多个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;
}
[解决办法]
前两天有一个精华的贴子一个IO挂多个搞成功了的,你可以去请教一下那个LZ
[解决办法]
那个帖子?我怎么没搜索到啊?
[解决办法]