#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)//經精準計算,該段程序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();
}
}