单片机P31接底板JP75的TX1,单片机P30接底板JP75的RX1。 底板JP71的PCR1接底板JP8的RX,底板JP71的PCT1接底板 JP8的TX(串口线接DB1串口母座) 1、串口通信初始化,包括SCON设置,通信波特率发生器设置 (TMOD,TCON,TH1,TL1,SMOD等的设置) 2、中断初始化,包括IE,IP等特殊功能寄存器设置 3、启动定时器TR1 4、根据接收到来自PC串口助手数据,送出并实现8路指示灯的显示 5、读入8位拨码值,若有变化,则把最新拨码值发送到PC机 编码:显示功能考虑使用三位数码管实时显示0~256的串口接收数值
时间: 2023-10-08 13:08:36 浏览: 79
以下是示例代码,仅供参考:
```c
#include <reg52.h>
// 定义波特率和时钟频率
#define BAUDRATE 9600
#define SYSCLK 11059200UL
// 定义全局变量
volatile unsigned char rx_data; // 接收到的数据
volatile unsigned char dip_switch; // 拨码开关值
volatile bit tx_flag = 0; // 发送标志
volatile bit dip_switch_changed = 0; // 拨码开关值变化标志
// 定义函数
void init_serial();
void init_interrupt();
void init_timer();
void display_number(unsigned char num);
void main() {
init_serial();
init_interrupt();
init_timer();
while (1) {
if (tx_flag) { // 如果有数据要发送
SBUF = dip_switch; // 发送拨码开关值
tx_flag = 0;
}
if (dip_switch_changed) { // 如果拨码开关值发生变化
display_number(dip_switch); // 显示拨码开关值
dip_switch_changed = 0;
}
}
}
void init_serial() {
// 设置波特率发生器
TH1 = 256 - SYSCLK / BAUDRATE / 12;
TL1 = TH1;
TMOD &= 0x0F;
TMOD |= 0x20;
// 打开串口中断和总中断
ES = 1;
EA = 1;
// 打开接收允许
RI = 0;
SM0 = 0;
SM1 = 1;
}
void init_interrupt() {
// 打开外部中断0和1
EX0 = 1;
EX1 = 1;
// 设置中断优先级(INT0 > INT1 > UART)
IT0 = 1;
IT1 = 1;
IP = 0x10;
}
void init_timer() {
// 启动定时器1
TR1 = 1;
}
void display_number(unsigned char num) {
unsigned char digits[3];
digits[0] = num / 100;
digits[1] = (num / 10) % 10;
digits[2] = num % 10;
// 显示数码管
// ...
}
void serial_isr() interrupt 4 {
if (RI) { // 如果接收到数据
rx_data = SBUF;
RI = 0;
}
if (TI) { // 如果发送完数据
TI = 0;
}
}
void external0_isr() interrupt 0 {
dip_switch = P2;
dip_switch_changed = 1;
}
void external1_isr() interrupt 2 {
tx_flag = 1;
}
```
注:上述代码仅为示例,实际使用时需要根据硬件连接和具体需求进行修改。
阅读全文