蓝桥杯超声波模块

蓝桥杯超声波模块原理图:

        

        将上述引脚J2跳帽(1-3,2-4)短接。

超声波工作原理:

        

代码:

        下述代码用到定时器0,和定时器1:

        定时器0:功能:数码管扫描,超声波测量允许,数码管缓存区刷新

        定时器1:功能:12us发送超声波,超声波发送后计时

#include <STC15F2K60S2.H>
#define uint8_t unsigned char
	/*变量定义*/
sbit TX = P1^0;
sbit RX = P1^1;
bit set;												//超声波测量标志位
uint8_t temp = 123;										//接收超声波返回的数值
unsigned char Nixie[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0xff};
uint8_t showNixieByte[8] = {1,2,18,18,18,1,1,1};		//数码管显示段
uint8_t triggeNixieBit;									//数码管位选循环位
	/*函数声明*/
void showNixie(void);
void Timer0Init(void);
void Timer1Init(void);
uint8_t send_ul();
void upData();
/*-------------------------------------------------*/
void main()
{	Timer0Init();
	Timer1Init();
	while(1)
	{
		if(set)										//超声波测量允许判断
		{
			temp = send_ul();						//测量
			upData();								//将测量的数据写入缓冲区
			set = 0;								//清除标志位
		}
		
	}
	
}
/*更新数码管缓冲区的数据*/
void upData()
{
	showNixieByte[5] = temp/100;
	showNixieByte[6] = (temp%100)/10;
	showNixieByte[7] = temp%10;
}
/*-------------------------------------------------*/
/*超声波发送接收函数*/
uint8_t send_ul()
{
	uint8_t temp = 0,count = 8;		//发送超声波次数
	TL1 = 0x70;						//设置定时初始值
	TH1 = 0xFF;						//设置定时初始值
	TX = 1;							//将超声波发送端置位
	TR1 = 1;						//打开定时器1,准备发送超声波
	while(count--)
	{
		TX^=1;					
		while(TF1 == 1);			//等待发送超声波发送时间到
		TF1 = 0;					//软件将定时器溢出标志位清零
	}
	TR1 = 0;						//关闭定时器
	TF1 = 0;						//清空标志位
	TL1 = 0x00;						//设置定时初始值,准备为接收超声波时间计时
	TH1 = 0x00;						//设置定时初始值
	TR1 = 1;						//打开定时器
	while(RX && !(TF1));			//等待接收到超声波或者定时结束
	TR1 = 0;						//关闭定时器
	if(TF1)							//判断定时器标志位是定时器溢出还是接收到超声波脉冲
	{
		temp = 255;					//超出计数范围,置位255
		TF1 = 0;					//清空标志位为发送脉冲做准备
	}
	else
	{
		temp = ((TH1<<8)|TL1) *0.017;//否则进行数据处理
	}
	TH1=0;							 //清空定时器
	TL1=0;
	return temp;
	
	
}
/*-------------------------------------------------*/	
	
/*定时器配置服务函数*/
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初始值
	TH0 = 0xD1;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA=1;
	ET0=1;
}
void Timer1Init(void)		//12微秒@12.000MHz
{
	AUXR &= 0xbf;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x70;		//设置定时初始值
	TH1 = 0xFF;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
	TR1 = 0;		//定时器1开始计时
	ET1 = 0;
	
}

void tm0_isr() interrupt 1
{
	static uint8_t count_ul;		//超声波规定时间测量位
	showNixie();
	count_ul++;
	if(count_ul == 66)				//66ms触发函数
	{
		set = 1;
		count_ul = 0;
	}
}
/*-------------------------------------------------*/
/*显示函数*/
void showNixie(void)
{
	P2 = (P2&0x1f)|0xe0;
	P0 = 0xff;
	
	P2 = (P2&0x1f)|0xc0;
	P0 = 1<<triggeNixieBit;
	
	P2 = (P2&0x1f)|0xe0;
	P0 = Nixie[showNixieByte[triggeNixieBit]];
//	
//	XBYTE[0xE000] = 0xff;  //ȥԽڭӰ  
// 	XBYTE[0xC000] = (1<<triggeNixieBit);
// 	XBYTE[0xE000] =Nixie[showNixieByte[triggeNixieBit]];
	if(++triggeNixieBit==8) triggeNixieBit = 0;
	
}
/*-------------------------------------------------*/

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值