#include <REG51.H>
#include <INTRINS.h>
#define uchar unsigned char
sbit DataLine =P0^0;
sbit PJIaRe=P3^4;
sbit P07=P0^7;
sbit P35=P3^5;
sbit P36=P3^6;
unsigned char XiaoShuWei,GeiWei,ShiWei;
unsigned char TempNow;
unsigned char BaoJingTem=80;
unsigned char JiaReTep=30;
unsigned char TimeCount;
bit Huang;
void Delay500ms(void);
void Delay2ms(void);
void Delay(uchar a);//按键延时程序
void Display(void);
void Cotrol(void);
void KeyScan(void);
uchar code XiaoShu[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
unsigned char DisplayTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x58};
unsigned char DisplayBit[]={0xef,0xdf,0xbf,0x7f};
unsigned char DisplayBuff[4];
//timer init
void initTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0;
}
//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;
if(++TimeCount==60)
{
TimeCount=0;
Huang=!Huang;
}
//add your code here.
}
bit ResetPluse(void)
{
uchar i ;
bit TempDataLine ;
DataLine=0 ;
for(i=255;i>0;i--);//510us
DataLine=1 ;
for(i=50;i>0;i--);//100us
TempDataLine=DataLine ;
for(i=190;i>0;i--);//400US
return(TempDataLine);
}
//写命令
void WriteCommandtoDS18b20(uchar command)
{
uchar i ,j;
for(i=8;i>0;i--)
{
DataLine=0 ;
_nop_();
_nop_();
_nop_();
DataLine=(command&0x01);
for(j=30;j>0;j--);
command>>=1 ;
DataLine=1 ;
}
}
//读取1820送出地数据
uchar ReadDatafromDS18b20(void)
{
uchar i,j,temp ;
TR0=0;
EA=0;
for(i=8;i>0;i--)
{
temp>>=1 ;
DataLine=0 ;
_nop_();
_nop_();
DataLine=1 ;
for(j=4;j>0;j--);
if(DataLine)
{
temp|=0x80 ;
}
else
{
temp|=0x00 ;
}
for(j=20;j>0;j--);
}
return(temp);
TR0=1;
EA=1;
}
//读温度并转换
void TemptureReadAndConvert(void)
{
uchar TempL,TempH,TempX ;
EA=0;
TempL=ReadDatafromDS18b20();//低位
TempH=ReadDatafromDS18b20();//高位
if(TempH&0xf0) //如果温度为负
{
TempH=~TempH ; //取反
TempL=~TempL ;
TempL++;
if(!TempL)
TempH++;
}
else //温度转换 //获得温度值最小单位为0.1摄氏度.
{
TempX=TempL&0x0f;
TempH<<=4 ;
TempL>>=4 ;
TempH |=TempL ;
}
//转换成数码管显示值
XiaoShuWei=XiaoShu[TempX];//小数处理
ShiWei=TempH/10 ;//整数十位
GeiWei=TempH%10 ;//整数个位
TempNow=ShiWei*10+GeiWei;
if(JiaReTep>TempNow)
PJIaRe=0;
else
PJIaRe=1;
if(TempNow>=BaoJingTem)
P07=0;
else
P07=1;
}
void main(void)
{
initTimer();
TR0=1;
ET0=1;
EA=1;
Delay500ms();
while(1)
{
Delay500ms();
while(ResetPluse());//复位并检测1820成功与否。
WriteCommandtoDS18b20(0xcc);//跳过序列号检查
Delay2ms();//延时2ms,准备发送下一个指令
WriteCommandtoDS18b20(0x44);//温度转换命令
Delay500ms();
Delay500ms();
Delay500ms();
while(ResetPluse());//再次复位
WriteCommandtoDS18b20(0xcc); //跳过序列号检查
Delay2ms();//延时2ms,准备读取温度
WriteCommandtoDS18b20(0xBE); //读取温度直到第九字节
Delay2ms();//读取温度命令
TemptureReadAndConvert(); //读取并转换温度
}
}
//延时500 ms
void Delay500ms(void)
{
uchar i=20 ;
while(--i)
{
Display();
KeyScan();
}
}
void Delay(uchar a)
{
unsigned char m;
while(--a)
for(m=200;m>0;m--);
}
//延时2ms
void Delay2ms(void)
{
uchar i ;
while(--i);
}
void Display(void)
{
unsigned char i;
for(i=0;i<4;i++)
{
P1= DisplayTab[DisplayBuff[i]];
P2= DisplayBit[i];
Delay(3);
if(Huang)
{
DisplayBuff[0] = 10;
DisplayBuff[1] = XiaoShuWei;
DisplayBuff[2] = GeiWei;
DisplayBuff[3] = ShiWei;
}
else
{
DisplayBuff[0] = 8;
DisplayBuff[1] = 0;
DisplayBuff[2] = JiaReTep/10;
DisplayBuff[3] = JiaReTep%10;
}
}
}
void KeyScan(void)
{
if(P35==0)
Delay(5);
if(P35==0)
{
EA=0;
TR0=0;
while(P35==0)
Display();
if(++JiaReTep==99)
JiaReTep=0;
EA=1;
TR0=1;
Huang=0;
}
if(P36==0)
Delay(5);
if(P36==0)
{
EA=0;
TR0=0;
while(P36==0)
Display();
if(--JiaReTep==0)
JiaReTep=30;
EA=1;
TR0=1;
Huang=0;
}
}
评论0