打印

温度测试问题

[复制链接]
1465|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinadz|  楼主 | 2012-7-11 22:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于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;
}

相关帖子

沙发
pkat| | 2012-7-11 22:12 | 只看该作者
记得以前好像讨论过这个问题,LZ搜搜以前的帖子

使用特权

评论回复
板凳
火箭球迷| | 2012-7-11 22:22 | 只看该作者
LS可以给个链接

使用特权

评论回复
地板
baidudz| | 2012-7-11 22:29 | 只看该作者
程序有点长了,实在没耐心看完

使用特权

评论回复
5
无冕之王| | 2012-7-12 21:52 | 只看该作者
LZ应该把程序标个重点,问题清晰的提出来,不然一般人还真没耐心看完

使用特权

评论回复
6
秋天落叶| | 2012-7-12 22:15 | 只看该作者
错误提示贴出来看看

使用特权

评论回复
7
summerlover| | 2012-9-12 21:31 | 只看该作者
好长啊,还真一下子看不懂啊

使用特权

评论回复
8
秋天落叶| | 2012-9-13 18:19 | 只看该作者
问题应该已经解决了吧

使用特权

评论回复
9
summerlover| | 2012-9-14 20:57 | 只看该作者
还是把重点贴出来,就好看了。这程序太长了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

304

主题

2313

帖子

0

粉丝