51单片机与ds18b20程序_第1页
51单片机与ds18b20程序_第2页
51单片机与ds18b20程序_第3页
51单片机与ds18b20程序_第4页
51单片机与ds18b20程序_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、#include #include #define uchar unsigned char#define uint unsigned intsbit DQ = P22;/sbit dula = P26;/sbit wela = P27;/uint temp;/数据口 define interface数码管段选数码管位选温度值 variable of temperature/ 不带小数点unsigned char code table = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7

2、1;/ 带小数点 unsigned char code table1 = 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;/*精确延时函数 */void delay(unsigned char i) while(-i);此延时函数针对的是 12Mhz的晶振 delay(0): 延时 518us 误差 :518-2*256=6 delay(1): 延时 7us (原帖写 5us 是错的) delay(10): 延时 25us误差 :25-20=5delay(20): 延时 45us误差 :45-40=5delay(100): 延时 205us

3、误差 :205-200=5 delay(200): 延时 405us 误差 :405-400=5DS18B20*void Init_Ds18b20(void) /DS18B20初始化 send reset andinitialization commandDQ = 1; /DQ复位,不要也可行。delay(1); / 稍做延时DQ = 0;/delay(250);/DQ = 1;/delay(100);/脉冲。单片机拉低总线 精确延时,维持至少 480us 释放总线,即拉高了总线 此处延时有足够 , 确保能让 DS18B20发出存在读取一个字节的数据 read a byte date 读数据时

4、 , 数据以字节的最低有效位先从总线uchar Read_One_Byte() /移出uchar i = 0;uchar dat = 0;for(i=8;i0;i-)DQ = 0;/有效。_nop_(); /dat = 1; / 低位。DQ = 1;/传输到总线上delay(1);/控制器采样时间放到读时序后的if(DQ) /dat |= 0x80; /将总线拉低,要在 1us 之后释放总线 单片机要在此下降沿后的 15us 内读数据才会至少维持了 1us, 表示读时序开始让从总线上读到的位数据,依次从高位移动到释放总线,此后 DS18B20会控制总线 , 把数据延时 7us, 此处参照推荐的

5、读时序图, 尽量把 15us 内的最后部分控制器进行采样若总线为 1,即 DQ为1,那就把 dat 的最高位置1;若为 0,则不进行处理 ,保持为 0delay(10); / 此延时不能少,确保读时序的长度 60us return (dat);void Write_One_Byte(uchar dat)uchar i = 0;for(i=8;i0;i-)DQ = 0;/拉低总线_nop_(); / 时序或写 1 时序)开始DQ = dat&0x01; / 拉低总线后的 15us 内 ,/ delay(10);/DQ = 1;/dat = 1; delay(1);至少维持了 1us,表示写时序

6、(包括写 0从字节的最低位开始传输指令 dat 的最低位赋予给总线 , 必须在因为 15us 后 DS18B20会对总线采样。 必须让写时序持续至少 60us 写完后 , 必须释放总线 ,uint Get_Tmp() / float tt;获取温度 get the temperatureuchar a,b;Init_Ds18b20(); / Write_One_Byte(0xcc); Write_One_Byte(0x44);Init_Ds18b20(); / Write_One_Byte(0xcc); Write_One_Byte(0xbe); a = Read_One_Byte(); b

7、= Read_One_Byte();temp = b; / temp = 8;/temp = temp|a;/tt = temp*;/初始化/忽略 ROM指令/温度转换指令初始化/忽略 ROM指令/读暂存器指令/读取到的第一个字节为温度LSB/读取到的第一个字节为温度MSB先把高八位有效数据赋于 temp 把以上 8 位数据从 temp 低八位移到高八位 两字节合成一个整型变量 得到真实十进制温度值因为 DS18B20可以精确到度 所以读回数据的最低位代表的是度temp = tt*10+; /放大十倍这样做的目的将小数点后第一位也转换为可显示数字/同时进行一个四舍五入操作return temp

8、;数码码动态显示函数 */void Display(uint temp) /uchar A1,A2,A3;A1 = temp/100; / 百位A2 = temp%100/10; / 十位A3 = temp%10; / 个位显示程序dula = 0;P0 = tableA1; / 显示百位dula = 1; /打开段选,对应 74573的锁存位,高电平不锁存dula = 0;wela = 0;P0 = 0x7e; wela = 1; / wela = 0;delay(0);打开位选dula = 0;P0 = table1A2; /显示十位,使用的是有小数点的数组 (因为 temp值扩大了10倍,虽然是十位,实际为个位 )dula = 1;dula = 0;wela = 0; P0 = 0x7d;wela = 1; wela

温馨提示

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

评论

0/150

提交评论