
程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P1^3;//ds18b20 端口
unsigned char code table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};// 显示段码值0~9
unsigned char code table2[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0x0,0x10};// 显示段码值0~9带点
unsigned char code table3[]={0x08,0x04,0x02,0x01};//分别对应相应的数码管点亮,即位码
unsigned char TempData[4]; //存储显示值的全局变量
//延时程序
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void ys(uint tt)
{
uint xx,yy;
for(xx=tt;xx>0;xx--)
for(yy=110;yy>0;yy--);
}
//延时程序结束
//DS18B20温度读取函数
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ复位
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;
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
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;
DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
DelayUs2x(25);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
//DS18B20温度读取函数结束
void Display()
{
unsigned int TempH,TempL,temp;
temp=ReadTemperature();
if(temp&0x8000)
{
TempData[0]=0xbf;//负号标志
temp=~temp; // 取反加1
temp +=1;
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
if((TempH/100==0)&&((TempH%100)/10==0))//消隐
TempData[1]=0xff;
else
TempData[1]=table[(TempH%100)/10]; //十位温度
TempData[2]=table2[(TempH%100)%10]; //个位温度,带小数点
TempData[3]=table[TempL];
}
else
{
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
if(TempH/100==0)
TempData[0]=0xff;
else
TempData[0]=table[TempH/100]; //十位温度
if((TempH/100==0)&&((TempH%100)/10==0))//消隐
TempData[1]=0xff;
else
TempData[1]=table[(TempH%100)/10]; //十位温度
TempData[2]=table2[(TempH%100)%10]; //个位温度,带小数点
TempData[3]=table[TempL];
}
}
void main()
{
uint aa;
while(1)
{
Display();
for(aa=0;aa<4;aa++)
{
P2=table3[aa];
P0=TempData[aa];
ys(4);
P0=0XFF;
}
}
}
[查看全文]