编程完成一个串口的收发数据程序。要求,单片机与PC机进行串口通 信,PC机发送字符给单片机,单片机统计收到的’A’宇符的个数,在数码管上显示个数。当收到10个’A'时发送宇符串TestOK。‘:当收到20个 ‘A°时发送字符串“Uart oK !‘。通信速率为4800bps,单片机外接晶振频 率力 11.0592WHz。
时间: 2023-12-03 18:46:37 浏览: 138
这里提供基于C语言的单片机收发数据程序,使用的是STC89C52单片机,串口通信速率为4800bps。
```
#include <reg52.h> //包含51单片机寄存器定义头文件
#define FOSC 11059200UL //晶振频率
#define BAUD 4800UL //波特率
#define TIMER_PRESCALER 12
bit flag; //标志位,标记是否接收到数据
unsigned char count = 0; //计数器,记录接收到的'A'的数量
void init_uart() //初始化串口
{
TMOD |= 0x20; //设置定时器1为模式2,8位自动重装载
TH1 = 256 - FOSC/(TIMER_PRESCALER*BAUD*16); //设置波特率
TL1 = TH1; //赋初值
TR1 = 1; //启动定时器1
SCON = 0x50; //设置串口为模式1,允许接收
ES = 1; //开启串口中断
EA = 1; //开启总中断
}
void uart_send(unsigned char dat) //发送数据
{
SBUF = dat; //将数据存入发送缓冲区
while(!TI); //等待发送完成
TI = 0; //清除发送完成标志位
}
void main()
{
init_uart(); //初始化串口
while(1)
{
if(flag) //如果接收到数据
{
flag = 0; //清除标志位
if(SBUF == 'A') //如果接收到的是'A'
{
count++; //计数器加1
if(count == 10) //如果已经接收到10个'A'
{
uart_send('T'); //发送字符串TestOK
uart_send('e');
uart_send('s');
uart_send('t');
uart_send('O');
uart_send('K');
uart_send('\n');
}
else if(count == 20) //如果已经接收到20个'A'
{
uart_send('U'); //发送字符串UartOK
uart_send('a');
uart_send('r');
uart_send('t');
uart_send(' ');
uart_send('O');
uart_send('K');
uart_send('!');
uart_send('\n');
count = 0; //计数器清零
}
}
}
}
}
void uart_isr() interrupt 4 //串口中断服务函数
{
if(RI) //如果接收到数据
{
RI = 0; //清除接收中断标志位
flag = 1; //设置标志位,表示接收到数据
}
}
```
这段代码实现了单片机与PC机进行串口通信,PC机发送字符给单片机,单片机统计收到的'A'宇符的个数,在数码管上显示个数。当收到10个'A'时发送宇符串TestOK。当收到20个 'A'时发送字符串“Uart oK!”。
需要注意的是,由于单片机与PC机进行的是异步串口通信,因此需要在程序中设置波特率、数据位、停止位、校验位等参数,以确保数据能够正确地传输。同时,要注意处理接收到的数据,避免出现数据丢失或错误的情况。
阅读全文