用keil5编写2道单片机程序(用51单片机)

1、按下S3键在8个发光二极管上对应学号的灯点亮,并闪烁3次,同时蜂鸣器发声;按下S4 键8个发光二极管的LED8、LED7点亮,按照2个灯逐步流动的规则,直至LED2,LED1 点亮,LED1点亮,熄灭;结束。
2、12864液晶屏显示:

img

引用chatGPT作答,
可以为您提供以下伪代码作为参考,帮助您开始编写这两个单片机程序。

1.按下S3键控制灯亮和蜂鸣器发声:

#include <reg51.h>

sbit S3 = P1^0;
sbit buzzer = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;
sbit LED8 = P1^7;

void delay(int time) {
    int i, j;
    for (i = 0; i < time; i++) {
        for (j = 0; j < 100; j++);
    }
}

void blinkLED() {
    int i;
    for (i = 0; i < 3; i++) {
        LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 1; // 点亮所有LED灯
        buzzer = 1; // 发声
        delay(500); // 延时
        LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = LED8 = 0; // 熄灭所有LED灯
        buzzer = 0; // 停止发声
        delay(500); // 延时
    }
}

void main() {
    while(1) {
        if (S3 == 0) { // 检测S3键是否按下
            // 点亮对应学号的LED灯
            // 例如:学号为20190001,则点亮LED2、LED0、LED1、LED9、LED0、LED0、LED0、LED1
            LED2 = 1;
            LED0 = 1;
            LED1 = 1;
            LED9 = 1;
            LED0 = 1;
            LED0 = 1;
            LED0 = 1;
            LED1 = 1;
            blinkLED(); // LED灯闪烁
        }
    }
}

2.按下S4键控制LED灯流动和熄灭:

#include <reg51.h>

sbit S4 = P1^1;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;
sbit LED8 = P1^7;

void delay(int time) {
    int i, j;
    for (i = 0; i < time; i++) {
        for (j = 0; j < 100; j++);
    }
}

void LEDFlow() {
    int i;
    for (i = 0; i < 6; i++) { // 逐个点亮LED灯
        LED
    LED1 = 1;
    delay(100);
    LED1 = 0;

    LED2 = 1;
    delay(100);
    LED2 = 0;

    LED3 = 1;
    delay(100);
    LED3 = 0;

    LED4 = 1;
    delay(100);
    LED4 = 0;

    LED5 = 1;
    delay(100);
    LED5 = 0;

    LED6 = 1;
    delay(100);
    LED6 = 0;

    LED7 = 1;
    delay(100);
    LED7 = 0;

    LED8 = 1;
    delay(100);
    LED8 = 0;
}

for (i = 0; i < 2; i++) { // 逐个点亮LED灯
    LED1 = 1;
    delay(100);
    LED1 = 0;

    LED2 = 1;
    delay(100);
    LED2 = 0;
}

LED1 = 1; // 最后点亮LED1
delay(1000);
LED1 = 0;
}

void main() {
while(1) {
if (S4 == 0) { // 检测S4键是否按下
LED8 = 1;
LED7 = 1;
LEDFlow(); // LED灯流动
}
}
}

您好,您这个有自己对应的原理图么,还是全部要自己设计,你这个硬件操作这个价位估计难有满意的答案哦

基于new Bing的编写:
【题目一】
假设每个LED的控制引脚分别为P1-P8,蜂鸣器的控制引脚为Buzzer,按键S3和S4的引脚为Key_S3和Key_S4。

首先,我们需要在程序中定义每个引脚的控制方式,例如输入还是输出。然后,我们可以编写一个函数来控制LED灯的亮灭,以及蜂鸣器的发声。接下来,我们可以在主程序中添加两个事件,对应按下S3和S4按键时的操作:点亮对应的LED灯、控制蜂鸣器发声。最后,我们可以编写一个循环来控制LED灯的流动,直至LED1点亮后熄灭,结束程序。

以下是示例代码:

// 引脚定义
#define P1 1
#define P2 2
#define P3 3
#define P4 4
#define P5 5
#define P6 6
#define P7 7
#define P8 8
#define Buzzer 9
#define Key_S3 10
#define Key_S4 11

// 控制引脚的函数
void digital_write(int pin, int value) {
    // 控制引脚为输出模式
    pinMode(pin, OUTPUT);
    // 输出高电平或低电平
    digitalWrite(pin, value);
}

// 读取引脚的状态
int digital_read(int pin) {
    // 控制引脚为输入模式
    pinMode(pin, INPUT);
    // 返回引脚的状态
    return digitalRead(pin);
}

// 控制LED灯亮灭和蜂鸣器发声的函数
void control_led_and_buzzer(int pin, int value) {
    digital_write(pin, value);
    delay(300);
    digital_write(pin, 0);
    delay(300);
}

// 按下S3键的操作
void press_s3() {
    // 学号对应的LED灯点亮并闪烁3次,蜂鸣器发声
    for (int i = 0; i < 3; i++) {
        digital_write(P1, 1);
        digital_write(Buzzer, 1);
        delay(500);
        digital_write(P1, 0);
        digital_write(Buzzer, 0);
        delay(500);
    }
}

// 按下S4键的操作
void press_s4() {
    // LED8、LED7点亮
    digital_write(P8, 1);
    digital_write(P7, 1);
    // 控制LED灯流动,直至LED1点亮后熄灭
    for (int i = 7; i >= 0; i--) {
        digital_write(P8-i, 0);
        digital_write(P7-i, 0);
        digital_write(P6-i, 1);
        digital_write(P5-i, 1);
        delay(200);
    }
    digital_write(P1, 1);
    delay(2000);
    digital_write(P1, 0);
}

void setup() {
    // 初始化引脚模式
    pinMode(P1, OUTPUT);
    pinMode(P2, OUTPUT);
    pinMode(P3, OUTPUT);
    pinMode(P4, OUTPUT);
    pinMode(P5, OUTPUT);
    pinMode(P6, OUTPUT);
    pinMode(P7, OUTPUT);
    pinMode(P8, OUTPUT);
    pinMode(Buzzer, OUTPUT);
    pinMode(Key_S3, INPUT);
    pinMode(Key_S4, INPUT);
}

void loop() {
    // 检测S3和S4按键是否被按下
    if (digital_read(Key_S3) == 0) {
        press_s3();
    }
    if (digital_read(Key_S4) == 0) {
        press_s4();
    }
}


需要注意的是,上述代码中采用了Arduino的库函数,如果不是在Arduino平台上运行,可能需要使用相应的GPIO操作函数库。
【题目二】
在这个例子中,我们使用了 Arduino 的基本框架:在 setup() 函数中初始化硬件并进行一些设置,在 loop() 函数中重复执行主要的代码逻辑。液晶屏的初始化和显示都在 setup() 中完成,而 loop() 函数中没有任何代码,因此程序会一直停留在这个循环中,直到重启或开机。

#include <LiquidCrystal.h>

// 初始化液晶屏控制对象
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// 程序初始化函数,只会在启动时执行一次
void setup() {
  // 设置液晶屏的列数和行数
  lcd.begin(16, 4);
  // 在第一行显示 "学号 姓名"
  lcd.print("学号  姓名");
  // 将光标移动到第二行
  lcd.setCursor(0, 1);
  // 输出音乐符号和 "显示一排" 文字
  lcd.write(byte(0)); // 使用 byte 函数输出特殊符号
  lcd.print(" 显示一排");
  // 将光标移动到第三行
  lcd.setCursor(0, 2);
  // 在第三行输出 "无线传感网课程"
  lcd.print("无线传感网课程");
  // 将光标移动到第四行
  lcd.setCursor(0, 3);
  // 在第四行输出 "期中测试"
  lcd.print("期中测试");
}

// 主程序循环体,会一直重复执行
void loop() {
  // 这里什么也不做
}