编程完成一个串口的收发数据程序。要求,单片机与PC机进行串口通 信,PC机发送字符给单片机,单片机统计收到的’A’宇符的个数,在数码管上显示个数。当收到10个’A'时发送宇符串TestOK。‘:当收到20个 ‘A°时发送字符串“Uart oK !‘。通信速率为4800bps,单片机外接晶振频 率力 11.0592WHz。
时间: 2023-12-03 12:46:36 浏览: 63
以下是一份基于8051单片机和Keil C编写的串口收发数据程序,实现了上述需求:
```c
#include <reg52.h>
#include <stdio.h>
#define FREQ_OSC 11059200L // 晶振频率
#define BAUD_RATE 4800 // 通信速率
#define TIMER1_RELOAD_VALUE (65536 - (FREQ_OSC/12/BAUD_RATE))
sbit LED = P1^0; // 控制LED灯亮灭
sbit D1 = P2^0; // 数码管位选
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
sbit A = P2^4; // 数码管段选
sbit B = P2^5;
sbit C = P2^6;
sbit D = P2^7;
unsigned char receiveData; // 接收到的数据
unsigned char sendData[] = "TestOK"; // 发送的数据
unsigned char countA = 0; // 统计收到的'A'字符个数
unsigned char countSend = 0; // 发送字符的计数器
void initSerialPort() {
TMOD &= 0x0F; // 清零T1模式位
TMOD |= 0x20; // 设置T1为8位自动重载模式
TH1 = TL1 = TIMER1_RELOAD_VALUE; // 设置波特率重载值
TR1 = 1; // 启动T1定时器
ES = 1; // 使能串口中断
EA = 1; // 全局中断使能
SCON = 0x50; // 设置串口工作模式和波特率
}
void sendChar(unsigned char c) {
SBUF = c; // 将待发送字符放入串口缓冲区
while(!TI); // 等待发送完成
TI = 0; // 发送完成标志复位
}
void sendString(unsigned char *s) {
while(*s) {
sendChar(*s++); // 逐个发送字符
}
}
void main() {
initSerialPort(); // 初始化串口
while(1) {
if(countA == 10) { // 收到10个'A'字符
sendString(sendData);
countA = 0; // 计数器清零
countSend++; // 发送计数器加1
}
if(countA == 20) { // 收到20个'A'字符
sendString("Uart OK !");
countA = 0; // 计数器清零
countSend++; // 发送计数器加1
}
if(countSend >= 2) { // 发送计数器达到2次
LED = ~LED; // 翻转LED灯状态
countSend = 0; // 计数器清零
}
}
}
void serialInterrupt() interrupt 4 {
if(RI) { // 接收中断
receiveData = SBUF;
RI = 0; // 接收完成标志复位
if(receiveData == 'A') { // 统计收到的'A'字符个数
countA++;
}
}
}
```
该程序中,initSerialPort函数用于初始化串口,包括设置波特率、启动定时器等;sendChar和sendString函数用于发送字符和字符串;serialInterrupt函数为串口中断服务函数,用于接收数据并统计'A'字符个数。在主函数中,通过判断计数器的值来实现发送数据和控制LED灯的亮灭。数码管的显示部分没有实现,可以根据具体的数码管型号进行修改。