本来想写一个模拟倒车雷达的小程序,结果定时器没学好,还是先补一下吧 先把最初的代码发出来~(代码有点乱,请见谅。。。)
#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;
}
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扫描一次,恰巧可以抵消人的视觉暂留。 但是有一个显而易见的缺点就是会造成延时不准确的现象,所以我后期考虑用定时器改进一下。
对于模拟倒车雷达的系统改进,各位大佬还有什么好的建议欢迎在评论区或私信给出哦~
|