单片机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机
时间: 2023-10-05 16:08:16 浏览: 96
以下是参考代码,仅供参考:
```c
#include <reg51.h>
#define BAUDRATE 9600 // 通信波特率
#define FOSC 11059200UL // 晶振频率
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;
void serial_init();
void timer1_init();
void interrupt_init();
void send_byte(unsigned char dat);
unsigned char receive_byte();
void display(unsigned char dat);
unsigned char read_dip_switch();
void main()
{
unsigned char dip_value = 0xFF; // 初始值为全高电平
serial_init();
timer1_init();
interrupt_init();
while (1)
{
unsigned char new_value = read_dip_switch(); // 读取拨码开关值
if (new_value != dip_value) // 如果拨码值有变化
{
dip_value = new_value;
send_byte(dip_value); // 发送最新拨码值到PC机
}
display(dip_value); // 显示拨码值到8路指示灯
}
}
void serial_init()
{
SCON = 0x50; // 设置串口为模式1,允许接收
TMOD &= 0x0F; // 清除定时器1的控制位
TMOD |= 0x20; // 设置定时器1为8位自动重载计数器模式
TH1 = TL1 = -(FOSC / 12 / 32 / BAUDRATE); // 计算波特率发生器的初值
PCON |= 0x80; // 启用波特率发生器的自动重载功能
EA = 1; // 允许中断
}
void timer1_init()
{
TR1 = 0; // 关闭定时器1
TMOD &= 0xF0; // 清除定时器1的工作模式
TMOD |= 0x01; // 设置定时器1为16位定时器模式
TH1 = 0xFC; // 设置定时器1的初始值,50ms定时
TL1 = 0x18;
ET1 = 1; // 允许定时器1中断
}
void interrupt_init()
{
ES = 1; // 允许串口中断
EA = 1; // 允许中断
}
void send_byte(unsigned char dat)
{
SBUF = dat; // 把要发送的数据放入发送缓冲区
while (!TI); // 等待发送完成
TI = 0; // 发送标志位清零
}
unsigned char receive_byte()
{
while (!RI); // 等待接收完成
RI = 0; // 接收标志位清零
return SBUF; // 返回接收到的数据
}
void display(unsigned char dat)
{
LED1 = !(dat & 0x01); // 根据拨码值的每一位控制对应的指示灯
LED2 = !(dat & 0x02);
LED3 = !(dat & 0x04);
LED4 = !(dat & 0x08);
LED5 = !(dat & 0x10);
LED6 = !(dat & 0x20);
LED7 = !(dat & 0x40);
LED8 = !(dat & 0x80);
}
unsigned char read_dip_switch()
{
unsigned char dip_value = 0xFF;
if (P1 != 0xFF) // 如果有至少一位拨码开关接入单片机
{
dip_value = P1; // 读取拨码值
}
return dip_value;
}
void serial_isr() interrupt 4
{
if (RI) // 如果是接收中断
{
unsigned char data = receive_byte(); // 读取接收到的数据
if (data == 0x01) // 如果收到0x01,则发送最新拨码值到PC机
{
send_byte(read_dip_switch());
}
}
}
void timer1_isr() interrupt 3
{
TH1 = 0xFC; // 设置定时器1的初始值,50ms定时
TL1 = 0x18;
send_byte(read_dip_switch()); // 定时发送最新拨码值到PC机
}
```
阅读全文