黄日刚 基于单片机的数字温度计的设计
3.5 报警和按键模块设计
蜂鸣器是一种很好的提示元件,在工业及民用设备中经常用到,蜂鸣器分为直流和交流两种,直流蜂鸣器只要通电就会发出声音,使用简单,因此本设计采用直流蜂鸣器的声响效果作为报警信号[20]。当温度超出设定值范围时,单片机通过置位P1.0口驱动三极管导通使得蜂鸣器发出声音实现报警。
本设计按键分为两部分而且都是独立按键,一部分是时间调整按键,另一部分是温度上、下限调整按键。按键0至按键3用于时间调整,按键0是调整模式选择健,可以对秒、分、时、星期、日、月和年进行调整。按键1和按键2分别为增加健和减少健,用时间或日期的上调或下调。按键3则为退出健,用调整模式的退出。按键5至按键7用于温度上、下限的调整,按键5为调整模式选择键,用于对上限、下限和退出这是三种模式的选择,按键6和按键7分别为增加和减少健,用来实现上限和下限的上调或下调。具体电路图如图3.5所示。 3.6 系统总体硬件电路
由上述个各部分的硬件电路组合在一起构成了本设计的总体硬件电路。如图3.6所示。
图3.5 报警和调整按键电路
20
钦州学院本科毕业论文(设计)
图3.6 总体硬件电路
4 软件设计
4.1 系统软件程序设计
开始 液晶初始化 调整时间或日期 温度是否超限? N Y 时钟芯片初始化 是否调整温度上、下限? Y 调整上、下限 N 报警 温度传感器初始化 N 是否调整时间、日期? Y 显示 按键扫描
图4.1 系统主程序执行流程图
21
黄日刚 基于单片机的数字温度计的设计
主程序执行流程如图4.1所示,主程序先对液晶、温度传感器和时钟芯片进行初始化,然后不停判断是否进行时间、日期或者温度上、下限的调整。接着判断温度值是否超出设定值,一旦温度高于设定值就自动报警,否则不报警。最后将数据处理后送LCD1602显示, 4.2 液晶显示程序
在让液晶显示一些内容之前,要对液晶进行相应的设置,例如:是否有光标、光标是否闪烁、光标的移动方向等,这样之后便可以实现所需的显示效果。使用控制指令可以实现液晶显示模式的设置,全部指令都是由主控制器发出的。显示一个字符的操作过程为“读状态→写指令或数据”。
(1) 液晶初始化程序 void LCD_Initial() {
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示, }
(2) 读状态程序
unsigned char LCD_Wait(void) {
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示,无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); LcdEn=0;
22
钦州学院本科毕业论文(设计)
}
return DBPort;
(3) 向液晶写入命令或数据程序
void LCD_Write(bit style, unsigned char input) { }
4.3 时钟芯片程序
对时钟芯片DS1302的操作是通过向芯片中的寄存器写入相应的指令实现的。具体如下:
(1) 写命令、数据程序
void Write1302(unsigned char ucAddr, unsigned char ucDa) {
DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr); DS1302InputByte(ucDa); DS1302_CLK = 1; DS1302_RST = 0; }
LcdEn=0; LcdRs=style; LcdRw=0;
_nop_();
DBPort=input; _nop_(); LcdEn=1; LcdEn=0; LCD_Wait();
_nop_(); _nop_();
23
黄日刚 基于单片机的数字温度计的设计
(2) 读取数据程序
unsigned char Read1302(unsigned char ucAddr) {
unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); ucData = DS1302OutputByte(); DS1302_CLK = 1; DS1302_RST = 0; return(ucData); }
4.4 温度传感器程序
根据前面DS18B20的接口电路便可以编写温度传感器程序,从而实现温度传感器的运行,然后对温度进行测量和输出。 (1) 温度传感器初始化程序
void ds1820rst() {
uchar x=0;
DQ = 1; delay_18B20(4); DQ = 0; delay_18B20(100); DQ = 1; delay_18B20(40);
} (2) 写命令程序
void ds1820wr(uchar dat)
24