|
仿真及程序在附件,僅供參考學(xué)習(xí)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (150.58 KB, 下載次數(shù): 50)
下載附件
2022-12-7 01:40 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include "ds18b20.h"
- #include "ds1302.h"
- #include "lcd1602.h"
- //LED引腳定義
- sbit LED_LOW=P1^4; //低溫度報(bào)警
- sbit LED_NORMAL=P1^5; //正常溫度
- sbit LED_HIGH=P1^6; //高溫報(bào)警
- //按鍵引腳定義
- sbit k1=P3^4; //模式切換(按鍵溫度上下限+或溫度上下限-)
- sbit k2=P3^2; //設(shè)置溫度下限
- sbit k3=P3^3; //設(shè)置溫度上限
- //DS1302相關(guān)
- uchar times[9];//保存時(shí)間
- uchar date[11];//保存日期
- //溫度數(shù)據(jù)
- uchar HT=40; //溫度上限
- uchar LT=15; //溫度下限
- uchar WenduData[6]; //實(shí)時(shí)溫度
- 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ù)讀取溫度并延時(shí)跳過默認(rèn)初始溫度顯示
- Delay(50000);
- Delay(50000);
- LCD_init();//LCD初始化
- while(1)
- {
- if(k1==0){ //按下KEY1時(shí),切換溫度上下限設(shè)置方向
- Delay(5);
- while(k1==0);
- flag=~flag;
- }
- Disp_Temperature();//顯示溫度
- Delay(500);
-
- get_1302(time_1302);//獲取時(shí)間
- change(); //時(shí)間轉(zhuǎn)換
-
- gotoxy(8,2);
- LCD_display(times);//顯示時(shí)間
- }
- }
- //溫度轉(zhuǎn)換顯示函數(shù)
- void Disp_Temperature() //顯示溫度
- {
- uint a,b,c,d,e,m;
- e=ReadTemperature(); //獲取溫度值
- a=e/1000; //計(jì)算得到十位數(shù)
- b=e/100-a*10; //計(jì)算得到個(gè)位數(shù)字
- d=e%10; //計(jì)算得到小數(shù)點(diǎn)后兩位
- c=(e%100)/10; //計(jì)算得到小數(shù)點(diǎn)后一位
- m=e/100;
-
- //溫度不在范圍內(nèi)報(bào)警
- 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()
- {
- // 時(shí) 間 的 轉(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ù)字溫度計(jì).rar
(148.36 KB, 下載次數(shù): 72)
2022-12-2 15:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|