单片机/MCU论坛
直播中

jf_30329267

1年用户 3经验值
擅长:电源/新能源
私信 关注

AT89C52单片机编程求大佬帮忙!

本帖最后由 jf_30329267 于 2024-4-28 09:39 编辑

1
  • 流水灯.png
  • 流水灯.png

回帖(1)

cherr番茄

2024-4-26 17:43:34
根据您的描述,您需要使用AT89C52单片机实现以下功能:

1. 使用LM016L LCD显示屏显示文本。
2. 使用3个按键K1、K2、K3控制8个LED流水灯的工作时长、闪烁频率和点亮模式。

以下是实现这些功能的大致步骤:

1. 初始化单片机和外设:
   - 设置时钟源和时钟频率。
   - 初始化LCD显示屏,设置显示模式和字符编码。
   - 初始化按键K1、K2、K3的输入端口。

2. 定义变量和函数:
   - 定义工作时长、闪烁频率和点亮模式的变量。
   - 定义LCD显示文本的函数。
   - 定义LED流水灯控制函数。

3. 主循环:
   - 在主循环中,检测按键K1、K2、K3的状态。
   - 根据按键状态更新工作时长、闪烁频率和点亮模式的变量。
   - 使用LCD显示文本函数更新显示屏上的内容。
   - 使用LED流水灯控制函数控制LED的闪烁和点亮。

4. 编写具体的按键检测、LCD显示和LED控制代码。

以下是一个简化的示例代码,仅供参考:

```c
#include

#define LED P1

void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 123; j++);
}

void lcd_command(char cmd) {
    // 发送LCD命令
}

void lcd_data(char dat) {
    // 发送LCD数据
}

void lcd_print(char *str) {
    // 在LCD上显示字符串
}

void led_control(int mode, int duration) {
    // 根据模式和时长控制LED流水灯
}

sbit K1 = P3^0;
sbit K2 = P3^1;
sbit K3 = P3^2;

int main() {
    char worktime = 1;
    char frequency = 2;
    char mode = 0;

    lcd_command(0x80); // 设置LCD显示起始地址
    lcd_print("worktime:1h");

    while (1) {
        if (K1 == 0) {
            delay(20); // 消抖
            K1 = 1;
            if (worktime == 1) {
                worktime = 2;
                lcd_command(0x80); // 设置LCD显示起始地址
                lcd_print("worktime:2h");
            } else {
                worktime = 1;
                lcd_command(0x80); // 设置LCD显示起始地址
                lcd_print("worktime:1h");
            }
        }

        if (K2 == 0) {
            delay(20); // 消抖
            K2 = 1;
            if (frequency == 2) {
                frequency = 4;
                lcd_command(0xC0); // 设置LCD第二行显示起始地址
                lcd_print("fre:4s");
            } else {
                frequency = 2;
                lcd_command(0xC0); // 设置LCD第二行显示起始地址
                lcd_print("fre:2s");
            }
        }

        if (K3 == 0) {
            delay(20); // 消抖
            K3 = 1;
            if (mode == 0) {
                mode = 1;
                lcd_command(0xC0); // 设置LCD第二行显示起始地址
                lcd_print("mod:sin");
            } else {
                mode = 0;
                lcd_command(0xC0); // 设置LCD第二行显示起始地址
                lcd_print("mod:dou");
            }
        }

        led_control(mode, frequency);
    }
}
```

请注意,这只是一个简化的示例,您需要根据您的具体需求和硬件环境进行调整。希望这对您有所帮助!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分