51单片机若晶振为11.0592MHz,串行口工作于方式1,波特率为4800,计算出采用T1作为波特率发生器的方式字和计数器初值,编写c语言程序实现将一个收到的字符按位取反后再发送回去。
时间: 2024-02-18 22:06:28 浏览: 291
根据波特率计算公式:波特率 = 晶振频率 / (16 * (256*T1计数器初值 + T1计数器当前值))
其中,晶振频率为11.0592MHz,波特率为4800,根据方式1的计数器初值为256-T1计数器初值,则有:
4800 = 11.0592MHz / (16 * (256*T1计数器初值 + T1计数器当前值))
化简得:
T1计数器初值 = (11.0592MHz / (16 * 4800)) - T1计数器当前值 / 256
代入计算得:T1计数器初值约为138
则方式字为:0x20 + T1计数器初值,即0x20 + 138 = 0x8A
编写C语言程序如下:
```
#include <reg51.h>
#define BAUDRATE 4800
void initSerial() {
TMOD = 0x20; // T1模式2
TH1 = 0x8A; // 波特率发生器初值
TL1 = 0x8A; // 波特率发生器当前值
SCON = 0x50; // 串口方式1
TR1 = 1; // 启动T1计数器
}
void sendChar(unsigned char c) {
SBUF = ~c; // 对字符按位取反后发送
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
}
void main() {
initSerial();
while (1) {
while (!RI); // 等待接收完成
RI = 0; // 清除接收完成标志
unsigned char c = SBUF; // 读取接收到的字符
sendChar(c); // 发送字符
}
}
```
该程序初始化串口,然后进入死循环,不断接收一个字符并按位取反后发送回去。
阅读全文