|
采用ds18b20溫度傳感器,將實(shí)時(shí)溫度與預(yù)設(shè)溫度進(jìn)行比較,若實(shí)時(shí)溫度低于預(yù)設(shè)溫度,則控制電阻絲進(jìn)行加熱,若實(shí)時(shí)溫度高于預(yù)設(shè)溫度,則停止電阻絲加熱,系統(tǒng)溫度在50~100攝氏度范圍內(nèi)可調(diào),溫度控制精度±0.5攝氏度。
我主程序的最后用if語句將實(shí)時(shí)溫度與預(yù)設(shè)溫度比較,但是用proteus仿真后,P3.1口一直輸出低電平,發(fā)現(xiàn)if語句好像沒有起作用,每次都直接執(zhí)行else語句。下面是我的程序和proteus電路圖。
51hei截圖20210427162136.png (46.67 KB, 下載次數(shù): 40)
下載附件
2021-4-27 16:22 上傳
單片機(jī)源程序如下:
- #include"reg51.h"
- #define uint unsigned int
- #define uchar unsigned char
- uchar code smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管段選定義
- uchar code smg_duan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//數(shù)碼管段選定義(小數(shù)點(diǎn))
- uchar code smg_wei[]={0xf7,0xfb,0xfd,0xfe};//數(shù)碼管位選定義
- sbit key1=P1^0;//輸入設(shè)定溫度50度
- sbit key2=P1^1;//輸入設(shè)定溫度75度
- sbit key3=P1^2;//輸入設(shè)定溫度100度
- sbit key4=P1^3;//增加2度
- sbit key5=P1^4;//減少2度
- sbit key6=P1^5;//增加0.5度
- sbit key7=P1^6;//減少0.5度
- sbit key8=P1^7;//確認(rèn)鍵
- float setH=0;//預(yù)設(shè)溫度上限
- float setL=0;//預(yù)設(shè)溫度下限
- uint bkey;
- sbit DQ=P3^0;//18b20 I/O口定義
- sbit jiare=P3^1;//加熱電阻絲I/O口定義
- /***********1ms延時(shí)函數(shù)********/
- void delay_1ms(uint i)
- {
- while(i--);
- }
- /***********小延時(shí)函數(shù)**********/
- void delay_small(uint q)
- {
- while(q--);
- }
- /**********18b20初始化函數(shù)*******/
- void Init_18b20()
- {
- bit q;
- DQ=1;//把總線拉高
- delay_small(1);//15us
- DQ=0;//給復(fù)位脈沖
- delay_small(80);//750us
- DQ=1;//把總線拉高,等待
- delay_small(10);//110us
- q=DQ;//讀取18b20初始化信號(hào)
- delay_small(20);//200us
- DQ=1;//把總線拉高,釋放總線
- }
- /**********寫18b20數(shù)據(jù)******/
- void write_18b20(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=dat&0x01;//向18b20總線寫數(shù)據(jù)
- delay_small(5);//60us
- DQ=1;//釋放總線
- dat>>=1;
- }
- }
- /*********讀18b20數(shù)據(jù)******/
- uchar read_18b20()
- {
- uchar i,r_dat;
- for(i=0;i<8;i++)
- {
- DQ=0;
- r_dat>>=1;//讀數(shù)據(jù)從低位開始
- DQ=1;//釋放總線
- if(DQ==1)
- r_dat|=0x80;
- delay_small(5);//60us
- }
- return r_dat;//返回?cái)?shù)據(jù)
- }
- /**********讀取實(shí)時(shí)溫度數(shù)值*******/
- uint read_Tem()
- {
- uint r_high;
- uchar r_low;
- Init_18b20();//初始化18b20
- write_18b20(0xcc);//跳過64位ROM
- write_18b20(0x44);//啟動(dòng)一次溫度轉(zhuǎn)換命令
- delay_small(50);//500us
- Init_18b20();//初始化18b20
- write_18b20(0xcc);//跳過64位ROM
- write_18b20(0xbe);//發(fā)出讀取暫存器命令
- EA=0;//關(guān)總中斷
- r_low=read_18b20();//讀溫度低字節(jié)
- r_high=read_18b20();//讀溫度高字節(jié)
- EA=1;//開總中斷
- r_high<<=8;//把溫度的高字節(jié)左移8位
- r_high|=r_low;//把讀出的溫度低位放到r_high的低八位中
- r_high*=0.625;//轉(zhuǎn)換到溫度值小數(shù)
- return r_high;//返回讀出的溫度
- }
- /**********數(shù)碼管顯示溫度函數(shù)(實(shí)時(shí)顯示)******/
- void DisplayTem(uint temperature)
- {
- uint a,b;
- P0=0x00;
- P2=smg_wei[0];//位選小數(shù)位
- P0=smg_duan[temperature%10];//段選顯示小數(shù)位
- delay_1ms(2300);
- P0=0x00;
- P2=smg_wei[1];//位選個(gè)位
- P0=smg_duan1[temperature/10%10];//段選顯示個(gè)位
- delay_1ms(2300);
- P0=0x00;
- P2=smg_wei[2];//位選十位
- P0=smg_duan[temperature/100%10];//段選顯示十位
- delay_1ms(2300);
- P0=0x00;
- b=temperature/1000%10;
- if(b==0)
- {
- a=0;
- }
- else
- {
- a=1;
- }
- switch(a)
- {
- case(0):break;
- case(1):P2=smg_wei[3];//位選百位
- P0=smg_duan[temperature/1000%10];//段選顯示百位
- delay_1ms(2300);
- P0=0x00;
- break;
- }
-
- }
- void keyscan()
- {
- bkey=0;
- if(!key1)
- {
- delay_1ms(3000);
- if(!key1)
- bkey=1;
- }
- if(!key2)
- {
- delay_1ms(3000);
- if(!key2)
- bkey=2;
- }
- if(!key3)
- {
- delay_1ms(3000);
- if(!key3)
- bkey=3;
- }
- if(!key4)
- {
- delay_1ms(8000);
- if(!key4)
- bkey=4;
- }
- if(!key5)
- {
- delay_1ms(8000);
- if(!key5)
- bkey=5;
- }
- if(!key6)
- {
- delay_1ms(8000);
- if(!key6)
- bkey=6;
- }
- if(!key7)
- {
- delay_1ms(8000);
- if(!key7)
- bkey=7;
- }
- if(!key8)
- {
- delay_1ms(8000);
- if(!key8)
- bkey=8;
- }
- }
- /***********數(shù)碼管顯示函數(shù)(按鍵顯示)******/
- void displaytem1(float temperature1)
- {
- do
- {
- uint b;
- float c;
- P0=0x00;
- P2=smg_wei[0];//位選小數(shù)位
- c=temperature1*10;
- P0=smg_duan[(int)c/1%10];//段選顯示小數(shù)位
- delay_1ms(1325);
- P0=0x00;
- P2=smg_wei[1];//位選個(gè)位
- P0=smg_duan1[(int)temperature1/1%10];//段選顯示個(gè)位
- delay_1ms(1325);
- P0=0x00;
- P2=smg_wei[2];//位選十位
- P0=smg_duan[(int)temperature1/10%10];//段選顯示十位
- delay_1ms(1325);
- P0=0x00;
- b=(int)temperature1/100%10;
- switch(b)
- {
- case(0):break;
- case(1):P2=smg_wei[3];//位選百位
- P0=smg_duan[1];//段選顯示百位
- delay_1ms(1325);
- P0=0x00;
- break;
- }
- keyscan();
- }
- while(bkey==0);
- }
- void main()
- {
- uint temperature;
- jiare=0;
- do
- {
- keyscan();
- switch(bkey)
- {
- case(0):break;
- case(1):setH=50.0;
- setL=50.0;
- displaytem1(50.0);
- break;
- case(2):setH=75.0;
- setL=75.0;
- displaytem1(75.0);
- break;
- case(3):setH=100.0;
- setL=100.0;
- displaytem1(100.0);
- break;
- case(4):setH=setH+2.0;
- setL=setL+2.0;
- displaytem1(setH);
- break;
- case(5):setH=setH-2.0;
- setL=setL-2.0;
- displaytem1(setH);
- break;
- case(6):setH=setH+0.5;
- setL=setL+0.5;
- displaytem1(setH);
- break;
- case(7):setH=setH-0.5;
- setL=setL-0.5;
- displaytem1(setH);
- break;
- case(8):P0=0x00;
- break;
- }
- }
- while(bkey<8);
- while(1)
- {
- temperature=read_Tem();//讀出溫度的值
- DisplayTem(temperature);//顯示實(shí)時(shí)溫度
- if(temperature<setH)
- {
- jiare=1;
- }
- else
- {
- jiare=0;
- }
- }
-
- }
復(fù)制代碼
|
|