多路智能温度测控系统设计_课程设计(编辑修改稿)内容摘要:

ial Number 的值(在该对话框下 还可以改变 Granularity的数值,即改变每次调整温度的额度 )。 在 Proteus 中,可以人为改变 3 个字节的器件序列号。 要想得到全部 8个字节,一个简单的方法就是每一次总线上只连接一个器件,利用 0x33 读器件序列号的命令在程序中得到完整的器件 序列号。 将测试序列号的程序烧入 Proteus 下 AT89C51 中, 程序中定义通信端口为 只需将 DS18B20 依次与单片机连接即可。 并在运行中点击菜单项 debug,选中watch window,按 alt+A,即出现图 1所示对话框,在 Name 项中输入 a,在 Address项中输入 0x08,点击 add,在 Watch Window 窗口中即可看到序列号低八位的值。 天津理工大学 通信工程 课程设计 12 然后依次输入 0x09— 0x0f,再点击 done 键,即可获得所有 64 位序列号。 所得序列号如图 2所示(本设计共用了两个 DS18B20)。 测试程序详见附录 1 程序中包含向 DS18B20发送一个字节 ,读取 一个字节 ,以及 DS18B20的初始化等子程序。 图 1 图 2 天津理工大学 通信工程 课程设计 13 判断 K=1。 读取 1ST DS18B20 LCD显示 读取 2ND DS18B20 LCD显示 初始化 DS18B20 开始 是 否 开始 初始化 DS18B20 跳过读序列号操作 匹配 ROM 启动温度转换 读序列号 匹配 ROM 读取温度寄存器 十 、 软件设计 软件流程图 主程序流程图 DS18B20读取温度流程图 关键模块说明 本程序由主函数 、 头文件 、 (为便于调用特将其编为 .h 文件 )三部分组成。 主函数 中 处理了由 DS18B20 采集的温度信息并交由 1602LCD 显示,并设置了 一个开关,当打开开关显示 1ST 的温度,闭合开关显示 2ND 的温度。 是 DS18B20 的驱动程序,包含了 DS18B20 的初始化函数、读写一个字节的函数、匹配 ROM 函数、温度读取函数。 是 1602LCD 的驱动程序,包含了 LCD 初始化等程序,使用时只需在主程序中调用 GotoXY()函数即可让 LCD1602 显示字母数字等信息。 具体程序见附录 2。 天津理工大学 通信工程 课程设计 14 结语总结 在本次课程设计中,我对于芯片的学习能力有了一定了提高,对于初次接触的 DS18B20 芯片能通过阅读它的数据手册了解其使用方法,并付诸于软件编程思想。 在设计中碰到了一些困难,如在实现多个 DS18B20 的单总线通信时,遇到了编程上的瓶颈,接着又在 Proteus 仿真中遇到了不会读取 DS18B20 的序列号的困难,幸而被一一克服,才得以完成本设计最终的仿真实现。 第一次亲自动手编写此类较为冗长的程序,将所学的 C 语言运用到实际,才发现实践总是高于理论的,在实际应用中总会出现困难。 在完成本设计后,本人感觉工程设计能力有较大的提升,培养了系统的思维能力,总之得到了很好的锻炼。 参考文献 唐颖 . 单片 机原理与应用及 C51 程序设计 .北京:北京大学出版社, 2020 周润景 .张丽娜 .基于 Proteus 的电路及单片机系统设计与仿真 .北京:北京航空航天大学出版社, 2020 天津理工大学 通信工程 课程设计 15 附录 1 DS18B20 ROM 系列号测试程序 include sbit DQ = P1^1。 //定义通信端口 unsigned char a[8]。 //延时程序 void delay_18B20(unsigned int i) { while(i)。 } //初始化函数 Init_DS18B20(void) { unsigned char x=0。 DQ = 1。 //DQ 复位 delay_18B20(4)。 //稍做延时 DQ = 0。 //单片机将 DQ 拉低 delay_18B20(100)。 //精确延时 大于 480us DQ = 1。 //拉高总线 delay_18B20(40)。 } //读一个字节 ReadOneChar(void) { unsigned char i=0。 unsigned char dat = 0。 for (i=8。 i0。 i) { DQ = 0。 // 给脉冲信号 dat=1。 DQ = 1。 // 给脉冲信号 if(DQ) dat|=0x80。 delay_18B20(10)。 } return(dat)。 } 天津理工大学 通信工程 课程设计 16 //写一个字节 WriteOneChar(unsigned char dat) { unsigned char i=0。 for (i=8。 i0。 i) { DQ = 0。 DQ = datamp。 0x01。 delay_18B20(10)。 DQ = 1。 dat=1。 } } void main(void) { unsigned char i。 Init_DS18B20()。 WriteOneChar(0x33)。 for(i=0。 i8。 i++) a[i]=ReadOneChar()。 //将 Rom 序列号存入 a[]中 }。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。