硬件没有问题,程序应该是数码管显示那一段出问题了,但是不知道哪里错了。

img

img


这是代码还有显示的数码管。(要求是基于51单片机,利用A4区的动态数码管,通过读取实时时钟PCF8563芯片中的信息来显示时钟,显示的形式为:“HH-MM-SS”,其中HH、MM、SS分别表示小时、分钟和秒的数值,以24小时制为显示方式。)
图中只有秒数会动,其他的都不会动而且很乱。

可能是没有对数码管和时钟模块进行正确的初始化或者时钟模块读取方式有误。
首先,需要对数码管的引脚进行配置和控制。A4区的动态数码管需要设置一个定时器中断,定时中断使单片机能够通过扫描控制位来实现动态扫描数码管。以下是一份基本的配置代码:

#define LED_DIG P0

uchar get_key();
void delay(uint z);
void initTimer0();

uchar numTable[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
uint count = 0, hour = 0, minute = 0, second = 0;

void main() {
    initTimer0();
    while (1) {
        // 读取PCF8563芯片的时间,并解析为小时、分钟和秒
        ...

        // 将时间显示在数码管上
        LED_DIG = 0xFF;
        DIG1 = numTable[hour / 10];
        delay(5);
        LED_DIG = 0xFE;
        DIG2 = numTable[hour % 10];
        delay(5);
        LED_DIG = 0xFD;
        DIG3 = numTable[minute / 10];
        delay(5);
        LED_DIG = 0xFB;
        DIG4 = numTable[minute % 10];
        delay(5);
        LED_DIG = 0xF7;
        DIG5 = numTable[second / 10];
        delay(5);
        LED_DIG = 0xEF;
        DIG6 = numTable[second % 10];
        delay(5);
    }
}

// 定时器 0 中断服务函数
void timer0_isr() interrupt 1 {
    TH0 = (65536 - 45872) / 256;
    TL0 = (65536 - 45872) % 256;
    count++;
    if (count == 20) {
        count = 0;
        second++;
        if (second == 60) {
            second = 0;
            minute++;
            if (minute == 60) {
                minute = 0;
                hour++;
                if (hour == 24) {
                    hour = 0;
                }
            }
        }
    }
}

void initTimer0() {
    TMOD &= 0xF0;
    TMOD |= 0x01;
    TL0 = (65536 - 45872) % 256;
    TH0 = (65536 - 45872) / 256;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

// 延时函数
void delay(uint z) {
    uint x, y;
    for (x = z; x > 0; x--) {
        for (y = 114; y > 0; y--);
    }
}

jiyugpt
以下是一些可能导致数码管显示混乱和静止的常见问题和解决方法:

数码管引脚连接问题:确保数码管的引脚正确连接到单片机的IO口。请仔细检查你的电路连接,确保每个数码管的引脚与对应的IO口连接正确。

动态扫描问题:动态数码管显示通常需要通过逐个扫描数码管的方式来实现。请检查你的程序是否正确进行了动态扫描,确保每个数码管都能够依次显示出来。

时钟读取问题:确认你正确读取了实时时钟 PCF8563 芯片中的时钟信息,并将其转换为显示时钟所需的格式。确保你正确读取了小时、分钟和秒的数值,并将其转换为24小时制的格式。

数码管刷新频率问题:动态数码管需要以足够高的刷新频率来显示数字,以使其看起来连续不间断。请确保你的程序中设置了适当的刷新频率,以避免数码管显示闪烁或看起来静止。

数码管显示函数问题:检查你的数码管显示函数是否正确实现。确保函数能够正确接收并显示时钟的数值,并按照正确的顺序和时间间隔刷新数码管。

在调试过程中,你可以逐步检查和验证这些可能的问题,并使用调试工具如示波器来观察信号的波形和变化,以帮助找出问题所在。另外,你也可以在代码中添加一些调试输出语句,打印相关变量的值,以便进一步排查问题。

1,先查I2C时序是否正确,写数据和读数据是否正常。
2,再查数码管显示是否正常,共阳/共阴。单独显示1~9是否正确。
3,然后查时钟的精度,数据如何转换1~9。可以先调通1个位的。比如,秒或者分。再一起组合。

流程大概是这样。

根据您提供的代码,我看到一些可能的错误:

在代码开头,数字数组 DIGIT 的括号中应该用逗号分隔数字,而不是句号。

在 12C_Start() 函数中,第 3 行应该是 "_nop_0",而不是 "-nop_0"。

在 I2C_SendByte() 函数中,第 7 行缺少一个左括号。

在 12C_ReadByte() 函数中,第 9 行的 SDA 变量应该在前面加一个“=”,即“byte = SDA”。

在 Read_Time() 函数中,第 5 行的“12C_Start()”后面应该有一个分号。

在 Read_Time() 函数中,第 7 行的“12C_SendByte(PCF8563_ADDRI0x01)”应该是“12C_SendByte(PCF8563_ADDR | 0x01)”。

在 Display_Time() 函数中,第 10 行的“disp_hour_”应该是“disp_hour_1”。

在 Display_Time() 函数中,第 14 行的“PO=”应该是“P0=”。

在 Display_Time()() 函数中,第 25 行的“PO=DIGIT[(minute >> 4)& 0x0F]”应该是“P0=DIGIT[(minute >> 4)& 0x0F]”。

在 Display_Time() 函数中,第 34 行的“PO=DIGIT[disp_second_1] :”应该是“PO=DIGIT[disp_second_1];”。

此外,您的代码中有一些语法错误,例如注释符号 "//" 后面没有空格或者缺少分号等。建议您仔细检查代码中的语法错误和拼写错误,并逐行排查代码中的问题。您可以使用调试器或者添加一些打印语句来帮助您调试代码,找出问题所在。

问题描述不太完善:是输送到数码管的数据本身就有问题,还是输送到数码管的数据没问题而显示出来的数字有问题呢?
如果是前者就定位I2C通信,是后者就定位数码管函数分析了

先要搞清楚是显示问题还是数据问题,可以显示一组固定的数据看看,如果正确就是数据问题,否则解决显示问题

数码管只有秒会动的话,那说明还是程序中控制数字显示的地方有问题,你找到控制数字显示的地方,注释掉一行,运行一下,看下是哪一行对这个现象有影响,从而定位到市那里的问题。一般来说,不动的话就是定时刷新的地方没有做好

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632