这是我做的单片机数字温度课实验,
用了两个星期的时间,
附件里面包含数字温度的单片机的源码
和Proteus仿真工程文件
proteus原理图
源代码的一部分
单片机源程序如下:
- #include <reg52.h>
- #include "ds18b20.h"
- #include "ds1302.h"
- #include "lcd1602.h"
- //LED引脚定义
- sbit LED_LOW=P1^4; //低温度报警
- sbit LED_NORMAL=P1^5; //正常温度
- sbit LED_HIGH=P1^6; //高温报警
- //按键引脚定义
- sbit k1=P3^4; //模式切换(按键温度上下限+或温度上下限-)
- sbit k2=P3^2; //设置温度下限
- sbit k3=P3^3; //设置温度上限
- //DS1302相关
- uchar times[9];//保存时间
- uchar date[11];//保存日期
- //温度数据
- uchar HT=40; //温度上限
- uchar LT=15; //温度下限
- uchar WenduData[6]; //实时温度
- uchar HTem[3],LTem[3];//温度上下限
- //全局变量定义
- bit flag=0;//模式切换标志位
- //主函数
- void main()
- {
- EA=1; //开总中断
- TCON=0x05; //外部中断0,1设置为边沿触发
- EX0=1; //开外部中断0
- EX1=1; //开外部中断1
- //init_1302(time_1302);
- ReadTemperature();//预读取温度并延时跳过默认初始温度显示
- Delay(50000);
- Delay(50000);
- LCD_init();//LCD初始化
- while(1)
- {
- if(k1==0){ //按下KEY1时,切换温度上下限设置方向
- Delay(5);
- while(k1==0);
- flag=~flag;
- }
- Disp_Temperature();//显示温度
- Delay(500);
-
- get_1302(time_1302);//获取时间
- change(); //时间转换
-
- gotoxy(8,2);
- LCD_display(times);//显示时间
- }
- }
- //温度转换显示函数
- void Disp_Temperature() //显示温度
- {
- uint a,b,c,d,e,m;
- e=ReadTemperature(); //获取温度值
- a=e/1000; //计算得到十位数
- b=e/100-a*10; //计算得到个位数字
- d=e%10; //计算得到小数点后两位
- c=(e%100)/10; //计算得到小数点后一位
- m=e/100;
-
- //温度不在范围内报警
- if( m<LT){ //温度超过温度上限
- LED_LOW=0;
- LED_HIGH=1;//黄灯亮
- LED_NORMAL=1;
- }
- else if(m>HT){ //温度低于温度下限
- LED_LOW=1;
- LED_HIGH=0;//红灯亮
- LED_NORMAL=1;
- }
- else{ //温度处于正常范围
- LED_LOW=1;
- LED_HIGH=1;
- LED_NORMAL=0;//绿灯亮
- }
- //LCD显示温度数据
- WenduData[0] = a+'0';
- WenduData[1] = b+'0';
- WenduData[2] = '.';
- WenduData[3] = c+'0';
- WenduData[4] = d+'0';
- WenduData[5] = '\0';
- LTem[0] = LT/10+'0';
- LTem[1] = LT%10+'0';
- LTem[2] = '\0';
- HTem[0] = HT/10+'0';
- HTem[1] = HT%10+'0';
- HTem[2] = '\0';
-
- gotoxy(1,1);
- LCD_display("LT:");
- gotoxy(4,1);
- LCD_display(LTem);
- gotoxy(1,2);
- LCD_display("HT:");
- gotoxy(4,2);
- LCD_display(HTem);
- gotoxy(8,1);
- LCD_display("T:");
- gotoxy(10,1);
- LCD_display(WenduData);
- }
- //外部0中断子函数
- void int0() interrupt 0
- {
- if(k2==0) //按键KEY2按下
- {
- Delay(5);
- while(k2==0);
- if(flag==0)
- LT++; //温度下限+
- else
- LT--;//温度下限-
- }
- }
- //外部1中断子函数
- void int1() interrupt 2
- {
- if(k3==0)
- {
- Delay(5);
- while(k3==0);
- if(flag==0)
- HT++;//温度上限+
- else
- HT--;//温度上限-
- }
- }
- //DS1302数值转换
- void change()
- {
- // 时 间 的 转 换
- times[0]=time_1302[2]/10+'0';
- times[1]=time_1302[2]%10+'0';
- times[2]=':';
- times[3]=time_1302[1]/10+'0';
- times[4]=time_1302[1]%10+'0';
- times[5]=':';
- times[6]=time_1302[0]/10+'0';
- times[7]=time_1302[0]%10+'0';
- times[8]='\0';
- // 日 期 的 转 换
- date[0]='2';
- date[1]='0';
- date[2]=time_1302[6]/10+'0';
- date[3]=time_1302[6]%10+'0';
- date[4]='/';
- date[5]=time_1302[4]/10+'0';
- date[6]=time_1302[4]%10+'0';
- date[7]='/';
- date[8]=time_1302[3]/10+'0';
- date[9]=time_1302[3]%10+'0';
- date[10]='\0';
- }
复制代码
Keil代码与Proteus仿真下载:
ds18b20数字温度计.7z
(112.68 KB, 下载次数: 50)
|