51单片机双机通信——DS18B20温度测量

目标实现功能

       甲机控制数字温度传感器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.程序仿真结果

视频如下:

双机通信—DS18B20测温

详尽工程见链接

https://item.taobao.com/item.htm?id=836566535091icon-default.png?t=O83Ahttps://item.taobao.com/item.htm?id=836566535091最重要的一点,祝大家天天开心!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值