One Wire协议应用篇(c语言板)
2023-12-23 06:21:50
一.项目简介
????????利用DS18B20实时检测温度并显示在LCD1602显示屏上,同时可以通过K1,K2,K3,K4设置最高温度和最低温度利用AT24C02可以实现掉电不丢失,最后当检测温度大于或小于最高温时,会在LCD1602显示屏上显示OV:H或OV:L。
二.准备材料
????????AT89C52、LCD1602显示屏、4只按键、AT24C02、DS18B20。
?
三.操作资料汇总
????????AT24C02芯片:2K位串行CMOS E2PROM, 内部含有256个8位字节,AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息。
存储介质:EEPROM;通讯接口:I2C总线。
??
????????DS18B20数字温度传感器:输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。[1]? DS18B20数字温度传感器接线方便,封装成后可应用于多种场合。通讯接口:单总线协议进行通信(One-Wire)
四.One-Wire协议解析与C代码
(1)初始化时序
?
代码
unsigned char onewire_init(void)
{
unsigned char i;
unsigned char ackbit;
onewire_dq = 1;
onewire_dq = 0;
i = 247;
while (--i); //delay 500us
onewire_dq = 1;
i = 32;
while (--i); //delay 70us
ackbit = onewire_dq;
i = 247;
while (--i); //delay 500us
return ackbit;
}
(2)读时序
代码?
unsigned char onewire_receivebit(void)
{
unsigned char i;
unsigned char Bit;
onewire_dq = 0;
i = 2;
while (--i); //delay 9us
onewire_dq = 1;
i = 2;
while (--i); //delay 9us
Bit = onewire_dq;
i = 22;while (--i); //delay 50us
return Bit;
}
(3) 写时序
?代码
unsigned char onewire_sendbit(unsigned char Bit)
{
unsigned char i;
onewire_dq = 0;
i = 4;
while (--i); //delay 14us
onewire_dq = Bit;
i = 22;
while (--i); //delay 50us
onewire_dq = 1;
}
?(4)主函数代码
?
#include <REGX52.H>
#include "LCD1602.h"
#include "onewire.h"
#include "DS18B20.h"
#include "key.h"
#include "AT24C02.h"
float t,tshow;
char tlow,thigh;
unsigned char keynum;
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
}
while (--i);
}
void main()
{
LCD_Init();
LCD_ShowString(1,1,"T:");
LCD_ShowString(2,1,"TH:");
LCD_ShowString(2,9,"TL:");
thigh = AT24C02_ReadByte(0);
tlow = AT24C02_ReadByte(1);
while(1)
{
LCD_ShowSignedNum(2,4,thigh,3);
LCD_ShowSignedNum(2,12,tlow,3);
keynum = key();
ds18b20_convert();
t = ds18b20_readt();
if(t<0)
{
LCD_ShowChar(1,3,'-');
tshow= -t;
}
else{
LCD_ShowChar(1,3,'+');
tshow = t;
}
LCD_ShowNum(1,4,tshow,3);
LCD_ShowChar(1,7,'.');
LCD_ShowNum(1,8,(unsigned long)(tshow*100)%100,2);
if(keynum)
{
if(keynum==1)
{
thigh++;
if(thigh>125)
{
thigh=125;
}
}
if(keynum==2)
{
thigh--;
if(thigh<=tlow)
{
thigh++;
}
}
if(keynum==3)
{
tlow++;
if(tlow>=thigh)
{
tlow--;
}
}
if(keynum==4)
{
tlow-- ;
if(tlow<-55)
{
tlow = -55;
}
}
if(tshow>thigh)
{
LCD_ShowString(1,13,"OV:H");
}
else if(tshow<tlow){
LCD_ShowString(1,13,"OV:L");
}
else{
LCD_ShowString(1,13," ");
}
AT24C02_WriteByte(0,thigh);
Delay5ms();
AT24C02_WriteByte(1,tlow);
Delay5ms();
}
}
}
五.运行结果
????????由测试图中的LCD1602显示屏可以得出:当前室温是24.18℃,最高温限制为21℃,最低温限制为-2℃。?
文章来源:https://blog.csdn.net/weixin_66634995/article/details/135162644
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!