本设计:
基于STM32单片机紫外线强度检测仪器蜂鸣器报警(程序+原理图+PCB)
原理图:Altium Designer
程序编译器:keil 5
编程语言:C语言
编号C0023
完整下载链接:
【腾讯文档】C0023 网盘链接
https://docs.qq.com/doc/DS2JPanJXZ2pwQnBU
功能描述:
本系统由STM32F103C8T6单片机核心板、紫外线传感器、LCD1602液晶显示、蜂鸣器报警、按键控制及电源组成。
1、通过传感器检测传感器实际值,并将传感器实际值显示在LCD1602液晶上。
2、感器检测采用的是AD数据转换,然后传感器手册运算获得的。
3、三个按键设置阈值,分别为设置键、设置+、设置-,其中设置+、设置-只有在设置模式下才能进行操作。
4、在设置模式下,液晶有对应的显示标志,设置阈值存储到单片机Flash中,具有掉电不丢失,无需重新设置。
5、设置值与采集值实时对比,如果出现异常情况,蜂鸣器报警提醒。
原理图(提供源文件):
PCB(提供源文件):
源程序(提供源文件):
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include <stdio.h>
#include "lcd1602.h"
#include "adc.h"
#include "stmflash.h"
#define BASICS_VAL 15 //????????×??????ù????
#define DEFAULT_SET_VAL 2 //???????????????è????
char dis0[17]; //??????×é
char dis1[17]; //??????×é
float sensorVolt = 0; //?±?°??????
unsigned int adcx;
unsigned int uvIndex = 0;
unsigned int setNum = 50; //?è????
unsigned char setMode = 0;//????????????
unsigned char disFlag = 0;//????±ê??
#define FLASH_SAVE_ADDR 0X08010000 // ×??????????? ????flash???·?????ù ?è??FLASH ±??????·(±????????????????????ó??±??ú???ù????FLASH???ó??+0X08000000)
//stm32f103R8T6 flash???··??§ 0x8010000-0x801FFFF
//stm32f103C8T6 flash???··??§ 0x8000000-0x807FFFF
#define SIZE 10 //??×é?¤??
unsigned char setFlashBuf[10];//????????'
unsigned char initFlagData; //????????????????
/******************°?????±??????????ú????eepom??******************/
void write_FlashBuf(void)
{
setFlashBuf[0] = initFlagData;
setFlashBuf[1] = setNum / 256; //??????????
setFlashBuf[2] = setNum % 256;
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)setFlashBuf,SIZE); //????????
}
/******************°????????????ú????eepom????????*****************/
void read_FlashBuf(void)
{
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)setFlashBuf,SIZE); //????flash??
initFlagData = setFlashBuf[0]; //??????????????
setNum = setFlashBuf[1]; //??????×???
setNum <<= 8;
setNum |= setFlashBuf[2]; //??????×??? ??????
}
/**************???ú??????±?????????*****************/
void init_FlashBuf(void)
{
read_FlashBuf(); //????flash??
if(initFlagData != 0x55) //?????????ú?????????ú????eeprom ????????0x55????????
{
setNum = DEFAULT_SET_VAL;//?è??????
initFlagData = 0x55; //??????
delay_ms(20);
write_FlashBuf(); //????????
}
}
void CheckKey(void);
int main(void)
{
delay_init(); //???±??????????
uart_init(9600); //????????????115200
TIM3_Int_Init(499,7199); //?¨?±?÷??????
LED_Init(); //??????????
KEY_Init();
Adc_Init(); //??????ad×???
init_FlashBuf();//??????????????????
buzzer = 1; //·??ù?÷±¨??????
delay_ms(200);
buzzer = 0;//·??ù?÷ ????±¨??
Lcd_GPIO_init(); //???§??????????
Lcd_Init(); //???§??????????
delay_ms(20);
while(1)
{
CheckKey();
if(disFlag==1)//?¨?±????±ê??
{
disFlag=0;//????±ê??
adcx=Get_Adc_Average(ADC_Channel_1,5);//????ad×????? 5???ó???ù
sensorVolt =(float)adcx*3.3/4096;// ??????
if(sensorVolt < 0.05) {uvIndex = 0;}//?ù???????÷±í?·?¨??
else if(sensorVolt < 0.227) {uvIndex = 1;}//?ù???????÷±í?·?¨??
else if(sensorVolt < 0.318) {uvIndex = 2;}//?ù???????÷±í?·?¨??
else if(sensorVolt < 0.408) {uvIndex = 3;}//?ù???????÷±í?·?¨??
else if(sensorVolt < 0.503) {uvIndex = 4;}
else if(sensorVolt < 0.606) {uvIndex = 5;}
else if(sensorVolt < 0.696) {uvIndex = 6;}
else if(sensorVolt < 0.795) {uvIndex = 7;}
else if(sensorVolt < 0.881) {uvIndex = 8;}
else if(sensorVolt < 0.976) {uvIndex = 9;}
else if(sensorVolt < 1.079) {uvIndex = 10;}
else {uvIndex = 11;}
sprintf(dis0,"%4.2fv UVIndex:%d ",sensorVolt,uvIndex); //?ò??
Lcd_Puts(0,0,(u8 *)dis0);//????
if(setMode){
sprintf(dis1,"setIndex:%02d< ",setNum); //?ò??
}
else{
sprintf(dis1,"setIndex:%02d ",setNum);
}
Lcd_Puts(0,1,dis1);//????
if(uvIndex > setNum) //?????? ?? ?è???? ??±?
{buzzer = !buzzer;} //·??ù?÷±¨??
else {buzzer = 0;} //??±¨??
}
}
}
void CheckKey(void)
{
static unsigned char rekey =0;
if((key1==0)||(key2==0)||(key3==0)) //?ì????°??ü°???
{
delay_ms(10); //??????
if(rekey==0)
{
if(key1==0) //?ì????·?°???
{
rekey=1;
if(setMode){
setMode = 0; //?????è??
}
else {
setMode = 1; //?è??×???
}
}
else if(key2==0)//?è?????ü
{
rekey=1;
if(setMode){ //?è????????
if(setNum < 99 ){setNum=setNum+1;} //+1
}
}
else if(key3==0)//?è?????ü
{
rekey=1;
if(setMode){ //?è????????
if(setNum > 0 ){setNum=setNum-1;}
}
}
write_FlashBuf();//????????
}
}
else
{
rekey=0; //·????????ì????°??ü
}
}
资料清单如下: