蓝桥杯超声波模块模板

#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延时,或者大家可以采用定时器刷新采样超声波,那样也不会出现异常
}

有问题可以评论区讨论,上面是个人理解写的代码,如果错误恳请指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值