大家都看看我这程序怎么回事。就是显示不出来数据。请...
# include <intrins.h>
char tab[]={0xd7,0x14,0xcd,0x5d,0x1e,0x5b,0xdb,0x15,0xdf,0x5f} ;
sbit trig=P1^0;
sbit echo=P3^2;
sbit P27=P2^7;
sbit P26=P2^6;
sbit P25=P2^5;
sbit P24=P2^4;
char d;
int timeH,timeL;
void delay(int z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(unsigned char temp)
{
int i;
unsigned char ge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
for(i=0;i<10;i++)
{
P27=1;P26=0;P25=0;P24=0;
P0=tab[ge];
P27=1;P26=1;P25=0;P24=0;
P0=tab[shi];
P27=1;P26=1;P25=1;P24=0;
P0=tab[bai];
}
}
main ()
{
EA=1;
TMOD=0x09;
TH0=0;
TL0=0;
ET0=1;
//EX0=1;
trig=0;
while(1)
{
trig=1;
nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=0;
EX0=1;
while(echo==0);
TR0=1;
while(echo==1);
TR0=0;
d=(timeH*256+timeL)*0.017; //CM
display(d);
delay(40);
}
}
void time0() interrupt 1
{
TH0=0;
TL0=0;
}
void int0() interrupt 0
{ EX0=0;
timeH=TH0;
timeL=TL0;
}
void display(unsigned char temp) temp的取值范围是0-255.应该改为unsigned int temp;
char d; 改为unsigned int d;
还有你到底有没有明白定时器和外部中断一起用。TMOD = 0x09是什么概念?
P27,P26,P25,P24这个直接用P2.0=一个数能后右移4位更好点。
while(echo==0);
TR0=1;
while(echo==1);
TR0=0; 这句应该有问题。你的外部中断使一个高低变化的信号吗?如果不是在这里肯定会停止,后面运行不下去,肯定也显示不了。如果是高低变化,高低变化的频率肯定不会有60多毫秒吧,这样肯定会影响定时器和后面的程序。 我猜应该是if(echo == 0) TR0 = 1; if(echo == 1) TR0 = 0; 如果有外部中断来了,echo = 0,这时候开启定时器。如果没有外部中断则关闭定时器。
建议你还是直接用外部中断,边沿触发或者是下降沿触发来处理。 如果用if检测一定要注意防抖处理。
还是自己看资料吧
PCB打样找华强 http://www.hqpcb.com 样板2天出货
是的,把数据类型改了以后数码管有反应了。定时器和外不中断是怎么用的呀?我写的当echo检测到有高电平的时候定时器0开始定时,然后用定时器时间来算距离的。请教一下了。
我下午调出来了,但是还是不明白定时器中断和外部中断的配合使用,请您给我讲一下,或者有这样的例程的话给我发一个我参考一下啊。谢谢了。
小编的是脉冲计数器么?