编程完成⼀个串口的收发数据程序。要求,单片机与PC机进行串口通 信,PC机发送字符给单片机,单片机统计收到的'A'字符的个数,在数码 管上显示个数。当收到10个'A'时发送字符串TestOK。';当收到20个 'A'时发送字符串'UartOK!'。通信速率为4800bps,单片机外接晶振频 率为11.0592MHz。
时间: 2023-12-03 16:46:21 浏览: 208
以下为基于8051单片机的串口收发数据程序,使用的编译器为Keil uVision5:
```c
#include <reg52.h>
#include <stdio.h>
#define BAUDRATE 4800
#define OSC_FREQ 11059200
#define TIMER_PRESCALER 12
sbit LED = P0^0; //连接数码管显示的LED
unsigned char receiveChar; //接收到的字符
unsigned char count = 0; //计数器
unsigned char buffer[20]; //缓冲区
unsigned char bufferIndex = 0; //缓冲区索引
void initUART() {
TMOD |= 0x20; //设置计数器1为模式2
TH1 = 256 - OSC_FREQ / (BAUDRATE * TIMER_PRESCALER); //设置波特率
TL1 = TH1;
TR1 = 1; //启动计数器1
SCON = 0x50; //设置串口为模式1,允许接收
EA = 1; //开启总中断
ES = 1; //开启串口中断
}
void sendChar(unsigned char c) {
SBUF = c; //将要发送的字符写入串口缓冲区
while(!TI); //等待发送完成
TI = 0; //清除发送完成标志
}
void sendString(char* str) {
while(*str) { //循环发送字符串
sendChar(*str++);
}
}
void main() {
initUART();
while(1) {
if(count == 10) {
sendString("TestOK\r\n"); //发送测试成功提示
count = 0; //计数器清零
}
if(count == 20) {
sendString("UartOK!\r\n"); //发送串口成功提示
count = 0; //计数器清零
}
LED = count >= 10; //控制数码管显示
}
}
void serialISR() interrupt 4 using 1 {
if(RI) { //有接收到字符
RI = 0; //清除接收中断标志
receiveChar = SBUF; //读取接收到的字符
if(receiveChar == 'A') { //如果接收到字符'A'
count++; //计数器加1
}
}
}
```
在这个程序中,我们使用了一个计数器来统计接收到的字符'A'的个数,并且使用一个缓冲区来存储接收到的字符。当计数器达到10或20时,分别发送字符串"TestOK"和"UartOK!",并将计数器清零。同时,我们使用一个LED来控制数码管的显示,当计数器达到10或20时,LED会亮起来,表示已经达到相应的个数。
需要注意的一点是,由于我们使用的是Timer1作为波特率发生器,因此需要在程序中设置Timer1的初值,这里的计算公式为:
```
TH1 = 256 - OSC_FREQ / (BAUDRATE * TIMER_PRESCALER);
```
其中,OSC_FREQ为单片机外接晶振的频率,BAUDRATE为波特率,TIMER_PRESCALER为计数器的分频系数。
在这个程序中,我们使用了printf函数来进行调试输出,因此需要在编译器的选项中开启printf支持。具体步骤为:在Project - Options for Target - C51 - C Compiler选项卡中,将Use MicroLIB选项设置为No,然后在Misc Controls中添加printf支持的选项:
```
--use_full_printf
--use_long_for_printf
```
阅读全文