开始 系统初始化 测温子程序 温度显示子程序 显示调整温度 是 温度上下限设定键是否按下? 是 显示温度上下限温度上下限调整键是否按下? 否 返回键? 是 否 报警子程序 蜂鸣器响起子程序
图4.1 系统主程序流程图
4.4.2传感器程序设计 (1)DSl8B20编程简介
每一片单总线芯片内部都有一个全球惟一的64 位编码,在多路测温时就是通过匹配每个芯片的ROM编码(ID),来搜寻该路的温度。DS18B20有9个可擦写的内部寄存器,称为便笺式RAM。所有的串行通讯,读写每一个bit位数据都必须严
基于单片机的多温度检测系统的设计与protues仿真
格遵守器件的时序逻辑来编程,同时还必须遵守总线命令序列,对单总线的DS18B20芯片来说,访问每个器件都要遵守下列命令序列:
首先是初始化;其次执行ROM 命令;最后就是执行功能命令(R0M命令和功能命令后面以表格形式给出)。
如果出现序列混乱,则单总线器件不会响应主机。当然,搜索ROM 命令和报警搜索命令,在执行两者中任何一条命令之后,要返回初始化。
基于单总线上的所有传输过程都是以初始化开始的,初始化过程由主机发出的复位脉冲和从机响应的应答脉冲组成。应答脉冲使主机知道,总线上有从机设备,且准备就绪。
每次访问任何单总线器件,必须严格遵守这个命令序列;如果出现序列混乱,则单总线器件不会响应主机。但是这个准则对于搜索ROM命令和报警搜索命令例外,在执行两者中任何一条命令之后,主机不能执行其后的功能命令,必须返回至第一步。在 主 机 发出ROM命令,以访问某个指定的DS18B20,接着就可以发出DS18 B20支持的某个功能命令。这些命令允许主机写人或读出DS18 B20暂存器,启动温度转换以及判断从机的供电方式。 (2)软件实现
前面提及单总线器件的ROM命令,在主机检测到应答脉冲后,就可以发出ROM命令。这些命令与各个从机设备的唯一64位ROM代码相关。允许主机在单总线上连接多个从机设备时,指定操作某个从机设备。这些命令还允许主机能够检测到总线上有多少个从机设备,以及其设备类型或者有没有设备处于报警状态。从机设备可能支持5种ROM命令(实际情况与具体型号有关),每种命令长度为8位。主机在发出功能命令之前,必须发送合适的ROM命令。 ① 搜索ROM[F0h]
当系统初始上电时,主机必须找出总线上所有从机设备的ROM代码,这样主机就能够判断出从机的数目和类型。主机通过重复执行搜索ROM循环(搜索ROM命令跟随着位数据交换)以找出总线上所有的从机设备。如果总线只有一个从机设备,则可以采用读ROM命令来替代搜索ROM命令。在每次执行完搜索ROM循环后,主机必须返回至命令序列的第一步(初始化)。 ② 读ROM[33h](仅适合于单节点)
该命令仅适用于总线上只有一个从机设备。它允许主机直接读出从机的64位ROM代码,而无须执行搜索ROM过程。如果该命令用于多节点,系统则必然发生数据冲突,因为每个从机设备都会响应该命令。 ③ 匹配ROM[ 55h]
匹配ROM命令跟随64位ROM代码,从而允许主机访问多节点系统中某个指定的从机设备。仅当从机完全匹配64位ROM代码时,才会响应主机随后发出的功能命令。其它设备将处于等待复位脉冲状态。 ④ 跳越ROM[CCh](仅适合于单节点)
主机能够采用该命令同时访问总线上的所有从机设备,而无须发出任何ROM代码信息。例如,主机通过在发出跳越ROM命令后跟随转换温度命令[44h],就可以同时命令总线上所有的DS18B20开始转换温度,这样大大节省了主机的时间。值得注意的是,如果跳越ROM命令跟随的是读暂存器〔BEh]的命令(包括其它读操作命令),则该命令只能应用于单节点系统,否则将由于多个节点都响应该命令而引起数据冲突。
⑤ 报警搜索「ECh](仅少数1一Wire器件支持)
除那些设置了报警标志的从机响应外,该命令的工作方式完全等同于搜索ROM命令。该命令允许主机设备判断那些从机设备发生了报警(如最近的测量温度过高或过低等)。同搜索ROM命令一样,在完成报警搜索循环后,主机必须返回至命令序列的第一步。
DS18B20在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求,只有严格遵守通讯协议才能保证数据传输的正确性和完整性。所有时序均以主机为Master,单总线器件为Slave,每次数据的传输均从主机启动写时序开始,如果要求单总线器件回送数据,则在写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。 ① DS18B20的复位时序
基于单片机的多温度检测系统的设计与protues仿真
图4.2 DS18B20复位时序 //该函数返回为0,表示有DS1820,否则没有 bit reset(void) { bit err; DQ=0;
//在数据线上产生600us的低电平
delay15(40); DQ=1;
//数据线拉高 //延时60us
//读取数据线状态,err=0:复位成功
delay15(4); err=DQ;
delay15(18); // err=1:复位失败 return(err); }
② DS18B20的读时序
图4.3 DS18B20读时序
DS18B20的读时序分读0时序和读1时序两个过程。读时序是主机先把单总线拉低,在之后的l5?s内必须释放单总线,以便将数据传输到单总线上。DS18B20完成一个读时序至少需要60?s。
unsigned char read_bit(void) { unsigned char i;
DQ = 0; _nop_(); _nop_(); DQ = 1;
// then return high
// 延时15μs
//将DQ 拉低开始读时间隙
for (i=0; i<3; i++);

