关于#51单片机#的问题:为什么这样不能在数码管上显示现在的时间

为什么这样不能在数码管上显示现在的时间?
部分代码如下:

#include <REGX52.H>
#include<intrins.h>
sbit u5A = P2^2;
sbit u5B = P2^3;
sbit u5C = P2^4;

unsigned char  Nixie[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f};//数码管0~9

void Delay400us()        //@12.000MHz
{
    unsigned char i, j;

    i = 5;
    j = 168;
    do
    {
        while (--j);
    } while (--i);
}

void ShowTime()//显示时间
{
    unsigned char SystemTime[9]=__TIME__;
    unsigned char j;
    for(j=0;j<8;j++)
    {
        switch(j)
        {
            case 0:u5A=1;u5B=1;u5C=1;break;
            case 1:u5A=0;u5B=1;u5C=1;break;
            case 2:u5A=1;u5B=0;u5C=1;break;
            case 3:u5A=0;u5B=0;u5C=1;break;
            case 4:u5A=1;u5B=1;u5C=0;break;
            case 5:u5A=0;u5B=1;u5C=0;break;
            case 6:u5A=1;u5B=0;u5C=0;break;
            case 7:u5A=0;u5B=0;u5C=0;break;
        }
        if(j==2 || j==5)
        {
            P0=0x40;
        }
        else
        {
            P0=Nixie[SystemTime[j]+'0'];
        }
        Delay400us();
    }
}

void main()
{
    while(1)
    {
        ShowTime();
    }
}

那就说明无法实时获取时间信息,况且如果程序下载到单片机中又何处去读取?只能验证数码管驱动是否正确,另外修改P0=Nixie[SystemTime[j]-'0'];

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7711024
  • 这篇博客也不错, 你可以看下利用单片机的数码管模拟时钟的显示时间
  • 除此之外, 这篇博客: 单片机实现双量程电压测量并显示中的 软件部分: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    该部分无非是驱动数据处理

    首先是驱动:

  • 您还可以看一下 程张浩老师的微信小程序项目实战之我画你猜视频课程课程中的 商品的展示功能和删除功能小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    根据提供的参考资料和信息,我无法直接确定您在显示当前时间的问题上出了什么问题。参考资料主要关于函数指针的使用,而您提供的代码中并没有涉及到时间的获取和显示。

    要在数码管上显示当前时间,您需要进行以下步骤:

    1. 确定您所使用的单片机的型号和相应的开发平台(如Keil)。
    2. 根据选定的单片机型号,查找相关的资料来学习如何获取当前时间,例如使用定时器、RTC(实时时钟)模块或外部时钟源。
    3. 确定您所使用的数码管的类型和接口方式,如共阴极还是共阳极,以及使用的引脚。
    4. 编写相应的代码来将获取到的时间数据按照数码管的接口方式转换并输出显示。

    由于我无法获取到您所使用的单片机型号和具体的数码管接口,我无法提供具体的代码示例。但以下是一个一般性的伪代码示例,供您参考:

    // 伪代码示例,不可直接运行
    
    #include "头文件和库"
    
    // 获取当前时间的函数
    void get_current_time(uint8_t* hour, uint8_t* minute, uint8_t* second)
    {
        // 使用相应方法获取当前时间,并将小时、分钟和秒数分别保存到对应的指针变量中
    }
    
    // 将时间数据转换为数码管显示的函数
    void display_time(uint8_t hour, uint8_t minute, uint8_t second)
    {
        // 根据数码管的接口方式和引脚,将时间数据转换并输出到数码管上
    }
    
    int main(void)
    {
        // 初始化相关硬件和引脚
    
        while (1)
        {
            // 获取当前时间
            uint8_t hour, minute, second;
            get_current_time(&hour, &minute, &second);
    
            // 显示当前时间
            display_time(hour, minute, second);
    
            // 延时一段时间,用于控制显示刷新的速度
            delay();
        }
    
        return 0;
    }
    

    请根据您所使用的单片机型号,参考相应的资料,修改上述代码示例中的相关函数和引脚的初始化方法,以适应您的实际需求。

    如果您需要进一步的帮助,请提供更多关于您所使用的单片机型号和数码管接口的详细信息。


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

你只能自己设置初始时间,他应该没法读取现实中的时间