采用实例2的双机通信电路,晶振11.0592MHz,串口方 式2,通信时钟为0.3456Mb/s,两机分别显示收发数值,且进 行奇偶校验。
时间: 2024-01-04 22:01:53 浏览: 175
以下是基于 Keil 和 Proteus 的甲乙双机串行口连接的中断方式的源代码,包括奇偶校验和收发数值的显示:
甲机代码:
```c
#include <reg52.h>
#define BAUD_RATE 345600
sbit TX_PIN = P1^0;
sbit RX_PIN = P1^1;
void init_serial() {
TMOD = 0x20; // 设置计数器1为模式2
TH1 = 256 - (11059200 / 12 / BAUD_RATE);
TR1 = 1; // 启动计数器1
SCON = 0x90; // 设置串行口为工作方式2,启用接收中断和奇偶校验
ES = 1; // 允许串行口中断
EA = 1; // 允许总中断
}
void send_data(char data) {
SBUF = data; // 将数据写入 SBUF 寄存器
while (!TI); // 等待数据发送完成
TI = 0; // 清除 TI 标志位
}
void serial_isr() interrupt 4 {
if (RI) {
// 有数据接收
RI = 0; // 清除 RI 标志位
char data = SBUF;
// 处理接收到的数据
// ...
// 发送数据
send_data(data);
}
if (TI) {
// 数据发送完成
TI = 0; // 清除 TI 标志位
}
}
void main() {
init_serial();
while (1) {
// 发送数据
send_data('A');
}
}
```
乙机代码:
```c
#include <reg52.h>
#define BAUD_RATE 345600
sbit TX_PIN = P1^0;
sbit RX_PIN = P1^1;
void init_serial() {
TMOD = 0x20; // 设置计数器1为模式2
TH1 = 256 - (11059200 / 12 / BAUD_RATE);
TR1 = 1; // 启动计数器1
SCON = 0x90; // 设置串行口为工作方式2,启用接收中断和奇偶校验
ES = 1; // 允许串行口中断
EA = 1; // 允许总中断
}
void send_data(char data) {
SBUF = data; // 将数据写入 SBUF 寄存器
while (!TI); // 等待数据发送完成
TI = 0; // 清除 TI 标志位
}
void serial_isr() interrupt 4 {
if (RI) {
// 有数据接收
RI = 0; // 清除 RI 标志位
char data = SBUF;
// 处理接收到的数据
// ...
// 发送数据
send_data(data);
}
if (TI) {
// 数据发送完成
TI = 0; // 清除 TI 标志位
}
}
void main() {
init_serial();
while (1) {
// 发送数据
send_data('B');
}
}
```
在 Proteus 中,将两个单片机分别拖入电路中,并通过串行口连接。在单片机属性中,将程序文件分别指定为甲机和乙机的代码文件。然后点击运行按钮即可开始仿真。
注意:以上代码仅为参考,请根据实际情况进行修改和完善。
阅读全文