基于DS18B20传感器的数字温度计设计

上传人:我*** 文档编号:132114221 上传时间:2020-05-12 格式:DOC 页数:10 大小:278.50KB
返回 下载 相关 举报
基于DS18B20传感器的数字温度计设计_第1页
第1页 / 共10页
基于DS18B20传感器的数字温度计设计_第2页
第2页 / 共10页
基于DS18B20传感器的数字温度计设计_第3页
第3页 / 共10页
基于DS18B20传感器的数字温度计设计_第4页
第4页 / 共10页
基于DS18B20传感器的数字温度计设计_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《基于DS18B20传感器的数字温度计设计》由会员分享,可在线阅读,更多相关《基于DS18B20传感器的数字温度计设计(10页珍藏版)》请在金锄头文库上搜索。

1、电路实物图如下图所示:电路原理图如下图所示:C语言程序如下所示:/* 程序名; 基于DS18B20的测温系统* 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;在调节上下限* 温度模式下,K2是实现加1功能,K1是实现减1功能,K3是用来设定上下限温* 度正负的。 * 编程者:ZPZ* 编程时间:2009/10/2 */#include#include#defin

2、e uint unsigned int #define uchar unsigned charuchar max_int=0x00,max_dot=0x00,min_int=0x00,min_dot=0x00;bit s=0,s1=0; #includeds18b20.h#includekeyscan.h#includedisplay.h/*主函数*/void main() beer=0; led=1; IT1=1; EX1=0; EA=1; timer1_init(0); get_temperature(1); while(1) keyscan(); get_temperature(0);

3、keyscan(); display(temp,temp_d*0.625); alarm(); keyscan(); /* 程序名; _ds18b20_h_* 功 能: DS18B20的c51编程头文件 * 编程者:ZPZ* 编程时间:2009/10/2 * 说 明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d * (测得的温度小数部分),标志位f(测量温度的标志位0表示“正温度”1表* 示“负温度”),标志位f_max(上限温度的标志位0表示“正温度”、1表* 示“负温度”),标志位f_min(下限温度的标志位0表示“正温度”、1表* 示“负温度”),标志位

4、w(报警标志位1启动报警0关闭报警)。 */#ifndef _ds18b20_h_#define _ds18b20_h_#define uint unsigned int #define uchar unsigned charsbit DQ= P23;sbit beer=P30; sbit led=P31;uchar temp=0; /温度的整数部分uchar temp_d=0; /温度的小数部uchar n;bit f=0,f_max=0,f_min=0;w=0;/*延时子函数*/void ds18b20_delayus(uint t) while(t-);void ds18b20_dela

5、yms(uint t)uint i,j;for(i=t;i0;i-) for(j=120;j0;j-);/*ds18b20初始化函数*(*/void ds18b20_init()/ DS18B20初始化 DQ=1;DQ=0; /控制器向DS18B20发低电平脉冲ds18b20_delayus(30); /延时480sDQ=1;/控制器拉高总线,while(DQ); /等待DS18B20拉低总线,在60-240s之间ds18b20_delayus(20);/延时,等待上拉电阻拉高总线DQ=1;/提升数据线,准备数据传输;/*ds18b20字节读函数*/uchar ds18b20_read() /

6、DS18B20 字节读取uchar i;uchar d = 0;DQ = 1;/准备读;for(i=8;i0;i-) d = 1; /低位先发;DQ = 0;_nop_();_nop_();_nop_();DQ = 1;/必须写1,否则读出来的将是不预期的数据;if(DQ)/在12us处读取数据;d |= 0x80;ds18b20_delayus(10);return d;/*ds18b20字节写函数*/void ds18b20_write(uchar d)/ ds18b20字节写 uchar i; for(i=8;i0;i-) DQ=0; _nop_(); _nop_(); _nop_();

7、 DQ=d&0x01; ds18b20_delayus(5); DQ=1; d = 1; /*获取温度函数*/ void get_temperature(bit f) /得到整数的温度值uchar a=0,b=0,c=0,d=0; uint i;ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc);/向DS18B20发SKIP ROM命令ds18b20_write(0x44);/启动DS18B20进行温度转换,结果存入内部RAMds18b20_delayms(1);ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc

8、); /向DS18B20发SKIP ROM命令ds18b20_write(0xbe);/读内部RAM中9字节的内容命令a=ds18b20_read();/读内部RAM (LSB)b=ds18b20_read();/读内部RAM (MSB)if(f=1) max_int=ds18b20_read();/读内部RAM (LSB) min_int=ds18b20_read();if(max_int&0x80)=0x80)f_max=1;max_int=(max_int-0x80); if(min_int&0x80)=0x80)f_min=1;min_int=(min_int-0x80); i=b;i

9、=4;if (i=0) f=0; /i为0,正温度,设立正温度标记 temp=(a4)|(b4)|(b4);/整数部分 a=(a&0x0f);/小数部分 temp_d=a; void store_t() if(f_max=1)max_int=max_int+0x80;if(f_min=1)min_int=min_int+0x80; ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20发SKIP ROM命令ds18b20_write(0x4e);ds18b20_write(max_int);ds18b20_write(min_int)

10、;ds18b20_write(0xff);ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20发SKIP ROM命令ds18b20_write(0x48); /*温度超限报警函数*/ void alarm() if(f_max=0) if(f_min=0) if(f=0) if(temp+temp_d*0.0625)=max_int) w=1;TR1=1; if(temp+temp_d*0.0625)min_int) w=0; if(f=1)w=1;TR1=1; if(f_min=1) if(f=0) if(temp+temp_d*0.0625)=max_int) w=1;T

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 事务文书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号