|
以下程序为DS18B20 M16 11.0592MHz 情况下5M以内通信正常的程序,我按照1,2,3,5,10M测量的,目的是想测量一下它的通信距离。
这个程序是我调试的比较好的程序了,反应也非常灵敏。
现在我在调试10M,实际是11.8M,近12M的距离,莫非是它通信不到了?
一直显示95,我想应该是没有转换完毕吧,但是无论我把转换时间改为多少【从200ms到1250ms】返回的数据都是95,是否有网友通信的距离超过12M?我用的线是3股平行的细导线。
//-----------------延时程序------------------
void delay_us(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
asm("nop");
}
//----------------DS18B20温度读取程序-----------------
//OneWire.c文件,用于操作DS18B20/DS2401等单总线器件
//注意实际硬件工作的频率
void OneWire_Init(void) //复位,不检测从机设备是否存在(只要没有虚焊就肯定存在的)
{
Set_Dir_OneWire;
Set_OneWire;
CLR_OneWire;
delay_us(960); //480~960us
Set_OneWire;
CLR_Dir_OneWire;
delay_us(60); //15~60us
while(Check_OneWire);
Set_Dir_OneWire;
Set_OneWire;
delay_us(240); //60~240us
}
void Write_OneWire(unsigned char Data) //向单总线的从机写入数据(先写低位再写高位,与SPI相反)
{
unsigned char i;
for(i=0;i<8;i++)
{
CLR_OneWire;
if(Data&(1<<i))Set_OneWire;//写数据了,先写低位的!
else CLR_OneWire;
delay_us(60); //15~60us
Set_OneWire;
}
Set_OneWire;
}
unsigned char Read_OneWire(void)
{
unsigned char data_L,n;
unsigned char temp_OneWire_Data=0;
for(n=0;n<8;n++)
{
CLR_OneWire;
Set_OneWire;
CLR_Dir_OneWire;
data_L=(Check_OneWire); //读数据,从低位开始
if(data_L)temp_OneWire_Data|=(1<<n);
else temp_OneWire_Data&=~(1<<n);
delay_us(120); //60~120us
Set_Dir_OneWire;
}
return temp_OneWire_Data;
}
void read_temperature(void) //读取温度值
{
unsigned char OneWire_DataL;
unsigned char OneWire_DataH;
unsigned char _T=1; //正负温度标志:<16为正 >15为负
switch(process_read_t)
{
case 0: OneWire_Init(); //复位DS18B20
Write_OneWire(0xcc); //跳过ID码匹配,适用于一个DS18B20
Write_OneWire(0x44); //启动温度转换
sign_read_t=1;
process_read_t=1;
break;
case 1: if(counter_read_t==counter_500ms)
{
OneWire_Init();
Write_OneWire(0xcc); //跳过ID码匹配,适用于一个DS18B20
Write_OneWire(0xbe); //通知DS18B20,准备读数据
OneWire_DataL=Read_OneWire(); //读取第一个数据(温度低字节)
OneWire_DataH=Read_OneWire(); //读取第二个数据(温度高字节)
if(OneWire_DataH<16)_T=1;
Data_T=OneWire_DataH*256+OneWire_DataL; //合并后得到原始温度数据
if(!_T) Data_T=(~Data_T+1)/16;
else Data_T/=16; //计算实际温度 -55~+125 器件以0.0625摄氏度递增
//如果温度为正 则T的最高位的4位都为0 否则为1; 负温度的计算:原始数据取反 加1 再乘以0.0625;正温度的计算:原始数据乘以0.0625
if(Data_T==85)Data_T=last_t; //稳定温度,不让通信中的错误数据掺杂进来干扰正常温度
if(last_t!=Data_T)sign_changet=1;//温度发生变化,串口重新上传一次数据,使得上位机的数据实时更新
if(_T) //显示温度函数,温度精度能够达到0.0625摄氏度
{
Data_T=Data_T%100;
data_T_bai=Data_T/100;
data_T_shi=Data_T/10;
data_T_ge=Data_T%10;
}
process_read_t=0;
sign_read_t=0;
last_t=(unsigned char)Data_T;
}
break;
default: break;
}
}
请各位朋友指点。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|