#include <stc15f2k60s2.h>
#include <intrins.h>
sbit TX = P1^0;
sbit RX = P1^1;
code unsigned char number[17] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned int time,juli;
bit flag;
float distence;
void Timer0Init(void) //从0开始记,每一次增加为一个us
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TL0 = 0x00;
TH0 = 0x00;
TF0 = 0;
TR0 = 0;
}
void Delay600us() //@11.0592MHz
{
unsigned char i, j;
i = 7;
j = 113;
do
{
while (--j);
} while (--i);
}
void Delay13us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void HC138_choose(unsigned char n)
{
switch(n)
{
case 0:
{
P2 = (P2 & 0x1f) | 0x00;
break;
}
case 4:
{
P2 = (P2 & 0x1f) | 0x80;
break;
}
case 5:
{
P2 = (P2 & 0x1f) | 0xa0;
break;
}
case 6:
{
P2 = (P2 & 0x1f) | 0xc0;
break;
}
case 7:
{
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
}
void smg_show(unsigned char wei,duan)
{
HC138_choose(6);
P0 = 0x01 << (wei - 1);
HC138_choose(7);
P0 = number[duan];
Delay600us();
P0 = 0xff;
}
void send_wave()
{
unsigned char i;
for(i = 1;i<=8;i++) //发送超声波,这段硬记就好
{
TX = 1;
Delay13us();
TX = 0;
Delay13us();
}
}
void smg()
{
if(flag == 0)
{
smg_show(1,juli / 100);
smg_show(2,juli / 10 % 10);
smg_show(3,juli % 10);
}
else if(flag == 1) //判断是否溢出
{
smg_show(1,9);
smg_show(2,9);
smg_show(3,9);
}
}
void chaoshengbo()
{
TL0 = 0; //清空时间
TH0 = 0; //清空时间
TF0 = 0; //重置溢出标志位
RX = 1; //重置RX
send_wave(); //发送声波
TR0 = 1; //开始计时
while(RX == 1 && TF0 == 0)
{
if(flag == 1) //用于防止闪,这段代码如果删掉,再超出范围的时候会不断地闪999,写了的话只会闪第一次
{
smg(); //稳定999
}
}
TR0 = 0; //结束计时
if(TF0 == 1)
{
flag = 1; //标志超出量程
}
else if(RX == 0) //收到声波 RX会自动置0
{
flag = 0; //标志正常测量
time = TH0;
time = time << 8;
time = time | TL0;
distence = (time * 0.00017); //声波速度一us走0.00017米
distence *= 100; //换算成厘米
juli = distence; //用char类型取回,便于取余显示
}
}
void main()
{
Timer0Init();
while(1)
{
smg();
smg();
smg(); //这里的smg循环非常必要,当只进行一次smg显示的时候,时间不够,显示会异常
smg(); //每次smg里面都有几毫秒的消隐,用smg显示也相当于延时了
smg(); //当只有一次smg时,大家可以试试,显示会有异常数据,接下文
chaoshengbo(); //推测是由于上一次发送的超声波被第二次接收接收到了,导致录入的时间变得异常的短
} //因此这里加入三段smg延时,或者大家可以采用定时器刷新采样超声波,那样也不会出现异常
}
有问题可以评论区讨论,上面是个人理解写的代码,如果错误恳请指正