1-Wire总线与DS18B20应用仿真
首先右击选 中protues编辑区中的DS18B20仿真模型然后再左击,此时弹出如图4所示的属性设置对话框。其中,Family Code是器件的家族码,对于DS18B20来说是28H。ROM Serial Number对应于器件的48bit序列号,格式为十六进制,在填写过程中要保证同一条1-Wire总线上所有仿真模型的ROM Serial Number都不相同。Automatic Serialization设置为No时仿真模型将使用ROM Serial Number中的序列号,设置为Yes时模型的序列号将由仿真环境自动生成,在此设置为Yes,这样可以免去手动修改ROM Serial Number的麻烦。Current Value中是仿真模型当前的温度值。Cranularity中是单击仿真模型的温度值增减按钮时温度值的改变量,在此设置为1.1。其他选项保持默认即可。单击OK按钮,设置完成。
本文引用地址:http://www.amcfsurvey.com/article/84508.htm图3 多点测温系统仿真原理图
③编制源程序
主机是通过Reset()、Readbit()、Writebit()三种基本操作与1-Wire总线进行通信的,只要这三个函数的时序准确,那么对于有一定C语言编程基础的用户来说程序其他部分的编写将不是难事,按照前面介绍的流程向总线发送功能命令并进行相应读写操作即可。多点测温系统编程的难点在于器件的查找,系统上电时主机首先要查找总线上挂接着多少个1-Wire器件并将各个器件的ROM编码读入单片机的RAM中,这需要一套复杂的算法,限于篇幅关于此算法在此不再详述。本仿真实例大体工作过程如图3右下角注释部分所示,“查找总线上所有器件的ROM编码并存储”这一步可以由 uchar B20ReadROM(uchar B20ROM[]函数完成,该函数的返回值是查找到的器件数目,各个器件的ROM编码将存储在二维数组B20ROM[]中。
图4 DS18B20仿真模型属性设置
“统一开始温度转换”的通信流程为:发送复位信号;发送跳过ROM(CCH)命令;发送启动温度转换(44H)命令。
“逐器件读取温度值”的通信流程为:发送复位信号;发送匹配ROM(55H)命令;发送第i(i=0~7)个器件的ROM编码;发送读RAM(BEH)命令;读取2字节,其中低字节在前,高字节在后,读取到的值符合温度值数据格式。
④在Proteus中添加监视变量
为了检验程序运行的正确与否,通常的做法是将运行结果通过单片机的UART接口输出到虚拟终端上,这种方法的缺点是会占用一定的单片机资源,在此介绍另外一种程序调试技巧——监视变量。在Proteus的运行状态下点击Debug→Watch Window会弹出监视窗口(Watch Window),然后按下Alt+A键会弹出如图5所示的添加存储器条目对话框(Add Memory Item)。所谓监视变量也就是监视相应存储单元中的内容,图5中
图5 添加存储器条目对话框
Memory用于选择待监视变量所在的存储器;Name用于填写变量名称,为了含义清晰该名称最好与源程序中定义的变量名称一致;Address用于填写待监视变量的地址;Data Type和Display Fomat用于设置数据格式和显示格式。设置完成后单击Add按钮即可添加一个监视变量。在本实例中将测量到的温度值转化成ACSLL码字符串的格式存储在二维数组TempBuffer中,因此Data Type选择为ASCLLZ String,Watch Window的最终结果如图6所示。Value一栏中显示的即为8个DS18B20测量到的温度值,单击仿真模型的温度增减按钮温度值的改变会自动映射在 Watch Window中。
图6 监视窗口
图6中TempBuffer[i](i=0~7)的地址在Keil中可以按以下步骤得到:
● 单击Keil工具栏中的按钮,进入调试状态。
● 通过View→Output Window菜单调出Keil的Output Window,并选中Command标签。
● 在Output Window的命令输入区输入TempBuffer[i]然后回车即可得到TempBuffer[i]的地址,在本实例中i=0~7。对于非数组类型的变量在输入时需要在变量名前加取地址符号&,如图7所示。
图7 变量地址的获取
评论