51串口中断函数接收字符串
时间: 2024-01-06 10:03:56 浏览: 135
串口中断接收函数.pdf
5星 · 资源好评率100%
在51单片机中,串口中断函数可以用来接收字符串。下面是一个简单的例子:
```c
#include <reg52.h>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER_1MS (65536-FOSC/12/1000) // 1ms定时器初值
typedef unsigned char BYTE;
typedef unsigned int WORD;
sbit LED = P1^0;
BYTE RxBuf[11]; // 用于存放接收到的字符串
BYTE RxCount = 0; // 接收计数器
void InitUart(void);
void SendByte(BYTE dat);
void SendString(char *s);
void main()
{
InitUart(); // 初始化串口
TMOD |= 0x10; // 设置定时器1为定时器模式
TH1 = TL1 = TIMER_1MS; // 定时1ms
TR1 = 1; // 启动定时器1
EA = ET1 = ES = 1; // 开启总中断、定时器1中断和串口中断
while(1);
}
void InitUart(void)
{
PCON |= 0x80;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
}
void SendByte(BYTE dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void SendString(char *s)
{
while(*s)
{
SendByte(*s++);
}
}
void Uart_Isr() interrupt 4
{
if(RI)
{
RI = 0;
RxBuf[RxCount] = SBUF;
if(RxBuf[RxCount] == '\r')
{
RxBuf[RxCount] = '\0'; // 字符串结束符
RxCount = 0; // 接收计数器清零
SendString(RxBuf); // 回显接收到的字符串
SendString("\r\n");
if(RxBuf[0] == '1') // 如果接收到的字符串是“1”,则点亮LED
{
LED = 0;
}
else if(RxBuf[0] == '0') // 如果接收到的字符串是“0”,则熄灭LED
{
LED = 1;
}
}
else
{
RxCount++;
if(RxCount >= 10) // 如果接收到的字符串长度超过10,则清零接收计数器
{
RxCount = 0;
}
}
}
}
void Timer1_Isr() interrupt 3
{
TH1 = TL1 = TIMER_1MS;
}
```
上述代码中,串口中断函数 `Uart_Isr()` 判断接收到的字符是否为回车符 `\r`,如果是,则将接收到的字符串存入 `RxBuf` 数组中,并在串口回显接收到的字符串。同时,根据接收到的字符串内容控制LED的状态。需要注意的是,接收到的字符串长度不能超过 `RxBuf` 数组的长度。
阅读全文