#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,shi,ge;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
// 显示段码值0123456789
void DelayUs2x(uchar t);
void DelayMs(uchar t);
bit Init_DS18B20(void);
sbit DQ=P3^2;
sbit dula=P2^0;
sbit wela=P2^1;
uchar ReadOneChar(void);
void WriteOneChar(uchar dat);
void display(uchar a,b,c);
uint ReadTemperature(void);
void main()
{
while(1)
{
temp=ReadTemperature();
temp=temp>>4;
shi=temp/10;
ge=temp%10;
display(shi,ge,0);
}
}
bit Init_DS18B20(void)
{
bit dat;
DQ=1;
DelayUs2x(5);
DQ=0; //
单片机将DQ拉低
DelayUs2x(200); //精确延时 大于 480us 小于960us
DelayUs2x(200);
DQ = 1; //拉高总线
DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲
dat=DQ; //如果x=0则初始化成功, x=1则初始化失败
DelayUs2x(25); //稍作延时返回
return dat;
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
DelayUs2x(33);
}
return(dat);
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
DelayUs2x(33);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
uint ReadTemperature(void)
{
uchar a=0;
uint b=0;
uint t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DelayMs(50);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
void display(uchar a,b,c)
{
while(1)
{
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table[a];
dula=0;
DelayMs(10);
wela=1;
P0=0xfb;
wela=0;
dula=1;
P0=table[b]|0x80;
dula=0;
DelayMs(10);
wela=1;
P0=0xf7;
wela=0;
dula=1;
P0=table[c];
dula=0;
DelayMs(10);
}
}
void DelayUs2x(uchar t)
{
while(--t);
}
void DelayMs(uchar t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
一周热门 更多>