本来想写一个模拟倒车雷达的小程序,结果定时器没学好,还是先补一下吧
先把最初的代码发出来~(代码有点乱,请见谅。。。)
#include<reg52.h> #define uc unsigned char uc NixieTable[17] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; uc ms=0,s=0; sbit ax=P2^2; sbit bx=P2^3; sbit cx=P2^4; sbit trig=P1^7; sbit echo=P1^6; void Nixie(unsigned char Location,Number); void delay2(unsigned int xms) { unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); } } void delay(uc c) { while(--c); } void delay1(uc c1) { uc a,b; for(;c1>0;c1--) { for(a=38;a>0;a--) for(b=130;b>0;b--); s=(TH0*256+TL0)/58; Nixie(6,s/100); Nixie(7,s/10%10); Nixie(8,s%10); } } void send() { trig=1; delay(5); trig=0; } void Nixie(unsigned char Location,Number) { switch(Location) //位码输出 { case 1:cx=1;bx=1;ax=1;break; case 2:cx=1;bx=1;ax=0;break; case 3:cx=1;bx=0;ax=1;break; case 4:cx=1;bx=0;ax=0;break; case 5:cx=0;bx=1;ax=1;break; case 6:cx=0;bx=1;ax=0;break; case 7:cx=0;bx=0;ax=1;break; case 8:cx=0;bx=0;ax=0;break; } P0=NixieTable[Number]; //段码输出 delay2(1); //显示一段时间 P0=0x00; //段码清0,消影 } void main() { TMOD=0X01; TH0=0; TL0=0; ET0=1; EA=1; while(1) { send(); while(echo==0); TR0=1; TH0=0; TL0=0; while(echo==1); TR0=0; s=(TH0*256+TL0)/58; Nixie(6,s/100); Nixie(7,s/10%10); Nixie(8,s%10); delay1(20); } }
接线在这里就不详细介绍了,因为数码管的位选和段选每个单片机用到的芯片和接口可能不一样
超声波的接法跟上一篇文章一样
但是超声波测距间隔的时间需要注意,因为这牵扯到动态数码管的扫描。这个可以尽量的设低一点,但不能小于80ms。
即使再小,动态数码管也会出现频闪的情况,所以我做出的改进是把动态数码管的扫描再加到delay函数里面,每10ms扫描一次,恰巧可以抵消人的视觉暂留。
但是有一个显而易见的缺点就是会造成延时不准确的现象,所以我后期考虑用定时器改进一下。
对于模拟倒车雷达的系统改进,各位大佬还有什么好的建议欢迎在评论区或私信给出哦~