目录
具体实现功能
(1)LCD1602显示实时温度(DS18B20)值和烟雾(MQ-2)值,以及设定的温度报警值和烟雾报警值;
(2)按键可调节温度报警值和烟雾报警值;
(3)当测得的温度值和烟雾值超过设定的报警值时,蜂鸣器响,相应的指示灯亮;当测得的温度和烟雾值同时超过报警值时,电机转动,表示灭火;
(4)报警时,利用GSM模块(仿真中无GSM模块,用串口模拟)将测得的温度值与烟雾值发送到用户手机上,实现远程报警。
仿真演示视频:
基于51单片机的智能防火GSM上报仿真-仿真视频
设计介绍
51单片机简介
51单片是一种低功耗、高性能CMOS-8位微控制器,拥有灵巧的8位CPU和可编程Flash,使得51单片机为众多嵌入式控制应用系统提供灵活、高效的解决方案。
本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。
资料内容
仿真实现(protues8.7)
本设计利用protues8.7软件实现仿真设计,具体如图。
程序(Keil5)
本设计利用KEIL5软件实现程序设计。
主函数如下:
///
void main (void)
{
u8 key;
u8 SmokeFlag = false;
u8 yanwu_cashe;
u8 TempFlag = false;
u16 wendu_cashe;
u8 IntrudeFlag = false;
char String[50];
char Value[3];
wendu=check_wendu(); //初始化时调用温度读取函数 防止开机85°C
Init1602(); //调用初始化显示函数
UsartInit();
LCD_Write_String(0,0,"SET T:00 E:000"); //开机界面
LCD_Write_String(1,0,"NOW T:00 E:000");
delay_ms(1000);
wendu=check_wendu(); //初始化时调用温度读取函数 防止开机85°C
while (1) //主循环
{
key=Key_Scan(); //按键扫描
yanwu=Adc0832(0); //读取烟雾值
wendu=check_wendu(); //读取温度值
if(key==KEY_SET)
{
Mode++;
}
switch(Mode) //判断模式的值
{
case 0: //监控模式
{
Display_1602(yushe_wendu,yushe_yanwu,wendu,yanwu); //显示预设温度,预设烟雾,温度值,烟雾值
if(yanwu>=yushe_yanwu) //烟雾值大于等于预设值时
{
Led_Y=0; //烟雾指示灯亮
if(yanwu_cashe != yanwu){
yanwu_cashe = yanwu;
SmokeFlag = false;
}
if(SmokeFlag == false){
Value[0] = 0x30+yanwu/100%10;
Value[1] = 0x30+yanwu/10%10;
Value[2] = 0x30+yanwu%10;
sprintf(String,"Smoke Alert Start! Value:%s \r\n",Value);
SendStr(String);
SmokeFlag = true;
}
}
else //烟雾值小于预设值时
{
Led_Y=1; //关掉报警灯
if(SmokeFlag == true){
SendStr("Smoke Alert Stop!\r\n");
SmokeFlag = false;
}
}
if(wendu>=(yushe_wendu*10) && wendu<=800) //温度大于等于预设温度值时(为什么是大于预设值*10:因为我们要显示的温度是有小数点后一位,是一个3位数,25.9°C时实际读的数是259,所以判断预设值时将预设值*10)
{
Led_W=0; //打开温度报警灯
if(wendu_cashe != wendu){
wendu_cashe = wendu;
TempFlag = false;
}
if(TempFlag == false){
sprintf(String,"Temperature Alert Start! Value:%2.1f \r\n",wendu*1.0/10);
SendStr(String);
TempFlag = true;
}
}
else //温度值小于预设值时
{
Led_W=1; //关闭报警灯
if(TempFlag == true){
SendStr("Temperature Alert Stop!\r\n");
TempFlag = false;
}
}
if((wendu>=(yushe_wendu*10))&(yanwu>=yushe_yanwu))
{
dianji=0;
}
else
{
dianji =1;
}
if((yanwu>=yushe_yanwu)||(wendu>=(yushe_wendu*10) && wendu<=800)) //烟雾值或温度值大于等于预设值时
{
Buzzer=0; //打开蜂鸣器报警
}
else
{
Buzzer=1; //关闭蜂鸣器报警
}
break;
}
case 1://预设温度模式
{
SelectPosition(0,7) ; //指定位置
write_com(0x0d); //阴影闪烁
if(key==KEY_ADD) //加键按下
{
yushe_wendu++; //预设温度值(阀值)加1
if(yushe_wendu>=99) //当阀值加到大于等于99时
yushe_wendu=99; //阀值固定为99
LCD_Write_Char(0,6,yushe_wendu,2) ;//显示预设温度
}
if(key==KEY_MINUS) //减键按下
{
if(yushe_wendu<=1) //当温度上限值减小到1时
yushe_wendu=1; //固定为1
yushe_wendu--; //预设温度值减一,最小为0
LCD_Write_Char(0,6,yushe_wendu,2) ;//显示预设温度
}
break; //执行后跳出switch
}
case 2: //预设烟雾模式
{
SelectPosition(0,15) ; //指定位置
write_com(0x0d); //打开显示 无光标 光标闪烁
if(key==KEY_ADD) //加键按下
{
if(yushe_yanwu>=255) //当阀值加到大于等于255时
yushe_yanwu=254; //阀值固定为254
yushe_yanwu++; //预设烟雾值(阀值)加1,最大为255
LCD_Write_Char(0,13,yushe_yanwu,3) ;//显示预设烟雾
}
if(key==KEY_MINUS) //减键按下
{
if(yushe_yanwu<=1) //当烟雾上限值减小到1时
yushe_yanwu=1; //固定为1
yushe_yanwu--; //预设温度值减一,最小为0
LCD_Write_Char(0,13,yushe_yanwu,3) ;//显示预设烟雾
}
break;
}
default :
{
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
Mode=0; //恢复正常模式
break;
}
}
}
}
程序运行结果如图:
全部内容
全部资料包括程序(keil5)、protues仿真(protues8.7)、开发资料、资料使用介绍、仿真视频、程序讲解视频、仿真讲解视频、最小系统介绍视频等。
资料获取
https://docs.qq.com/doc/DT0pUcEhZdllMQlNr