一个8XX511单片机的双机通信系统波特率为9600, fosc=12MHz,用中断方式编写程序,将甲机片外RAM 3400H~34AOH的数据块通过串行口传送到乙机的片外RAM 4400H~44AOH单元中去。
时间: 2024-02-16 21:59:38 浏览: 86
好的,这是一个比较具体的技术问题,需要一步一步解决。首先,我们需要计算出波特率发生器的值。
在这个系统中,我们使用的是晶振为12MHz的8XX511单片机,需要将波特率设置为9600。根据串口通信的原理,波特率发生器的值可以通过以下公式计算:
Baud Rate = Fosc / (64 × (X + 1))
其中,X是波特率发生器的值。将9600代入公式中,可以得到:
9600 = 12000000 / (64 × (X + 1))
X = 77.083
因为X必须是整数,所以我们可以取最接近77.083的整数,即77。因此,波特率发生器的值为77。
接下来,我们需要编写程序实现数据的传输。首先,需要初始化串口,设置波特率和中断。接着,将甲机的片外RAM 3400H~34AOH的数据块读取到内存中,然后通过串口发送给乙机。乙机接收到数据后,将其存储到片外RAM 4400H~44AOH单元中。
具体的代码实现如下(仅供参考):
```c
#include <reg51.h>
#define BAUD_RATE 9600
#define BUF_SIZE 16
unsigned char buf[BUF_SIZE];
void init_serial() {
TMOD |= 0x20; // 设置定时器1为模式2
TH1 = 0xFF - 77 + 1; // 设置波特率发生器的值
SCON = 0x50; // 设置串口为模式1
TR1 = 1; // 启动定时器1
ES = 1; // 允许串口中断
EA = 1; // 允许总中断
}
void send_byte(unsigned char byte) {
SBUF = byte;
while (!TI); // 等待发送完成
TI = 0;
}
void send_data(unsigned char *data, unsigned char len) {
unsigned char i;
for (i = 0; i < len; i++) {
send_byte(data[i]);
}
}
void main() {
unsigned int i;
for (i = 0; i < BUF_SIZE; i++) {
buf[i] = i;
}
init_serial(); // 初始化串口
while (1) {
send_data(buf, BUF_SIZE); // 发送数据
}
}
void serial_isr() interrupt 4 {
unsigned char byte = SBUF;
unsigned char addr = 0x4400 + (byte % BUF_SIZE); // 计算存储地址
buf[byte % BUF_SIZE] = byte; // 将数据存储到缓存中
send_byte(byte); // 发送回复
}
```
这段代码使用定时器1作为波特率发生器,通过中断的方式接收和发送数据。当收到数据时,将其存储到缓存中,并发送一个回复。这里为了方便,将回复的数据设置为接收到的数据本身。在实际使用中,可以根据需要进行修改。
阅读全文