標(biāo)題:
單片機ds18b20數(shù)字溫度計Proteus仿真代碼 可設(shè)上下限
[打印本頁]
作者:
joyv
時間:
2022-12-2 15:44
標(biāo)題:
單片機ds18b20數(shù)字溫度計Proteus仿真代碼 可設(shè)上下限
仿真及程序在附件,僅供參考學(xué)習(xí)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(150.58 KB, 下載次數(shù): 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; //設(shè)置溫度下限
sbit k3=P3^3; //設(shè)置溫度上限
//DS1302相關(guān)
uchar times[9];//保存時間
uchar date[11];//保存日期
//溫度數(shù)據(jù)
uchar HT=40; //溫度上限
uchar LT=15; //溫度下限
uchar WenduData[6]; //實時溫度
uchar HTem[3],LTem[3];//溫度上下限
//全局變量定義
bit flag=0;//模式切換標(biāo)志位
//主函數(shù)
void main()
{
EA=1; //開總中斷
TCON=0x05; //外部中斷0,1設(shè)置為邊沿觸發(fā)
EX0=1; //開外部中斷0
EX1=1; //開外部中斷1
//init_1302(time_1302);
ReadTemperature();//預(yù)讀取溫度并延時跳過默認(rèn)初始溫度顯示
Delay(50000);
Delay(50000);
LCD_init();//LCD初始化
while(1)
{
if(k1==0){ //按下KEY1時,切換溫度上下限設(shè)置方向
Delay(5);
while(k1==0);
flag=~flag;
}
Disp_Temperature();//顯示溫度
Delay(500);
get_1302(time_1302);//獲取時間
change(); //時間轉(zhuǎn)換
gotoxy(8,2);
LCD_display(times);//顯示時間
}
}
//溫度轉(zhuǎn)換顯示函數(shù)
void Disp_Temperature() //顯示溫度
{
uint a,b,c,d,e,m;
e=ReadTemperature(); //獲取溫度值
a=e/1000; //計算得到十位數(shù)
b=e/100-a*10; //計算得到個位數(shù)字
d=e%10; //計算得到小數(shù)點后兩位
c=(e%100)/10; //計算得到小數(shù)點后一位
m=e/100;
//溫度不在范圍內(nèi)報警
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顯示溫度數(shù)據(jù)
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中斷子函數(shù)
void int0() interrupt 0
{
if(k2==0) //按鍵KEY2按下
{
Delay(5);
while(k2==0);
if(flag==0)
LT++; //溫度下限+
else
LT--;//溫度下限-
}
}
//外部1中斷子函數(shù)
void int1() interrupt 2
{
if(k3==0)
{
Delay(5);
while(k3==0);
if(flag==0)
HT++;//溫度上限+
else
HT--;//溫度上限-
}
}
//DS1302數(shù)值轉(zhuǎn)換
void change()
{
// 時 間 的 轉(zhuǎn) 換
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';
// 日 期 的 轉(zhuǎn) 換
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';
}
復(fù)制代碼
Keil代碼與Proteus仿真下載:
ds18b20數(shù)字溫度計.rar
(148.36 KB, 下載次數(shù): 72)
2022-12-2 15:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1