本设计: 基于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 <stdio.h> #include "timer.h" #include "key.h" #include <stdio.h> #include "lcd1602.h" #include "adc.h" #include "stmflash.h" #define BASICS_VAL 15 //ó?óúêy?Y×a??μ??ù′??μ #define DEFAULT_SET_VAL 2 //μúò?′???è?éè???μ char dis0[17]; //?Y′?êy×é char dis1[17]; //?Y′?êy×é float sensorVolt = 0; //μ±?°2é?ˉ?μ 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; //·ÀÖ¹ÖØ¸´¼ì²âµ½°´¼ü
}
}
资料清单如下: