加键按下? N Y 延时消抖 查询下一个值 Y 确认按下? N 减键按下? N Y 延时消抖 查询上一个值 Y 确认按下? N N 退出功能键按下? Y 返回 图18 温度查询模块流程图
5.5 温度设定、报警模块
此模块跟温度查询模块类似,需要接受按键输入,进入模块界面后,按加减键分别上调和下调设定报警温度值,当实时温度值超过设定值时驱动蜂鸣器发声,并点亮8位发光二极管,实现声光报警。 温度设定、报警模块流程图如下:
入口 功能键按下? N Y 延时消抖 确认按下? N Y 显示设定温度值 加键按下? N Y 延时消抖 上调设定值 Y 确认按下? N
减键按下? N Y 延时消抖 下调设定值 Y 确认按下? N 声光报警 Y 温度超出设定值? N 取消报警 N 判断退出界面? Y 返回 图19 温度设定、报警模块流程图
5.6 数码管驱动模块
本设计数码管通过锁存器接单片机P0口,采用动态扫描驱动7段LED数码管进行显示,需调用延时子程序以稳定显示。 模块流程图如下:
入口 关段选 P0置高
开位选
送位码
关位选
P0清零 开段选 送段码 关段选 延时
返回
图20 数码管驱动模块流程图
6 源程序
#include
#define uchar unsigned char #define uint unsigned int
/*************************变量定义************************************/ sbit DQ=P2^2;//ds18b20 端口 sbit beep=P2^3;//蜂鸣器使能端 sbit dula=P2^6;//数码管段选使能 sbit wela=P2^7;//数码管位选使能 sbit add=P3^5;//加键 sbit sub=P3^4;//减键
sbit alarm=P3^6;//设定报警功能键
sbit record=P3^7;//查询温度记录功能键 uchar code tabled[]={
0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, //0~9的七段数码管段码 0x40,0x63,0x39};//- c 的段码
uchar code tablew[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f};//1~8个数码管的位选码 uchar recordtable[10];//存储过去的十个温度值 uchar temperature;//温度值
uchar countsec,recordnum,count;//计数变量 uint countmin;//计数变量
uchar alanum=30;//报警温度值,初始值为30摄氏度 uchar z=65;//消抖延时函数入口参数
/**********************函数声明***************************************/ void delay1(uchar MS);//动态扫描延时子程序 void delay(uchar i);//DS18B20工作延时子程序 void Init_DS18B20();//DS18B20初始化子程序
void WriteOneChar(unsigned char dat);//向DS18B20写一字节数据 uchar ReadOneChar(void);//向DS18B20读一字节数据 void GetTemperature();//由DS18B20产生温度值
void Display(uchar wei,uchar duan);//数码管驱动子程序 void Alarm();//温度报警
void Showtemperature(uchar tt);//温度显示 void Keeprecord();//记录温度值
void Showrecord();//显示记录的温度值
/*********************主函数*******************************************/ void main() { TMOD=0x01;//定时器初始化,定时器0方式1 TH0=(65536-50000)/256;//50ms TL0=(65536-50000)%6; EA=1;//开中断
ET0=1;
TR0=1;//启动定时器 while(1) {
Showtemperature(temperature);//显示实时温度 Alarm();//温度设定、报警 Showrecord();//查询温度记录值 } }
/************************动态扫描延时函数********************************/ void delay1(uchar MS) { int i,j; for(i=80;i>0;i--) for(j=MS;j>0;j--); }
/************************DS18B20工作延时函数*****************************/ void delay(uchar i) {
while(i--); }
/*************************DS18B20初始化函数******************************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(10); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5); while(!x) { x=DQ; } }
/*************************读一个字节**************************************/ uchar ReadOneChar(void) {
unsigned char i=0;