51 32单片机使用蓝牙测RSSI值定位(包含字符串发送,接收字符串,数据解析发送,中断超时接收等)

本文详细介绍了使用51单片机进行串口通信的过程,包括字符串发送与接收、中断处理、超时接收以及RSSI值的解析。作者通过中断服务函数实现了帧头帧尾检验,并分享了串口初始化和定时器中断的设置。此外,还探讨了RSSI值在蓝牙连接中的应用,以及如何从AT+CWLAP命令的返回信息中提取RSSI值进行距离估算。文章适合对单片机和无线通信感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先这是一篇血泪文章,当你看到这篇文章的时候,笔者已经失败了,首先笔者选用了51单片机进行编写,51单片机的一个串口难以进行相应的验证,这是其一;其二,使用AT+CWLAP调回WIFI信息的时候,你会发现字符串的数量过于庞大,验证时间过长;其三RSSI值影响太大了,可以说基本没有精度。下面我会分享我的流程,如果你有幸成功的话,可以在下面留言。同时这篇文章包含字符串的接收和发送等知识,包含中断,超时接收,如何检验帧头帧尾等内容,希望对大家有所帮助。

1,字符串的发送

void SendChar(char Char)//这是发送单个字符的
{
    SBUF=Char;
		while(!TI);
		TI=0;
}

void SendString(char *p)//发送字符串
{
    while(*p!='\0')
    {
			SendChar(*p);
			p++;
    }
}

这个地方笔者不做太多的解释,主要就是利用TI和SBUF,进行单个字符的发送,而字符串的发送则是调用指针的类型然后进行字符串的发送。

2串口的初始化函数(这一部分可以在ISP中进行寻找)

void UsartInit()
{
	SCON=0X50;			//???????1
	TMOD=0X20;			//?????????2
	//PCON=0X80;			//?????
	TH1=0xfd;				//????????,??????9600?
	TL1=0xfd;
	ES=1;						//??????
	EA=1;						//?????
	TR1=1;					//?????
}

不做太多解释

3利用中断进行字符串的接收(本人使用了帧头检验,帧尾检验以及超时接收等)

void Usart() interrupt 4//中断
{
	if(RI)//当检验到数据时
	{
		
		RI = 0;//归0,下次检验
		start_timer = 1;//定时计数器置1
		
		
		temp = SBUF;//这里是定义了一个中间变量,将SBUF的内容传给中间变量,然后对中间变量进行检验
		if(temp != 0x63)//这里本人是用的字符串“c”使用的是16进制,因为单片机接收数据接受的是16进制
		{
			recv_buf[recv_cnt] = temp;//这里讲接收到的一帧放入数组
			recv_cnt++;//recv_cnt进行累加,方便下一次
			if(recv_cnt > MAX_LEN)//当recv_cnt大于规定的最大字符串时,不再进行接收
			{
				recv_cnt = MAX_LEN;
			}
		
		}
		else
		{
			usart_receive_flag = 1;//这是串口接收字符的标志位
			recv_length = 47;//我设置的最大接收区为47(51单片机最多接收128个字符)
			//recv_cnt = 0;
		}
		recv_timer_cnt = 0;//定时器计数归0
	}
}

void Timer0Init(void)		//1??@11.0592MHz
{
	//AUXR &= 0x7F;		//?????12T??
	TMOD &= 0xF0;		//???????
	TL0 = 0x66;		//??????
	TH0 = 0xFC;		//??????
	TF0 = 0;		//??TF0??
	ET0 = 1;
	TR0 = 1;		//???0????
}

void timer0_ISR() interrupt 1
{
	TR0 = 0;
	if(start_timer == 1)
	{
		recv_timer_cnt++;
		if(recv_timer_cnt > MAX_REV_TIME)
		{
			recv_timer_cnt =0;
			recv_cnt = 0;
			usart_receive_flag = 1;
		}
	}
	TL0 = 0x66;		//??????
	TH0 = 0xFC;		//??????
	TR0 = 1;
}

4.清楚数组的数据也就是清除缓存

void clr_recvbuffer(unsigned char *buf)
{
	unsigned char i;
	for(i=0;i<MAX_LEN;i++)
	{
			buf[i] = 0;	
	}		
}	

这里很容易理解,就是利用i来清空每一个数组

5串口中断服务函数

void uart_service(unsigned char *buf)
{
	unsigned char recv_m
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值