一、系统方案
1、本设计默认采用STC89C52单片机,如需更换单片机请联系客服。
2、接收板LCD1602液晶实时显示当前检测的2点温度值以及对应的上下限报警值。发射板由DS18B20采集温度值,通过无线模块NRF24L01传给接收板。
3、按键可以设置温度上下限值,超过阈值系统进行报警。
4、带有继电器控制系统,当任一温度值超过上限,开启继电器1,模拟系统降温。当任一温度值低于下限,开启继电器2,模拟系统升温。
二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
uchar RxBuf[20]={0};
init_1602(); //1602液晶初始化函数
init_NRF24L01();
write_str("Start receiving ");
2、液晶显示程序
/延时函数,延时一毫秒****/
void delay(uint z)
{
uint x,y;
for(x=112;x>0;x–)
for(y=z;y>0;y–);
}
/1602显示操作设置**/
void write_cmd(char cmd) //写指令函数
{
lcdrs=0;
P0=cmd;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void write_data(uchar dat) //写数据函数
{
lcdrs=1;
P0=dat ;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void write_str(uchar *str)//写字符串函数
{
while(*str!=‘\0’)
{
write_data(*str++);
delay(1);
}
}
void init_1602() //1602液晶显示器的初始化设置
{
lcdrw=0;
lcden=0;
write_cmd(0x38); //显示模式设置
write_cmd(0x0c); //显示开关,光标关闭
write_cmd(0x06); //显示光标移动设置
write_cmd(0x01); //清除屏幕
write_cmd(0x80); //数据指针移到第一行第一个位置
}
3、按键程序
void keyscan() //按键扫描
{
if(K10)
{
delay(5); //按键消除抖动判断
if(K10)
{
keyflag_1++; //键一按下,标志位加一
while(!K1);
}
}
if(keyflag_15){keyflag_1=0;write_cmd(0x0c);}
if(keyflag_11){write_cmd(0x8a);write_cmd(0x0d);} //温度1下限末位打开光标
if(keyflag_12){write_cmd(0x8f);write_cmd(0x0d);} //温度1上限末位打开光标
if(keyflag_13){write_cmd(0xca);write_cmd(0x0d);} //温度2下限末位打开光标
if(keyflag_14){write_cmd(0xcf);write_cmd(0x0d);} //温度2上限末位打开光标
if(keyflag_1!=0)
{
if(K20) //限值加键
{
delay(5); //按键消除抖动判断
if(K20)
{
while(!K2);
if(keyflag_11) //下限值加一
{
tem_l1++;
if(tem_l1100)tem_l1=0;
write_cmd(0x89);
write_data(tem_l1/10+48);
write_data(tem_l1%10+48);
}
if(keyflag_12) //上限值加一
{
tem_h1++;
if(tem_h1==100)tem_h1=0;
write_cmd(0x8e);
write_data(tem_h1/10+48);
write_data(tem_h1%10+48);
}
if(keyflag_1==3) //下限值加一
{
tem_l2++;
if(tem_l2==100)tem_l2=0;
write_cmd(0xc9);
write_data(tem_l2/10+48);
write_data(tem_l2%10+48);
}
if(keyflag_1==4)
{
tem_h2++;
if(tem_h2==100)tem_h2=0;
write_cmd(0xce);
write_data(tem_h2/10+48);
write_data(tem_h2%10+48);
}
}
}
if(K3==0) ///限值减键
{
delay(5); //按键消除抖动判断
if(K3==0)
{
while(!K3);
if(keyflag_1==1) //下限值减一
{
tem_l1--;
if(tem_l1==0)tem_l1=99;
write_cmd(0x89);
write_data(tem_l1/10+48);
write_data(tem_l1%10+48);
}
if(keyflag_1==2) //上限值减一
{
tem_h1--;
if(tem_h1==0)tem_h1=99;
write_cmd(0x8e);
write_data(tem_h1/10+48);
write_data(tem_h1%10+48);
}
if(keyflag_1==3) //下限值减一
{
tem_l2--;
if(tem_l2==0)tem_l2=99;
write_cmd(0xc9);
write_data(tem_l2/10+48);
write_data(tem_l2%10+48);
}
if(keyflag_1==4) //上限值减一
{
tem_h2--;
if(tem_h2==0)tem_h2=99;
write_cmd(0xce);
write_data(tem_h2/10+48);
write_data(tem_h2%10+48);
}
}
}
}
}
4、核心算法程序
void baojing() //报警判断函数
{
if(wendu1<=(tem_h110)&&wendu1>=(tem_l110)&&wendu2<=(tem_h210)&&wendu2>=(tem_l210)) //两个温度为正常值
{D1=D2=D3=D4=1;BELL=1;} //灯全灭 蜂鸣器不响
if(wendu1>(tem_h1*10)) //温度1大于设定上限值
{D1=0;BELL=0;} //D1灯亮 蜂鸣器响
else {D1=1;}
if(wendu1<(tem_l1*10)) //温度1低于下限值
{D2=0;BELL=0;} //D2灯亮 蜂鸣器响
else {D2=1;}
if(wendu2>(tem_h2*10)) //温度2大于设定上限值
{D3=0;BELL=0;} //D3灯亮 蜂鸣器响
else {D3=1;}
if(wendu2<(tem_l2*10)) //温度2低于下限值
{D4=0;BELL=0;} //D4灯亮 蜂鸣器响
else {D4=1;}
if((wendu1>(tem_h110))||(wendu2>(tem_h210)))
jdq1=0;
else
jdq1=1;
if((wendu1<(tem_l110))||(wendu2<(tem_l210)))
jdq2=0;
else
jdq2=1;
}
四、proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。