|
該系統(tǒng)為基于51單片機(jī)的智能溫控器,采用了DS18b20溫度傳感器和4位數(shù)碼管顯示。
捕獲.JPG (137.86 KB, 下載次數(shù): 77)
下載附件
2020-6-11 21:40 上傳
低溫報警.JPG (144.96 KB, 下載次數(shù): 77)
下載附件
2020-6-11 21:40 上傳
捕獲1.JPG (93.19 KB, 下載次數(shù): 91)
下載附件
2020-6-11 21:40 上傳
單片機(jī)源程序如下:
- #include "reg52.h"
- #include "absacc.h"
- unsigned char code tab[]={0X3F,0X24,0X5D,0X75,0X66,0X73,0X7B,0X25,0X7F,0X77,0X40}; //共陰 (cc)
- sbit DQ=0xb7; //c51與DS18B20通信口
- sbit P07=0x87; //小數(shù)點
- sbit RED=0x97; //高溫報警燈
- sbit GREEN=0x96; //低溫報警燈
- sbit SET=0x90; //以下按鈕設(shè)置
- sbit NEXT=0x91;
- sbit REDUCE=0x92;
- sbit ADD=0x93;
- unsigned char tempL=0; //溫度低八位
- unsigned char tempH=0; //溫度高八位
- float temperature; //顯示溫度值
- float temperatureH=30,temperatureL=10; //報警溫度
- int tH=0,tL=0;//報警狀態(tài),1為關(guān)閉
- int m,k=1,l,keyon,keytype,out=0;//設(shè)置報警溫度時使用的中間變量
- void delay(unsigned int time)
- {
- while(time--);
-
- }
- void display(float k) //顯示溫度
- {
- if(k>=0) //正溫度顯示
- {
- P2=0xfe;
- P0=tab[(int)(k/100)];
- delay(260);
- P0=0x00;
- }
- else //負(fù)溫度顯示負(fù)號
- {
- k=-k;
- P2=0xfe;
- P0=0x40;
- delay(260);
- P0=0x00;
- }
- P2=0xfd; //溫度十位顯示
- P0=tab[(((int)k)%100)/10];
- delay(260);
- P0=0x00;
- P2=0xfb; //溫度個位顯示
- P0=tab[((int)k)%10];
- P07=1;
- delay(260);
- P0=0x00;
- P2=0xf7; //溫度一位小數(shù)顯示
- P0=tab[((int)(k*10))%10];
- delay(260);
- P0=0x00;
- }
- Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ=1;
- delay(8);
- DQ=0;
- delay(85);
- DQ=1;
- delay(14);
- x=DQ;
- delay(20);
- }
- ReadOneChar(void)
- {
- /* unsigned char i=0;
- unsigned char dat=0;
- for (i=8;i>0;i--)
- {
- DQ=1;
- delay(1);
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ) dat|=0x80;
- delay(4);
- }
- return(dat);*/
-
- unsigned char i,dat=0;
- DQ = 1;
- //_nop_();
- delay(1);
- for(i=0;i<8;i++)
- {
- DQ = 0;
- delay(1);
- dat >>= 1;
- DQ = 1;
- delay(1);
- if(DQ)
- dat |= 0X80;
- delay(30);
- DQ = 1;
- }
- return dat;
-
-
- }
- WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay(5);
- DQ=1;
- dat>>=1;
-
- }
- delay(4);
- }
- ConversionTemperature()
- {
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0x44);
- delay(20);
- }
- ReadTemperature(void)
- {
- char ctempL,ctempH;
-
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0xbe);
- tempL=ReadOneChar();
- tempH=ReadOneChar();
- if(tempH<0xf8) //溫度是否小于零
- temperature=((tempH*256)+tempL)* 0.0625;//大于零
- if (temperature>temperatureH,tH=-1);
- if (temperature<temperatureL,tL=-1);
- else
- {
- ctempL=tempL;
- ctempH=tempH;
- temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
- temperature=-temperature;
- }
- delay(200);
- return(temperature);
- }
- ///////////////////////////報警設(shè)置顯示/////////////////////////
- void Display2()
- { ///////////////////高溫報警顯示////////////////////
- if(m==0||m==1)
- {
- P2=0xfe;
- P0=0x6e;
- delay(70);
- P0=0x00;
- if(m==0&&k==-1) delay(70);
- else
- {
- if(tH==1)
- {
- P2=0xfd;
- P0=0x4b;
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfd;
- P0=0x3f;
- delay(70);
- P0=0x00;
- }
- }
- if(m==1&&k==-1) delay(100);
- else
- {
- if(temperatureH>=0)
- {
- P2=0xfb;
- P0=tab[(int)(temperatureH/10)];
- delay(70);
- P0=0x00;
- P2=0xf7;
- P0=tab[(int)(temperatureH)%10];
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfb;
- P0=0x40; //////顯示負(fù)號
- delay(70);
- P0=0x00;
- P2=0xf7;
- P0=tab[(int)(-temperatureH)%10];
- delay(70);
- P0=0x00;
- }
- }
- }
- //////////////////////////////////////////////////
- ///////////////////低溫報警顯示//////////////////
- else if(m==2||m==3)
- {
- P2=0xfe;
- P0=0x1a;
- delay(70);
- P0=0x00;
- if(m==2&&k==-1) delay(70);
- else
- {
- if(tL==1)
- {
- P2=0xfd;
- P0=0x4b;
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfd;
- P0=0x3f;
- delay(70);
- P0=0x00;
- }
- }
- if(m==3&&k==-1) delay(100);
- else
- {
- if(temperatureL>=0)
- {
- P2=0xfb;
- P0=tab[(int)(temperatureL/10)];
- delay(70);
- P0=0x00;
- P2=0xf7;
- P0=tab[(int)(temperatureL)%10];
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfb;
- P0=0x40; ////顯示負(fù)號
- delay(70);
- P0=0x00;
- P2=0xf7;
- P0=tab[(int)(-temperatureL)%10];
- delay(70);
- P0=0x00;
- }
-
- }
- }
- ///////////////////////////////////////////////////////
- if(l==200){k=-k;l=0;}
- l++;
- }
- /////////////////////////////報警設(shè)置顯示結(jié)束///////////////////////////////////
- ////////////////////////////////報警設(shè)置/////////////////////////////////////////
- void seting()
- {
- if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1); //無鍵盤按下
- else /////有鍵盤按下時
- {
- keyon=1;
- if(SET==0)keytype=0;
- if(NEXT==0)keytype=1;
- if(REDUCE==0)keytype=2;
- if(ADD==0)keytype=3;
- }
- if(keyon==1&&SET==1&&NEXT==1&&REDUCE==1&&ADD==1) //鍵盤松開后判斷鍵盤狀態(tài)
- {
- if(keytype==1)////////////////菜單下翻
- {
- if(m>=3)m=0;
- else m++;
- }
- if(keytype==2) ////////////////加操作
- {
- if(m==0)tH=-tH;
- if(m==1)
- {
- if(temperatureH>(temperatureL+1)) temperatureH--;
- else temperatureH=99;
- }
- if(m==2)tL=-tL;
- if(m==3)
- {
- if(temperatureL>-9) temperatureL--;
- else temperatureL=(temperatureH-1);
- }
- }
- if(keytype==3) ////////////////減操作
- {
- if(m==0)tH=-tH;
- if(m==1)
- {
- if(temperatureH<99) temperatureH++;
- else temperatureH=(temperatureL+1);
- }
- if(m==2)tL=-tL;
- if(m==3)
- {
- if(temperatureL<(temperatureH-1)) temperatureL++;
- else temperatureL=-9;
- }
- }
- if(keytype==0) ///////////跳出溫度設(shè)置
- {
- keyon=0;
- keytype=4;
- out=1;
- }
- keyon=0;
- keytype=4;
- }
- }
- /////////////////////////////報警設(shè)置結(jié)束/////////////////////////////////////////
- void main()
- {
- P1=0XFF;
- while(1)
- {
- ConversionTemperature();//開始溫度轉(zhuǎn)換
- ReadTemperature( );
-
- display(temperature);//顯示溫度
- if(SET==0) /////////////////////////進(jìn)入報警溫度設(shè)定
- {
- out=0;
- delay(300);
- while(SET==0);
- m=0;
- l=0;
- keyon=0;
- keytype=4;
- while(1)
- {
- Display2();
- seting();
- if (out==1)break;
- }
- delay(200);
- while(SET==0);
- }
- if(tH==1)RED=1;
- else if(tH==-1&&temperature>=temperatureH) RED=0; //////滿足條件是開啟高溫報警
- else if(temperature<(temperatureH-0.9))RED=1;
- if(tL==1)GREEN=1;
- if(tL==-1&&temperature<=temperatureL) GREEN=0;//////滿足條件時開啟低溫報警
- else if(temperature>(temperatureL+1)) GREEN=1;
- ReadTemperature();//讀取溫度
- display(temperature);//顯示溫度
-
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
仿真圖.zip
(31.78 KB, 下載次數(shù): 41)
2020-6-11 21:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
完整程序.zip
(5.3 KB, 下載次數(shù): 38)
2020-6-11 21:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|