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屏幕上