"); //-->
/*********************************************************************
功能: 控制数字温度传感器DS18B20,熟悉1总线操作
*********************************************************************/
#include<ADuC7026.H>
#define PIN GP2DAT = 0x00; // 设置P2.7为输入,由于总线存在上拉电阻,所以此时是高电平1
#define POUT_0 GP2DAT = 0x80000000; // 设置P2.7为输出,同时输出低电平0
#define POUT_1 GP2DAT = 0x80800000; // 设置P2.7为输出,同时输出高电平1
unsigned char data_H, data_L;
unsigned short int data_T;
void delay_us(int lengh) // 微妙延时子程序
{
int i="lengh"*9;
while(i>0)
i--;
}
void delay_ms(int a) // 毫秒延时子程序
{
int i;
for(i=0;i<1000*a;i++)
delay_us(1);
}
// 1总线初始化子程序
void monobus_init()
{
POUT_1; // 复位脉冲(下降沿)
POUT_0;
delay_us(60); // 延时480-960us
PIN; // 拉高总线
delay_us(45); // 延时15-60us
if((GP2DAT&0x80)==0x80) // 判断DS18B20是否存在,如果存在会产生一个低电平60-240us
while(1);
PIN; // 拉高总线
delay_us(3);
}
//读数据子程序(先传输低位后传输高位)
unsigned char read_monobus(void)
{
unsigned char data_18b20=0;
unsigned char n="1";
while(n)
{
POUT_1;
POUT_0;
delay_us(1); // 拉低总线1-3us,通知从机准备收发数据
PIN; // 释放总线
delay_us(2); // 从机在1-15us内会向总线输出数据的某一位(1或者0)
if((GP2DAT&0x80)==0x80)
data_18b20+=n; // 读取总线数据
delay_us(1); // 等待从机释放总线
n<<=1;
}
return data_18b20;
}
//写数据子程序(先写低位再写高位)
void write_monobus(unsigned char data)
{
unsigned char n="1";
while(n)
{
POUT_1;
POUT_0;
if(data&n)
{ POUT_1;}
else
POUT_0; // 向总线写数据的某一位(1或者0)
delay_us(60); // 等待60us保证从机有足够的时间进行采样
PIN; // 释放总线
delay_us(2); // 释放总线时间要大于1us
n<<=1;
}
}
int DS18B20(void)
{
monobus_init(); // 调用初始化子程序
write_monobus(0xCC); // 跳过ID码匹配,适用于一个DS18B20
//可以使用8条语句代替上面的那条语句依次写入8个ID码,这样就是ID码匹配了
//如果不知道18B20的ID码,可以在总线上接入单个18B20
//然后参考下面的读取语句,依次读取18B20的8个ID码
//记得使用CRC8校验一下是否正确
write_monobus(0x44); // 启动温度转换
delay_ms(100); // 等待转换结束
monobus_init(); // 调用初始化子程序
write_monobus(0xCC); // 跳过ID码匹配
write_monobus(0xBE); // 通知DS18B20,准备读数据
data_L=read_monobus(); // 读取第一个数据(温度低字节)
data_H=read_monobus(); // 读取第二个数据(温度高字节)
//此时如果有需要可以继续读取第三个到第九个RAM数据
data_T=data_H*256+data_L; // 合并后得到原始温度数据
if(data_H>15)
data_T=(~data_T+1)/16;
else
data_T/=16; // 计算实际温度
return data_T;
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。