编程完成⼀个串口的收发数据程序。要求,单片机与 PC 机进行串口通 信,PC 机发送字符给单片机,单片机统计收到的'A'字符的个数,在数码 管上显示个数。当收到 10 个'A'时发送字 符串 Test OK。';当收到 20 个 'A'时发送字符串'Uart OK !'。通信速率为 4800bps,单片机外接晶振频 率为 11.0592MHz。
时间: 2023-12-10 07:38:47 浏览: 189
这是一个比较基础的单片机串口通信程序,下面我将给出AT89C51单片机的C语言代码实现。
首先,我们需要了解一下AT89C51单片机的串口通信模块。AT89C51单片机内置有一个可编程的串行通信接口UART,通过UART可以实现与PC机的串口通讯。UART有两个主要的控制寄存器:SCON和SBUF。其中,SCON是串口控制寄存器,用于配置串口通讯的参数;SBUF是串行数据缓冲寄存器,用于存放要发送或接收的数据。
下面是AT89C51单片机串口通讯的初始化代码:
```c
void InitUART()
{
TMOD |= 0x20; // 定时器1工作在模式2,自动重装载方式
TH1 = 0xFD; // 波特率为4800bps,晶振频率为11.0592MHz
TL1 = 0xFD;
SCON = 0x50; // 串口工作在模式1,允许接收
TR1 = 1; // 启动定时器1
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
}
```
初始化代码中,我们设置了定时器1的工作模式为模式2,并设置了波特率为4800bps,晶振频率为11.0592MHz。同时,我们开启了串口中断和总中断,以便在数据接收完成后及时处理数据。
下面是AT89C51单片机串口通讯的中断服务函数:
```c
void UART_ISR() interrupt 4
{
if (RI) // 接收中断
{
RI = 0; // 清除接收中断标志位
if (SBUF == 'A') // 统计'A'字符个数
{
a_count++;
if (a_count == 10) // 接收到10个'A',发送Test OK
{
a_count = 0;
SendString("Test OK");
}
else if (a_count == 20) // 接收到20个'A',发送Uart OK
{
a_count = 0;
SendString("Uart OK");
}
}
}
}
```
中断服务函数中,我们首先判断是接收中断还是发送中断。对于接收中断,我们通过判断SBUF寄存器中接收到的字符是否为'A'来统计'A'字符个数,并根据条件发送相应的字符串。
下面是AT89C51单片机串口通讯的发送函数:
```c
void SendString(char *str)
{
while (*str)
{
SBUF = *str; // 将字符发送到串口
while (!TI); // 等待发送完成
TI = 0; // 清除发送中断标志位
str++; // 发送下一个字符
}
}
```
发送函数中,我们使用了一个while循环来逐个发送字符串中的字符。在发送一个字符时,我们需要等待发送完成,并且清除发送中断标志位,以便下次发送数据。
完整代码如下:
```c
#include <reg51.h>
unsigned char a_count = 0;
void InitUART();
void SendString(char *str);
void main()
{
InitUART();
while (1);
}
void InitUART()
{
TMOD |= 0x20; // 定时器1工作在模式2,自动重装载方式
TH1 = 0xFD; // 波特率为4800bps,晶振频率为11.0592MHz
TL1 = 0xFD;
SCON = 0x50; // 串口工作在模式1,允许接收
TR1 = 1; // 启动定时器1
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
}
void UART_ISR() interrupt 4
{
if (RI) // 接收中断
{
RI = 0; // 清除接收中断标志位
if (SBUF == 'A') // 统计'A'字符个数
{
a_count++;
if (a_count == 10) // 接收到10个'A',发送Test OK
{
a_count = 0;
SendString("Test OK");
}
else if (a_count == 20) // 接收到20个'A',发送Uart OK
{
a_count = 0;
SendString("Uart OK");
}
}
}
}
void SendString(char *str)
{
while (*str)
{
SBUF = *str; // 将字符发送到串口
while (!TI); // 等待发送完成
TI = 0; // 清除发送中断标志位
str++; // 发送下一个字符
}
}
```
阅读全文