单片机中使用DS18B20温度传感器C语言程序_第1页
单片机中使用DS18B20温度传感器C语言程序_第2页
单片机中使用DS18B20温度传感器C语言程序_第3页
单片机中使用DS18B20温度传感器C语言程序_第4页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、/带小数点数字编码学习资料收集于网络,仅供参考单片机中使用DS18B20 温度传感器C 语言程序(参考1)/* *DS18B20 测温程序硬件: AT89S52(1) 单线 ds18b20 接 P2.2(2) 七段数码管接 P0 口(3) 使用外部电源给 ds18b20 供电,没有使用寄生电源软件: Kei uVision 3* */#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P22;sbit dula=

2、P26;sbit wela=P27;uchar flag ;uint temp;/参数 temp 一定要声明为int 型uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/ 不带小数点数字编码uchar code table1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;/* 延时函数 */void TempDelay (uchar us)while(us-);void delay(uint co

3、unt) / 延时子函数uint i;while(count)i=200;while(i>0)i-;count-;/* 串口初始化,波特率9600,方式 1 */void init_com()学习资料学习资料收集于网络,仅供参考TMOD=0x20;/ 设置定时器1 为模式 2TH1=0xfd;/ 装初值设定波特率TL1=0xfd;TR1=1;/ 启动定时器SM0=0;/串口通信模式设置SM1=1;/ REN=1;/ 串口允许接收数据PCON=0;/ 波特率不倍频/ SMOD=0;/波特率不倍频/ EA=1;/开总中断/ES=1;/ 开串行中断/* 数码管的显示*/void display

4、(uint temp)uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=tablebai; / 显示百位dula=1;/从 0 到 1,有个上升沿,解除锁存,显示相应段dula=0;/从 1 到 0 再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1);/ 延时约 2msP0=table1shi; / 显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=tablege; / 显示个位dula=1;dula=0;P0=0xf

5、b;wela=1;wela=0;学习资料学习资料收集于网络,仅供参考delay(1);/*时序:初始化时序、读时序、写时序。所有时序都是将主机(单片机 )作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。初始化时序:复位脉冲存在脉冲读;1 或 0时序写;1 或 0时序只有存在脉冲信号是从18b20(从机)发出的,其它信号都是由主机发出的。存在脉冲:让主机(总线)知道从机(18b20)已经做好了准备。*/*-初始化:检测总线控制器发出的复位脉冲和 ds18

6、b20 的任何通讯都要从初始化开始初始化序列包括一个由总线控制器发出的复位脉冲和跟在其后由从机发出的存在脉冲。初始化:复位脉冲+存在脉冲具体操作:总线控制器发出(TX )一个复位脉冲(一个最少保持480s 的低电平信号) ,然后释放总线,进入接收状态 ( RX )。单线总线由5K 上拉电阻拉到高电平。探测到 I/O引脚上的上升沿后DS1820 等待 1560 s,然后发出存在脉冲(一个60240 s的低电平信号) 。具体看 18b20 单线复位脉冲时序和1-wire presence detect " 的时序图-*/void ds_reset(void)ds=1;_nop_();/1

7、usds=0;TempDelay(80); / 当总线停留在低电平超过480us,总线上所以器件都将被复位,这里延/学习资料学习资料收集于网络,仅供参考时约 530us 总 线停留在低电平超过480s,总线上的所有器件都将被复位。_nop_();ds=1;/ 产生复位脉冲后,微处理器释放总线,让总线处于空闲状态,原因查18b20中文资料TempDelay(5); / 释放总线后,以便从机18b20 通过拉低总线来指示其是否在线,/存在检测高电平时间:1560us, 所以延时44us,进行 1-wire presence detect(单线存在检测)_nop_();_nop_();_nop_()

8、;if(ds=0)flag=1;/detect 18b20 successelseflag=0;/detect 18b20 failTempDelay(20);/ 存在检测低电平时间:60240us,所以延时约140us_nop_();_nop_();ds=1;/再次拉高总线,让总线处于空闲状态/*/原理解释:控制器对18B20 操作流程:1 , 复位 : 首先我们必须对 DS18B20 芯片进行复位 , 复位就是由控制器 ( 单片机 )给 DS18B20 单总线至少 480uS 的低电平信号 。 当 18B20 接到此复位信号后则会 在1560uS 后回发一个芯片的存在脉冲。2 , 存在脉冲

9、: 在复位电平结束之后, 控制器应该将数据单总线拉高, 以便于在1560uS 后接收存在脉冲,存在脉冲为一个60240uS 的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20 间的数据通信。/*-读/写时间隙 :DS1820 的数据读写是通过时间隙处理位和命令字来确认信息交换。-*/bit ds_read_bit(void)/读一位bit dat;ds=0;/ 单片机(微处理器)将总线拉低_nop_();/读时隙起始于微处理器将总线拉低至少1usds=1;/拉低总线后接着释放总线,让从机18b20 能够接管总线,输出有效数据_nop_();_nop_();/小延时

10、一下,读取18b20 上的数据,因为从 ds18b20 上输出的数据/在读 " 时间隙 " 下降沿出现15us 内有效dat=ds;/ 主机读从机18b20 输出的数据,这些数据在读时隙的下降沿出现/15us 内有效TempDelay(10);/所有读 "时间隙 " 必须 60120us,这里 77us学习资料学习资料收集于网络,仅供参考return(dat);/返回有效数据原理:图8读时间隙时控制时的采样时间应该更加的精确才行, 读时间隙时也是必须先由主机产生至少1uS 的低电平,表示读时间的起始。随后在总线被释放后的15uS 中DS18B20 会发送

11、内部数据位,这时控制如果发现总线为高电平表示读出“ 1 ” ,如果总线为低电平则表示读出数据“ 0 ” 。每一位的读取之前都由控制器加一个起始信号。注意:如图8 所示,必须在读间隙开始的15uS 内读取数据位才可以保证通信的正确。在通信时是以8 位 “ 0 ” 或 “ 1 ” 为一个字节, 字节的读或写是从高位开始的,即 A7到 A0.字节的读写顺序也是如图2 自上而下的。uchar ds_read_byte(void ) / 读一字节uchar value,i,j;value=0;/一定别忘了给初值for(i=0;i<8;i+)j=ds_read_bit();value=(j<&

12、lt;7)|(value>>1);/ 这一步的说明在一个word 文档里面?return(value);/返回一个字节的数据void ds_write_byte(uchar dat) / 写一个字节uchar i;bit onebit;/一定不要忘了,onebit 是一位for(i=1;i<=8;i+)onebit=dat&0x01;dat=dat>>1;/由低到高传送数据if(onebit)/写 1ds=0;_nop_();_nop_();/ 看时序图,至少延时1us,才产生写 "时间隙 "ds=1;/ 写时间隙开始后的15s内允许数

13、据线拉到高电平学习资料学习资料收集于网络,仅供参考TempDelay(5); / 所有写时间隙必须最少持续60uselse/写 0ds=0;TempDelay(8);/ 主机要生成一个写0 时间隙,必须把数据线拉到低电平并保持至少60s,这里 64usds=1;_nop_();_nop_();/*主机(单片机)控制18B20 完成温度转换要经过三个步骤:学习资料学习资料收集于网络,仅供参考每一次读写之前都要18B20 进行复位操作,复位成功后发送一条 ROM 指令,最后发送 RAM 指令,这样才能对 DS18b20 进行预定的操作。复位要求主 CPU 将数据线下拉 500us,然后释放,当 d

14、s18B20 受到信号后等待 1660us,后发出 60240us 的存在低脉冲,主 CPU 收到此信号表示复位成功*/*-进行温度转换:先初始化然后跳过 ROM :跳过 64 位 ROM 地址,直接向 ds18B20 发温度转换命令,适合单片工作发送温度转换命令-*/void tem_change()ds_reset();delay(1);/约 2msds_write_byte(0xcc);/ 单线情况下,跳跃ROM 指令ds_write_byte(0x44);/ 温度转换指令/*-获得温度:-*/uint get_temperature()float wendu;uchar a,b;ds_

15、reset();delay(1);/约 2msds_write_byte(0xcc);ds_write_byte(0xbe);/ 发送读温度命令a=ds_read_byte();/ 读出温度低8 位b=ds_read_byte();/ 读书温度高8 位temp=b;temp<<=8;temp=temp|a;wendu=temp*0.0625;/ 得到真实十进制温度值,因为DS18B20/ 可以精确到0.0625 度,所以读回数据的最低位代表的是/0.0625 度temp=wendu*10+0.5;/放大十倍,这样做的目的将小数点后第一位/ 也转换为可显示数字,同时进行一个四舍五入操作。return temp;学习资料学习资料收集于网络,仅供参考/*-

温馨提示

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

评论

0/150

提交评论