|
- 該溫度檢測系統(tǒng)可直接測溫,測溫范圍為-125-+125度,還可以時時對不同時刻的溫度進行手動采樣,待采樣完成后,可以將采樣溫度一一讀出,也可進行定時采樣,例如間隔1秒采樣溫度一次,采樣開始有指示燈亮,采樣結(jié)束指示燈滅,停止采樣,一一讀出數(shù)據(jù)。
- 源程序
- #include<reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit lcdrs=P1^1;
- sbit lcdrw=P1^2;
- sbit lcden=P1^3;
- sbit DQ = P3^7;
- sbit JL=P3^0;
- sbit DT=P3^1;
- sbit DS=P3^2;
- sbit LED=P3^3;
- uchar code table0[]=" RUI LOVE YING";
- uchar unm,temp,temp1,temp2,temp3,kk=0,s,tt=0;
- uchar temp00,temp01,temp02,temp03,temp04,temp05,temp06,temp07,temp08,temp09;
- uchar xs00,xs01,xs02,xs03,xs04,xs05,xs06,xs07,xs08,xs09;
- /*************精確延時函數(shù)*****************/
- void delay(unsigned char i)
- {
- while(--i);
- }
- /******************************************
- 此延時函數(shù)針對的是12Mhz的晶振
- delay(0):延時518us 誤差:518-2*256=6
- delay(1):延時7us (原帖寫"5us"是錯的)
- delay(10):延時25us 誤差:25-20=5
- delay(20):延時45us 誤差:45-40=5
- delay(100):延時205us 誤差:205-200=5
- delay(200):延時405us 誤差:405-400=5
- *******************************************/
- /*****************DS18B20******************/
- void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command
- {
- DQ = 1; //DQ復(fù)位,不要也可行。
- delay(1); //稍做延時
- DQ = 0; //單片機拉低總線
- delay(250); //精確延時,維持至少480us
- DQ = 1; //釋放總線,即拉高了總線
- delay(100); //此處延時有足夠,確保能讓DS18B20發(fā)出存在脈沖。
- }
- uchar Read_One_Byte() //讀取一個字節(jié)的數(shù)據(jù)read a byte date
- //讀數(shù)據(jù)時,數(shù)據(jù)以字節(jié)的最低有效位先從總線移出
- {
- uchar i = 0;
- uchar dat = 0;
- for(i=8;i>0;i--)
- {
- DQ = 0; //將總線拉低,要在1us之后釋放總線
- //單片機要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會有效。
- _nop_(); //至少維持了1us,表示讀時序開始
- dat >>= 1; //讓從總線上讀到的位數(shù)據(jù),依次從高位移動到低位。
- DQ = 1; //釋放總線,此后DS18B20會控制總線,把數(shù)據(jù)傳輸?shù)娇偩上
- delay(1); //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序后的15us內(nèi)的最后部分
- if(DQ) //控制器進行采樣
- {
- dat |= 0x80; //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0
- }
- delay(10); //此延時不能少,確保讀時序的長度60us。
- }
- return (dat);
- }
- void Write_One_Byte(uchar dat)
- {
- uchar i = 0;
- for(i=8;i>0;i--)
- {
- DQ = 0; //拉低總線
- _nop_(); //至少維持了1us,表示寫時序(包括寫0時序或?qū)?時序)開始
- DQ = dat&0x01; //從字節(jié)的最低位開始傳輸
- //指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),
- //因為15us后DS18B20會對總線采樣。
- delay(10); //必須讓寫時序持續(xù)至少60us
- DQ = 1; //寫完后,必須釋放總線,
- dat >>= 1;
- delay(1);
- }
- }
- uint Get_Tmp() //獲取溫度get the temperature
- {
- uchar a,b;
- Init_Ds18b20(); //初始化
- Write_One_Byte(0xcc); //忽略ROM指令
- Write_One_Byte(0x44); //溫度轉(zhuǎn)換指令
- Init_Ds18b20(); //初始化
- Write_One_Byte(0xcc); //忽略ROM指令
- Write_One_Byte(0xbe); //讀暫存器指令
- a = Read_One_Byte(); //讀取到的第一個字節(jié)為溫度LSB
- b = Read_One_Byte(); //讀取到的第一個字節(jié)為溫度MSB
- temp1 = b<<4;
- temp3=(a&0xf0)>>4;
- temp=temp1+temp3;
- temp2=(a&0x0f)*0.0625*100;
- return temp;
- }
- void delay1(int z)
- {
- int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--) ;
- }
- void writen_com(uchar com)
- {
- lcdrs=0;
- P2=com;
- delay1(5);
- lcden=1;
- delay1(5);
- lcden=0;
- }
-
- void writen_date(uchar date)
- {
- lcdrs=1;
- P2=date;
- delay1(5);
- lcden=1;
- delay1(5);
- lcden=0;
- }
- void writen_sfm(uchar add,uchar date)
- {
- uchar bai,shi,ge;
- bai=date/100;
- shi=date%100/10;
- ge=date%10;
- writen_com(0x80+0x40+add);
- writen_date(0x30+bai);
- writen_date(0x30+shi);
- writen_date(0x30+ge);
- }
- void writen_sfm1(uchar add,uchar date)
- {
- uchar shi,ge;
-
- shi=date/10;
- ge=date%10;
- writen_com(0x80+0x40+add);
- writen_date(0x30+shi);
- writen_date(0x30+ge);
- }
- void main();
- void xianshi_temp()
- {
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('0');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs00);
- writen_sfm(2,temp00);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('1');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs01);
- writen_sfm(2,temp01);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('2');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs02);
- writen_sfm(2,temp02);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('3');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs03);
- writen_sfm(2,temp03);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('4');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs04);
- writen_sfm(2,temp04);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('5');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs05);
- writen_sfm(2,temp05);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('6');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs06);
- writen_sfm(2,temp06);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('7');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs07);
- writen_sfm(2,temp07);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('8');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs08);
- writen_sfm(2,temp08);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- writen_com(0x01);
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- writen_date('9');
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- while(DT)
- {
- writen_sfm1(6,xs09);
- writen_sfm(2,temp09);
- }
- if(DT ==0)
- {
- delay(5);
- if(DT==0)
- {
- while(!DT);
- s=0;
- main();
- }}}}}}}}}}}}}}}}}}}}}}
- }
- void record_temp()
- {
- if(JL == 0)
- {
- delay(5);
- if(JL == 0)
- {
- while(!JL);
- switch(s)
- {
- case 0:temp00=Get_Tmp(),xs00=temp2;break;
- case 1:temp01=Get_Tmp(),xs01=temp2;break;
- case 2:temp02=Get_Tmp(),xs02=temp2;break;
- case 3:temp03=Get_Tmp(),xs03=temp2;break;
- case 4:temp04=Get_Tmp(),xs04=temp2;break;
- case 5:temp05=Get_Tmp(),xs05=temp2;break;
- case 6:temp06=Get_Tmp(),xs06=temp2;break;
- case 7:temp07=Get_Tmp(),xs07=temp2;break;
- case 8:temp08=Get_Tmp(),xs08=temp2;break;
- case 9:temp09=Get_Tmp(),xs09=temp2;break;
- }
- s++;
- if(s==10)
- s=0;
- }
- }
- }
- void init()
- {
- temp00=temp01=temp02=temp03=temp04=temp05=temp06=temp07=temp08=temp09=0;
- xs00=xs01=xs02=xs03=xs04=xs05=xs06=xs07=xs08=xs09=0;
- s=0;
- LED=1;
- lcden=0;
- lcdrw=0;
- writen_com(0x38);
- writen_com(0x0c);
- writen_com(0x06);
- writen_com(0x80);
- for(unm=0;unm<14;unm++)
- {
- writen_date(table0[unm]);
- }
- writen_com(0x80+0x40+0x05);
- writen_date('.');
- }
- void main()
- {TMOD=0X01; //定時器工作方式設(shè)定
- TH0=(65536-50000)/256; //設(shè)定定時初值50MS
- TL0=(65536-50000)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- TR0=1;
- init();
- while(1)
- {
- xianshi_temp();
- record_temp();
- writen_sfm1(6,temp2);
- writen_sfm(2,Get_Tmp());
- }
- }
- void time0() interrupt 1 //定時器0
- {
- if(DS==0)
- {
- delay(5);
- if(DS==0)
- {
- LED=0;
- if(tt==4)
- {
- tt=0;
- switch(s)
- {
- case 0:temp00=Get_Tmp(),xs00=temp2;break;
- case 1:temp01=Get_Tmp(),xs01=temp2;break;
- case 2:temp02=Get_Tmp(),xs02=temp2;break;
- case 3:temp03=Get_Tmp(),xs03=temp2;break;
- case 4:temp04=Get_Tmp(),xs04=temp2;break;
- case 5:temp05=Get_Tmp(),xs05=temp2;break;
- case 6:temp06=Get_Tmp(),xs06=temp2;break;
- case 7:temp07=Get_Tmp(),xs07=temp2;break;
- case 8:temp08=Get_Tmp(),xs08=temp2;break;
- case 9:temp09=Get_Tmp(),xs09=temp2;break;
- }
- s++;
- if(s==10)
- {s=0;
- LED=1;
- while(!DS);
- }}}}
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- Get_Tmp();
- tt++;
- }
復(fù)制代碼
|
|