DS18B20温度传感器测温通过数码管显示上传汇总.docx
《DS18B20温度传感器测温通过数码管显示上传汇总.docx》由会员分享,可在线阅读,更多相关《DS18B20温度传感器测温通过数码管显示上传汇总.docx(18页珍藏版)》请在冰豆网上搜索。
![DS18B20温度传感器测温通过数码管显示上传汇总.docx](https://file1.bdocx.com/fileroot1/2022-10/19/8f78cdf3-d532-44c5-990c-66991ca8795a/8f78cdf3-d532-44c5-990c-66991ca8795a1.gif)
DS18B20温度传感器测温通过数码管显示上传汇总
DS18B20温度传感器测温通过数码管显示(详尽版)
/*-----------------------------------------------
名称:
DS18B20温度传感器数码管显示
编写:
JR
日期:
2017.12
修改:
无
内容:
利用DS18B20温度传感器测量温度-40~+100℃,通过数码管显示单片机开发板使用“金容电子(
------------------------------------------------*/
#include
#include
#include
#include"delayus.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^2;//温度传感器信号线
sbitdula=P2^6;//数码管段选线
sbitwela=P2^7;//数码管位选线
sbitbeep=P2^3;//数码管位选线
uinttemper;
uchara1,a2,a3,a4,a5,n;
uintaaa,num;
uintwarn_l=3000;//低温-40℃报警,测试温度乘以100
uintwarn_h=10000;//高温100℃报警,测试温度乘以100
floatttt;
voiddisp(ucharnum0,ucharnum1,ucharnum2,ucharnum3,ucharnum4,ucharnum5);
constuchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x40,0x00};//不带小数点0-9编码
constuchartable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};//带小数点0-9编码
uchardatatemp_data[2]={0x00,0x00};//读出温度暂放
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************************************************************
18B20复位初始化函数
1、将数据线拉高到1
2、延时2us(该时间要求不是很严格,但是要尽可能短一点)
3、将数据线拉低到0
4、延时750us(该时间范围可以在480~960us)
5、将数据线拉高到1
6、延时等待(70us),如果初始化成功则在15~60us内产生一个由18B20返回的低电平0,
据该状态可以确定它的存在。
但是应注意,不能无限的等待,不然会使程序进入死循环,所以要进行超时判断。
7、若CPU读到数据线上的低电平0后,还要进行延时,其延时时间从发出高电平算起(第5步的时间算起最少要480us)。
8、将数据线再次拉高到1后结束
**********************************************************************/
voiddsreset()
{
ucharst=1;
DQ=1;//拉高数据线
_nop_();_nop_();
while(st)
{
DQ=0;//控制器向DS18B20发低电平脉冲
delayus(81);//延时750us左右
DQ=1;////控制器拉高总线
delay70us();//延时70us
if(DQ==1)st=1;
else
st=0;
delayus(54);//延时500us等待
}
}
/*******************************************************************
向DS18B20写一个字节函数
1、将数据线置低电平0
2、延时15us
3、按从低位到高位的顺序发送数据(一次只发送一位)
4、延时45us
5、将数据线拉高到1
6、重复1~5步骤,直到发送完整个字节
7、最后将数据线拉高到1
**********************************************************************/
voidtempwritebyte(uchardate)
{
uchari,temp;
DQ=1;//因为写之前需要置0,所以先置为高电平
_nop_();_nop_();
for(i=8;i>0;i--)//一位一位的写
{
temp=date&0x01;//取数据最低位
DQ=0;
delay20us();//延时20us
if(temp==1)//判断数据为1还是0
DQ=1;//如果为1则发送1,即DQ=1;如果是0则保持,因为之前DQ已经置为0,所以不用判断。
delay45us();
DQ=1;
date=date>>1;
}
}
/*******************************************************************
读1个字节数据函数
1、将数据线拉高到1
2、延时2us
3、将数据线拉低到0
4、延时6us
5、将数据线拉高到1
6、延时4us
7、读数据线的状态得到一个状态位,并进行数据处理。
8、延时30us
9、重复1~7步骤,直到读取完一个字节(一个字节共8位需要循环8次)。
**********************************************************************/
uchartempread()//uchar为带返回值的函数,void不带
{
uchari,date;
staticbitj;//定义静态变量位
for(i=8;i>0;i--)
{
date=date>>1;//读出的数据最低位在最前面,这样刚好一个字节在date里
DQ=1;//将数据线拉高到1
_nop_();_nop_();//延时2us
DQ=0;//将数据线拉低到0
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//延时6us
DQ=1;////将数据线拉高到1
_nop_();_nop_();_nop_();_nop_();//延时4us
j=DQ;
if(j==1)
date=date|0x80;//10000000
delay30us();
}
return(date);
}
voidget_tem()
{
dsreset();//复位
tempwritebyte(0xCC);//跳过ROM
tempwritebyte(0x44);//温度转换
dsreset();//每次操作ROM之前要先复位,然后执行跳过或其他指令
tempwritebyte(0xCC);
tempwritebyte(0xBE);//读暂存器
temp_data[0]=tempread();//第0位,温度值低8位;RAM共9个字节,从0开始自动读
temp_data[1]=tempread();//第1位,温度值高8位
aaa=temp_data[1];
aaa<<=8;
aaa=aaa|temp_data[0];//两字节合成一个整型变量。
}
work_aaa()
{
n=0;
if(aaa>63488)//温度值正负判断63448=1111100000000000
{
aaa=65536-aaa;
n=1;//负温度求补码,标志位置1
}
ttt=aaa*6.25;//0.0625*100=6.25
temper=(int)ttt;
a1=temper/10000;//对1000求模,取万位
a2=temper%10000/1000;//对10000求余对1000求模,取千位
a3=temper%1000/100;//对1000求余再对100求模,取百位
a4=temper%100/10;//取小数十位
a5=temper%10;//取个位
for(num=100;num>0;num--)
{
if(n==1)//负温度
{
if(ttt>warn_l)//超温报警
{
beep=0;
delay(100);
beep=1;
delay(100);
}
if(a2!
=0)disp(11,10,a2,a3,a4,a5);
elsedisp(11,11,10,a3,a4,a5);
}
else//正温度
{
if(ttt>warn_h)//超温报警
{
beep=0;
delay(100);
beep=1;
delay(100);
}
if(a1==0&&a2==0)disp(11,11,11,a3,a4,a5);
if(a1==0&&a2!
=0)disp(11,11,a2,a3,a4,a5);
if(a1!
=0)disp(11,a1,a2,a3,a4,a5);
}
}
}
voiddisp(ucharnum0,ucharnum1,ucharnum2,ucharnum3,ucharnum4,ucharnum5)
{
wela=1;
P0=0xFE;
wela=0;
dula=1;
P0=table[num0];//显示第一个数码管显示'-'号
dula=0;
delay
(2);
wela=1;
P0=0xFD;
wela=0;
dula=1;
P0=table[num1];//显示第二个数码管
dula=0;
delay
(2);
wela=1;
P0=0xFB;
wela=0;
dula=1;
P0=table[num2];//显示第三个数码管
dula=0;
delay
(2);
wela=1;
P0=0xF7;
wela=0;
dula=1;
P0=table1[num3];//显示第四个数码管
dula=0;
delay
(2);
wela=1;
P0=0xEF;
wela=0;
dula=1;
P0=table[num4];//显示第五个数码管
dula=0;
delay
(2);
wela=1;
P0=0xDF;
wela=0;
dula=1;
P0=table[num5];//显示第六个数码管
dula=0