DS18B20温度传感器测温通过数码管显示(上传)_第1页
DS18B20温度传感器测温通过数码管显示(上传)_第2页
DS18B20温度传感器测温通过数码管显示(上传)_第3页
DS18B20温度传感器测温通过数码管显示(上传)_第4页
DS18B20温度传感器测温通过数码管显示(上传)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DS18B20温度传感器测温通过数码管显示(详尽版)/*- 名称:DS18B20温度传感器数码管显示 编写:JR 日期:2017.12 修改:无 内容:利用DS18B20温度传感器测量温度-40+100,通过数码管显示单片机开发板使用“金容电子(-*/#include<reg52.h>#include<stdio.h>#include<intrins.h>#include"delayus.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P22; /温度传感器信号线

2、sbit dula=P26; /数码管段选线sbit wela=P27; /数码管位选线sbit beep=P23; /数码管位选线uint temper;uchar a1,a2,a3,a4,a5,n;uint aaa,num;uint warn_l=3000; /低温-40报警,测试温度乘以100uint warn_h=10000; /高温100报警,测试温度乘以100float ttt;void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5);const uchar table=0x3f,0x0

3、6,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x40,0x00;/不带小数点0-9编码const uchar table1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef; /带小数点0-9编码uchar data temp_data2=0x00,0x00; /读出温度暂放void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);/*18B20复位初始化函数1、将数据线拉高到12、延时2us(该时间要求不是很严格,但是要尽可能

4、短一点)3、将数据线拉低到04、延时750us(该时间范围可以在480960us)5、将数据线拉高到16、延时等待(70us),如果初始化成功则在1560us内产生一个由18B20返回的低电平0,据该状态可以确定它的存在。但是应注意,不能无限的等待,不然会使程序进入死循环,所以要进行超时判断。7、若CPU读到数据线上的低电平0后,还要进行延时,其延时时间从发出高电平算起(第5步的时间算起最少要480us)。8、将数据线再次拉高到1后结束*/void dsreset()uchar st=1;DQ=1; /拉高数据线_nop_();_nop_();while(st)DQ=0; /控制器向DS18B

5、20发低电平脉冲delayus(81); /延时750us左右DQ=1; /控制器拉高总线delay70us(); /延时70usif(DQ=1)st=1;else st=0;delayus(54); /延时500us等待/*向DS18B20写一个字节函数1、将数据线置低电平02、延时15us3、按从低位到高位的顺序发送数据(一次只发送一位)4、延时45us5、将数据线拉高到16、重复15步骤,直到发送完整个字节7、最后将数据线拉高到1*/void tempwritebyte(uchar date)uchar i,temp;DQ=1; /因为写之前需要置0,所以先置为高电平_nop_();_n

6、op_(); for(i=8;i>0;i-) /一位一位的写 temp=date&0x01; /取数据最低位DQ=0;delay20us(); /延时20usif(temp=1) /判断数据为1还是0DQ=1; /如果为1则发送1,即DQ=1;如果是0则保持,因为之前DQ已经置为0,所以不用判断。delay45us(); DQ=1;date=date>>1; /*读1个字节数据函数1、将数据线拉高到12、延时2us3、将数据线拉低到04、延时6us5、将数据线拉高到16、延时4us7、读数据线的状态得到一个状态位,并进行数据处理。8、延时30us9、重复17步骤,直到

7、读取完一个字节(一个字节共8位需要循环8次)。*/uchar tempread() /uchar为带返回值的函数,void不带uchar i,date;static bit j; /定义静态变量 位for(i=8;i>0;i-)date=date>>1; /读出的数据最低位在最前面,这样刚好一个字节在date里DQ=1; /将数据线拉高到1_nop_();_nop_(); /延时2usDQ=0; /将数据线拉低到0_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/延时6usDQ=1; /将数据线拉高到1_nop_();_nop_

8、();_nop_();_nop_();/延时4usj=DQ;if(j=1)date=date|0x80;/1000 0000delay30us();return(date);void get_tem()dsreset(); /复位tempwritebyte(0xCC); /跳过ROMtempwritebyte(0x44); /温度转换dsreset(); /每次操作ROM之前要先复位,然后执行跳过或其他指令tempwritebyte(0xCC);tempwritebyte(0xBE); /读暂存器 temp_data0=tempread(); /第0位,温度值低8位;RAM共9个字节,从0开始

9、自动读temp_data1=tempread(); /第1位,温度值高8位aaa=temp_data1;aaa<<=8;aaa=aaa|temp_data0; / 两字节合成一个整型变量。work_aaa()n=0;if(aaa>63488) / 温度值正负判断63448=1111 1000 0000 0000aaa=65536-aaa;n=1; / 负温度求补码,标志位置1ttt=aaa*6.25; /0.0625*100=6.25temper=(int)ttt;a1=temper/10000; /对1000求模,取万位a2=temper%10000/1000; /对100

10、00求余对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);else disp(11,11,10,a3,a4,a5);else /正温度if(ttt>warn_h) /超温报警beep=0;delay

11、(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);void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5)wela=1;P0=0xFE;wela=0;dula=1;P0=tablenum0;/显示第一个数码管显示'-'号dula=0;de

12、lay(2);wela=1;P0=0xFD;wela=0;dula=1;P0=tablenum1;/显示第二个数码管dula=0;delay(2);wela=1;P0=0xFB;wela=0;dula=1;P0=tablenum2;/显示第三个数码管dula=0;delay(2);wela=1;P0=0xF7;wela=0;dula=1;P0=table1num3;/显示第四个数码管dula=0;delay(2);wela=1;P0=0xEF;wela=0;dula=1;P0=tablenum4;/显示第五个数码管dula=0;delay(2);wela=1;P0=0xDF;wela=0;du

13、la=1;P0=tablenum5;/显示第六个数码管dula=0;delay(2);void disp1(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5)wela=1;P0=0xFE;wela=0;dula=1;P0=tablenum0;/显示第一个数码管显示'-'号dula=0;delay(2);wela=1;P0=0xFD;wela=0;dula=1;P0=tablenum1;/显示第二个数码管dula=0;delay(2);wela=1;P0=0xFB;wela=0;dula=1;P0=

14、tablenum2;/显示第三个数码管dula=0;delay(2);wela=1;P0=0xF7;wela=0;dula=1;P0=tablenum3;/显示第四个数码管dula=0;delay(2);wela=1;P0=0xEF;wela=0;dula=1;P0=tablenum4;/显示第五个数码管dula=0;delay(2);wela=1;P0=0xDF;wela=0;dula=1;P0=tablenum5;/显示第六个数码管dula=0;delay(2);void main()uchar j;get_tem();for(j=0;j<10;j+)wela=1;P0=0x00;w

15、ela=0;dula=1;P0=tablej;/显示第一个数码管显示'-'号delay(500);dula=0;while(1)get_tem();work_aaa();/* 程序名; _delayus_h_* 功 能: DS18B20的c51编程头文件 * 编程者:ZPZ* 编程时间:2017/1 * 说 明:us延时程序 */#ifndef _delayus_h_/定义头文件#define _delayus_h_#define uint unsigned int /变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned charvoi

16、d delayus(uint t) /t=54时,延时500us;t=81时延时745us while(t-);void delay15us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void delay20us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_n

17、op_();void delay30us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void delay45us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop

18、_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void delay70us() _nop_();_nop_();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论