stephen杜 发表于 2022-6-4 11:49:20

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

写了一个数码管显示数字时钟,但是时间对不上是怎么回事呢?
代码如下:
#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; //秒个位
                dula=0;
                P0=0xff;//消影先不送
                wela=1;//控制位选
                P0=0X7f;
                wela=0;
                delay(1);

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

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

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

                dula=1;//控制段选
                P0=table;//时十位数
                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();
        }
}
主要问题是、:时间显示太快了

傻眼貓咪 发表于 2022-6-4 12:49:05

会不会是 delay(1) 是 1 毫秒问题?你是指 4 位七段数码管吗?

stephen杜 发表于 2022-6-4 14:16:08

傻眼貓咪 发表于 2022-6-4 12:49
会不会是 delay(1) 是 1 毫秒问题?你是指 4 位七段数码管吗?

对是4位数码管了

傻眼貓咪 发表于 2022-6-4 15:24:22

本帖最后由 傻眼貓咪 于 2022-6-4 15:26 编辑

stephen杜 发表于 2022-6-4 14:16
对是4位数码管了

我对单片机比较不熟,很久之前玩的,现在电脑要安装编译器和连接单片机很麻烦所以没有玩。
我是用 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 = { pinA, pinB, pinC, pinD, pinE, pinF, pinG, pinDP, D1, D2, D3, D4 };

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

// num 为数字,D 为位,共有 4位(个、十、百、千位)
void foo(int num, int D) {
    int digits = {
      {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, digits);
    digitalWrite(pinDP, LOW); // 设为低电位
    for (int i = 8; i < 12; ++i) digitalWrite(pin, 1);
    if(D <= 4) digitalWrite(pin, 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);
    }
}

stephen杜 发表于 2022-6-8 20:07:33

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

谢谢 我只是想了解一下单片机的原理

傻眼貓咪 发表于 2022-6-8 20:28:25

stephen杜 发表于 2022-6-8 20:07
谢谢 我只是想了解一下单片机的原理

好的 {:10_257:}

川田园长 发表于 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函数你可以先用流水灯试。{:10_254:}
页: [1]
查看完整版本: 求助大神,数码管数字时钟问题