好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

基于DS18B20温度传感器温控系统的Proteus仿真.docx

10页
  • 卖家[上传人]:飞***
  • 文档编号:40272856
  • 上传时间:2018-05-25
  • 文档格式:DOCX
  • 文档大小:261.53KB
  • / 10 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 安徽理工大学 机械电子工程1 / 10 来自 jasmineemail: zkchen@基于基于 DS18B20 温度传感器温控系统的温度传感器温控系统的 Proteus 仿真仿真DS18B20 温度传感器是美国 DALLAS 半导体公司推出的支持“一线总线”接口的传感器 具有功耗低、性能高、抗干扰能力强的特点,可以直接将温度转化为串行数字信号供处理 器处理 DS18B20 传感器具有以下一些特性: (1)测温范围-55℃至+125℃,在-10℃至+85℃时的精度为正负 0.5℃; (2)适应电压的范围在 3.0 至 5.5V; (3)单线接口,只用一条口线就可以与微处理器的双向通信; (4)支持多点组网,多个 DS18B20 并接在一根口线上就可实现多点测温; (5)测量结果直接输出数字温度信号,通过单线串行传输给微处理器; (6)具有负压特性,电源极性接反芯片不会烧坏,只是不能正常工作; (7)可编程分辨率为 9 至 12 位,对应的分辨温度分别是 0.5℃,0.25℃,0.125℃,0.0625℃,能够实现高精度测温 (8)在 9 位分辨率时可在 93.75ms 内把温度值转换为数字;在 12 位分辨率时可在 750us 内把温度值转换为数字; (9)传送数据时可传送 CRC 校验码,抗干扰纠错能力强。

      DS18B20 的引脚封装图如下:各引脚定义如下:安徽理工大学 机械电子工程2 / 10 来自 jasmineemail: zkchen@GND:电源地 DQ:信号输入输出 VDD:电源正极 NC:空DS18B20 单总线技术:DS18B20 采用单条信号线,既可以传输数据,也可以传输时钟其 数据传输是双向的,这种单总线技术线路简单,硬件开销小,成本低廉,便于总线扩展与 维护单总线通常需要外接一个 4.7K 的上拉电阻它与处理器的连接非常简单,通常连接 方式如下图:DQ 端外接一个上拉电阻,与处理器的任一端口连接DS18B20 工作原理1. ROM 功能命令 (1)[33H] Read ROM 读 ROM把 DS18B20 传感器的 ROM 中编码读出来 (2)[55H] Match ROM 匹配 ROM发出该命令接着会发送 64 位包含具体 DS18B20 序 列号的 ROM 编码,与该编码序列号相同的 DS18B20 就会做出响应,序列号不匹配的 DS18B20 继续等待,不做响应由于不同的 DS18B20 序列号不一样,所以通过该命令 可以访问控制具体的 DS18B20 (3)[F0H] Search ROM 搜索 ROM。

      用于识别各个 DS18B20 的 64 位 ROM (4)[CCH] Skip ROM 跳过 ROM当只有一个 DS18B20 时,使用该命令可以忽略 64 位 ROM 地址,直接向 DS18B20 发送温度变换命令安徽理工大学 机械电子工程3 / 10 来自 jasmineemail: zkchen@(5)[ECH] Alarm Search 告警搜索执行后,温度超出上限或者下限的芯片做出响应主机与多个 DS18B20 连接,要对众多 DS18B20 的某一个进行通信,首先要逐个与 DS18B20 连接,读出其序列号;然后将所有的 DS18B20 挂接到总线上,单片机发出匹 配指令 55H,接着主机提供 64 位序列,之后就可以与序列号相应的 DS18B20 进行数据 交换 主机与单个 DS18B20 连接时,不需要读取或者匹配 ROM,只要使用跳过指令 CCH,就 可以进行数据转换和读取操作 (1)[44H] Convert T 温度转换启动 DS18B20 进行温度转换12 位精度转换时最长为 750ms,转换结束后将数据存入内部 9 字节的 RAM (2)[4EH] Write Scratchpad 写暂存器。

      发出该命令后,将两字节的数据写入内部 RAM 的第 2、3 字节,作为上、下限温度数据 (3)[BEH] Read Scratchpad 读暂存器读取内部 9 字节的温度数据 (4) [48H] Copy Scratchpad 复制暂存器将 RAM 中的第 2、3 字节的内容复制到 E2PROM (5)[B8H] Recall E2 重调 E2PROM将 E2PROM 内容恢复到 RAM 中的第 3、4 字节 (6)[B4H] Read Power Supply 读供电方式读取 DS18B20 的供电模式2.工作时序图 (1)初始化Step1:数据线置低电平 Step2:延时 800us 左右(时间范围为 480us 至 960us) Step3:数据线拉高电平 Step4:延时 40us 左右(时间范围为 15us 至 60us)(2)读数据安徽理工大学 机械电子工程4 / 10 来自 jasmineemail: zkchen@逐位读取数据,然后把 8 位数据组成 1 个字节编写程序时分为两个部分,一个实现 读取一位数据,另一个实现读取一个字节数据 读取数据步骤: Step1:数据线置低电平 Step2:延时 5us 左右(大于 1us 即可) Step3:数据线拉高电平 Step4:延时 10us 左右(这次延时和第一次延时之和接近 15us 左右) Step5:读取一位数据 Step6:延时 60us 左右(大于 45us 即可) Step7:重复上面步骤,直到读完一个字节(3)写数据写数据分为写数据位 1 和数据位 0。

      写数据位 1 步骤: Step1:数据线置低电平 Step2:延时 5us 左右(大于 1us 即可) Step3:数据线拉为高电平 Step4:延时 70us 左右(大于 55us 即可) 写数据位 0 步骤: Step1:数据线置低电平 Step2:延时 70us 左右(大于 60us 即可) Step3:数据线拉高电平 Step4:延时 5us 左右(不要太小)根据 DS18B20 的结构和性能,在 Proteus 中构建仿真工程,电路连接图如下:安徽理工大学 机械电子工程5 / 10 来自 jasmineemail: zkchen@上面的电路要实现的功能是,把传感器测量的温度显示到 1602 液晶上温度变化的范围是0℃至 99.9℃,温度传感器通过设置可以设定温度调节的步长,这里取温度变化的步长为 0.1℃,设置如下图:安徽理工大学 机械电子工程6 / 10 来自 jasmineemail: zkchen@设置好之后,就可以根据 DS18B20 的特性和控制方式编写程序参考程序如下:#include #define uchar unsigned char #define uint unsigned intuchar code disp[]=“0123456789“; uchar code disp2[]=“Tempreture“; uchar code disp3[]=“^C“;sbit lcden=P2^0; sbit lcdrw=P2^1; sbit lcdrs=P2^2; sbit tempt=P2^3;uint u_temp; //定义无符号整型形参 float f_temp; //定义浮点型形参void delay(uint x) //延时 500ms 程序 { uint i,j;安徽理工大学 机械电子工程7 / 10 来自 jasmine。

      email: zkchen@for(i=0;i0)i--; tempt=1;i=4;//延时 while(i>0)i--; }bit read_bit()//读一位 DS18B20 数据 { uint i; bit dat; tempt=0;i++;//延时 tempt=1;i++;//延时 i++; dat=tempt;i=8;//延时 while(i>0)i--; return dat; }uchar read_tempt()//读一个字节 DS18B20 数据 { uchar i,j,dat; dat=0; for(i=1;i>1); //将读取的数据位按读取先后顺序, } //从低位到高位(从右往左)排列保存到 dat return dat; }void write_byte(uchar dat)//写一个字节数据到 DS18B20安徽理工大学 机械电子工程9 / 10 来自 jasmineemail: zkchen@{ uint i; uchar j; bit testbit; for(j=1;j>1; if(testbit) { tempt=0;i++;//延时 tempt=1;i=8;//延时 while(i>0)i--; } else { tempt=0;i=8;//延时 while(i>0)i--; tempt=1;i++;//延时 i++; } } }void convert_tempt() //DS18B20 开始获取温度并进行转换 { reset_tempt(); delay(1); write_byte(0xcc); write_byte(0x44); }uint get_tempt() //读取 DS18B20 寄存器中的温度数据 { uchar a,b; reset_tempt(); delay(1); write_byte(0xcc); write_byte(0xbe); a=read_tempt();安徽理工大学 机械电子工程10 / 10 来自 jasmine。

      email: zkchen@b=read_tempt(); u_temp=b; u_temp<<=8; u_temp=u_temp|a;f_temp=u_temp*0.0625; //精度为 12 位,所以分辨率为 0.0625 u_temp=f_temp*10 ; //乘以 10,将实际温度扩大 10 倍 return u_temp; //返回的 u_temp 是整型数据 }void display() //静态文字显示 { uchar i,j; write_com(0x80+3); for(i=0;i<10;i++) { write_data(disp2[i]); } write_com(0x80+0x40+10); for(j=0;j<2;j++) { write_data(disp3[j]); } }void main() //主函数 { uchar i; lcd_init(); display(); while(1) { convert_tempt(); for(i=0;i<10;i++) { display_tempt(get_tempt()); } } }谨供参考学习使用,如有错误欢迎指正。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.