#include <REG52.H>
#include <MYLIB.H>
sbit DQ = P3^7; //定义DQ引脚
//初始化DS18B20
uchar DS18B20_inint()
{
uchar i = 0;
DQ = 0;
delay_10us(50);
DQ = 1;
while (DQ)
{
delay_10us(1);
i++;
if(i>5)
return 0;
}
return 1;
}
//向DS18B20写入一个字节
void DS18B20_write_byte(uchar date)
{
uchar i;
for (i = 0; i < 8; i++)
{
DQ = 0;
DQ = date&0x01;
delay_10us(6);
DQ = 1;
date >>= 1;
}
}
//在DS18B20读取一个字节
uchar DS18B20_read_byte()
{
uchar i,value;
for (i = 0; i < 8; i++)
{
DQ = 0;
value >>= 1;
DQ = 1;
//delay_10us(1);
if(DQ)
value |= 0x80;
delay_10us(6);
}
return value;
}
//DS18B20获取温度总函数
uint read_temperature()
{
uchar a,b;
uint temp = 0;
DS18B20_inint();
delay_ms(1);
DS18B20_write_byte(0xcc); //跳过ROM操作
DS18B20_write_byte(0x44); //启动温度测量
delay_10us(300);
DS18B20_inint();
delay_ms(1);
DS18B20_write_byte(0xcc); //跳过ROM操作
DS18B20_write_byte(0xbe); //发送读取温度命令
a = DS18B20_read_byte(); //读取低八位
b = DS18B20_read_byte(); //读取高八位
temp = b;
temp <<=8;
temp |= a;
return temp;
}
/* 调用示例 */
//实验现象:前四个数码管显示当前的温度,保留两位小数,四舍五入。
uchar display_temp[10];
void display_smg()
{
uchar i;
for (i = 1; i <= 4; i++)
{
LSA = LSA_NODE1[i];
LSB = LSB_NODE1[i];
LSC = LSC_NODE1[i];
P0 = SMG[display_temp[i]];
if (i==2)
{
P0 = SMG[display_temp[i]]|0x80; //加一个小数点
}
delay_10us(50);
P0 = 0x00;
}
}
void main()
{
uint temp; //注意要使用unit类型,防止溢出
while(1)
{
temp = read_temperature() *0.0625*100 + 0.5;
//乘以0.0625将16进制数转换为10进制数
//乘以100保留两位小数
//加0.5,四舍五入
display_temp[1] = temp/1000;
display_temp[2] = temp%1000/100;
display_temp[3] = temp%100/10;
display_temp[4] = temp%10;
display_smg();
}
}
可能会出现的问题提示
显示15.96------------------------没有正确处理高八位,返回值溢出
显示不正确----------------------初始化错误,温度值溢出