我最近在研究1--wire总线,然后通过单片机控制18b20测温,并把温度显示在4个数码管上,但是调了半天程序,显示一直都是0000,哪位大侠帮我看下我的程序错在哪?谢谢~~
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={0x00,0x04,0x08,0x0c};
uchar code table2[]={0xfc,0x60,0xda,0xf2,
0x66,0xb6,0xbe,
0xe0,0xfe,0xf6};
sbit DQ=P3^7;
uint temp,num=0;
void delay(uint z)
{
while(z--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void init_t0( )
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
void init18b20( ) //初始化总线
{
DQ=1;
_nop_();
DQ=0;
delay(48);//延迟至少480微秒
DQ=1;//释放总线
delay(10);
}
void write_bit(bit abit) //写入一个字位
{
DQ=1;
_nop_();//保证每次写之间有至少1微秒的间隔
DQ=0;
_nop_();
if(abit) //写1时间间隙
{
DQ=1;
delay(6);
}
else //写0时间间隙
{
delay(6);
DQ=1;
}
}
void write_byte(uchar dat) //写入一个字节
{
uint i=0;
bit test;
_nop_();
for(i=0;i<8;i++)
{
test=dat&0x01;
write_bit(test);
dat=dat>>1;
_nop_();
}
}
bit read_bit(void) //读出一个字位
{
bit abit;
_nop_();
DQ=1;
_nop_( );
DQ=0; //准备好读
_nop_();
_nop_();
abit=DQ; //主机采样
return(abit);
}
uchar read_byte(void) //读出一个字节
{
uint i=0;
uchar dat,j;
for(i=0;i<8;i++)
{ _nop_();
j=read_bit();
dat=(j<<7)|(dat>>1);//由于传输多是从最低有效位开始的,故先把最低位移至高位,再慢慢往低位移动
}
return(dat);
}
void get_tem(void)
{
init18b20();
write_byte(0xcc); //忽略读ROM
write_byte(0x44); //温度转化
}
uint read_tem( )
{
uint i;
uchar a,b;
init18b20();
write_byte(0xcc);
write_byte(0xbe); //读暂存器
a=read_byte( );
b=read_byte( );
i=b;
i=i<<8;
i=i|a;
temp=i;
//if(temp>6348) // 温度值正负判断
//{temp=65536-temp;}
//temp=temp*0.625;
return(temp);
}
void display( )
{
P2=table1[0];
P0=table2[temp%10];
delay(200);
P2=table1[1];
P0=table2[(temp%100)/10];
delay(200);
P2=table1[2];
P0=table2[(temp%1000)/100];
delay(200);
P2=table1[3];
P0=table2[temp/1000];
delay(200);
}
void main( )
{
init_t0( );
while(1)
{
get_tem( );
delay(100);
if(num==10)
{
TR0=0;
num=0;
read_tem( );
}
display( );
TR0=1;
}
}
void ext_t0( ) interrupt 1
{
TMOD=0x01;
TH0=0x3c;
num++;
} |