DS18B20温度传感器测温通过数码管显示上传汇总.docx

上传人:b****2 文档编号:1233730 上传时间:2022-10-19 格式:DOCX 页数:18 大小:696.03KB
下载 相关 举报
DS18B20温度传感器测温通过数码管显示上传汇总.docx_第1页
第1页 / 共18页
DS18B20温度传感器测温通过数码管显示上传汇总.docx_第2页
第2页 / 共18页
DS18B20温度传感器测温通过数码管显示上传汇总.docx_第3页
第3页 / 共18页
DS18B20温度传感器测温通过数码管显示上传汇总.docx_第4页
第4页 / 共18页
DS18B20温度传感器测温通过数码管显示上传汇总.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

DS18B20温度传感器测温通过数码管显示上传汇总.docx

《DS18B20温度传感器测温通过数码管显示上传汇总.docx》由会员分享,可在线阅读,更多相关《DS18B20温度传感器测温通过数码管显示上传汇总.docx(18页珍藏版)》请在冰豆网上搜索。

DS18B20温度传感器测温通过数码管显示上传汇总.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1