检查了很多天。实在找不出来了。迫不得已,知道检查这个很麻烦,希望各位能帮忙看一下。
#include<reg52.h>
#include<intrins.h>
sbit zx=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //budai
//带小数点
unsigned char code table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned int i,temp;
void delay1(unsigned char z) //11.0592MHz 一个机器周期约1.0851微秒 delay(1)约750微秒
{
unsigned char x,y;
for(x=z;x--;x>0)
for(y=110;y--;y>0);
}
void delay2(unsigned char z) //delay2(1)=7us;delay(10):延时25usdelay(20):延时45usdelay(100):延时205usdelay(200):延时405us
{
while(z--);
}
void display(unsigned int temp)
{
unsigned char A1,A2,A3;
A1 = temp/100; //百位
A2 = temp%100/10; //十位
A3 = temp%10; //个位
dula =0;
P0 =table[A1]; //显示百位
dula = 1; //打开段选,对应74573的锁存位,高电平不锁存
dula = 0;
wela = 0;
P0 = 0xfe;
wela = 1; //打开位选
wela = 0;
delay1(5);
dula=0;
P0 = table1[A2]; //显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)
dula = 1;
dula = 0;
wela = 0;
P0 = 0xfd;
wela = 1;
wela = 0;
delay1(5);
P0 = table[A3]; //显示个位
dula = 1;
dula = 0;
P0 = 0xfb;
wela = 1;
wela = 0;
delay1(5);
}
void initial()
{
zx=1;
_nop_();
zx=0;
delay2(250);
zx=1;
delay2(100);
/* if(zx==0)
signal=1;
else
signal=0;
i=150;
while(i--);
zx=1; */
}
/*bit read_bit(void)
{
bit dat;
zx=0;
_nop_();
zx=1;
delay2(1);
_nop_();
dat=zx;
delay2(20);
return (dat);
}
unsigned char read_char(void)
{
unsigned char m,n,info;
info=0x00;
n=0x00;
for(m=0;m<=7;m++)
{
n=read_bit();
info=(n<<7)|(info>>1);
}
return (info);
} */
unsigned char Read_One_Byte() //读取一个字节的数据read a byte date
//读数据时,数据以字节的最低有效位先从总线移出
{
unsigned char dat = 0;
for(i=8;i>0;i--)
{
zx = 0; //将总线拉低,要在1us之后释放总线
//单片机要在此下降沿后的15us内读数据才会有效。
_nop_(); //至少维持了1us,表示读时序开始
dat >>= 1; //让从总线上读到的位数据,依次从高位移动到低位。
zx = 1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上
delay2(1); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
if(zx) //控制器进行采样
{
dat|=0x80; //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
}
delay2(10); //此延时不能少,确保读时序的长度60us。
}
return (dat);
}
void write_cmd(unsigned char dat)
{
unsigned char m;
bit first;
for(m=1;m<=8;m++)
{
first=dat&0x01;
dat=dat>>1;
if(first)
{
zx=0;
_nop_();
_nop_();
zx=1;
delay2(30);
_nop_();
}
else
{
zx=0;
delay2(30);
_nop_();
}
}
}
void tem_change()
{
initial();
delay1(1);
write_cmd(0xcc);
write_cmd(0x44);
}
unsigned int get_tem()
{
float wendu;
unsigned char a,b;
tem_change();
initial();
delay1(1);
write_cmd(0xcc);
write_cmd(0xbe);
a=Read_One_Byte(); //从低八位开始读
b=Read_One_Byte();
temp=b;
temp=temp<<8;
temp=temp|a;
wendu=temp*0.0625;
temp=wendu*10+0.5;
return (temp);
}
void main()
{
while(1)
{
display(get_tem());
}
} |