#include
#include
#define _Nop() _nop_() /*定义空指令*/
sbit D18B20=P3^7;
sbit k1=P1^5;
unsigned char flag;
unsigned char u,d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void TempDelay (unsigned char us)
{
while(us--);
}
void Init18b20 (void)
{
D18B20=1;
_nop_();
D18B20=0;
TempDelay(80); //delay 530 uS//80
_nop_();
D18B20=1;
TempDelay(14); //delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(D18B20==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(20); //20
_nop_();
_nop_();
D18B20 = 1;
}
/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (unsigned char wr) //单字节写入
{
unsigned char idata i;
for (i=0;i<8;i++)
{
D18B20 = 0;
_nop_();
D18B20=wr&0x01;
TempDelay(3); //delay 45 uS //5
_nop_();
_nop_();
D18B20=1;
wr >>= 1;
}
}
/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
unsigned char ReadByte (void) //读取单字节
{
unsigned char idata i;
for(i=0;i<8;i++)
{
D18B20 = 0;
u >>= 1;
D18B20 = 1;
if(D18B20==1)
u |= 0x80;
TempDelay (2);
_nop_();
}
return(u);
}
main()
{unsigned char a,b,c,j;
while(1)
{
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0x44); //保存设定值
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0xbe); //read Temperature//回调设定值
a=ReadByte();
b=ReadByte();
a=a>>4;
b=b<<4;
c=a+b;
if(c>30)
k1=0;
else
k1=1;
for(j=0;j<250;j++)
{
P0=d[c/10];
P2=0xe3;
TempDelay(100);
P0=d[c%10];
P2=0xe7;
TempDelay(100);
}
}
}
主程序如下:
ORG 0000H
AJMP MAIN
MAIN: MOV R0,#00H
ACALL XIANS 调用显示子程序
ACALL DELAY 延时1S子程序
INC @RO 数时加1
AJMP MAIN 返回循环
显示子程序可以用LED静态显示方式!注意要根据显示子程序改变延时的长短以提高计时的精度!延时应该不到1S,要在提高精度的话就要计算延时程序的用时了,注意用几个LED才可以编与之对应的显示子程序!
你的串号我已经记下,采纳后我会帮你制作