写一段51单片机串口接收esp8266信号的测试代码,其中单片机晶振为11.0592KHZ,波特率为9600
时间: 2024-02-03 20:12:31 浏览: 83
以下是使用51单片机接收ESP8266模块发送的串口数据的测试代码,其中单片机晶振为11.0592KHZ,波特率为9600:
```c
#include <reg52.h>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER_1MS_CNT (65536-FOSC/12/1000) // 1ms定时器计数值
sbit LED = P1^0; // 定义P1.0为LED输出口
void InitUART(); // 串口初始化函数
void InitTimer(); // 定时器初始化函数
void UART_ISR() interrupt 4; // 串口中断服务函数
void Timer_ISR() interrupt 1; // 定时器中断服务函数
unsigned char RX_BUF[32]; // 接收缓冲区
unsigned char RX_CNT = 0; // 接收计数器
void main()
{
InitUART(); // 初始化串口
InitTimer(); // 初始化定时器
EA = 1; // 全局中断使能
while(1);
}
void InitUART()
{
TMOD &= 0xF0; // 定时器1工作在16位自动重载模式
TMOD |= 0x20;
TH1 = TL1 = -(FOSC/12/BAUD); // 波特率设置
PCON &= 0x7F; // SMOD=0,波特率加倍
SCON = 0x50; // 串口工作在模式1,允许接收
ES = 1; // 串口中断使能
RI = 0; // 接收标志位清零
}
void InitTimer()
{
TMOD &= 0x0F; // 定时器0工作在模式1
TMOD |= 0x10;
TH0 = TIMER_1MS_CNT / 256; // 1ms定时器初值设置
TL0 = TIMER_1MS_CNT % 256;
ET0 = 1; // 定时器中断使能
TR0 = 1; // 定时器0开始计时
}
void UART_ISR() interrupt 4
{
if(RI) // 如果接收到数据
{
RI = 0; // 接收标志位清零
RX_BUF[RX_CNT++] = SBUF; // 将接收到的数据存入缓冲区
if(RX_CNT >= 32) RX_CNT = 0; // 超出缓冲区大小则清零
}
}
void Timer_ISR() interrupt 1
{
TH0 = TIMER_1MS_CNT / 256; // 1ms定时器计数值重新赋值
TL0 = TIMER_1MS_CNT % 256;
LED = !LED; // 指示灯翻转
if(RX_CNT) // 如果接收缓冲区中有数据
{
unsigned char i;
for(i=0; i<RX_CNT; i++) // 循环读取所有数据
{
SBUF = RX_BUF[i]; // 将数据发送回去
while(!TI); // 等待发送完成
TI = 0; // 发送标志位清零
}
RX_CNT = 0; // 清空接收缓冲区
}
}
```
以上代码中,使用了定时器和串口中断来实现中断驱动的串口接收。每次接收到数据后,将数据存入缓冲区中,并在定时器中断中周期性地将缓冲区中的数据发送回去。注意,此代码中只是将接收到的数据原封不动地返回,实际应用中需要根据具体需求进行处理。
阅读全文