标题:
单片机ds18b20数字温度计Proteus仿真代码 可设上下限
[打印本页]
作者:
joyv
时间:
2022-12-2 15:44
标题:
单片机ds18b20数字温度计Proteus仿真代码 可设上下限
仿真及程序在附件,仅供参考学习
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif
(150.58 KB, 下载次数: 50)
下载附件
2022-12-7 01:40 上传
单片机源程序如下:
#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数字温度计.rar
(148.36 KB, 下载次数: 72)
2022-12-2 15:42 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1