DS18B20温度传感器测温通过数码管显示上传汇总Word文件下载.docx

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

DS18B20温度传感器测温通过数码管显示上传汇总Word文件下载.docx

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

DS18B20温度传感器测温通过数码管显示上传汇总Word文件下载.docx

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>

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

6、重复1~5步骤,直到发送完整个字节

7、最后将数据线拉高到1

voidtempwritebyte(uchardate)

uchari,temp;

//因为写之前需要置0,所以先置为高电平

for(i=8;

i>

i--)//一位一位的写

{

temp=date&

0x01;

//取数据最低位

delay20us();

//延时20us

if(temp==1)//判断数据为1还是0

DQ=1;

//如果为1则发送1,即DQ=1;

如果是0则保持,因为之前DQ已经置为0,所以不用判断。

delay45us();

date=date>

>

1;

}

读1个字节数据函数

2、延时2us

4、延时6us

6、延时4us

7、读数据线的状态得到一个状态位,并进行数据处理。

8、延时30us

9、重复1~7步骤,直到读取完一个字节(一个字节共8位需要循环8次)。

uchartempread()//uchar为带返回值的函数,void不带

uchari,date;

staticbitj;

//定义静态变量位

i--)

//读出的数据最低位在最前面,这样刚好一个字节在date里

//将数据线拉高到1

_nop_();

//延时2us

//将数据线拉低到0

//延时6us

////将数据线拉高到1

//延时4us

j=DQ;

if(j==1)

date=date|0x80;

//10000000

delay30us();

return(date);

voidget_tem()

dsreset();

//复位

tempwritebyte(0xCC);

//跳过ROM

tempwritebyte(0x44);

//温度转换

//每次操作ROM之前要先复位,然后执行跳过或其他指令

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>

num--)

if(n==1)//负温度

if(ttt>

warn_l)//超温报警

{

beep=0;

delay(100);

beep=1;

}

if(a2!

=0)disp(11,10,a2,a3,a4,a5);

elsedisp(11,11,10,a3,a4,a5);

else//正温度

warn_h)//超温报警

}

if(a1==0&

&

a2==0)disp(11,11,11,a3,a4,a5);

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);

P0=0xFD;

P0=table[num1];

//显示第二个数码管

P0=0xFB;

P0=table[num2];

//显示第三个数码管

P0=0xF7;

P0=table1[num3];

//显示第四个数码管

P0=0xEF;

P0=table[num4];

//显示第五个数码管

P0=0xDF;

P0=table[num5];

//显示第六个数码管

dula=0

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

当前位置:首页 > 幼儿教育 > 唐诗宋词

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

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