学习目标:实现测温
一、DS18B20介绍
发送/读取数据帧
这里主要使用skip rom,convert t,read scratchpad指令。温度由2个字节存储,在读取暂存器时要分别读取温度数据的低字节和高字节。ms byte高5位是符号位,如果温度为正,那么前5位都是0,反之则为1。ls byte 后四位存的温度数据的小数部分,前4位是整数部分。
代码部分
一、测温部分
整体思路:onewire.c包含初始化,发送接收一位、一个字节的操作,DS18B20.c功能包括温度转化,读取温度。主函数调用DS18B20实现测温。
main.c
#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "delay.h"
float T;
void main()
{
DS18B20_convertT();
delay(1000);
LCD_Init();
LCD_ShowString(1,1,"temperature:");
while(1)
{
DS18B20_convertT();
T=DS18B20_readT();
if(T<0)
{
LCD_ShowChar(2,1,'-');
T=-T;
}
else
{
LCD_ShowChar(2,1,'+');
}
LCD_ShowNum(2,2,T,3);
LCD_ShowChar(2,5,'.');
LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);
}
}
onewire.c
#include <REGX52.H>
sbit onewire_dq=P3^7;
unsigned char onewire_init()
{
unsigned char i;
unsigned char ackbit;
onewire_dq=1;
onewire_dq=0;
i = 227;while (--i);
onewire_dq=1;
i = 29;while (--i);
ackbit= onewire_dq;
i = 227;while (--i);
return ackbit;
}
void onewire_sendbit(unsigned char Bit)
{
unsigned char i;
onewire_dq=0;
i=4;while(--i);
onewire_dq=Bit;
i = 22;while (--i);
onewire_dq=1;
}
unsigned char onewire_receivebit()
{
unsigned char i;
unsigned char Bit;
onewire_dq=0;
i=1;while(--i);
onewire_dq=1;
i=1;while(--i);
Bit=onewire_dq;
i=22;while(--i);
return Bit;
}
void onewire_sendbyte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
onewire_sendbit(byte&(0x01<<i));
}
}
unsigned char onewire_receivebyte()
{
unsigned char i;
unsigned char byte=0x00;
for(i=0;i<8;i++)
{
if(onewire_receivebit())
{byte|=(0x01<<i);}
}
return byte;
}
DS18B20.c
#include <REGX52.H>
#include "onewire.h"
#define DS18B20_skip_rom 0xCC
#define DS18B20_convert_T 0x44
#define DS18B20_read_scratchpad 0xBE
void DS18B20_convertT()
{
onewire_init();
onewire_sendbyte(DS18B20_skip_rom);
onewire_sendbyte(DS18B20_convert_T);
}
float DS18B20_readT()
{
unsigned char TLSB,TMSB;
int temp;
float T;
onewire_init();
onewire_sendbyte(DS18B20_skip_rom);
onewire_sendbyte(DS18B20_read_scratchpad);
TLSB=onewire_receivebyte();
TMSB=onewire_receivebyte();
temp=(TMSB<<8)|TLSB;
T=temp/16.0;
return T;
}