要求是:使用超声波测距,并且使用数码管显示出来距离单位是cm,距离超过量程显示999
#include <STC15F2K60S2.H>
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();}//延时
sbit RX=P1^1;//接收引脚
sbit TX=P1^0;//发送引脚
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//¹²ÑôÊýÂë¹Ü
uchar code adress[]={0x01,0x02,0x04};//位选表
uint num=0,flag=0,count=0,distance,t,i=0;
uchar buff[8];//显示数组
void init()//初始化
{
P2=0xa0;P0=0x00;P2=0x00;
P2=0x80;P0=0xff;P2=0x00;
}
void Timer0Init(void) //1ms,STC生成定时器0,用来显示数码管
{
EA=1;//开总中断
ET0=1;//开定时器0中断
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer1Init(void) //这个定时器是记录超声波从发送到接收的时间,根基声速因而可以得到距离
{
EA=1;//开总中断
ET1=1;//开定时器1中断
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0; //设置定时初值
TH1 = 0; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1开始计时
}
void send_wave()//发送超声波
{
uchar j=8;//发送8个脉冲
do
{
TX=1;//发送引脚置1
//延时10个smenop
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
TX=0;//发送引脚置0
//延时10个smenop
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
}while(j--);
}
void time0()interrupt 1
{
count++;
buff[0]=distance/100;
buff[1]=distance/10%10;
buff[2]=distance%10;
P2=0xc0;P0=adress[i];P2=0x00;
P2=0xe0;P0=table[buff[i]];P2=0x00;
i++;
if(i==3)
i=0;
}
void main()
{
init();
Timer0Init();
while(1)
{
if(count==200)//200ms发送一次
{
count=0;
send_wave();//发送方波信号
TR1=1;//开始计时,类似于频率测量
while((RX==1)&&(TF1==0));//等待当RX==0,说明收到传回来的超声波了,或者TF1==1,定时器溢出
TR1=0;//关闭计时
if(TF1==1)//定时器溢出
{
TF1=0;//手动清零!!!!
distance=999;//距离设置成上限值
}
else
{
t=TH1;
t<<=8;
t|=TL1;//这个就是计算距离,可以化简为t=256*TH1+TL1
distance=(uint)(t*0.0184);//单位cm
//0.0184 11.0592mhz ,1T 0.017 12mhz£,1t
}
TH1=0;
TL1=0;
}
}
}
超声波要注意定时器的设置,初值设置成0,还有TR1的设置,一开始设置成0,不计时,发送之后开始计时。还有就是注意时钟频率,12m或者要乘0.017,,近两年的比赛都要求是12mhz的。