在内部RAM的10H~27H单元中的数据,采用方式 1串行发送出去,传送速率为1200波特,时钟频率为6MHz,SMOD-0。
时间: 2024-02-17 10:03:02 浏览: 79
根据题目描述,需要将内部RAM的10H~27H单元中的数据以方式1串行发送出去,传送速率为1200波特,时钟频率为6MHz,SMOD=0。下面给出一种实现方式:
```c
#include <reg51.h>
#define BAUD_RATE 1200 // 波特率
#define TIMER_VALUE (65536 - (6e6 / 12 / BAUD_RATE)) // 定时器计数值
unsigned char data_buf[24] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; // 待发送的数据
void Timer1_ISR() interrupt 3 {
static unsigned char cur_byte = 0; // 当前发送的字节
static unsigned char cur_bit = 0; // 当前发送的位
// 发送起始位
if (cur_bit == 0) {
SBUF = 0x00;
}
// 发送数据位
else if (cur_bit <= 8) {
SBUF = (data_buf[cur_byte] >> (cur_bit - 1)) & 0x01;
}
// 发送停止位
else if (cur_bit == 9) {
SBUF = 0x01;
}
cur_bit++;
if (cur_bit > 9) {
cur_bit = 0;
cur_byte++;
if (cur_byte >= 24) {
cur_byte = 0;
}
}
}
void main() {
TMOD = 0x20; // 设置定时器1为模式2,自动重载
TH1 = TIMER_VALUE >> 8; // 初始化定时器1计数值
TL1 = TIMER_VALUE & 0xFF;
ES = 1; // 开启串口中断
EA = 1; // 开启总中断开关
TR1 = 1; // 开启定时器1
SM0 = 0; // 设置串口为方式1
SM1 = 1;
TI = 1; // 先发送一个字节
while(1);
}
```
在这个实现方式中,使用定时器1来控制串口数据的发送。定时器1的工作模式为模式2,自动重载模式,时钟源为Fosc/12。因此,定时器的计数值可以通过以下公式计算得到:
计数值 = 65536 - (时钟频率 / 12 / 波特率)
注意到这里使用的是SMOD=0,因此波特率的实际值应为1200波特的一半,即600波特,因此计数值为:
计数值 = 65536 - (6e6 / 12 / 600) = 4587
每次定时器中断服务程序被触发时,先发送一个起始位(0),然后依次发送数据位和停止位,最后更新当前发送的字节和位数。因为该题中要发送的数据有24个字节,因此当发送完最后一个字节之后需要重新从第一个字节开始发送。
阅读全文