AT89C52项目:DS18B20温度报警器
源码在这里,需要自取:
[13.2 DS18B20温度报警器 · 钦某/51project - 码云 - 开源中国 (gitee.com)](https://gitee.com/wang-qin928/51project/tree/master/13.2 DS18B20温度报警器)
我们先来了解DS18B20
我们看到总共有三个接口,gnd是接地,vcc接5v。在DS18B20手册上Vcc标的是Vdd。
中间的接口是传输数据的线。**单总线,异步,半双工,**单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供电(由通信线提供电压,主机配一个强上拉电路)时还可以省去VDD线路,此时,供电加通信只需要两根线。(51单片机不采取这种做法)
初始化:主机将总线拉低至少480us然后释放总线,等待1560us后,从机会拉低总线60240us响应主机,之后从机释放总线。
发送一位: 主机将总线拉低60120us,然后释放总线,表示发送0然后释放总线,表示发送1。从机将在总主机将总线拉低115us,(典型值)线拉低30us后读取电平,整个时间片应大于60us
接收一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),读取为低电平则为接收0,读取为高电平则为接收1,整个时间片应大于60us
之后就将上面两个步骤走8次,就可以封装出两个函数:发送一个字节和接受一个字节。
1 |
|
之后就是在main函数里面调用这俩,然后将其显示在LCD1602上。
之后的任务就是设定温度报警阈值。
定义两个变量THigh,TLow,分别初始化为0°和30°。然后调用独立按键函数,按下Key1,THigh++;按下Key2,THigh–;Key3,4同理控制TLow。
1 |
|
这里将逻辑写好后会发现一个问题:
在你将按键按下后,它就不会再读取数据了。这是因为程序卡在了while循环,在你没松开之前是不会出来的。我们需要重新封装Key.c。这时我们就需要定时器每隔20ms调用一次它。这样既不会干扰主程序的执行,可以实现按键调节温度阈值的功能。
1 |
|
然后加上蜂鸣器的报警功能,这个很简单,当T<TLow调用Buzzer,当T>THigh调用Buzzer。
到这里我们的main是这样的:
1 |
|
这样我们就实现了开头视频的全部功能了。
本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!