2023年11月21日星期二晚21:09
此次设计是基于单片机的温度检测……
完成LCD1602正常显示及Proteus原理图的绘制。如下图:
需要注意的是:LCD1602的三个数据引脚RS、RW、EN的正确连接。
2023年11月22日星期三 晚21:47:08
添加按键扫描及键处理函数,如下:
void KeyScanf(void) //按键扫描
{
P3=P3|0x07;
if(StateNo == 1)
{
if((P1 & 0x07) != 0x07)
StateNo = 2;
else StateNo = 1;
}
else if(StateNo == 2)
{
if((P1 & 0x07) != 0x07)
{
KeyValueTemp = P3 & 0x07;
StateNo = 3;
}
else StateNo = 1;
}
else if(StateNo == 3)
{
if((P1 & 0x07) == 0x07)
{
StateNo = 4;
KeyValue = KeyValueTemp;
}
else _nop_();
}
else if(StateNo == 4)
{
KeyProce();
StateNo = 1;
}
else StateNo = 1;
}
void KeyProce(void) //键处理
{
if(KeyValue == 0x05) //
{
if(Screen_No == 1)
{
Flash_LCD=1;
Screen_No = 2;
}
else if(Screen_No == 2)
{
Flash_LCD=1;
Screen_No = 3;
}
else if(Screen_No == 3)
{
Flash_LCD=1;
Screen_No = 1;
}
}
else if(KeyValue == K1)
{
if(Screen_No == 2);
}
else if(KeyValue == K2)
{if(Screen_No == 3);
}
else _nop_();
}
遇见的问题是:键处理不执行,按下按键,无动作。
问题解决:因为为P3口写为P1口。更改后,按下KEY1能够切换1~3屏。
添加温度上限和下限;
LCDLine1[5] = set_tempH/10 + 0x30;
LCDLine1[6] = set_tempH%10 + 0x30;
LCDLine2[5] = set_tempL/10 + 0x30;
LCDLine2[6] = set_tempL%10 + 0x30;
添加 温度上下限的加减;
else if(KeyValue == 0x06) //加
{
if(Screen_No == 2)
{
set_tempH++;
}
else if(Screen_No == 3)
{
set_tempL++;
}
}
else if(KeyValue == 0x03) //减
{
if(Screen_No == 2)
{
set_tempH--;
}
else if(Screen_No == 3)
{
set_tempL++;
}
2023年11月23日星期四晚21:09:44
直接移植温度传感器DS18B20驱动程序,稍作调整,Proteus仿真如下:
将程序下载至开发板之中,DS18B20工作正常,能正常采集,一次成功。
但是出现一个有趣的现象,温度超过26°后,LCD1602显示出现乱码,如下:
原因暂时未知;
2023年12月1日周五晚21:35:32
本周花了一些时间看串口通信,想试试将检测的温度输出到PC,为啥没有26°以上的温度,结果失败了。
后面有重新查看所有变量,结果原因是:temp_value 的类型太小,导致26°温度无法正常显示(仅仅是将原unsigned char 改为unsigned int ,并未仔细研究温度转换前的数值大小。)。图如下;
目前零下的温度没有处理,所以不能正常显示。
晚22:32:08,
对零下温度的相关函数进行修改和调试,效果图如下。
至于为什么是0.9的精度,后续有机会再研究。
下一步是完成报警系统。
2023年12月2日周六晚22:22:56
加入电机散热、加热设备,均分别以黄绿LED代替;以及蜂鸣器报警程序。图略。还存在一个小小问题,每个几秒钟,蜂鸣器会无故响一下。
本次设计大致基本 完成。end?