文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真STM32单片机控制器,使用按键、LED、蜂鸣器、LCD1602、DS18B20温度传感器、HC05蓝牙模块等。
主要功能:
系统运行后,默认LCD1602显示前4路采集的温度,可通过K4键切换显示后4路温度;
可通过K3键进入阈值设置模式,K1和K2键调节阈值,K4键确认并返回显示界面。将采集的8路温度数据通过蓝牙传输到APP显示;当8路温度有超过阈值或低于阈值,则蜂鸣器报警,且APP显示第几路温度高或低。
二、软件设计
/*
作者:嗨小易(QQ:3443792007)*///系统数据显示
void sys_data_show(void)
{u8 buf[5];static u8 i=0;while(1){//正常模式显示if(sys_ctrl.mode==0){//页面1if(sys_ctrl.page==0){//温度1显示buf[0]=sys_ctrl.temp[0]/100+0x30;buf[1]=sys_ctrl.temp[0]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[0]%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,0,buf);//温度2显示buf[0]=sys_ctrl.temp[1]/100+0x30;buf[1]=sys_ctrl.temp[1]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[1]%100%10+0x30;buf[4]='\0';lcd1602_show_string(11,0,buf);//温度3显示buf[0]=sys_ctrl.temp[2]/100+0x30;buf[1]=sys_ctrl.temp[2]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[2]%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,1,buf);//温度4显示buf[0]=sys_ctrl.temp[3]/100+0x30;buf[1]=sys_ctrl.temp[3]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[3]%100%10+0x30;buf[4]='\0';lcd1602_show_string(11,1,buf); }//页面2else{//温度5显示buf[0]=sys_ctrl.temp[4]/100+0x30;buf[1]=sys_ctrl.temp[4]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[4]%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,0,buf);//温度6显示buf[0]=sys_ctrl.temp[5]/100+0x30;buf[1]=sys_ctrl.temp[5]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[5]%100%10+0x30;buf[4]='\0';lcd1602_show_string(11,0,buf);//温度7显示buf[0]=sys_ctrl.temp[6]/100+0x30;buf[1]=sys_ctrl.temp[6]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[6]%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,1,buf);//温度8显示buf[0]=sys_ctrl.temp[7]/100+0x30;buf[1]=sys_ctrl.temp[7]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[7]%100%10+0x30;buf[4]='\0';lcd1602_show_string(11,1,buf);}//串口传输温度数据i++;if(i%1==0){//温度1显示buf[0]=sys_ctrl.temp[0]/100+0x30;buf[1]=sys_ctrl.temp[0]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[0]%100%10+0x30;buf[4]='\0';UART_SendString("\r\nTP1:");UART_SendString(buf);UART_SendString("C ");//温度2显示buf[0]=sys_ctrl.temp[1]/100+0x30;buf[1]=sys_ctrl.temp[1]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[1]%100%10+0x30;buf[4]='\0';UART_SendString("TP2:");UART_SendString(buf);UART_SendString("C ");//温度3显示buf[0]=sys_ctrl.temp[2]/100+0x30;buf[1]=sys_ctrl.temp[2]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[2]%100%10+0x30;buf[4]='\0';UART_SendString("TP3:");UART_SendString(buf);UART_SendString("C ");//温度4显示buf[0]=sys_ctrl.temp[3]/100+0x30;buf[1]=sys_ctrl.temp[3]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[3]%100%10+0x30;buf[4]='\0';UART_SendString("TP4:");UART_SendString(buf);UART_SendString("C\r\n");//温度5显示buf[0]=sys_ctrl.temp[4]/100+0x30;buf[1]=sys_ctrl.temp[4]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[4]%100%10+0x30;buf[4]='\0';UART_SendString("TP5:");UART_SendString(buf);UART_SendString("C ");//温度6显示buf[0]=sys_ctrl.temp[5]/100+0x30;buf[1]=sys_ctrl.temp[5]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[5]%100%10+0x30;buf[4]='\0';UART_SendString("TP6:");UART_SendString(buf);UART_SendString("C ");//温度7显示buf[0]=sys_ctrl.temp[6]/100+0x30;buf[1]=sys_ctrl.temp[6]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[6]%100%10+0x30;buf[4]='\0';UART_SendString("TP7:");UART_SendString(buf);UART_SendString("C ");//温度8显示buf[0]=sys_ctrl.temp[7]/100+0x30;buf[1]=sys_ctrl.temp[7]%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp[7]%100%10+0x30;buf[4]='\0';UART_SendString("TP8:");UART_SendString(buf);UART_SendString("C\r\n"); }}//阈值设置显示else{//温度下限显示lcd1602_show_nums(4,1,sys_ctrl.templ,2,0);//温度上限显示lcd1602_show_nums(13,1,sys_ctrl.temph,2,0);//阈值设定,数据位置闪烁switch(sys_ctrl.mode){case 1://温度下限lcd1602_show_string(4,1," ");delay_ms(100);lcd1602_show_nums(4,1,sys_ctrl.templ,2,0);break;case 2://温度上限lcd1602_show_string(13,1," ");delay_ms(100);lcd1602_show_nums(13,1,sys_ctrl.temph,2,0);break; }}break; }
}//系统数据设置
void sys_data_set(void)
{u8 key=0;static u8 oneflag=0;key=KEY_Scan(1);//设置if(key==KEY3_PRESS){sys_ctrl.mode++;if(sys_ctrl.mode>2)sys_ctrl.mode=1;if(oneflag==0){oneflag=1;_parm_set_show();//参数设置界面显示}} //正常模式if(sys_ctrl.mode==0){//翻页if(key==KEY4_PRESS){sys_ctrl.page=!sys_ctrl.page;if(sys_ctrl.page==1)sys_open_show2();//页面2else sys_open_show1();//页面1 }}//阈值设置模式else{//加if(key==KEY1_PRESS){switch(sys_ctrl.mode){case 1://温度下限 sys_ctrl.templ++;if(sys_ctrl.templ>99)sys_ctrl.templ=0;break;case 2://温度上限 sys_ctrl.temph++;if(sys_ctrl.temph>99)sys_ctrl.temph=0;break; }}//减else if(key==KEY2_PRESS){switch(sys_ctrl.mode){case 1://温度下限 sys_ctrl.templ--;if(sys_ctrl.templ<0)sys_ctrl.templ=99;break;case 2://温度上限 sys_ctrl.temph--;if(sys_ctrl.temph<0)sys_ctrl.temph=99;break; }}//确定else if(key==KEY4_PRESS){sys_ctrl.mode=0;oneflag=0;if(sys_ctrl.page==1)sys_open_show2();//页面2else sys_open_show1();//页面1}}
}//系统功能控制
void sys_fun_ctrl(void)
{u8 i=0;//正常工作模式下if(sys_ctrl.mode==0){//温度高于上限,或者温度低于下限,蜂鸣器报警for(i=0;i<8;i++){if(sys_ctrl.temp[i]>sys_ctrl.temph*10 || sys_ctrl.temp[i]<sys_ctrl.templ*10){beep_alarm(10,1000);if(sys_ctrl.temp[i]>sys_ctrl.temph*10){//第几个温度过高UART_SendString("\r\n第");UART_SendData(i+0x31);UART_SendString("个温度高\r\n");}else if(sys_ctrl.temp[i]<sys_ctrl.templ*10){//第几个温度过低UART_SendString("\r\n第");UART_SendData(i+0x31);UART_SendString("个温度低\r\n");}} } }
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。