多个DS18B20的温度测试问题
由于DS18B20是单总线的器件,但是由于要省时,我把八个DS18B20接在p1口子上,然后把得到的数据进行分析, 但是我的程序哪里不对 哪个高手看看
/*------------------------------------------------
延时函数(1us)
------------------------------------------------*/
void Delay_1us(uint x)
{
while(x--);//时间大约是1us
}
/*------------------------------------------------
写1时序控制函数
------------------------------------------------*/
void DS18B20_Write_1(void)
{
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(10); //延时10us左右
P1 = 0xff; //8个DQ线全部输出高电平
Delay_1us(30); //延时30us左右
}
/*------------------------------------------------
写0时序控制函数
------------------------------------------------*/
void DS18B20_Write_0(void)
{
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(40); //延时
P1 = 0xff; //端口恢复高电平
Delay_1us(1);
}
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
void DS18B20_Reset(void)
{
uchar Error_Counter=0;
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(500); //保持总线低电平500us
P1 = 0xff;
Delay_1us(100);
if(P1!=0x00) B20_Error = P1;//如检测到DS18B20总线响应了回复信号,则读取当前8条总线的状态
Delay_1us(50);
P1 = 0xff;
for(Error_Counter=0;Error_Counter<200;Error_Counter++)
{
if((P1&(~B20_Error))==(~B20_Error)) break; //如检测到总线的回复信号结束,则退出循环
Delay_1us(1);
}
P1 = 0xff; //恢复端口电平
Delay_1us(200); //延时 200us
}
/*------------------------------------------------
总线读取一个数据位
------------------------------------------------*/
uchar DS18B20_ReadDQ(void)
{
uchar DQ_S=0;
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(10);
P1 = 0xff; //端口置1,准备读取
Delay_1us(1); //延时待总线准备好数据
DQ_S = P1; //一次性读取8条DQ线的数据状态
P1 = 0xff; //恢复端口电平
Delay_1us(30); //延时
return DQ_S; //返回读取的值
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void DS18B20_WriteByte(uchar Com)
{
uchar i;
for(i=0;i<8;i++)
{
if(Com&0x01)
DS18B20_Write_1();
else
DS18B20_Write_0();
Com = Com>>1;
}
}
/*------------------------------------------------
读数据
------------------------------------------------*/
void DS18B20_Read2Byte(void)
{
uint i;
for(i=0;i<16;i++)
Read_buf_8ch[i]= DS18B20_ReadDQ(); //16个字节的数据存进RB数组
}
/*------------------------------------------------
温度转换
------------------------------------------------*/
void DS18B20_ReadTemp(void)
{
DS18B20_Reset(); //初始化
DS18B20_WriteByte(0xcc); //跳过 ROM
DS18B20_WriteByte(0x44); //启动测温
Delay_1us(10);
DS18B20_Reset(); //初始化
DS18B20_WriteByte(0xcc); //跳过 ROM
DS18B20_WriteByte(0xbe); //送入读取数据命令
DS18B20_Read2Byte();
} //8个DS18B20器件的测温数据将保存在数组Read_buf_8ch的16个字节单元当中
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
P0=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
P0=weima[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
P0=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==Num)
i=0;
}
void main (void)
{
uint Temp,TempH=50,TempL=1; //定的温度初值范围,可以进行修改
uchar TempFlag=0,t;//buff[16];
uint uiData[8];// 8个DS18B20器件的测温数据将保存在数组uiData当中的8个单元里
uchar Mask,i,j; //OS the resoult of Temperature
Init_Timer0();
UART_Init();
while (1)
{
DS18B20_ReadTemp();
for(i=15;i>=0;i--) //提取每个DS18B20的温度数据
{
Mask = 0x01;
for(j=0;j<8;j++)
{
uiData[j] = uiData[j]<<1;
if(Read_buf_8ch[i]&Mask) uiData[j]++;
Mask = Mask<<1; //uiData存的是每个DS18B20的温度值,uiData[1]为P1^0口
}
}
if(i>=0&&i<=8)
Temp=uiData[i];
t=(Temp>>4)+(Temp<<4);
t*=0.0625;
TempData[0]=duma[t/10];
TempData[0]=duma[t%10];
i++;Temp=0;
}
/*------------------------------------------------
延时函数(1us)
------------------------------------------------*/
void Delay_1us(uint x)
{
while(x--);//时间大约是1us
}
/*------------------------------------------------
写1时序控制函数
------------------------------------------------*/
void DS18B20_Write_1(void)
{
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(10); //延时10us左右
P1 = 0xff; //8个DQ线全部输出高电平
Delay_1us(30); //延时30us左右
}
/*------------------------------------------------
写0时序控制函数
------------------------------------------------*/
void DS18B20_Write_0(void)
{
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(40); //延时
P1 = 0xff; //端口恢复高电平
Delay_1us(1);
}
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
void DS18B20_Reset(void)
{
uchar Error_Counter=0;
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(500); //保持总线低电平500us
P1 = 0xff;
Delay_1us(100);
if(P1!=0x00) B20_Error = P1;//如检测到DS18B20总线响应了回复信号,则读取当前8条总线的状态
Delay_1us(50);
P1 = 0xff;
for(Error_Counter=0;Error_Counter<200;Error_Counter++)
{
if((P1&(~B20_Error))==(~B20_Error)) break; //如检测到总线的回复信号结束,则退出循环
Delay_1us(1);
}
P1 = 0xff; //恢复端口电平
Delay_1us(200); //延时 200us
}
/*------------------------------------------------
总线读取一个数据位
------------------------------------------------*/
uchar DS18B20_ReadDQ(void)
{
uchar DQ_S=0;
P1 = 0x00; //8个DQ 线全部设置为低电平
Delay_1us(10);
P1 = 0xff; //端口置1,准备读取
Delay_1us(1); //延时待总线准备好数据
DQ_S = P1; //一次性读取8条DQ线的数据状态
P1 = 0xff; //恢复端口电平
Delay_1us(30); //延时
return DQ_S; //返回读取的值
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void DS18B20_WriteByte(uchar Com)
{
uchar i;
for(i=0;i<8;i++)
{
if(Com&0x01)
DS18B20_Write_1();
else
DS18B20_Write_0();
Com = Com>>1;
}
}
/*------------------------------------------------
读数据
------------------------------------------------*/
void DS18B20_Read2Byte(void)
{
uint i;
for(i=0;i<16;i++)
Read_buf_8ch[i]= DS18B20_ReadDQ(); //16个字节的数据存进RB数组
}
/*------------------------------------------------
温度转换
------------------------------------------------*/
void DS18B20_ReadTemp(void)
{
DS18B20_Reset(); //初始化
DS18B20_WriteByte(0xcc); //跳过 ROM
DS18B20_WriteByte(0x44); //启动测温
Delay_1us(10);
DS18B20_Reset(); //初始化
DS18B20_WriteByte(0xcc); //跳过 ROM
DS18B20_WriteByte(0xbe); //送入读取数据命令
DS18B20_Read2Byte();
} //8个DS18B20器件的测温数据将保存在数组Read_buf_8ch的16个字节单元当中
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
P0=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
P0=weima[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
P0=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==Num)
i=0;
}
void main (void)
{
uint Temp,TempH=50,TempL=1; //定的温度初值范围,可以进行修改
uchar TempFlag=0,t;//buff[16];
uint uiData[8];// 8个DS18B20器件的测温数据将保存在数组uiData当中的8个单元里
uchar Mask,i,j; //OS the resoult of Temperature
Init_Timer0();
UART_Init();
while (1)
{
DS18B20_ReadTemp();
for(i=15;i>=0;i--) //提取每个DS18B20的温度数据
{
Mask = 0x01;
for(j=0;j<8;j++)
{
uiData[j] = uiData[j]<<1;
if(Read_buf_8ch[i]&Mask) uiData[j]++;
Mask = Mask<<1; //uiData存的是每个DS18B20的温度值,uiData[1]为P1^0口
}
}
if(i>=0&&i<=8)
Temp=uiData[i];
t=(Temp>>4)+(Temp<<4);
t*=0.0625;
TempData[0]=duma[t/10];
TempData[0]=duma[t%10];
i++;Temp=0;
}
...全文
相关推荐
DS18B20温度测试实验.zip_ds18b20_单片机
ds18b20采集温度数据发送到单片机AT89C51上,处理并显示。
基于DS18B20的温度检测
每个DS18B20的片内ROM都存有一个独一无二的64位编码。在该ROM编码的低8位保存有DS18B20的分类编码:28h;中间的48位是独一无二的序列号;最高8位是前面56位的CRC循环冗余校验码 (CRC=X8+X5+X4+1)。因为每个DS18B20的序列号都不一样,所以一条总线上可以控制多个DS18B20。温度测量方法:DS18B20中的温度传感器可完成对温度的测量,他的温度转换精度用户可自定义为9、10、11、12位,精度分别为0.5℃、0.25℃、0.125℃、0.0625℃分辨率。
51单片机温度传感器DS18B20
DS18B20是由DALLAS半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、 适用电压宽、与微处理器接口简单的数字化温度传感器。
基于DS18B20的温度测试程序
这是一个基于DS18B20的温度测试程序,它可以感应温度并输出相应的温度值(串口输出)
DS18B20多路温度检测
下面是一个利用 51 系列单片机驱动多路 DS18B20 的电路图。


单片机/工控
