Proteus仿真51单片机串口接发数据实现单片机a按钮控制单片机b的led灯亮,单片机b按钮实现单片机a的led灯亮,c语言
时间: 2024-03-12 19:46:34 浏览: 57
下面是实现该功能的 C 语言代码示例:
单片机 A 代码:
```c
#include <reg51.h>
#define FOSC 11059200L // 单片机工作频率
#define BAUD 9600 // 串口波特率
#define TIMER_1MS (65536 - FOSC/12/1000) // 定时器计数初值,1ms 中断
sbit LED = P2^0; // 控制 LED 灯的引脚
sbit BTN = P3^0; // 按钮引脚
unsigned char code LED_ON = '1'; // 控制 B 单片机 LED 灯亮起的字符
unsigned char code LED_OFF = '0'; // 控制 B 单片机 LED 灯熄灭的字符
void init_timer(); // 初始化定时器
void init_serial(); // 初始化串口
void send_byte(unsigned char dat); // 发送一个字节数据
void main()
{
init_timer(); // 初始化定时器
init_serial(); // 初始化串口
while (1)
{
if (BTN == 0) // 按钮按下
{
send_byte(LED_ON); // 发送控制 B 单片机 LED 亮起的字符
LED = 1; // 控制 A 单片机的 LED 灯亮起
while (BTN == 0); // 等待按钮释放
send_byte(LED_OFF); // 发送控制 B 单片机 LED 熄灭的字符
LED = 0; // 控制 A 单片机的 LED 灯熄灭
}
}
}
// 初始化定时器
void init_timer()
{
TMOD |= 0x10; // 设置定时器 1 为模式 1(16 位定时器)
TH1 = TIMER_1MS / 256; // 设置定时器初值
TL1 = TIMER_1MS % 256;
ET1 = 1; // 允许定时器 1 中断
TR1 = 1; // 启动定时器 1
EA = 1; // 开启总中断
}
// 定时器 1 中断服务程序,用于串口通信时的延时
void timer1_isr() interrupt 3
{
static unsigned char cnt = 0;
TH1 = TIMER_1MS / 256; // 重新设置定时器初值
TL1 = TIMER_1MS % 256;
cnt++;
if (cnt >= 10) // 10ms 延时
{
cnt = 0;
TF1 = 0; // 清除定时器 1 溢出标志
}
}
// 初始化串口
void init_serial()
{
SCON = 0x50; // 设置串口为模式 1,允许串口接收
TMOD |= 0x20; // 设置定时器 1 为模式 2(8 位自动重载定时器)
TH1 = 256 - FOSC/12/32/BAUD; // 计算并设置波特率
TL1 = TH1;
ES = 1; // 允许串口中断
}
// 发送一个字节数据
void send_byte(unsigned char dat)
{
SBUF = dat;
while (!TI); // 等待发送完成
TI = 0;
}
```
单片机 B 代码:
```c
#include <reg51.h>
#define FOSC 11059200L // 单片机工作频率
#define BAUD 9600 // 串口波特率
#define TIMER_1MS (65536 - FOSC/12/1000) // 定时器计数初值,1ms 中断
sbit LED = P2^0; // 控制 LED 灯的引脚
sbit BTN = P3^0; // 按钮引脚
unsigned char code LED_ON = '1'; // 控制 A 单片机 LED 灯亮起的字符
unsigned char code LED_OFF = '0'; // 控制 A 单片机 LED 灯熄灭的字符
void init_timer(); // 初始化定时器
void init_serial(); // 初始化串口
void send_byte(unsigned char dat); // 发送一个字节数据
void main()
{
init_timer(); // 初始化定时器
init_serial(); // 初始化串口
while (1)
{
if (BTN == 0) // 按钮按下
{
send_byte(LED_ON); // 发送控制 A 单片机 LED 亮起的字符
LED = 1; // 控制 B 单片机的 LED 灯亮起
while (BTN == 0); // 等待按钮释放
send_byte(LED_OFF); // 发送控制 A 单片机 LED 熄灭的字符
LED = 0; // 控制 B 单片机的 LED 灯熄灭
}
}
}
// 初始化定时器
void init_timer()
{
TMOD |= 0x10; // 设置定时器 1 为模式 1(16 位定时器)
TH1 = TIMER_1MS / 256; // 设置定时器初值
TL1 = TIMER_1MS % 256;
ET1 = 1; // 允许定时器 1 中断
TR1 = 1; // 启动定时器 1
EA = 1; // 开启总中断
}
// 定时器 1 中断服务程序,用于串口通信时的延时
void timer1_isr() interrupt 3
{
static unsigned char cnt = 0;
TH1 = TIMER_1MS / 256; // 重新设置定时器初值
TL1 = TIMER_1MS % 256;
cnt++;
if (cnt >= 10) // 10ms 延时
{
cnt = 0;
TF1 = 0; // 清除定时器 1 溢出标志
}
}
// 初始化串口
void init_serial()
{
SCON = 0x50; // 设置串口为模式 1,允许串口接收
TMOD |= 0x20; // 设置定时器 1 为模式 2(8 位自动重载定时器)
TH1 = 256 - FOSC/12/32/BAUD; // 计算并设置波特率
TL1 = TH1;
ES = 1; // 允许串口中断
}
// 发送一个字节数据
void send_byte(unsigned char dat)
{
SBUF = dat;
while (!TI); // 等待发送完成
TI = 0;
}
// 串口接收中断服务程序
void serial_isr() interrupt 4
{
static unsigned char dat = 0;
static unsigned char cnt = 0;
if (RI) // 接收到数据
{
RI = 0;
dat = SBUF;
if (dat == LED_ON) // 收到控制 B 单片机 LED 亮起的字符
{
LED = 1; // 控制 B 单片机的 LED 灯亮起
}
else if (dat == LED_OFF) // 收到控制 B 单片机 LED 熄灭的字符
{
LED = 0; // 控制 B 单片机的 LED 灯熄灭
}
}
}
```
阅读全文