蓝桥开发板(CT107D)学习记录————18.超声波测距

要求是:使用超声波测距,并且使用数码管显示出来距离单位是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的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值