本设计:
基于STM32单片机紫外线强度检测仪器蜂鸣器报警(程序+原理图+PCB)
原理图:Altium Designer
程序编译器:keil 5
编程语言:C语言
编号C0023
完整下载链接: 链接:https://pan.baidu.com/s/1-ZwgnplZuByGZrS9bL7Yug?pwd=0ffd 提取码:0ffd
功能描述:
本系统由STM32F103C8T6单片机核心板、紫外线传感器、LCD1602液晶显示、蜂鸣器报警、按键控制及电源组成。
1、通过传感器检测传感器实际值,并将传感器实际值显示在LCD1602液晶上。
2、感器检测采用的是AD数据转换,然后传感器手册运算获得的。
3、三个按键设置阈值,分别为设置键、设置+、设置-,其中设置+、设置-只有在设置模式下才能进行操作。
4、在设置模式下,液晶有对应的显示标志,设置阈值存储到单片机Flash中,具有掉电不丢失,无需重新设置。
5、设置值与采集值实时对比,如果出现异常情况,蜂鸣器报警提醒。
原理图(提供源文件):
PCB(提供源文件):
源程序(提供源文件):
#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include#include "timer.h" #include "key.h" #include #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; //³õʼ»¯Êý¾Ý´æ¶ÁÈ¡ void write_FlashBuf(void) { setFlashBuf[0] = initFlagData; setFlashBuf[1] = setNum / 256; //ÖØÐÂдÈëÖµ setFlashBuf[2] = setNum % 256; STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)setFlashBuf,SIZE); //¶ÁÈ¡Êý¾Ý } 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; //·ÀÖ¹ÖØ¸´¼ì²âµ½°´¼ü } }
资料清单如下:



