单片机18b20c语言程序,单片机中使用DS18B20温度传感器C语言程序.doc

253b171540df25e1b84436cbe50dfc72.gif单片机中使用DS18B20温度传感器C语言程序.doc

单片机中使用 DS18B20 温度传感器 C 语言程序(参考 1) / DS18B20 测温程序 硬件A T89S52 1单线 ds18b20 接 P2.2 2七段数码管接 P0 口 3使用外部电源给 ds18b20 供电,没有使用寄生电源 软件Kei uVision 3 * */ include “reg52.h“ include “intrins.h“ define uchar unsigned char define uint unsigned int sbit dsP22; sbit dulaP26; sbit welaP27; uchar flag ; uint temp; 参数 temp 一定要声明为 int 型 uchar code table0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d, 0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71; 不带小数点数字编码 uchar code table10 xbf,0 x86,0 xdb,0 xcf,0 xe6,0 xed,0 xfd, 0 x87,0 xff,0 xef; 带小数点数字编码 /*延时函数*/ void TempDelay uchar us whileus; void delayuint count 延时子函数 uint i; whilecount i200; whilei0 i; count; /*串口初始化,波特率 9600,方式 1 */ void init_com TMOD0 x20; 设置定时器 1 为模式 2 TH10 xfd; 装初值设定波特率 TL10 xfd; TR11; 启动定时器 SM00; 串口通信模式设置 SM11; REN1; 串口允许接收数据 PCON0; 波特率不倍频 SMOD0; 波特率不倍频 EA1; 开总中断 ES1; 开串行中断 /*数码管的显示 */ void displayuint temp uchar bai,shi,ge; baitemp/100; shitemp100/10; getemp10010; dula0; P0tablebai; 显示百位 dula1; 从 0 到 1,有个上升沿,解除锁存,显示相应段 dula0; 从 1 到 0 再次锁存 wela0; P00 xfe; wela1; wela0; delay1; 延时约 2ms P0table1shi; 显示十位 dula1; dula0; P00 xfd; wela1; wela0; delay1; P0tablege; 显示个位 dula1; dula0; P00 xfb; wela1; wela0; delay1; /* 时序初始化时序、读时序、写时序。 所有时序都是将主机单片机作为主设备,单总 线器件作为从设备。而每一次命令和数据的传输 都是从主机主动启动写时序开始,如果要求单总 线器件回送数据,在进行写命令后,主机需启动 读时序完成数据接收。数据和命令的传输都是低 位在先。 初始化时序复位脉冲 存在脉冲 读;1 或 0 时序 写;1 或 0 时序 只有存在脉冲信号是从 18b20(从机)发出的,其 它信号都是由主机发出的。 存在脉冲让主机(总线)知道从机(18b20)已 经做好了准备。 / /* 初始化检测总线控制器发出的复位脉冲 和 ds18b20 的任何通讯都要从初始化开始 初始化序列包括一个由总线控制器发出的复位脉冲 和跟在其后由从机发出的存在脉冲。 初始化复位脉冲存在脉冲 具体操作 总线控制器发出(TX)一个复位脉冲 (一个最少保持 480s 的低电平信号) ,然后释放总 线, 进入接收状态(RX) 。单线总线由 5K 上拉电阻拉到高电平。探测到 I/O 引脚上的上升沿后 DS1820 等待 1560s,然后发出存在脉冲(一个 60240s 的低电平信号) 。 具体看 18b20 单线复位脉冲时序和 1-wire presence detect “的时序图 -*/ void ds_resetvoid ds1; _nop_; 1us ds0; TempDelay80; 当总线停留在低电平超过 480us,总线上所以器件都将被复位,这里延 时约 530us 总 线停留在低电平超过 480s,总线上的所有器件都将被复位。 _nop_; ds1; 产生复位脉冲后,微处理器释放总线,让总线处于空闲状态,原因查 18b20 中文资料 TempDelay5; 释放总线后,以便从机 18b20 通过拉低总线来指示其是否在线, 存在检测高电平时间 1560us, 所以延时 44us, 进行 1-wire presence detect (单 线存在检测) _nop_; _nop_; _nop_; ifds0 flag1; detect 18b20 success else flag0; detect 18b20 fail TempDelay20; 存在检测低电平时间60240us,所以延时约 140us _nop_; _nop_; ds1; 再次拉高总线,让总线处于空闲状态 原理解释控制器对 18B20 操作流程 1 , 复位 首先我们必须对 DS18B20 芯片进行复位 , 复位就是由控制器 ( 单片机 ) 给 DS18B20 单总线至少 480uS 的低电平信号 。 当 18B20 接到此复位信号后则会 在 1560uS 后回发一个芯片的存在脉冲。 2 , 存在脉冲 在复位电平结束之后 , 控制器应该将数据单总线拉高 , 以便于 在 1560uS 后接收存在脉冲,存在脉冲为一个 60240uS 的低电平信号。至此,通信双方已 经达成了基本的协议,接下来将会是控制器与 18B20 间的数据通信 。 /* 读/写时间隙 DS1820 的数据读写是通过时间隙处理 位和命令字来确认信息交换。 */ bit ds_read_bitvoid 读一位 bit dat; ds0; 单片机(微处理器)将总线拉低 _nop_; 读时隙起始于微处理器将总线拉低至少 1us ds1; 拉低总线后接着释放总线,让从机 18b20 能够接管总线,输出有效数据 _nop_; _nop_; 小延时一下,读取 18b20 上的数据 ,因为从 ds18b20 上输出的数据 在读“时间隙“下降沿出现 15us 内有效 datds; 主机读从机 18b20 输出的数据,这些数据在读时隙的下降沿出现15us 内 有效 TempDelay10; 所有读“时间隙“必须 60120us,这里 77us returndat; 返回有效数据 原理图 8 读时间隙时控制时的采样时间应该更加的精确才行 , 读时间隙时也是必须先由主 机产生至少 1uS 的低电平,表示读时间的起始。随后在总线被释放后的 15uS 中 DS18B20 会发送内部数据位,这时控制如果发现总线为高电平表示读出 “ 1 ” , 如果总线为低电平则表示读出数据 “ 0 ” 。每一位的读取之前都由控制器加一个 起始信号。注意如图 8 所示,必须在读间隙开始的 15uS 内读取数据位才可以 保证通信的正确。 在通信时是以 8 位 “ 0 ” 或 “ 1 ” 为一个字节 , 字节的读或写是从高位开始的 , 即 A7 到 A0. 字节的读写顺序也是如图 2 自上而下的。 uchar ds_read_bytevoid 读一字节 uchar value,i,j; value0; 一定别忘了给初值 fori0;i1; 这一步的说明在一个 word 文档里面 returnvalue; 返回一个字节的数据 void ds_write_byteuchar dat 写一个字节 uchar i; bit onebit; 一定不要忘了,onebit 是一位 fori1;i1; 由低到高传送数据 ifonebit 写 1 ds0; _nop_; _nop_; 看时序图,至少延时 1us,才产生写“时间隙“ ds1; 写时间隙开始后的 15s 内允许数据线拉到高电平 TempDelay5; 所有写时间隙必须最少持续 60us else 写 0 ds0; TempDelay8; 主机要生成一个写 0 时间隙,必须把数据线拉到低电平并保持至少 60s,这里 64us ds1; _nop_; _nop_; /* 主机(单片机)控制 18B20 完成温度转换要经过三个步骤 每一次读写之前都要 18B20 进行复位操作,复位成功后发送 一条 ROM 指令,最后发送 RAM 指令,这样才能对 DS18b20 进行 预定的操作。 复位要求主 CPU 将数据线下拉 500us,然后释放,当 ds18B20 受到信号后等待 1660us,后发出 60240us 的存在低脉冲, 主 CPU 收到此信号表示复位成功 / /* 进行温度转换 先初始化 然后跳过 ROM跳过 64 位 ROM 地址,直接向 ds18B20 发温度转换命令,适合单片工作 发送温度转换命令 */ void tem_change ds_reset; delay1; 约 2ms ds_write_byte0 xcc;单线情况下,跳跃 ROM 指令 ds_write_byte0 x44;温度转换指令 /* 获得温度 */ uint get_temperature float wendu; uchar a,b; ds_reset; delay1; 约 2ms ds_write_byte0 xcc; ds_write_byte0 xbe;发送读温度命令 ads_read_byte;读出温度低 8 位 bds_read_byte;读书温度高 8 位 tempb; temp0;a display get_temperature;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值