#include "reg52.h"http://頭文件 #include "intrins.h" #define uchar unsigned char//宏定義 #define uint unsigned int//宏定義 sbit led_7=P1^7;//;;;LED秒閃爍 sbit DQ=P2^2;////定義I/O的硬件接口--溫度 uchar code temp[4][8]= {{40,92,34,152,2,0,0,132}, //張 {40,42,193,186,2,0,0,77}, //江 {40,153,209,186,2,0,0,111}, //斌 {40,14,151,7,3,0,0,137}}; //云 sbit beep=P3^6; sbit rs=P3^5; sbit lcden=P3^4; sbit key1=P2^4; sbit key2=P2^5; uchar table1[8]={0}; uchar fuhao; uchar count=1; void delay1(uchar x2)//經(jīng)精準(zhǔn)計算,該段程序1次延時時間為 19.53us;多次調(diào)用需要重新計算。 { while(x2>0) { x2--; } } void delay3(uint t) { while(t--); } void DB18B20_init()//DB18B20復(fù)位 { DQ=1; delay1(1);//程序1次延時時間為 19.53us DQ=0; delay1(110);//程序110次延時時間為 965.71us DQ=1; delay1(1);//程序1次延時時間為 19.53us while(DQ==1); if(DQ==0) led_7=~led_7;//led檢測復(fù)位正常否,如果DB18B20存在,且正常;led閃爍。 while(DQ==0); delay1(20);//程序20次延時時間為 197.32us } void write_DB18B20(uchar m1)//寫DB18B20 { uchar i,m2; for(i=0;i<8;i++) { m2=m1; m2=m2&0x01; DQ=0; _nop_(); DQ=1; if(m2==0x01) DQ=1; else DQ=0; delay1(5);//程序5次延時時間為 54.25us m1=m1>>1; DQ=1; } } //從總線上取1 個字節(jié) uchar read_byte(void) { uchar i; uchar value=0; for(i=8;i>0;i--) { DQ=1; value>>=1; DQ=0;nop_();_nop_(); //2 us DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us if(DQ)value|=0x80; delay3(6); //66 us } DQ=1; return(value); } void delay2(uint z) //延時函數(shù) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com)//液晶寫命令 { rs=0; //指令選通 lcden=0; P0=com; //送指令 delay2(5); lcden=1; delay2(5); lcden=0; } void write_date(uchar date)//液晶寫數(shù)據(jù) { rs=1; //數(shù)據(jù)選通 lcden=0; //液晶使能信號 P0=date; //送數(shù)據(jù) delay2(5); lcden=1; delay2(5); lcden=0; } void init() //初始化函數(shù) { lcden=0; write_com(0x38); //設(shè)置顯示模式 write_com(0x0c); // 不顯示光標(biāo) write_com(0x06);// 地址指針自動加1 write_com(0x01);// 顯示開始清屏 write_com(0x80); // 設(shè)置數(shù)據(jù)指針 write_date(0x35); } void write_sfm(uchar date) //寫數(shù)據(jù) { uchar bai,shi,ge; bai=date/100; shi=date%100/10; ge=date%10; if(bai==0) { write_date(0x30+shi); write_date(0x30+ge); } else { write_date(0x30+bai); write_date(0x30+shi); write_date(0x30+ge); } } void display(uchar dis) { write_com(0x80+0x40); write_date(0x30+dis+1); if(fuhao==1) { write_com(0x80+0x40+5); write_date(0x2d); } else write_com(0x80+0x40+5); write_sfm(table1[2*dis]); write_date(0x2e); write_sfm(table1[2*dis+1]); } void read_tmper(uchar tt) { uint twork; uchar i_s; uint zhenshu,xiaoshu; DB18B20_init(); delay1(10); write_DB18B20(0xcc); write_DB18B20(0x44); delay1(20); DB18B20_init(); delay1(10); write_DB18B20(0x55); for(i_s=0;i_s<8;i_s++) { write_DB18B20(temp[tt][i_s]); } write_DB18B20(0xbe); table1[2*tt]=read_byte(); table1[2*tt+1]=read_byte(); twork=table1[2*tt+1]; twork<<=8; twork=twork|table1[2*tt]; if(twork&0x0800) { fuhao=1; twork=~twork; zhenshu=twork>>4; zhenshu=zhenshu&0x007f; table1[2*tt]=zhenshu; xiaoshu=twork&0x000f; xiaoshu=xiaoshu*625/100; table1[2*tt+1]=xiaoshu; } else { fuhao=0; zhenshu=twork>>4; zhenshu=zhenshu&0x007f; table1[2*tt]=zhenshu; xiaoshu=twork&0x000f; xiaoshu=xiaoshu*625/100; table1[2*tt+1]=xiaoshu; } } void keyscan() { if(key1==0) { while(!key1); count++; if(count==5) count=1; } if(key2==0) { while(!key2); count--; if(count==0) count=4; } } void alarm() { if((table1[3]>50&&count==0)||(table1[3]>10&&fuhao==1&&count==0)) { beep=~beep; } if((table1[3]>50&&count==1)||(table1[3]>10&&fuhao==1&&count==1)) { beep=0; delay1(100); beep=1; } if((table1[3]>50&&count==2)||(table1[3]>10&&fuhao==1&&count==2)) { beep=0; delay1(50); beep=1; delay1(50); beep=0; delay1(50); beep=1; } if((table1[3]>50&&count==3)||(table1[3]>10&&fuhao==1&&count==3)) { beep=0; delay1(70); beep=1; delay1(70); beep=0; } } void main() { init(); while(1) { read_tmper(0); read_tmper(1); read_tmper(2); read_tmper(3); display(count-1); keyscan(); alarm(); } }