标题:
注释详细的51单片机读取DS18B20温度C语言源代码
[打印本页]
作者:
青年
时间:
2020-9-16 15:18
标题:
注释详细的51单片机读取DS18B20温度C语言源代码
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbit DQ=P3^7;
bdata uchar dat;
sbit dat0=dat^0;
sbit dat7=dat^7;
uchar dp[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xbf,0xff};
uchar dbuf[4]={0,0,0,0x12};
void disp(void)
{
uchar i,n,bsel;
bsel=0x01;
for(n=0;n<4;n++)
{
P2=0xf0|bsel;
P0=segtab[dbuf[n]];
if(n==1)P0=P0&0x7f;
bsel=_crol_(bsel,1);
for(i=1;i<200;i++);
P0=0xff;
}
}
void delay15(uchar n) //15us????
{ do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
n--;
}while(n);
}
bit reset(void) //初始化DS18B20
{
bit err;
DQ=0; //在数据线上产生600US低电平
delay15(40);
DQ=1; //数据线电平拉高
delay15(4); //延时60us
err=DQ; //将读数据线状态,如果为低则复位成功
delay15(18); // 如果数据线为高则复位不成功
return(err);
}
void wrbyte(uchar d) //单片机向DS18B20发送一个字节的命令
{
uchar i;
dat=d;
for(i=8;i>0;i--) //循环写入8位
{
DQ=0; //数据低电平产生15us
delay15(1);
DQ=dat0; //将当前数据为送至数据总线
dat=dat>>1; //将下一位要写入的数据移到最低位
delay15(1); //延时15us
DQ=1; //数据线拉高为写入下一位做准备
}
}
uchar rdbyte(void) //从DS18B20读取一个字节数据
{
uchar i;
dat=0; //读取数据初始值要为0
for(i=8;i>0;i--) //循环读取8位(先低后高)
{
dat=dat>>1; //读出数据线右移一位
DQ=0; //产生1us负脉冲
_nop_();
DQ=1; // 产生15us高电平
delay15(1);
dat7=DQ; // 读取到数据放入暂存·
delay15(4); // 延时,为读取下一位做准备
}
return(dat); //将读取到的温度值返回给单片机
}
void convert(void) //启动DS18B20开始温度转换
{
bit err;
err=reset(); //先复位温度传感器
wrbyte(0xcc); //由于我们本次只用了一个温度传感器,则这里跳过传感器的识别
wrbyte(0x44); //启动温度传感器
}
int readt(void)//读取DS18B20暂存器中的值
{
uchar h,l;
bit err;
err=reset(); //复位温度传感器
wrbyte(0xcc);//跳过多传感器识别
wrbyte(0xbe);//读暂存指令
l=rdbyte(); //读取温度低位
h=rdbyte(); //读取温度高位
return(h*256+l); //返回读取到的温度
}
void format(int t)//将读取到的温度值转换为带一位小数的BCD码格式送至缓存区,并灭掉高位0
{
bit zf; // 正负标记,0正数;1负数
zf=0;
if(t<0) //如果温度在0度以下
{
zf=1; //置为负数标志
t=-t; //求补码
}
dbuf[0]=dp[t&0x0f]; //求出温度的小数
t=t>>4; //移掉小数部分
if(t==0xff)t=99; //字节扩展
dbuf[3]=t/100; //求出百位
t=t%100;
dbuf[2]=t/10; //求出十位
dbuf[1]=t%10; // 求出个位
if(zf==1) //如果是负数
{
if(dbuf[2]==0) // 如果十位为零
{
dbuf[3]=0x13; //显示格式为“-x.x"
dbuf[2]=0x12;
}
else // 如果十位不为零
dbuf[3]=0x12; //显示格式为“-xx.x"
}
else //如果是正数
{
if(dbuf[3]==0) //如果百位,十位都为零
{
if(dbuf[2]==0) //显示格式为x.x
dbuf[2]=0x13; //如果只有百位为零
dbuf[3]=0x13; //显示格式为xx.x
}
}
}
main()
{
int temp; //保存测量的温度值
while(1)
{
temp=0;
convert(); //启动温度转换
temp=readt(); // 读取温度值
format(temp); //将温度值转换为BCD码送至显缓区
disp();
}
}
复制代码
DS18B20.7z
2020-9-21 15:02 上传
点击文件名下载附件
下载积分: 黑币 -5
19.7 KB, 下载次数: 29, 下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1