目标实现功能
甲机控制数字温度传感器DS18B20采集温度、并将温度传递给乙机;乙机接收甲机传递的温度数据、并通过8位数码管动态显示。
1.DS18B20简介
1.1 DS18B20特点
DS18B20采用单总线接口,测量结果直接输出数字信号,通过单总线传递给微处理器。工作电压在3.0v~5.5v,供电方式灵活,即可以采用外部供电、也可以采用寄生供电。测温范围在-55℃~125℃,分辨率可编程,最小分辨率可达0.0625℃。
1.2 DS18B20内部结构
(1)64位ROM编码
开始8位是产品系列编码,中间48位是DS18B20自身序列号,最后8位是前面56位的循环冗余校验码。不同的DS18B20,有不同的64位ROM编码,根据这一特点可以在单总线上挂接多只DS18B20实现组网多点测温。
(2)9字节的高度缓存寄存器
9个字节由低到高依次存放信息如下:温度低字节、温度高字节、温度报警上限副本、温度报警下限副本、分辨率配置副本、未用(保留)、未用(保留)、未用(保留)、前面8字节的循环冗余校验码。
(3)3个EEPROM存储器
3个EEPROM存储器(掉电不丢失)分别保存温度报警上限、温度报警下限和分辨率数据。
1.3 DS18B20读取温度(单只时)
初始化:单片机将数据线拉低至少480us后释放数据线,等待15~60us后,若DS18B20将数据线拉低60~240us,单片机才可对其进行ROM指令操作。
ROM、RAM指令:初始化后单片机发出ROM指令:CCH(即跳过ROM匹配,用于总线上只有1只DS18B20的情况)。接着单片机发出RAM指令:44H(即启动温度采集指令)。此时DS18B20会采集温度,并将温度保存在高速暂存器的第0个字节和第1个字节。
等待DS18B20完成温度采集和转换(例如,当设置DS18B20分辨率为0.0625℃时需要等待750ms)。
重复初始化操作和CCH指令,发出RAM指令:BEH(即读取暂存器指令)。此时DS18B20会将告诉暂存器9个字节的数据从低到高输出,其中第0个字节和第1个字节对应的温度的二进制形式。将这16位二进制数,根据正负情况、对应的分辨率进行二进制到十进制的数据转换。例如:二进制数0000 0101 0101 0000,对应的十进制数乘以分辨率即可得到十进制温度;二进制数1111 1100 1001 0000,取反加1后对应的十进制数乘以分辨率即可得到十进制温度。
1.4 编写DS18B20工作时序
初始化时序:对DS18B20执行ROM、RAM指令前必须先初始化!!
程序如下:
/*DS18B20初始化函数*/
bit ds18b20_init()
{
bit flag;//定义判断标志
DQ=1;//确保DQ开始是高电平
delay(1);//稍作延时
DQ=0;//单片机拉低电平发送复位脉冲
delay(54);//延时大于480us
DQ=1;//释放DQ,等待DS18B20响应
delay(4);//延时15us到60us之间
flag=DQ;//读取DQ状态,1:DS18B20不存在 0:存在
delay(54);//延时大于480us
DQ=1;//DQ复位
return flag;
}
写时序:单片机向DS18B20写入数据(包括ROM、RAM指令等)。
程序如下:
/*主机向DS18B20写入数据(8位)*/
void ds18b20_writebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;//单片机拉低电平发产生写时序
_nop_();
_nop_();//延时大于1us
DQ=dat&0X01;//先发低位
delay(5);//延时61us
DQ=1;//释放DQ
dat=dat>>1;//次低位补位
}
}
读时序:单片机从DS18B20读取数据时(包括温度等)
程序如下:
/*主机从DS18B20读取数据(8位)*/
uchar ds18b20_readbyte()
{
uchar i,dat=0,wbit;
for(i=0;i<8;i++)
{
DQ=0;//单片机拉低电平发产生读时序
_nop_();
_nop_();//延时大于1us
DQ=1;//释放DQ
_nop_();
_nop_();//延时大于1us
wbit=DQ;//先接收低位
dat=(dat>>1)|(wbit<<7);//数据处理,调整高低位顺序
delay(5);//延时61us
}
return dat;
}
注意:程序严格遵循DS18020时序 、上述程序中延时部分均以12MHz晶振为前提!!!!
2.双机通信
2.1 串口通信工作过程
发送数据过程:单片机执行写SBUF指令后,发送控制器在定时器产生的移位脉冲控制下,将数据由低位到高位逐位发送。发送完1帧数据后,发送中断请求标志位向CPU中断申请,CPU响应中断并开始发送下一帧数据。
接收数据过程:单片机串行控制寄存器(SCON)中REN位为1时才允许接收数据,当单片机RXD引脚检测到一帧数据的起始信号,接收控制器在定时器产生的移位脉冲控制下,将RXD引脚输入的数据由低位到高位逐位移入输入移位寄存器。最后,输入移位寄存器将数据送入接收SBUF,同时接收中断请求标志位向CPU中断申请,CPU响应中断并接收数据。
2.2 串行通信口初始化
每一种串行口的工作方式,都有对应的数据帧格式,以及波特率是否可变。波特率的设置还与单片机晶振、定时器的工作方式,以及PCON寄存器中的波特率设置位SMOD有关。
假设单片机晶振为12MHz,以串行通信口工作在方式1、定时器T1用作波特率发生器并工作在方式2为例,则初始化程序如下:
/*串口初始化*/
void usart_init()
{
TMOD=0X20;//T1:定时模式、方式2(8位自动重装)、启动仅由TR1控制。
TH1=0XF3;//存放初值
TL1=0XF3;//计数
PCON=0X80;//倍增,波特率4800、12MHz晶振
TR1=1;//启动定时器1
SCON=0X50;//串行口方式1(10位异步收发)REN允许
ES=1;//串行口中断允许位
EA=1;//总中断允许
}
3.程序仿真结果
视频如下:
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="DebJzh57-1726929881329" src="https://player.bilibili.com/player.html?aid=113170307882830"></iframe>双机通信—DS18B20测温
详尽工程见链接
https://item.taobao.com/item.htm?id=836566535091https://item.taobao.com/item.htm?id=836566535091最重要的一点,祝大家天天开心!!!
标签:初始化,ROM,DS18B20,51,单片机,DQ,双机,温度 From: https://blog.csdn.net/weixin_45755708/article/details/142387374