蓝桥杯笔记之 DS18B20驱动程序(八)

标签: 蓝桥杯  单片机

一、芯片介绍

1、DS18B20特点
(1)采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。
(2)测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范围内,精度为 ± 0.5°C 。
(3)持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。
(4)测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
1、引脚及原理图
(1)引脚
引脚图
(2)原理图
原理图

二、程序原理分析

1、使用一次DS18B20的操作步骤

Step 1.Initialization:

主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。
做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。

Step 2.ROM Command (followed by any required data exchange):

写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

Step 3. DS18B20 Function Command (followed by any required data exchange):

对于读数据操作时序也分为读0时序和读1时序两个过程。读时隙是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成

赛点资源已经给出了底层驱动程序(初始化,读,写函数),稍作改动直接调用即可。至于如何修改请看下面的文章,该文章末尾。文章连接

2、需要掌握的ROM命令

命令 代码
SKIP ROM(跳过ROM) CCH

3、需要掌握的DS18B20功能命令

命令 代码 参数或返回值 说明
CONVERT T(温度转换) 44H 0-转换,1-完成 启动温度转换,转换结果存放在暂存器的0~1个字节
READ SCRATCHPAD(读暂存器) BEH 9字节数据 读取暂存器的0~8字节

4、数据在寄存器中的格式

数据格式

三、操作步骤

1
(1)初始化
(2)发送ROM命令–SKIP ROM
(3)发送功能命令–温度转换
2
(1)初始化
(2)发送ROM命令–SKIP ROM
(3)发送功能命令–读取暂存器
(4)读暂存器(ds18b20在收到读暂存器功能命令后先发送低位,再发送高位)

四、程序例程

1.以下为主程序

#include<STC15F2K60S2.H>
#include<intrins.h>
#include<onewire.h>
#define uchar unsigned char

uchar wendu,low,heigh;
uchar wei_tab[]={0xff,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};		//位选从0到8依次为全选,1号管到八、8号管
uchar duan_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xbf};	//段选从0到10依次为,0到9以及‘-’

void Delay1ms();
void all_init();
void dispaly(uchar wei,uchar duan);

//void Delay_OneWire(unsigned int t);
//void Write_DS18B20(unsigned char dat);
//unsigned char Read_DS18B20(void);
//bit init_ds18b20(void);

void main()
{
	all_init();
	while(1)
	{
		init_ds18b20();		//初始化
		Write_DS18B20(0xcc);	//跳过rom
		Write_DS18B20(0x44); 	//发送温度转换命令

		init_ds18b20();		//初始化
		Write_DS18B20(0xcc);	//跳过ROM
		Write_DS18B20(0xbe);	//发送读暂存器命令
		low=Read_DS18B20();		//先读低位
		heigh=Read_DS18B20();	//
		wendu=(heigh<<4)+(low>>4);	//数据转换

		dispaly(1,wendu/100);
		dispaly(2,(wendu%100)/10);
		dispaly(3,wendu%10);


	}
}


void all_init()
{
	P2=0x80;	//译码器输出选择Y4 ,p27,p27,p25控制译码器输出
	P0=0x00;

	P2=0xa0;	//ULN2003
	P0=0x00;	//主要是想关了蜂鸣器
}

void dispaly(uchar wei,uchar duan)
{
	P2=0xc0;	//1100 0000,译码器输出Y6,选择位选锁存器
	P0=wei_tab[wei];

	P2=0xff;
	P0=duan_tab[duan];

	Delay1ms();
}

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

2.下面需要对赛点资源包提供的底层驱动(onewire.c)做出一个修改
(对那个单总线延时函数做出修改)

原来:

void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	while(t--);
}

修改为

void Delay_OneWire(unsigned int t)  //STC89C52RC
{
	t=12*t;
	while(t--);
}
版权声明:本文为weixin_45289059原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45289059/article/details/107741882