关于用c语言代码,把所给的问题c52在单片机上显示出效果!

项目8:倒计时定时提醒装置
任务1:通过串口下发倒计时定时提醒,定时时间范围(0-999s) 倒计时过程中无法更新定时时间;任务2:动态数码管显示定时时间;
任务3:按下独立按键K1,利用定时器按秒开始倒计时;
任务4:倒计时大于20s时,绿灯闪烁,10s—20s时黄灯闪烁,10s内红灯闪烁;
任务5:按下独立按键K2,停止倒计时提醒,倒计时零;
任务6:倒计时结束后,蜂鸣器发声
任务7:按下独立按键K3,蜂鸣器停止发声;

提供一个不错的参考实例:https://blog.csdn.net/weixin_43772810/article/details/121347301

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

C语言写的代码,你可以参考一下。

#include <reg52.h>  // 根据实际单片机型号和编译器修改头文件名称
#include <math.h>

// 数码管相关
sbit DIG1 = P2^0;
sbit DIG2 = P2^1;
sbit DIG3 = P2^2;
sbit DIG4 = P2^3;
sbit A = P0^0;
sbit B = P0^1;
sbit C = P0^2;
sbit D = P0^3;
sbit E = P0^4;
sbit F = P0^5;
sbit G = P0^6;
sbit DP = P0^7;

// 按钮相关
sbit K1 = P3^0;
sbit K2 = P3^1;
sbit K3 = P3^2;

// LED灯相关
sbit LED_GREEN = P1^0;
sbit LED_YELLOW = P1^1;
sbit LED_RED = P1^2;

// 蜂鸣器相关
sbit BUZZER = P1^3;

// 定时器相关
unsigned int TH0_VALUE, TL0_VALUE;  // 定时器0的初值
volatile unsigned char OVERFLOW_COUNT;  // 定时器0溢出计数,用于控制倒计时
volatile unsigned int SECOND_COUNT;  // 秒数计数,用于动态更新数码管

// 全局变量
unsigned int countdown_time = 0;  // 倒计时时间(单位:秒)
volatile unsigned int remaining_time = 0;  // 剩余时间(单位:秒)

// 数码管显示函数
void display(unsigned char digit, unsigned char number) {
    unsigned char table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
    DIG1 = 1;
    DIG2 = 1;
    DIG3 = 1;
    DIG4 = 1;
    switch (digit) {
        case 1:
            DIG1 = 0;
            break;
        case 2:
            DIG2 = 0;
            break;
        case 3:
            DIG3 = 0;
            break;
        case 4:
            DIG4 = 0;
            break;
        default:
            break;
    }
    DP = 0;
    P0 = table[number];
}

// 数码管显示倒计时时间函数
void display_countdown_time() {
    unsigned int t = remaining_time;
    unsigned char d1, d2, d3;
    d1 = t / 100;
    t %= 100;
    d2 = t / 10;
    t %= 10;
    d3 = t;
    display(1, d1);
    display(2, d2);
    display(3, d3);
    display(4, 0);
}

// 停止倒计时和提醒
void stop_countdown() {
    TR0 = 0;  // 关闭定时器0
    remaining_time = 0;
    OVERFLOW_COUNT = 0;
    SECOND_COUNT = 0;
    LED_GREEN = 0;
    LED_YELLOW = 0;
    LED_RED = 0;
    BUZZER = 0;
}

// 定时器0中断服务函数
void timer0_interrupt() interrupt 1 {
    TH0 = TH0_VALUE;
    TL0 = TL0_VALUE;
    OVERFLOW_COUNT++;
    if (OVERFLOW_COUNT >= 20) {  // 倒计时大于20s
        LED_GREEN = ~LED_GREEN;
        LED_YELLOW = 0;
        LED_RED = 0;
    }
    else if (OVERFLOW_COUNT >= 10) {  // 倒计时10-20s
        LED_GREEN = 0;
        LED_YELLOW = ~LED_YELLOW;
        LED_RED = 0;
    }
    else {  // 倒计时小于10s
        LED_GREEN = 0;
        LED_YELLOW = 0;
        LED_RED = ~LED_RED;
    }
    if (OVERFLOW_COUNT >= 50) {  // 1秒钟
        OVERFLOW_COUNT = 0;
        SECOND_COUNT++;
        if (SECOND_COUNT > remaining_time) {  // 倒计时结束
            stop_countdown();
            BUZZER = 1;
        }
        else {
            display_countdown_time();
        }
    }
}

// K1按键中断服务函数
void k1_interrupt() interrupt 0 {
    if (countdown_time == 0) return;
    remaining_time = countdown_time;
    TH0_VALUE = 0x4c;
    TL0_VALUE = 0x00;
    TR0 = 1;  // 打开定时器0
}

// K2按键中断服务函数
void k2_interrupt() interrupt 0 {
    stop_countdown();
}

// K3按键中断服务函数
void k3_interrupt() interrupt 0 {
    BUZZER = 0;
}

// 主函数
void main() {
    // 初始化串口和定时器
    // ...

    // 初始化按键和LED灯和蜂鸣器
    K1 = 1;
    K2 = 1;
    K3 = 1;
    LED_GREEN = 0;
    LED_YELLOW = 0;
    LED_RED = 0;
    BUZZER = 0;

    // 中断控制
    EA = 1;  // 全局中断开关
    EX0 = 1;  // 开启外部中断0(K1按键)
    IT0 = 1;  // 设置外部中断0下降沿触发
    EX1 = 1;  // 开启外部中断1(K2按键)
    IT1 = 1;  // 设置外部中断1下降沿触发

    while (1) {
        // 通过串口接收倒计时时间,并保存到countdown_time中
        // ...

        // 利用动态扫描,在数码管上动态显示剩余时间
    }
}

这道题目需要在一个单片机平台上实现,因此需要选择一个单片机和开发环境。

一般情况下,可以选择一款支持C语言的单片机,例如STC89C52、STM32等。对于该题目中的任务,可以采用如下方法来实现:

1.通过串口下发倒计时时间,可以用串口通信库来实现,例如使用UART串口通信库。

2.动态数码管显示定时时间,可以使用数码管显示函数库或者自己编写驱动代码来实现。

3.按下独立按键K1,开启定时器进行倒计时,可以利用定时器库来实现。

4.根据倒计时时间的不同,控制不同的LED灯的闪烁和颜色,可以编写LED控制函数库或自己编写驱动代码来实现。

5.按下独立按键K2,停止倒计时提醒,可以通过定时器中断和控制变量的方式来实现。

6.倒计时结束后,蜂鸣器发声,可以使用蜂鸣器函数库或自己编写驱动代码来实现。

7.按下独立按键K3,蜂鸣器停止发声,同样可以通过定时器中断和控制变量的方式来实现。

需要注意的是,单片机平台编程需要考虑到硬件的细节问题,例如I/O口的选择和控制、定时器和计数器的设定和使用、中断的处理等等。针对具体硬件平台和开发工具,需要进一步深入学习和熟悉相关文档和实验材料,才能够正确实现这个项目。