2.4G超声波数据串口接收

本文介绍了一段使用51单片机实现的2.4G超声波接收代码,通过串行通信接收数据,解析后显示在OLED屏幕上,涉及UART初始化、中断处理和数据解析功能。

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

51单片机2.4G超声波接收代码

#include "REG51.h"
#include "oled.h"
#include "bmp.h"
#include <intrins.h> //包含头文件,定义了一些内联汇编函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h> // 包含ctype.h头文件
#define UINT16  unsigned int
#define FALSE 0
#define TRUE  1
#define Recover_Length   6 //判定接收数据的长度(数据长度为6)
sbit Tx = P3^1; //定义串行通信的发送引脚为P3.1
sbit Rx = P3^0; //定义串行通信的接收引脚为P3.0
unsigned char receive_buf[50]; // 接收缓冲区
unsigned char receive_len = 0; // 接收长度

sbit led=P1^3;
sbit K1=P3^4;
sbit K2=P3^5;


UINT16 Num_Count=1;
UINT16 i;
int count;

void delay(UINT16 ms) 
{
   unsigned int i, j;
   for (i = ms; i > 0; i--)
       for (j = 114; j > 0; j--); // 114是一个大约1ms的值,可根据实际情况调整
}

char putchar(char c)//串口打印重定向函数重定向到print
{
    TI = 0;
    SBUF = c;
    while(TI == 0);
    return c;
}

void UartInit()		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;			//设定定时初值
	TH1 = 0xFD;			//设定定时器重装值		
	TR1 = 1;			//启动定时器1
	ET1 = 0;        	//禁止定时器1中断
	EA=1;				//开放总中断 
	ES=1;				//开放串口中断
}
void timer0_init()
{
//设定定时器0为16位自动重装方式 (方式1) 1111(前4位设定定时器1工作方式)
	// 0000 (后4位设定定时器0工作方式)此寄存器不可以位寻址
	//下面两条语句不改变定时器1的工作方式 只改变定时器0的工作方式
	TMOD &= 0xF0;//&赋值不会改变高4位的数据  将低四位数据清零
	TMOD |= 0x01;//不改变高4位数据  只改变置1的位
	//中断溢出标志位 0 不触发中断 硬件置1 触发中断
	TF0 = 0;
	//开启定时器0
	TR0 = 1;
	//赋初值 由STC-ISP软件计算获取 定时器模式16位 定时器时钟12T  FC66相当于十进制64614 在当前设定的晶振频率下从64614计数到65535 为1ms
	TL0 = 0x66;     //设定定时初值  中断时间为1ms
	TH0 = 0xFC;     //设定定时初值  中断时间为1ms
	//开启定时器1中断
	ET0 = 1;
	// IT0 = 0; // 初始化中断0触发方式为下降沿触发
 	// EX0 = 1; // 使能外部中断0
	// IT1 = 0; // 初始化中断1触发方式为下降沿触发
 	// EX1 = 1; // 使能外部中断1
	//开启总中断
	EA = 1;
	//设置定时器1的中断优先级为低
	PT0 = 0;

}
void Uartsend(unsigned char byte)//发送
{
	SBUF=byte;//把数据写入发送缓冲区SBUF
	//数据发送完成的标志是TI=1;所以等待数据传送完
	while(TI==0);
	TI=0;//软件清零
}

void Key_Up()
{
	if(K1==0){
		delay_ms(50);
		if(K1==0){
			Num_Count++;
			if(Num_Count>400)
				Num_Count=1;
			OLED_ShowNum(85,2,Num_Count,3,16);
		}
	}
	if(K2==0){
		delay_ms(50);
		if(K2==0){
			Num_Count--;
			if(Num_Count<1)
				Num_Count=1;
			OLED_ShowNum(85,2,Num_Count,3,16);
	    }
	}
	
}




void UART_ISR() interrupt 4//串口中断函数
{
	 if(RI==1)//接收中断
	 {
	 	//Uartsend(SBUF);//把接收的数据发送到计算机
      receive_buf[receive_len++] = SBUF; // 将新数据添加到接收缓冲区
      if(receive_len >= 10) 
	  { // 如果接收缓冲区已满
          receive_len = 0; //
		// 清空接收缓冲区
      }
	 	RI=0;//软件清零
	 }
}

// 定时器中断处理函数
void timer0_isr() interrupt 1 // 定时器中断0
{
	//设定初值  保证下次计数从这个初值在当前频率下累加到65535的时间为1ms
	TL0 = 0x66;    
	TH0 = 0xFC;
	count=atoi(receive_buf);
	if(count>Num_Count)
	{
		led=0;
	}
	else led=1;
     
}
int main(void)
 {	
	UartInit();
	timer0_init();
	OLED_Init();			//初始化OLED  
	OLED_Clear();
    OLED_ShowString(5,0,"ECHO :",16);
	OLED_ShowString(60,0,"WAIT",16);
    OLED_ShowString(105,0,"CM",16);
	OLED_ShowString(5,2,"Set CM :",16);
	OLED_ShowNum(85,2,Num_Count,2,16); 
	while(1) 
	{
      if(receive_len==1)
      {
		for(i=1;i<=Recover_Length;i++)
		{
			receive_buf[i]='\0';
		}
        if (isalpha(SBUF)) {
			OLED_ShowString(55,0,"------",16);
		} else {
			OLED_ShowString(55,0,receive_buf,16);
			OLED_ShowString(55,0,"      ",16); 
			OLED_ShowString(55,0,receive_buf,16);
		}
		receive_len=0;
      }
		
		Key_Up();	
   }
     
		
	
}

这段代码的功能是把超声波测到的数据通过2.4G模块接收数据并打印出来显示到OLED屏幕上

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值