本帖最后由 xyp749192072 于 2010-5-7 15:56 编辑
#include <reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar jump[4]={ 0xcc,0xcc,0xcc,0xcc};
uchar start[4]={0x44,0x44,0x44,0x44};
uchar read[4]={ 0xbe,0xbe,0xbe,0xbe};
uint temp;
uchar back[4];
uchar ret[4];
void delay(int z) //以15um递增
{ int x,y;
for(x=0;x<110;x++)
for(y=0;y<z;y++)
;
}
uchar reset() //复位四根缆
{ uchar flag,i;
P1=0XFF;
P1=0XF0;
for(i=200;i>0;i--); //延时 802 us time=1+2*i
for(i=200;i>0;i--);
P1=0XFF;
for(i=60;i>0;i--);// 延时 120 us
flag=P1&0x01;
for(i=200;i>0;i--);// 延时 400us 满足 最小周期
return flag; //返回0则复位成功
}
void write_bit(uchar *wei) //wei地址存 P3^0
{
uchar i;
uchar four=0;
for(i=0;i<4;i++)
four+=( ( *(wei+i) ) << i );//四通道位值转换成 一个数值
P1=0XFF;
P1=0;
_nop_();
_nop_();
P1=four;
for( i=30;i>0;i--);//满足最小 写周期
P1=0XFF;
}
void write_byte(uchar *date)//data指向数据首地址
{ uchar i,j;
uchar a[4];
for(i=0;i<8;i++)
{
for(j=0;j<4;j++)
a[j]=( ( *(date+j) ) >>i ) & 0x01;
write_bit(a);
}
}
void read_bit()
{ uchar flag,i,bb;
uchar aa=0;
P1=0xff;
P1=0;
_nop_();
_nop_();
P1=0xFF;
for(i=0;i<5;i++);
flag=P1&0X0F;//只要低四位数值
for(i=40;i>0;i--); //满足最小读周期
P1=0xFF; //满足最大读时隙
for(i=0;i<4;i++)//四通道数值 存到数组中 P2^0是第一个
{ bb=(1<<i);
aa=flag&bb;
if(aa!=0)
back=1;
else
back=0;
}
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
第一种:
uchar read_byte()
{
uchar i,j;
uchar mid;
for(i=0;i<8;i++)
{
read_bit();
for(j=0;j<4;j++)
{
mid=back[j] <<i;
ret[j]=ret[j]+mid;
}
}
return ret[0];
}
第二种:
uchar read_byte()
{ uchar ret[4]=【0】;
uchar i,j;
uchar mid;
for(i=0;i<8;i++)
{
read_bit();
for(j=0;j<4;j++)
{
mid=back[j] <<i;
ret[j]=ret[j]+mid;
}
}
return ret[0];
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
void display(uint tem)
{
P0 =table[tem / 100];
P2 = 0x04;
delay(10);
P2=0;
P0 =table[tem / 10 % 10];
P2 = 0x02;
delay(10);
P2=0;
P0 =table[tem % 10];
P2 = 0x01;
delay(10);
P2=0;
}
void main()
{ uchar aa=0;
uchar bb=0;
P2 = 0x00;
while(1)
{
reset() ;
write_byte(jump);
write_byte(start);
reset();
write_byte(jump);
write_byte(read);
aa=read_byte();//低字节温度
bb=read_byte() ;//高字节温度
aa=aa&0XF8;
bb=bb&0X07;
temp=((bb*0XFF)+aa)*0.0625;
display(temp);
}
}
大家帮我看看,当采用第一种情况时候,我能采集到正确稳定的温度,当采用第二种情况时候,采集到的温度数字剧烈变化,且数字不正常。两者情况差别只在于全局变量和局部变量的分别,却造成这么大影响,谁能给解释一下?问了很多人都解释不了,只能到21ic上找牛人了 |