51数码管显示DS18B02传感器温度(12位精度)

![

  1. 在这里插入图片描述

](https://img-blog.csdnimg.cn/20200715201245150.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2N6eTE4MDY2,size_16,color_FFFFFF,t_70)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
#include<reg52.h>
#include<intrins.h> //nop()指令函数调用
sbit du=P2^6;
sbit we=P2^7;
sbit DS=P22;//DS18B20数据脚接P22
bit flag=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9
void delayms(unsigned char a)//毫秒级延时
{unsigned char x,y;
for(x=0;x<a;x++)
for(y=0;y<114;y++);
}
void display(unsigned int a) //数码管显示函数
{ if(flag) //flag=1,表明DS18B20读回来的数字量代表负温度,见倒数第3行代码标记flag=1;
{P0=0xff;//清除乱码
we=1;
P0=0xfe; //第1位数码管阴极打开(数码管为共阴极)
we=0;
P0=0; //上一次P0的值被擦除,以免让数码管显示。
du=1;
P0=0x40;// “负号”显示
du=0;
delayms(10);
flag=0; // 不加这行代码,当读过负温度即flag=1的值将永远为1,测到负温度后,数码管“负号”将一直保留
}

P0=0xff;
we=1;
P0=0xfd;//第2位数码管阴极打开
we=0;
P0=0;
du=1;
if(a>=1000)
P0=table[a/1000]; 	//温度值百位显示,比如-122.5 ,“1”显示在数码管第2位
else
{P0=0; //温度百位不显示,即数码管第二位不显示
}
du=0;
delayms(10);

P0=0xff;
we=1;
P0=0xfb; //第3位数码管阴极打开
we=0;
P0=0;
du=1;
if(a>=100)
P0=table[a%1000/100];
else 
P0=0;
du=0;
delayms(10);

P0=0xff;
we=1;
P0=0xf7;//第4位数码管阴极打开
we=0;
P0=0;
du=1;
P0=table[a%100/10]|0x80;//此位加了小数点
du=0;
delayms(10);

P0=0xff;
we=1;
P0=0xef;//第5位数码管阴极打开
we=0;
P0=0;
du=1;
P0=table[a%10];
du=0;
delayms(10);

}
void delayus(unsigned char us ) //微秒级延时,unsigned char型(0-255)
{while(us–);
}
bit DS_Init( )//参考芯片手册看每一步的延时时间范围,以下延迟时间均在范围内
{ bit i;
DS=1;
nop(); //缓冲1us左右
DS=0;
delayus(75);//756.5+11.9=499.4us,自行在11.0592MHZ下Debug测试延迟时间,while(us–)单步6.5us,跳出11.9us
DS=1;//释放总线
delayus(4); //6.5
4+11.9=37.9us
i=DS;
delayus(23); //23*6.5+11.9=161.4us
DS=1;//释放总线
nop();//缓冲1us左右
return (i);
}

void DS_WriteByte(unsigned char dat )
{unsigned char i;
for(i=0;i<8;i++)
{DS=0;
nop(); //缓冲1us左右
DS=dat&0x01;
delayus(15);//156.5+11.9=109.4us
dat>>=1;
DS=1;
nop(); //缓冲1us左右
}
}
unsigned char DS_ReadByte( )
{ unsigned char i,j,dat;
for(i=0;i<8;i++)
{ DS=0;
nop();
DS=1;//释放总线
nop();//缓冲1us左右
j=DS;
delayus(10);//10
6.5+11.9=76.9us
DS=1;//释放总线
nop();//缓冲1us左右
dat=(j<<7)|(dat>>1);
}
return dat;
}
void main()
{unsigned char h,l;
unsigned int digital;//16位温度数字量
DS_Init( ); //初始化
DS_WriteByte(0xCC);//单设备通信,忽略ROM指令
DS_WriteByte(0x4E);//写暂存器指令
DS_WriteByte(0x3b);//1、写暂存器第一个字节,任意写,因为没有相关程序驱动硬件报警
DS_WriteByte(0x53);//2、暂存器第一个字节,任意写,因为没有报警相关程序驱动硬件报警
DS_WriteByte(0x7F);//3、配置温度寄存器工作精度为12位,这个可以自行配置
DS_Init( ); //初始化
DS_WriteByte(0xCC);//单设备通信,忽略ROM指令
DS_WriteByte(0x48);// 写拷贝指令将上述3个字节非指令数据复制到EEPROM,掉电保存
while(1)
{ DS_Init( ); //初始化
DS_WriteByte(0xCC);//单设备通信,忽略ROM指令
DS_WriteByte(0x44);//发送要读取温度指令
DS_Init( ); //初始化
DS_WriteByte(0xCC);//单设备通信,忽略ROM指令
DS_WriteByte(0xBE);//发送要读暂存器的指令
l=DS_ReadByte( ); // 先读低8位,暂存器第一个字节
h=DS_ReadByte( ); // 再读高8位,暂存器第二个字节
digital=h;
digital<<=8;
digital=digital|l;
if(digital>=0x800)
{digital=~digital+1;
flag=1;
}
digital=digital0.062510+0.5;
display(digital);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值