CN102929717B - 一种实现ds18b20读写时序的方法 - Google Patents
一种实现ds18b20读写时序的方法 Download PDFInfo
- Publication number
- CN102929717B CN102929717B CN201210449997.XA CN201210449997A CN102929717B CN 102929717 B CN102929717 B CN 102929717B CN 201210449997 A CN201210449997 A CN 201210449997A CN 102929717 B CN102929717 B CN 102929717B
- Authority
- CN
- China
- Prior art keywords
- ds18b20
- counter
- value
- interruption
- timeslice
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Microcomputers (AREA)
Abstract
一种实现DS18B20读写时序的方法本发明涉及电子技术应用领域,尤其涉及用单片机驱动DS18B20时,公开一种采用定时中断实现DS18B20读写时序的方法。将DS18B20读写时序所要求的时间片,及DS18B20处于温度转换期间的延时等待全部放在定时中断服务程序中,并将中断的优先级设置为高优先级,以严格保证DS18B20的时序要求。这种方法,既避免了在C语言中插入汇编的复杂编程过程,又避免了采用软件延时实现DS18B20时序而带来的占用单片机资源、程序效率低下的事实。另外,在程序中使用其他的中断源,不会对DS18B20的读写造成影响。
Description
技术领域
本发明涉及电子技术应用领域,尤其涉及用单片机驱动DS18B20时,一种实现DS18B20读写时序的方法。
背景技术
DS18B20是MAXIM公司生产的一种分辨率可编程的单总线(1-Wire)数字温度计。DS18B20在工农业生产、日常生活等需要测量温度的场合有着广泛的应用。
1-Wire总线系统主控制器控制一个或多个从器件。DS18B20在单总线系统中总是从器件,主控制器一般为单片机。一般情况下,访问DS18B20的操作顺序为:首先进行初始化;然后是ROM操作命令;接着是DS18B20功能命令。在初始化、ROM命令、功能命令中涉及的主要时序有:主控制器发出的复位脉冲、DS18B20发出的存在脉冲,如图1所示。主控制器写“0”时序、主控制器写“1”时序、主控制器读“1”时序、主控制器读“0”时序,如图2所示。
另外,DS18B20在9位、10位、11位、12位分辨率下的最长转换时间分别为93.75毫秒、187.5毫秒、375毫秒、750毫秒。如果采用外部电源供电,当主控制器发出温度转换指令44H后,跟着发出读时序,如果DS18B20处在转换中,则在总线上返回0,如果温度转换结束,在总线上返回1。可是,如果采用寄生供电模式,就不能通过主控制器发出读时序来确定DS18B20对温度转换是否完成,只能通过延时所配置分辨率对应的最长转换时间后,再去读温度转换结果。
综上所述,当采用单片机作为主控制器对DS18B20进行读写操作时,必须要严格按照DS18B20的读写时序进行操作,才能获得正确的温度转换结果。一般的做法是采用软件延时的方法来获得对DS18B20操作的各种时序及读取温度转换结果,由于DS18B20对时序要求比较严格,如初始化操作,主控制器拉低总线至少480微秒后释放总线至高电平,DS18B20检测到上升沿后,等待15微秒~60微秒,然后DS18B20发出60微秒~240微秒低电平信号构成存在脉冲。如果等待时间不够或等待时间过长,都将导致接收不到DS18B20正确的存在脉冲,从而可能使温度转换不能完成,可能也就得不到正确的温度值。所以,在采用软件延时方法进行程序设计时,一般采用汇编语言编写,以其获得较为精确的延时时间。可是,一方面现在绝大多数人都在使用C语言进行单片机编程,在C语言中插入汇编,使得编程变得复杂起来,掌握起来不太容易。另一方面采用软件延时的方法会导致单片机程序效率低下,使单片机经常处于无谓的延时等待中,浪费了单片机宝贵的资源。再有,如果程序中使用了中断,由于中断是随机发生的,经常出现中断发生在对DS18B20操作的时序中,从而破坏了原本正常的操作时序,导致对DS18B20的读写失败。如果在使用中断的程序中,在对DS18B20操作前禁止中断,完成操作后再开放中断,又会导致在此期间中断得不到及时响应,这在某些应用中是不允许的。
发明内容
本发明解决了上述对DS18B20读写时存在的问题,公开一种采用定时中断实现DS18B20读写时序的方法。
为了解决上述对DS18B20读写时存在的问题,将DS18B20读写时序所要求的时间片,及DS18B20处于温度转换期间的延时等待全部放在定时中断服务程序中,并将中断的优先级设置为高优先级,以严格保证DS18B20的时序要求。这种方法,既避免了在C语言中插入汇编的复杂编程过程,又避免了采用软件延时实现DS18B20时序而带来的占用单片机资源、程序效率低下的事实,再有,在程序中使用其他的中断源,不会对DS18B20的读写造成影响。
本发明的主要特点在于,在主控制器单片机的初始化程序中,选择并开放一个定时器中断,定时器初值根据实际控制系统可以设置为5毫秒左右,作为系统外设上电延时时间;设置四个变量并初始化为0值,一个作为时间片计数器、一个作为一个时间片或几个时间片循环次数计数器、一个作为命令字计数器、一个作为中断次数计数器。
进一步的,本发明的主要特点在于,在定时中断服务程序中,调整时间片计数器的值,把对DS18B20的操作所涉及的所有时序中大于15微秒的时间片序列化,并与时间片计数器的值一一对应。
进一步的,本发明的主要特点在于,在定时中断服务程序中,把对DS18B20的操作所涉及的所有时序中要求大于1微秒而小于无限长的时间片,直接在中断程序里用1微秒至2微秒左右的指令延时实现。并对指令延时的前、后相应的设置1-Wire的高或低电平。
进一步的,本发明的主要特点在于,在定时中断服务程序中,根据时间片计数器的值,重新对计数器设置不同的计数初值,该计数初值满足再次进入定时中断服务程序时,跨过的时间间隔等于该时间片计数器值所对应的DS18B20所要求的时间片时间。并根据时间片计数器的值,相应的设置1-Wire的高或低电平。
进一步的,本发明的主要特点在于,在定时中断服务程序中,根据时间片计数器的值,调整循环次数计数器的值,以便在发送命令或接收数据中,满足相应的发送或接收时序,完整并正确的发送8位命令或接收8位数据。
进一步的,本发明的主要特点在于,在定时中断服务程序中,根据时间片计数器的值和循环计数器的值,调整命令字计数器的值,以便根据程序要求将相应的ROM命令或功能命令发送出去以及将温度转换结果的高8位或低8位接收进来。
进一步的,本发明的主要特点在于,在定时中断服务程序中,根据时间片计数器的值和命令字计数器的值,设置定时器计数初值、判断并调整中断次数计数器的值,使其达到较长时间的延时,如750毫秒,用以确保DS18B20温度转换完成。
本发明所述方法,仅需要通过调整定时器初值,就能精确满足对DS18B20的操作时序要求,降低了对DS18B20的调试难度,使DS18B20的使用变得简单、容易。更为关键的是这种方法便于更合理的安排系统程序结构,不必考虑系统程序结构对DS18B20操作时序的影响,大大的提高了程序的工作效率。
附图说明
图1是DS18B20初始化时序图;
图2是DS18B20读/写时序图;
图3是主控制器单片机的定时中断服务程序流程图;
图4是图3主控制器单片机的定时中断服务程序流程图的续图。
具体实施方式
下面给出本发明的一个实施例,并结合附图对本发明进行详细介绍。
在本发明的一个实施例中,采用STC12C5A60S2单片机作为主控制器件,外部只接一个DS18B20数字温度计。DS18B20的DQ脚接在STC12C5A60S2的P1.0脚,上拉电阻为1K,采用寄生电源供电,即把DS18B20的VDD和GND连在一起接到单片机STC12C5A60S2的GND端。采用4位数码管通过定时中断1进行动态扫描方式显示转换温度值。实现DS18B20读写时序的操作在定时中断0中完成。
在单片机初始化程序中,初始化相关的变量,开放所使用的各种中断源。在主程序循环中,根据定时中断0中DS18B20温度转换结束标志,将温度转换结果进行处理,然后送显示缓冲区,再在定时中断1中进行动态显示。
上电复位后,第一次进入定时中断0时,时间片计数器、命令字计数器、循环次数计数器、中断次数计数器都为0值。定时中断0的流程图见图3和图4。每次进入定时中断0所执行的程序及操作步骤如下。
1、当时间片计数器为0时,置P1.0(即DS18B20的DQ,下同)为0,设置定时时间常数,使之下次进入该中断的时间为480微秒,对时间片计数器加1,定时中断0返回。
2、480微秒后第二次进入定时中断0时,时间片计数器值为1,将P1.0置1,准备接受DS18B20返回的存在脉冲,此时,DS18B20时序要求等待15微秒至60微秒后,DS18B20如果存在,则拉低P1.0,拉低时间为60微秒至240微秒,如图1所示。所以,这里重新设置时间常数,使之下次进入该中断的时间为60微秒,并对时间片计数器加1,定时中断0返回。
3、60微秒后,再次进入定时中断0,此时,时间片计数器值为2,读P1.0的状态送入事先定义的标志位,为0则DS18B20存在,否则,不存在或损坏。再次重置时间常数为480微秒后进入中断,时间片计数器加1,定时中断0返回。
4、再次进入定时中断0时,时间片计数器值为3,判断命令字计数器的值,此时,应为0,则给准备写出命令的变量W_DATA赋值0xCC,即跳过ROM命令,重置时间常数2微秒后进入中断,时间片计数器置4,中断返回。
5、再次进入定时中断0时,时间片计数器值为4,置P1.0为0,写时序开始,通过指令延时1微秒,送出1位数据,重置时间常数60微秒后进入中断,循环计数器加1,判断循环计数器是否为7,即是否写完8位一个字节,是,则循环计数器清0,命令字计数器加1,数据片计数器赋3,中断返回;否,时间片计数器赋值6,准备拉高P1.0,其他变量不做调整,中断返回。
6、再次进入定时中断0时,时间片计数器值为6,置P1.0为1,重置时间常数2微秒后进入中断,时间片计数器赋值4,中断返回。
7、再次进入定时中断0时,时间片计数器值为4,重复上面5、6这两个步骤,直到循环计数器为7,写完8位一个字节的指令,循环计数器清0,命令字计数器加1,数据片计数器赋值3,中断返回。
8、再次进入定时中断0时,时间片计数器值为3,判断命令字计数器的值,此时,应为1,则给准备写出命令的变量W_DATA赋值0x44,即温度转换命令,重置时间常数2微秒后进入中断,时间片计数器置4,中断返回。
9、接下来的几次进入定时中断0,重复上面5、6、7三个步骤,将温度转换命令送出。
10、再次进入定时中断0时,时间片计数器值为3,判断命令字计数器的值,此时,应为2,置P1.0为1,给寄生供电的DS18B20提高上拉,并保持此高电平直到温度转换结束。故,第一次进入该步骤时,给中断次数计数器赋值150,重置时间常数为5毫秒,中断返回。由于时间片计数器和命令字计数器均没有调整,下次进入中断时,还是进入该步骤,此时,每进入一次,中断次数计数器减1,判断中断次数计数器。不为0,则重置时间常数为5毫秒,中断返回;为0,时间片计数器赋值0,命令字计数器加1,中断返回。这样,在该步骤一共中断150次,时间过去750毫秒,DS18B20完成了温度转换。
11、再次进入定时中断0时,时间片计数器值为3,判断命令字计数器的值,此时,应为3,给准备写出命令的变量W_DATA赋值0xCC,即跳过ROM命令,重置时间常数2微秒后进入中断,时间片计数器置4,中断返回。
12、重复5、6、7三个步骤,将跳过ROM命令送出。
13、再次进入定时中断0时,时间片计数器值为3,判断命令字计数器的值,此时,应为4,给准备写出命令的变量W_DATA赋值0xBE,即读暂存器命令,重置时间常数2微秒后进入中断,时间片计数器置4,中断返回。
14、重复5、6、7三个步骤,将读暂存器命令送出。
15、再次进入定时中断0时,时间片计数器值为3,判断命令字计数器的值,此时,应为5,准备读取温度转换值的低8位,保存数据的变量R_DATA先清0,重置时间常数2微秒后进入中断,时间片计数器置5,中断返回。
16、再次进入定时中断0时,时间片计数器值为5,置P1.0为0,指令延时1微秒,置P1.0为1,读出1位数据,重置时间常数为60微秒后进入中断,循环次数计数器加1。判断循环次数计数器的值,不为7,中断返回;为7,说明已经接收完8位数据,则循环计数器赋值0,命令字计数器加1,时间片计数器赋值3,中断返回。
17、再次进入定时中断0时,时间片计数器值为3,判断命令字计数器的值,此时,应为6,将上步读出的数据送温度转换值变量TPL,准备读取温度转换值的高8位,再将保存数据的变量R_DATA先清0,重置时间常数2微秒后进入中断,时间片计数器置5,中断返回。
18、重复步骤16,直到温度转换值高8位接收完毕。
19、再次进入定时中断0时,时间片计数器值为3,判断命令字计数器的值,此时,应为7,将上步读出的数据送温度转换值变量TPH,设置转换结束标志为1,将时间片计数器、命令字计数器、循环次数计数器、中断次数计数器等全部清0,中断返回。
定时中断0服务程序,就在上述19个步骤里周而复始的执行,完成了包括温度转换期间提供上拉及等待温度转换结束时间750毫秒在内的所有读写DS18B20的时序。
本发明所述方法,同样适用于单片机跨接多个DS18B20的多点温度转换的场合。
Claims (1)
1.一种实现DS18B20读写时序的方法,在主控制器的程序中,有四个初始化为0值的变量,分别是时间片计数器、循环次数计数器、命令字计数器和中断次数计数器,通过主控制器定时中断服务程序,调整时间片计数器、循环次数计数器、命令字计数器及中断次数计数器的值,实现发送DS18B20的复位脉冲、接收DS18B20的存在脉冲、对DS18B20的写1时序、写0时序、读1时序、读0时序、DS18B20寄生供电的上拉操作及DS18B20温度转换结束的时间等待,其特征在于:实现DS18B20读写时序的定时中断的优先级为高优先级;在定时中断服务程序中,把对DS18B20的操作所涉及的所有时序中要求大于1微秒而小于无限长的时间片,直接在中断程序里用1微秒至2微秒左右的指令延时实现,对DS18B20的操作所涉及的所有时序中大于15微秒的时间片序列化而且与时间片计数器的值一一对应;在定时中断服务程序中,调整时间片计数器的值,根据时间片计数器的值,重新对定时器设置不同的计数初值,该计数初值满足再次进入定时中断服务程序时,跨过的时间间隔等于该时间片计数器值所对应的DS18B20所要求的时间片时间;在定时中断服务程序中,接收DS18B20发送的存在脉冲,判断DS18B20是否存在或损坏;在定时中断服务程序中,根据时间片计数器的值,调整循环次数计数器的值,以便在发送命令或接收数据中,满足相应的发送或接收时序,完整并正确的发送8位命令或接收8位数据;在定时中断服务程序中,根据时间片计数器的值和循环计数器的值,调整命令字计数器的值,以便根据程序要求将相应的ROM命令或功能命令发送出去以及将温度转换结果的高8位或低8位接收进来;在定时中断服务程序中,根据时间片计数器的值和命令字计数器的值,设置定时器计数初值、判断并调整中断次数计数器的值,使其达到较长时间的延时,用以确保DS18B20温度转换完成并实现DS18B20寄生供电模式下的上拉操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210449997.XA CN102929717B (zh) | 2012-11-12 | 2012-11-12 | 一种实现ds18b20读写时序的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210449997.XA CN102929717B (zh) | 2012-11-12 | 2012-11-12 | 一种实现ds18b20读写时序的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102929717A CN102929717A (zh) | 2013-02-13 |
CN102929717B true CN102929717B (zh) | 2015-05-13 |
Family
ID=47644524
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210449997.XA Expired - Fee Related CN102929717B (zh) | 2012-11-12 | 2012-11-12 | 一种实现ds18b20读写时序的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102929717B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107894706B (zh) * | 2017-12-05 | 2021-04-06 | 山东航天电子技术研究所 | 一种基于fpga和cpu综合控制的星上时间管理系统 |
-
2012
- 2012-11-12 CN CN201210449997.XA patent/CN102929717B/zh not_active Expired - Fee Related
Non-Patent Citations (2)
Title |
---|
"DS18B20在实时控制系统中的应用";阮海蓉;《制造业自动化》;20120331;第34卷(第3期);第120-124页 * |
"DS18B20数据温度传感器接口程序的时序";黄文力等;《仪器仪表用户》;20111231;第18卷(第6期);第99-101页 * |
Also Published As
Publication number | Publication date |
---|---|
CN102929717A (zh) | 2013-02-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103823776A (zh) | 面向主从设备通信的单总线及通信方法 | |
US10936524B2 (en) | Bus system with slave devices | |
CN100480923C (zh) | I2c总线从控制器软实现方法 | |
EP2645262A1 (en) | Usb device and detection method therefor | |
CN101719110A (zh) | 光通信器件中多路i2c器件的实时监控方法 | |
CN101581964B (zh) | 计算机系统及外围设备驱动方法 | |
CN101089838A (zh) | 一种实现i2c读写时序的方法 | |
CN203720837U (zh) | 面向主从设备通信的单总线 | |
CN112904751B (zh) | 一种热敏打印头的加热逻辑控制方法 | |
CN200990088Y (zh) | 一种新型的8位risc微控制器构架 | |
CN103901814A (zh) | 一种多轴运动数控系统 | |
CN102929717B (zh) | 一种实现ds18b20读写时序的方法 | |
US20170168980A1 (en) | SPI Interface With Automatic Slave Select Generation | |
Corcoran | Two wires and 30 years: A tribute and introductory tutorial to the I2C two-wire bus | |
CN101025720A (zh) | 一种外部存储器控制器时序配置的装置及方法 | |
CN208366386U (zh) | 一种多路数据采集系统 | |
CN109887259B (zh) | 一种单线传输装置及方法 | |
CN101329648B (zh) | 可调试atr的接触式智能卡仿真器 | |
CN103218334A (zh) | 基于usb总线和rs485总线的计算机外设级联装置 | |
CN202042048U (zh) | 红外遥控吊扇调速器 | |
CN202533818U (zh) | 一种基于at89s51单片机的室内温度控制器 | |
CN202600693U (zh) | I2c总线启动与停止电路结构 | |
CN201444302U (zh) | 一种可配置管脚的soc芯片 | |
CN112714105A (zh) | 一种嵌入式opc ua协议转换系统 | |
CN204143173U (zh) | 一种数码管电子时钟 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20150513 Termination date: 20181112 |
|
CF01 | Termination of patent right due to non-payment of annual fee |