一种基于单片机定时器读取DS18B20温度的方法与流程

文档序号:32442514发布日期:2022-12-06 22:39阅读:46来源:国知局
一种基于单片机定时器读取DS18B20温度的方法与流程
一种基于单片机定时器读取ds18b20温度的方法
【技术领域】
1.本发明涉及单片机技术领域,具体涉及一种基于单片机定时器读取ds18b20温度的方法。


背景技术:

2.ds18b20是一款常用的单总线数字温度测量芯片,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。但由于ds18b20是单总线接口,即接收和发送都是这个通信脚进行的。
3.其接收数据时为高电阻输入,其发送数据时是开漏输出,本身不具有输出高电平的能力,即输出0时通过mos下拉为低电平,而输出1时,则为高阻,需要外接上拉电阻将其拉为高电平,故而对时序的要求比较严格,需在一定时间内精确延时,常用的方法为根据单片机的频率采用软件延时,容易出现的问题有:1、用软件做延时会导致单片机阻塞;2、延时期间一般要关中断,防止别的任务进来导致延时不准,这会导致多任务系统运行不稳定。


技术实现要素:

4.为解决上述问题,提出了一种基于单片机定时器读取ds18b20温度的方法;
5.一种基于单片机定时器读取ds18b20温度的方法,具体步骤为:1)、status==0等待状态;2)、初始化时序;3)、写时序、4)、读时序;5)、status==12计算温度值;方法通过单片机的定时器来控制各时序的延时,将初始化时序、写时序和读时序分解成3种、3种和4种的状态,在定时器的中断里根据不同的状态进行处理后读出2字节,继而根据读出的2字节计算温度值。
6.优选的,初始化时序分解为:status==1,开始初始化时序,拉低总线500us;status==2,已经拉低总线500us,释放总线60us,等待器件的响应;status==3,等待了60us,判断是否存在器件,延时500us。
7.优选的,写时序分解为:status==4,开始写时序,拉低总线5us;status==5,写bit至总线,延时60us;status==6,写完1bit,释放总线5us。
8.优选的,读时序分解为:status==8,开始读时序,拉低总线5us;status==9,释放总线,延时10us;status==10,单片机采样,延时50us;status==11,读完1bit了,释放总线5us。
9.优选的,写时序和读时序之间还设有status==7,即中间状态,在写时序命令完成后判断下一步的步骤,如果要读数据转到status==8,要重新初始化转到status==1。
10.优选的,写时序分解的status==6,在写完1bit,释放总线5us的步骤完成后,判断一个字节是否写完,没写完状态转回status==4,完成了转到status==7。
11.优选的,status==11,读完1bit,释放总线5us完成后,继而判断两个字节是否读完,没读完状态转回到status==8,完成了转到status==12,即根据读出的2字节计算温度值。
12.优选的,status==12在根据读出的2字节计算温度值后,状态转为status==0,即初始状态。
13.本发明通过本方法提出采用单片机定时器中断来实现延时,将读取ds18b20温度的时序分成不同的状态,每次进入定时器中断根据不同的状态来进行不同的操作。采用这种方法消除了读取ds18b20温度的阻塞问题,并且能精准的控制时序,大大提高了多任务系统的稳定性。
【附图说明】
14.图1为本发明的初始化时序分解示意图;
15.图2为本发明的写时序分解示意图;
16.图3为本发明的读时序分解示意图;
17.图4为本发明的流程图。
【具体实施方式】
18.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处描述的具体实施例仅用于解释本发明,并不用于限定本发明。
19.一种基于单片机定时器读取ds18b20温度的方法,如图1至3所示,通过单片机的定时器来控制各时序的延时,将初始化时序、写时序和读时序分解成3种、3种和4种的状态;
20.即初始化时序分解为:status==1,开始初始化时序,拉低总线500us;status==2,已经拉低总线500us,释放总线60us,等待器件的响应;status==3,等待了60us,判断是否存在器件,延时500us。
21.优选的,写时序分解为:status==4,开始写时序,拉低总线5us;status==5,写bit至总线,延时60us;status==6,写完1bit,释放总线5us。
22.优选的,读时序分解为:status==8,开始读时序,拉低总线5us;status==9,释放总线,延时10us;status==10,单片机采样,延时50us;status==11,读完1bit了,释放总线5us。
23.如图4所示,具体步骤为:1)、status==0等待状态;
24.2)、初始化时序;status==1,开始初始化时序,拉低总线500us,即:start();writetime(500);status++。
25.status==2,已经拉低总线500us,释放总线60us,等待器件的响应,即wait();writetime(60);status++。
26.status==3,等待了60us,判断是否存在器件,延时500us;即:
27.if(read()==0)status++;//如果器件存在进行下一步
28.else status=0;//器件不存在状态归0
29.writetime(500)。
30.3)、写时序;status==4,开始写时序,拉低总线5us;即:start();writetime(5);status++。
31.status==5,写bit至总线,延时60us;即:if(写1)wait();else start();
writetime(60);status++;
32.status==6,写完1bit,释放总线5us,继而判断一个字节是否写完,没写完状态转回status==4,完成了转到status==7;即:wait();writetime(5);if(写完1字节)status++;else status-=2。
33.4)、中间状态,status==7,在写时序命令完成后判断下一步的步骤,如果要读数据转到status==8,要重新初始化转到status==1;
34.5)、读时序;status==8,开始读时序,拉低总线5us,即:start();writetime(5);status++;
35.status==9,释放总线,延时10us,即:wait();writetime(10);status++;
36.status==10,单片机采样,延时50us;status==11,读完1bit了,释放总线5us,继而判断两个字节是否读完,没读完状态转回到status==8,完成了转到status==12;即:wait();writetime(5);if(读完2字节)status++;else status-=3。
37.6)、status==12计算温度值,即根据读出的2字节计算温度值后,并将状态转为status==0,即初始状态,即:temperature=(byte2*256+byte1)*0.0625;status=0;
38.其中:状态机:status,表示进入定时器中断时,处理过程所处的状态;
39.写定时器延时时间:writetime(x),x表示us;
40.启动:start(),单片机拉低总线;
41.等待:wait(),单片机释放总线;
42.读取总线电平:read(),单片机读取总线电平。
43.以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1