鱼C论坛

 找回密码
 立即注册
查看: 1307|回复: 6

求助大神,数码管数字时钟问题

[复制链接]
发表于 2022-6-4 11:49:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
写了一个数码管显示数字时钟,但是时间对不上是怎么回事呢?
代码如下:
#include<reg52.h>        //数码管显示电子时钟
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};        //段码
uint minute, hour , second,h1, h2, m1, m2, s1 ,s2, count;
void delay(uint z)                                  //延时函数
{        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void init()
{
        TMOD=0x01;
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        EA=1;
        ET0=1;
        TR0=1;       
        hour = 0;
        minute = 0;
        second = 0;       
        count = 0;
}
void display()
{
                dula=1;//控制段选
                P0=table[s2]; //秒个位
                dula=0;
                P0=0xff;//消影先不送
                wela=1;//控制位选
                P0=0X7f;
                wela=0;
                delay(1);

                dula=1;//控制段选
                P0=table[s1]; //秒十位
                dula=0;
                P0=0xff;//消影先不送
                wela=1;//控制位选
                P0=0Xbf;
                wela=0;
                delay(1);

                dula=1;//控制段选
                P0=table[m2];//分个位数
                dula=0;
                P0=0xff;
                wela=1;//控制位选
                P0=0Xef;
                wela=0;
                delay(1);
               
                dula=1;//控制段选
                P0=table[m1];//分十位数
                dula=0;
                P0=0xff;
                wela=1;//控制位选
                P0=0Xf7;
                wela=0;
                delay(1);

                dula=1;//控制段选
                P0=table[h2];//时个位数
                dula=0;
                P0=0xff;//消影先不送
                wela=1;//控制位选
                P0=0Xfd;
                wela=0;
                delay(1);

                dula=1;//控制段选
                P0=table[h1];//时十位数
                dula=0;
                P0=0xff;//消影先不送
                wela=1;//控制位选
                P0=0Xfe;
                wela=0;
                delay(1);
}
void timer0() interrupt 1//定时器0
{
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        count++;
        if(count == 10000)
                        count = 0;
                        second ++ ;
                if(second == 60)
                {
                        second = 0;
                        minute ++;
                        if(minute == 60)
                        {
                                minute = 0;
                                hour ++;
                                if(hour == 24)
                                {
                                        hour = 0;
                                }
                        }
                }
                        s2 = second % 10;
                        s1 = second / 10;
                        m2 = minute % 10;
                        m1 = minute /10;
                        h2= hour % 10;
                        h1 = hour / 10;                       
}
void main()
{
        init();
        while(1)
        {
                display();
        }
}
主要问题是、:时间显示太快了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-4 12:49:05 From FishC Mobile | 显示全部楼层
会不会是 delay(1) 是 1 毫秒问题?你是指 4 位七段数码管吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-4 14:16:08 | 显示全部楼层
傻眼貓咪 发表于 2022-6-4 12:49
会不会是 delay(1) 是 1 毫秒问题?你是指 4 位七段数码管吗?

对是4位数码管了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-4 15:24:22 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-6-4 15:26 编辑


我对单片机比较不熟,很久之前玩的,现在电脑要安装编译器和连接单片机很麻烦所以没有玩。
我是用 Arduino 呈现 4 位七段数码管的,我的 Arduino 代码,希望对你有帮助:
#define pinA 2
#define pinB 3
#define pinC 4
#define pinD 5
#define pinE 7
#define pinF 12
#define pinG 8
#define pinDP 13
#define D1 6
#define D2 9
#define D3 10
#define D4 11

uint8_t pin[12] = { pinA, pinB, pinC, pinD, pinE, pinF, pinG, pinDP, D1, D2, D3, D4 };

void setup() {
    for (int i = 0; i < 12; ++i) {
        pinMode(pin[i], OUTPUT); // 设为输出电位
    }
    Serial.begin(9600);
}

// num 为数字,D 为位,共有 4位(个、十、百、千位)
void foo(int num, int D) {
    int digits[10][7] = {
        {1, 1, 1, 1, 1, 1, 0}, // 0
        {0, 1, 1, 0, 0, 0, 0}, // 1
        {1, 1, 0, 1, 1, 0, 1}, // 2
        {1, 1, 1, 1, 0, 0, 1}, // 3
        {0, 1, 1, 0, 0, 1, 1}, // 4
        {1, 0, 1, 1, 0, 1, 1}, // 5
        {1, 0, 1, 1, 1, 1, 1}, // 6
        {1, 1, 1, 0, 0, 0, 0}, // 7
        {1, 1, 1, 1, 1, 1, 1}, // 8
        {1, 1, 1, 1, 0, 1, 1}  // 9
    };
    for (int i = 0; i < 7; ++i) digitalWrite(pin[i], digits[num][i]);
    digitalWrite(pinDP, LOW); // 设为低电位
    for (int i = 8; i < 12; ++i) digitalWrite(pin[i], 1);
    if(D <= 4) digitalWrite(pin[D + 7], LOW); // 设为低电位
}

void foo3(int num) {
    if (num < 10) {
        foo(num, 1);
        delay(5);
    }
    else if (num < 100) {

        int a, b;
        a = num / 10;
        b = num % 10;

        foo(a, 2);
        delay(5);
        foo(b, 1);
        delay(5);

    }
    else if (num < 1000) {

        int a, b, c, d;
        a = num / 100;
        b = num % 100 / 10;
        c = num % 10;
        d = 0;

        foo(a, 3);
        delay(5);
        foo(b, 2);
        delay(5);
        foo(c, 1);
        delay(5);
        foo(d, 5);
        delay(5);

    }
    else {

        int a, b, c, d;
        a = num / 1000;
        b = num % 1000 / 100;
        c = num % 100 / 10;
        d = num % 10;

        foo(a, 4);
        delay(5);
        foo(b, 3);
        delay(5);
        foo(c, 2);
        delay(5);
        foo(d, 1);
        delay(5);

    }
}

int foo2(int num) {
    int T = (millis()/1000)%10; // 当程序开始时,millis()函数开始计时(以毫秒为单位),计满50天后,又从0开始一直循环计时

    // T 时间线和 foo3() 七段数码管开关函数时间不会互相影响(foo3()只会重复打印当时应该显示的时间)
    while (((millis()/1000)%10) - T < 1) {
        foo3(num);
    }
    return T + 1;
}

// 主函数
void loop() {
    int x;
    for (int num = 0; num < 10000; ++num) {
        x = foo2(num);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-8 20:07:33 | 显示全部楼层
傻眼貓咪 发表于 2022-6-4 15:24
我对单片机比较不熟,很久之前玩的,现在电脑要安装编译器和连接单片机很麻烦所以没有玩。
我是用 Ard ...

谢谢 我只是想了解一下单片机的原理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-8 20:28:25 | 显示全部楼层
stephen杜 发表于 2022-6-8 20:07
谢谢 我只是想了解一下单片机的原理

好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-19 14:55:02 | 显示全部楼层
好像确实是延时delay函数的问题:
① 你前面没有自己编出一个void delay{}函数可以调用,而且主函数应该是main不用void,在main函数里调用 vioid delay ()。
② delay () 函数括号里的数不是想当然的,不能认为 delay (5)就是5ms,这个数和单片机的晶振有关,不同的数值代表了不同的ms,这个具体上网简单学习一下你就会了。

我举一个简单的例子:
void delay(j)     //将括号里的数赋值给j
  {
  uint i;
  for(i=0;i<j;i++);  //根据j的大小确定时间长度,
  }
然后mian函数里就可以直接赋值调用了。

PS:这个delay函数你可以先用流水灯试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 15:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表