前言
其实看到很多博客,介绍这一类的时候都是介绍很多细节上的东西,比如说DS18B20的时序是什么样子的,其实这些知识对于我们速成来说,以及编写蓝桥杯来说是没有必要的,因为他给我写好了一部分的驱动代码所以我们知道怎么修改这个驱动代码就可以了。
硬件略解
其实这一节都没有什么硬件略解,因为这个传感器很简单,只有三个引脚,分别是VCC GND和信号
软件详解
我们需要修改的一个地方就是delay函数,因为它编写的是51单片机的,而我们实际使用的是stc15单片机,他和传统51的区别是这个12T和1T工作模式,我们需要做的就是将这个延时的变大12倍。
/*
程序说明: 单总线驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
日 期: 2011-8-9
*/
#include "common.h" //没有什么东西,就是一些声明
sbit DQ = P1 ^ 4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
uint z;
while (t--)
for(z=0;z<12;z++); //在这里加一句这个
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
DQ = dat & 0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for (i = 0; i < 8; i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if (DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
float rd_temperature(void)
{
unsigned int temp;
unsigned char low, high; //收集数据的--高低位
float tempreturn;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44); //直接使用温度转换(这种地方自己看手册芯片理解CC、BE、44的用法)
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low = Read_DS18B20();
high = Read_DS18B20();
temp = high;
temp <<= 8;
temp |= low;
tempreturn = temp * 0.0625; //精度为0.0625,需要乘以0.0625
return tempreturn;
//返回温度数值,直接在主函数里获取就可以直接使用了
}
对于我们速成来说,我们首先是需要记忆一下这个一个通信的流程和需要修改的地方。其实如果有时间的话,可以适当在datasheet里面去查看一下这些寄存器是写在哪里的,这样我们忘记的话可以查看一下,引起自己的回忆。