#include "reg52.h"//头文件 #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)//经精准计算,该段程序1次延时时间为 19.53us;多次调用需要重新计算。 { while(x2>0) { x2--; } } void delay3(uint t) { while(t--); } void DB18B20_init()//DB18B20复位 { 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检测复位正常否,如果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 个字节 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) //延时函数 { 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)//液晶写数据 { rs=1; //数据选通 lcden=0; //液晶使能信号 P0=date; //送数据 delay2(5); lcden=1; delay2(5); lcden=0; } void init() //初始化函数 { lcden=0; write_com(0x38); //设置显示模式 write_com(0x0c); // 不显示光标 write_com(0x06);// 地址指针自动加1 write_com(0x01);// 显示开始清屏 write_com(0x80); // 设置数据指针 write_date(0x35); } void write_sfm(uchar date) //写数据 { 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(); } }