闲着蛋疼,花了1个小时用51驱动了ds18b20。
18b20的DQ脚要接上拉电阻,取4.7K就行了。
直接上代码吧。
#include "ioCC1110.h"
#include "hal.h"
#define DQ P1_5
#define INPUT 0
#define OUTPUT 1
#define DS18B20_(put) \
do{ \
if(put == INPUT)\
P1DIR &= 0xDF;\
else \
P1DIR |= 0X20;\
}while(0)
BYTE Temperature[30] = "the temperature is : ";
void DS18B20_Reset(void) //DS18B20 RESET
{
DS18B20_(OUTPUT); //设置为输出状态
DQ = 0; //拉低总线
Delay_us(500); //需要将总线拉低480~950us
DQ = 1; //释放总线
Delay_us(60); //DS18B20拉低信号,60~240us表示应答
DS18B20_(INPUT); //读入DS18B20拉低信号
while(DQ); //等待DS18B20应答
while(!DQ); //等待DS18B20释放总线
}
void Write_DS18B20(BYTE Data)
{
// BYTE Temp;
DS18B20_(OUTPUT); //设置DS18B20输出状态
for(BYTE i=0;i<8;i++){
DQ = 0; //拉低总线
Delay_us(10); //需要拉低10~15us
if(Data&0x01)
DQ = 1;
else
DQ = 0;
Delay_us(40); //需要拉低20~40us来写0
DQ = 1; //释放总线
Delay_us(1); //稍微延时
Data >>= 1;
}
}
BYTE Read_DS18B20(void)
{
BYTE Temp;
for(BYTE i=0;i<8;i++){
Temp >>= 1;
DS18B20_(OUTPUT); //DQ为输出状态
DQ = 0; //拉低总线,启动输入
Delay_us(1); //拉低总线约1us
DQ = 1; //释放总线
DS18B20_(INPUT); //DQ为输入状态
if(DQ)
Temp |= 0x80;
Delay_us(45); //延时45us
}
return Temp;
}
void Read_Temperature(void)
{
// U16 LowTemp,HighTemp,Temp;
BYTE LowTemp;
BYTE HighTemp;
U16 Temp;
DS18B20_Reset();
Write_DS18B20(0xCC); //跳过ROM
Write_DS18B20(0x44); //温度转换
DS18B20_Reset();
Write_DS18B20(0xCC); //跳过ROM
Write_DS18B20(0xbe); //读取RAM
LowTemp = Read_DS18B20(); //读低8位,LS Byte RAM0
HighTemp = Read_DS18B20(); //读高8位,MS Byte RAM1
DS18B20_Reset();
Temp = (U16)(((HighTemp<<8)|LowTemp)*6.25); //0.0625=>xx,0.625=>xx.x,6.25=>xx.xx
Temperature[21] = Temp/1000+48;
Temperature[22] = Temp%1000/100+48;
Temperature[23] = '.';
Temperature[24] = Temp%100/10+48;
Temperature[25] = Temp%10+48;
Temperature[26] = ' ';
Temperature[27] = 'C';
}