贵州大学课程设计
LCM的数据总线与单片机的P0口通过一个上拉电阻排相连,LCM的三条控制线RS、RW、EN分别与单片机的I/O口P2.0、P2.1、P2.2相连,第1、2引脚分别与地、电源相连,第3引脚使用一个10kΩ的可调电阻对显示屏的明亮进行调整。
3.6报警与指示模块
在本次设计中,采用LED发光二极管作为系统指示灯,采用蜂鸣器作为报警鸣笛。当温度高于上限警戒值时,点亮红色发光二极管,蜂鸣器发出响声;当温度低于下限警戒值时,点亮黄色发光二极管,蜂鸣器发出响声;温度在正常范围内时,
图9 报警与指示模块
点亮黄色发光二极管。整个报警与指示电路如图9所示,其中绿、红、黄色指示灯分别接单片机P2.0、P2.1、P2.2口,电平拉低时点亮LED,蜂鸣器电路接单片机的P2.7口,电平拉高时蜂鸣器响。
至此便完成了整个硬件电路的设计工作,整个系统的原理图见附录二,系统I/O分配表如下:
I/O口 P0.0~P0.7 P1.0~P1.3 P1.7 P2.0
功能说明 LCM数据口 键盘输入 DS18B20温度采集 LCM数据/命令控制 I/O口 P2.1 P2.2 P2.4~P2.6 P2.7 功能说明 LCM读/写控制 LCM使能 LED信号输出 报警信号输出 6
贵州大学课程设计
4.软件设计
单片机应用系统的设计中,软件设计占有重要的位置。在本次设计中,根据功能要求,可以把系统程序划分为5个模块,即主程序模块、显示模块、温度测量模块、键盘扫描模块、其它子程序模块,如图10所示。
主程序模块 温度测量模块键盘扫描模块显示模块其它子程序 图10 软件设计框图
4.1主程序设计
主程序的内容包括单片机初始化、相关部件初始化和一些其它子程序的调用等。主程序清单如下,程序流程图如图11所示。 /************主程序************/ void main(void) {
P1=0xff; //初始化P1口以便读入 P2|=0x70; P2&=0x7f;
Temp_set1=90; //上限报警温度初值90 Temp_set2=10; //下限报警温度初值10 Delay(500); //延时500ms启动 init_LCD(); //LCD初始化 init_18B20(); //DS18B20初始化 Display_str(0,0,str2); //开机界面 Display_str(0,1,str2); //开机界面 Delay(2000);
显示 图11 主程序流程图
7
初始化温度传感器 初始化显示模块 键盘扫描 读取温度 显示字形转换 开始 初始化单片机 贵州大学课程设计
}
Display_str(0,0,str0); Display_str(0,1,str1); while(1) { }
Key_scan(); //扫描键盘 Read_temp(); //读取温度 Change();
Display(); //显示
Alarm(); //指示灯与报警程序 Delay(1000);
4.2显示模块
显示程序主要完成的功能是模式、上下限警戒值和测量温度值的显示,模块中包含LCD初始化、显示单个字符子函数、显示一个字符串子函数。程序流程图如图12所示,LCD初始化程序如下,其它子函数程序详见附录一。 /************LCD初始化************/ void init_LCD(void) {
P0=0; Delay(15);
LCD_Command(0x38,0); Delay(5);
LCD_Command(0x38,0); Delay(5);
LCD_Command(0x38,0); Delay(5);
LCD_Command(0x38,1); //8位数据传送,2行显示,5*7字形 LCD_Command(0x08,1); //关闭显示
图12 显示程序流程图
写显示字符 结束显示 写显示命令 开始 定位显示位置 8
贵州大学课程设计
}
LCD_Command(0x01,1); //清屏
LCD_Command(0x06,1); //显示光标右移设置
LCD_Command(0x0c,1); //显示屏打开,光标不显示不闪烁
4.3温度测量模块
温度测量程序主要功能是读出数字温度传感器的温度值。要正确地读出温度值必须严格遵守单总线器件的命令序列,否则单总线器件不会响应主机。单总线器件的命令序列如图13所示。
温度测量模块程序流程图如图14所示,DS18B20初始化程序如下,其它子程序详见附录一。
/************DS18B20初始化************/ void init_18B20(void) { }
结束 图13 单总线命令序列
9
uchar x=0;
DQ=1; //DQ复位 Delay_us(4); //延时 DQ=0; //将DQ拉低 Delay_us(250); //精确延时大于480us DQ=1; //拉高总线 Delay_us(40); x=DQ; Delay_us(20); 开始 初始化 温度转换 发ROM指令 读取温度 发功能指令 返回 图14 温度测量程序流程图
DS18B20存在? Y 发跳过ROM指令 N 读DS18B20序列号 初始化DS18B20 开始 贵州大学课程设计
4.4键盘扫描模块
本次设计中使用了4个按键,除了1个复位键还有3个功能键,具体功能前面已介绍。键盘扫描程序如下,其它子程序详见附录一,相关流程图如图15所示。
/************键盘扫描************/ void Key_scan(void) {
uchar temp; P1=0xff; if(P1!=0xff) { Delay(20); //延时消抖 if(P1!=0xff) {
temp=P1; switch(temp) {
case 0xfe:Key_set();break;
//P1.0按下,功能选择
case 0xfd:Key_inc();break;
//P1.1按下,数字加一
case 0xfb:Key_dec();break;
//P1.2按下,数字减一 default:break;
} }
} }
10
开始 初始化DS18B20 有键按下? N Y 延时去抖动 有键按下? N Y 读取键值 执行键功能程序 返回 15 键盘扫描程序流程图
图