单片机串口通信甲机四个按钮控制乙机,按钮1被按下时乙机8个流水灯全亮,按钮2被按下时乙机8个流水灯以流水形式点亮,按钮3被按下时乙机4个4个流水灯亮,按钮4被按下时流水灯全灭代码
时间: 2023-10-01 16:08:20 浏览: 77
工业通信设计--LED灯的三种模式显示与控制
以下是单片机串口通信甲机四个按钮控制乙机的代码。假设甲机通过串口发送四个字节的数据到乙机,分别为0x01、0x02、0x03、0x04代表按钮1、按钮2、按钮3、按钮4被按下。
```c
#include <reg52.h>
// 定义串口波特率常量
#define BAUDRATE 9600
// 定义流水灯亮起和熄灭的时间间隔
#define DELAY_TIME 500
// 定义按钮对应的命令字节
#define CMD_LED_ON 0x01
#define CMD_LED_FLOW 0x02
#define CMD_LED_GROUP 0x03
#define CMD_LED_OFF 0x04
// 定义乙机8个流水灯的引脚
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
// 定义流水灯的数组
sbit LEDS[] = {&LED1, &LED2, &LED3, &LED4, &LED5, &LED6, &LED7, &LED8};
// 定义流水灯的索引
int led_index = 0;
// 定义延时函数
void delay(int time) {
while (time--);
}
// 串口初始化函数
void uart_init() {
// 设置波特率
SCON = 0x50;
TMOD = 0x20;
TH1 = 256 - FOSC / BAUDRATE / 12;
TL1 = TH1;
TR1 = 1;
}
// 串口发送函数
void uart_send(unsigned char dat) {
SBUF = dat;
while (!TI);
TI = 0;
}
// 乙机8个流水灯全亮
void led_all_on() {
for (int i = 0; i < 8; i++) {
*LEDS[i] = 0;
}
}
// 乙机8个流水灯以流水形式点亮
void led_flow() {
for (int i = 0; i < 8; i++) {
*LEDS[i] = 1;
delay(DELAY_TIME);
*LEDS[i] = 0;
}
}
// 乙机4个4个流水灯亮
void led_group() {
for (int i = 0; i < 8; i += 4) {
*LEDS[i] = 1;
*LEDS[i+1] = 1;
*LEDS[i+2] = 1;
*LEDS[i+3] = 1;
delay(DELAY_TIME);
*LEDS[i] = 0;
*LEDS[i+1] = 0;
*LEDS[i+2] = 0;
*LEDS[i+3] = 0;
}
}
// 流水灯全灭
void led_all_off() {
for (int i = 0; i < 8; i++) {
*LEDS[i] = 1;
}
}
void main() {
// 串口初始化
uart_init();
while (1) {
if (RI) {
// 读取串口接收到的数据
unsigned char cmd = SBUF;
RI = 0;
switch (cmd) {
case CMD_LED_ON:
led_all_on();
break;
case CMD_LED_FLOW:
led_flow();
break;
case CMD_LED_GROUP:
led_group();
break;
case CMD_LED_OFF:
led_all_off();
break;
}
}
}
}
```
代码中通过switch语句对四个命令字节进行判断,分别执行不同的流水灯控制函数。其中led_all_on()函数将8个流水灯全部点亮,led_flow()函数将8个流水灯以流水形式点亮,led_group()函数将4个4个流水灯点亮,led_all_off()函数将8个流水灯全部熄灭。
阅读全文