编程完成一个串口的收发数据程序。要求,单片机与PC机进行串口通 信,PC机发送字符给单片机,单片机统计收到的’A’宇符的个数,在数码管上显示个数。当收到10个’A'时发送宇符串TestOK。‘:当收到20个 ‘A°时发送字符串“Uart oK !‘。通信速率为4800bps,单片机外接晶振频 率力 11.0592WHz。
时间: 2023-12-03 15:46:37 浏览: 91
这是一个使用C语言编写的串口收发数据程序,使用的单片机为AT89C51,通信速率为4800bps,晶振频率为11.0592MHz。程序功能为接收PC机发送的字符,统计收到的字符中'A'的个数,并在数码管上显示个数。当收到10个'A'时,单片机向PC机发送字符串"TestOK";当收到20个'A'时,单片机向PC机发送字符串"Uart OK!"。
```c
#include <reg51.h>
#define BAUDRATE 4800
#define XTAL_FREQ 11059200
sbit LED = P1^0;
sbit SDA = P1^1;
sbit SCL = P1^2;
void delay_us(unsigned int us)
{
while(us--)
{
_nop_();
}
}
void delay_ms(unsigned int ms)
{
while(ms--)
{
delay_us(1000);
}
}
void init_serial()
{
TMOD |= 0x20;
TH1 = 256 - XTAL_FREQ / (BAUDRATE * 12 * 16);
TL1 = TH1;
TR1 = 1;
SCON = 0x50;
}
void send_char(unsigned char ch)
{
SBUF = ch;
while(!TI);
TI = 0;
}
unsigned char receive_char()
{
unsigned char ch;
while(!RI);
ch = SBUF;
RI = 0;
return ch;
}
void send_string(unsigned char *str)
{
while(*str != '\0')
{
send_char(*str++);
}
}
void main()
{
unsigned char count_a = 0;
unsigned char ch;
init_serial();
while(1)
{
ch = receive_char();
if(ch == 'A')
{
count_a++;
if(count_a == 10)
{
send_string("TestOK");
}
else if(count_a == 20)
{
send_string("Uart OK!");
}
}
LED = ~LED;
}
}
```
注:该程序使用了I2C协议控制数码管,需要外接DS1307实时时钟模块。如果没有DS1307模块,可以将数码管部分代码删除或注释掉。
阅读全文