帮楼主贴出来代码如下:
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define Led P0
sbit Line = P3 ^ 7;
sbit L1 = P2 ^ 2;
sbit L2 = P2 ^ 3;
sbit L3 = P2 ^ 4;
u8 zifu[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void delay(u16 i)
{
while (i--)
;
}
void delay_10us()
{
u8 a, b;
for (a = 1; a > 0; a--)
for (b = 1; b > 0; b--)
;
}
void delay_100us()
{
u8 a, b;
for (a = 10; a > 0; a--)
for (b = 10; b > 0; b--)
;
}
u8 init() //初始化时序
{
u8 i = 0;
Line = 0;
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
Line = 1;
delay_10us();
delay_10us();
delay_10us();
delay_10us();
while (Line)
{
delay_10us();
delay_10us();
delay_10us();
i++;
if (i > 16)
return 0;
}
return 1;
}
void sendbyte(u8 dat) //写时序
{
u8 i;
for (i = 0; i < 8; i++)
{
Line = 0;
_nop_();
_nop_();
Line = dat & 0x01;
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
Line = 1;
_nop_();
_nop_();
dat >>= 1;
}
}
u8 readbyte() //读时序
{
u8 i = 0, dat = 0;
for (i = 0; i < 8; i++)
{
Line = 0;
_nop_();
_nop_();
Line = 1;
_nop_();
_nop_();
delay_10us();
dat <<= 1;
dat |= Line;
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
}
return dat;
}
u16 gettemp() //转化为具体的温度数字
{
u16 tmp = 0;
u16 c = 2047;
u8 tl, th;
init(); // 复位
sendbyte(0xcc); //skip rom
sendbyte(0x44); //转换命令
delay_10us();
init(); //
sendbyte(0xcc);//
sendbyte(0xbe);//读存储器命令
delay_10us();
tl = readbyte();
th = readbyte();
//以下是数据处理,我用官方的程序比对过了,没有问题,出问题的在上面与 ds18b20 通信上
tmp = th;
tmp << 8;
tmp |= tl;
tmp &= c;
tmp *= 6.25;
return tmp;
}
void printled(u16 dat)
{
u8 q = dat / 1000;
u8 b = dat % 1000 / 100;
u8 s = dat % 100 / 10;
u8 g = dat % 10;
L1 = L2 = L3 = 1;
Led = zifu[q];
delay(100);
Led = 0;
L3 = L2 = 1;
L1 = 0;
Led = zifu[b];
delay(100);
Led = 0;
L3 = L1 = 1;
L2 = 0;
Led = zifu[s];
delay(100);
Led = 0;
L3 = 1;
L2 = L1 = 0;
Led = zifu[g];
delay(100);
Led = 0;
}
void main()
{
L1 = L2 = L3 = 1;
Led = zifu[8];
while (1)
{
printled(gettemp());
}
} |