#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit p34=P2^4;
sbit p35=P2^5 ;
sbit p36=P2^6;
sbit dp=P0^7;
sbit p37=P2^7;
sbit DQ=P2^2;
sbit SET=P3^1;
sbit LING=P2^0;
signed char m;
bit sign=0;
signed char shangxian=38;
signed char xiaxian=6;
uchar code
LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
/****延时子程序******/
void Delay(uint i)
{
while(i--);
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;
Delay(8);
DQ=0;
Delay(80);
DQ=1;
Delay(14);
x=DQ;
Delay(20);
}
/*******读一个字节****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ);
dat|=0x80;
Delay(4);
}
return(dat);
}
/*****写一个字节******/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
void Tmpchange(void)
{
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
}
/********读取温度********/
unsigned char ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Tmpchange();
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*100+0.5;
return(t);
}
/*********显示开机初始化等待画面********/
Disp_init()
{
P0=0x80;
p34=1;
p35=0;
p36=0;
p37=0;
Delay(200);
P0=0x80;
p34=0;p35=1;p36=0;p37=0;
Delay(200);
P0=0x80;
p34=0;p35=0;p36=1;p37=0;
Delay(200);
P0=0x80;
p34=0;p35=0;p36=0;p37=1;
Delay(200);
P0=0x80;
}
/*********显示温度子程序********/
Disp_Temperature()
{
uint a,b,c,d,e;
e=ReadTemperature();
a=e/1000;
b=e/100-a*10;
d=e%10;
c=(e%100)/10;
m=e/100;
if(m>shangxian||m<xiaxian)
LING=1;
else
LING=0 ;
p34=0;p35=0;p36=0;p37=0;
P0=LEDData[d];
p34=1;p35=0;p36=0;p37=0;
Delay(300);
p34=0;p35=0;p36=0;p37=0;
P0=LEDData[c];
p34=0;p35=1;p36=0;p37=0;
Delay(300);
p34=0;p35=0;p36=0;p37=0;
P0=LEDData[b];
dp=0;
p34=0;p35=0;p36=1;p37=0;
Delay(300);
p34=0;p35=0;p36=0;p37=0;
P0=LEDData[a];
p34=0;p35=0;p36=0;p37=1;
Delay(300);
p34=0;p35=0;p36=0;p37=0;
}
disptiaozheng()
{
uchar f,g,j,k;
f=shangxian/10;
g=shangxian%10;
j=xiaxian/10;
k=xiaxian%10;
p34=0;p35=0;p36=0;p37=0;
P0=0xc0;
p34=1;p35=0;p36=0;p37=0;
Delay(200);
p34=0;p35=0;p36=0;p37=0;
P0=0xc0;
p34=0;p35=1;p36=0;p37=0;
Delay(200);
p34=0;p35=0;p36=0;p37=0;
if(SET==1)
{
P0=LEDData[g];
dp=0;
}
else
{
P0=LEDData[k];
dp=0;
}
p34=0;p35=0;p36=1;p37=0;
Delay(200);
p34=0;p35=0;p36=0;p37=0;
if(SET==1)
P0=LEDData[f];
else
{
if(f==0)
P0=0x00;
else
P0=LEDData[j];
}
p34=0;p35=0;p36=0;p37=1;
Delay(200);
p34=0;p35=0;p36=0;p37=0;
Delay(200);
}
/********外部中断0服务程序****/
void int0(void) interrupt 0
{
EX0=0;
sign=1;
if(SET==1)
shangxian++;
else
xiaxian++;
Delay(500);
EX0=1;
}
/********外部中断1服务程序*********/
void int1(void) interrupt 1
{
EX1=0;
if(SET==1)
shangxian--;
else
xiaxian--;
Delay(500);
EX1=1;
}
/******主函数********/
void main(void)
{
uint z;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
ReadTemperature();
LING=0;
for(z=0;z<100;z++)
{
Disp_init();
}
while(1)
{
Disp_Temperature();
if(sign==1)
{
for(z=0;z<300;z++)
disptiaozheng();
sign=0;
}
}
}
|