多个DS18B20的温度测试问题

mondeo8320350 2012-07-11 03:55:31
由于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;
}
...全文
397 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshi_ziyu 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

那个帖子?我怎么没搜索到啊?
[/Quote]

不同型号的单片机带多个DS18B20
mondeo8320350 2012-07-11
  • 打赏
  • 举报
回复
那个帖子?我怎么没搜索到啊?
lbing7 2012-07-11
  • 打赏
  • 举报
回复
前两天有一个精华的贴子一个IO挂多个搞成功了的,你可以去请教一下那个LZ

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧