本帖最后由 backupyan 于 2009-12-21 19:25 编辑
请严格注意时序。例如延时60us,15us等延时。因为DS18B20与单片机之间不是同步的。参考程序压缩包(MPLAB+Proteus+PICC)
参考程序如下:
//*********************************************************
// 实现的功能:数码管显示实时温度,支持负温度
// 芯片PIC16F877
// XT:4MHZ
//*********************************************************
#include <pic.h> //包含单片机内部资源预定义
#define LVP 0x3f39
// 晶振:XT;代码:没有代码保护;上电延时定时器关闭;
// 低电压复位禁止;看门狗关闭 ;低电压编程禁止
__CONFIG (XT & UNPROTECT & PWRTDIS & BORDIS & WDTDIS & LVP);
#define uch unsigned char //给unsigned char起别名 uch
#define DQ RA2 //定义18B20数据端口
#define DQ_DIR TRISA2 //定义18B20D口方向寄存器
#define DQ_HIGH() DQ_DIR =1 //设置数据口为输入
#define DQ_LOW() DQ_DIR = 0;DQ = 0 //设置数据口为输出
void init_port(void)
{
RBPU=0;
// PORTB=0xFF;
TRISB=0xFF;
PORTD=0x00; //
TRISC=0x00; //C口控制LED指示灯,设置成输出
TRISD=0; //D口当作数码管段,设置成输出
ADCON1=0x07; //使A口,E口全为数字I/O口
TRISE=0x00; //E口当作数码管位选择控制脚,设置成输出
PORTE=0x00;
}
//*********************************************************
// 延时程序
//*********************************************************
void delay(char x,char y)
{
char z;
do{
z=y;
do{;}while(--z);
}while(--x);
}
//复位DS18B20函数
void reset(void)
{
uch presence=1;
while(presence)
{
DQ_LOW() ; //主机拉至低电平
delay(2,90); //延时>480503us
DQ_HIGH(); //释放总线等电阻拉高总线,并保持15~60us
delay(2,8); //延时>60us
if(DQ==1) presence=1; //没有接收到应答信号,继续复位
else presence=0; //接收到应答信号
delay(2,70); //延时>240us
}
}
//-----------------------------------------------
//写18b20写字节函数
void write_byte(uch val)
{
uch i;
uch temp;
for(i=8;i>0;i--)
{
temp=val&0x01; //最低位移出
DQ_LOW();
NOP();
NOP();
NOP();
NOP();
NOP(); //从高拉至低电平,产生写时间隙
if(temp==1) DQ_HIGH(); //如果写1,拉高电平
delay(2,7); //延时63us
DQ_HIGH();
NOP();
NOP();
val=val>>1; //右移一位
}
}
void get_temp()
{
int i;
DQ_HIGH();
reset(); //复位等待从机应答
write_byte(0XCC); //忽略ROM匹配
write_byte(0X44); //发送温度转化命令
for(i=10;i>0;i--)
{
delay(201,132);
}
reset(); //再次复位,等待从机应答
write_byte(0XCC); //忽略ROM匹配
write_byte(0XBE); //发送读温度命令
TLV=read_byte(); //读出温度低8位
THV=read_byte(); //读出温度高8位
DQ_HIGH(); //释放总线
TZ=(TLV>>4)|(THV<<4); //温度整数部分
TX=TLV<<4; //温度小数部分,注意TX的后四位无效码
binary_temp(TX, TZ ); //将相应的温度二进制值转换成十进制数
}
|