看了很多别人的程序,也了解了一下原理,感觉别人写的太复杂了,所以就自己写了一个,但是不管用,距离乱显示,而且刷新时间长。麻烦大神帮我看看哪出问题了,不要给别人的程序,我有太多。只想知道这个程序问题在哪,谢谢。- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
- 0x79,0x71};
- sbit tring=P2^0;
- sbit echo=P2^1;
- sbit DLA=P2^2; //位显数码管
- sbit DLB=P2^3;
- sbit DLC=P2^4;
- bit flag=0; //测量超声波是否成功标志
- uint S; //长度
- void delay20us(void) //误差 0us
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=7;a>0;a--);
- }
- void conduct()
- {
- uint time;
- time=TH0; //读取时间长度
- time<<=8;
- time=time|TL0;
- TH0=0;TL0=0;
- S=time*0.017; //转化为距离,单位CM;time*340*100/(2*1000000)
- }
- void init()
- {
- TMOD=0x11;
- EA=1;ET0=1;ET1=1;
- TH1=0xB1;TL1=0xE0;//周期为20MS;
- TH0=0;TL0=0;
- TR1=1;
- }
- void timer0() interrupt 1 //若溢出,则说明测量失败
- {
- flag=1;
- }
- void timer1() interrupt 3
- {
- uchar a,b;
- TH1=0xB1;TL1=0xE0;
- if((S>4000)|(flag==1)) //数码管显示函数
- {
- for(a=40;a>0;a--)
- {
- flag=0;
- DLA=0;DLB=0;DLC=0;P0=0x3f;delay20us();
- DLA=1;DLB=0;DLC=0;P0=0x50;delay20us();
- DLA=0;DLB=1;DLC=0;P0=0x50;delay20us();
- DLA=1;DLB=1;DLC=0;P0=0x79;delay20us();
- }
- }
- else
- {
- for(a=40;a>0;a--)
- {
- DLA=0;DLB=0;DLC=0;P0=table[S%10];delay20us();
- DLA=1;DLB=0;DLC=0;P0=table[S%100/10];delay20us();
- DLA=0;DLB=1;DLC=0;P0=table[S%1000/100];delay20us();
- DLA=1;DLB=1;DLC=0;P0=table[S/1000];delay20us();
- }
- }
- b++; //b为10即200ms测量一次;
- if(b==10)
- {
- b=0;
- tring=1;
- delay20us();
- tring=0;
-
- }
- }
- void main()
- {
- init();
- while(1)
- {
- while(echo==0);
- TR0=1;
- while(echo==1);
- TR0=0;
- conduct();
- }
- }
复制代码
|