考超声波实际上就是考定时器,关于信号的传输与接收如何实现的硬件知识我们不需要掌握,首先来了解一下定时器;
跳线帽短接2,4 1,3,选用定时器1,采用12T模式
比赛设置的频率为12MHZ,12T模式相当于对1T模式进行计数,即计数器每计数一次,时间过去了1*10^-6S,即1us
首先我们来理一下顺序,first,发送脉冲信号,开始计数;second,接收到脉冲信号(假设在可测距范围内),停止计数;
完成这两部后,我们得到了一个计数值;
该计数值,设为count,也就是脉冲信号在所测距离里传播两次所需的时间t,根据音速v=340m/s,vt/2也就是所测距离。
整理如下:
发送脉冲,开始计数,接收脉冲,停止计数,计数值count,distance=(count/(10^6)*(3.4*(10^2)))/2,简化为count*1.7/10000,受限于数据类型的问题,我们可以改成count/100*17/100/10
开始进入敲代码环节:
#include <STC15F2K60S2.H>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
sbit Tx=P1^0;
sbit Rx=P1^1;
float dis=0;
u8 dv=0;
u8 flag_csb=0;
u8 flag_display=0;
u8 a[8]={10,10,10,10,10,10,10,10};
void ctrl(u8 ctrl)
{
u8 p2data=P2;
P2=ctrl<<5|(P2&0x1f);
P2=p2data&0x1f;
}
void get(u8 a0,u8 a1,u8 a2,u8 a3,u8 a4,u8 a5,u8 a6,u8 a7)
{
a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;a[5]=a5;a[6]=a6;a[7]=a7;
}
void Delay12us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 3;
while (--i);
}
void csb(void)
{
u8 i;
AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x01;
TL0=0X00;
TH0=0X00;
for(i=0;i<8;i++)
{
Tx=1;
Delay12us();
Tx=0;
Delay12us();
}
TR0=1;
while(Rx&&!TF0);
TR0=0;
if(TF0)
{
TF0=0;
dis=0;
dv=255;
}
else
{
dis=(TH0*256+TL0)*0.017;
dv=(int)dis;
}
TL0=0X00;
TH0=0X00;
}
void display(u8 site,u8 light)
{
P0=0xff;
ctrl(7);
P0=0x01<<site;
ctrl(6);
switch(light%20)
{
case 0:P0=0xc0;break;
case 1:P0=0xf9;break;
case 2:P0=0xa4;break;
case 3:P0=0xb0;break;
case 4:P0=0x99;break;
case 5:P0=0x92;break;
case 6:P0=0x82;break;
case 7:P0=0xf8;break;
case 8:P0=0x80;break;
case 9:P0=0x90;break;
case 10:P0=0xff;break;
default:break;
}
if(light>=20)P0=P0&0x7f;
ctrl(7);
}
void Timer2_Init(void) //1??@12.000MHz
{
AUXR &= 0xFB; //?????12T??
T2L = 0x18; //???????
T2H = 0xFC; //???????
AUXR |= 0x10; //???2????
IE2|=0x04;
EA=1;
}
void main()
{
P0=0x00;ctrl(5);
P0=0xff;ctrl(4);
Timer2_Init();
while(1)
{
if(flag_csb>200){flag_csb=0;csb();}
get(10,10,10,10,10,dv/100,dv%100/10,dv%10);
}
}
void t2isr(void) interrupt 12
{
flag_csb++;
flag_display++;
flag_display=flag_display%8;
display(flag_display,a[flag_display]);
}