鱼C论坛

 找回密码
 立即注册
查看: 996|回复: 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 代码,希望对你有帮助:
  1. #define pinA 2
  2. #define pinB 3
  3. #define pinC 4
  4. #define pinD 5
  5. #define pinE 7
  6. #define pinF 12
  7. #define pinG 8
  8. #define pinDP 13
  9. #define D1 6
  10. #define D2 9
  11. #define D3 10
  12. #define D4 11

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

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

  20. // num 为数字,D 为位,共有 4位(个、十、百、千位)
  21. void foo(int num, int D) {
  22.     int digits[10][7] = {
  23.         {1, 1, 1, 1, 1, 1, 0}, // 0
  24.         {0, 1, 1, 0, 0, 0, 0}, // 1
  25.         {1, 1, 0, 1, 1, 0, 1}, // 2
  26.         {1, 1, 1, 1, 0, 0, 1}, // 3
  27.         {0, 1, 1, 0, 0, 1, 1}, // 4
  28.         {1, 0, 1, 1, 0, 1, 1}, // 5
  29.         {1, 0, 1, 1, 1, 1, 1}, // 6
  30.         {1, 1, 1, 0, 0, 0, 0}, // 7
  31.         {1, 1, 1, 1, 1, 1, 1}, // 8
  32.         {1, 1, 1, 1, 0, 1, 1}  // 9
  33.     };
  34.     for (int i = 0; i < 7; ++i) digitalWrite(pin[i], digits[num][i]);
  35.     digitalWrite(pinDP, LOW); // 设为低电位
  36.     for (int i = 8; i < 12; ++i) digitalWrite(pin[i], 1);
  37.     if(D <= 4) digitalWrite(pin[D + 7], LOW); // 设为低电位
  38. }

  39. void foo3(int num) {
  40.     if (num < 10) {
  41.         foo(num, 1);
  42.         delay(5);
  43.     }
  44.     else if (num < 100) {

  45.         int a, b;
  46.         a = num / 10;
  47.         b = num % 10;

  48.         foo(a, 2);
  49.         delay(5);
  50.         foo(b, 1);
  51.         delay(5);

  52.     }
  53.     else if (num < 1000) {

  54.         int a, b, c, d;
  55.         a = num / 100;
  56.         b = num % 100 / 10;
  57.         c = num % 10;
  58.         d = 0;

  59.         foo(a, 3);
  60.         delay(5);
  61.         foo(b, 2);
  62.         delay(5);
  63.         foo(c, 1);
  64.         delay(5);
  65.         foo(d, 5);
  66.         delay(5);

  67.     }
  68.     else {

  69.         int a, b, c, d;
  70.         a = num / 1000;
  71.         b = num % 1000 / 100;
  72.         c = num % 100 / 10;
  73.         d = num % 10;

  74.         foo(a, 4);
  75.         delay(5);
  76.         foo(b, 3);
  77.         delay(5);
  78.         foo(c, 2);
  79.         delay(5);
  80.         foo(d, 1);
  81.         delay(5);

  82.     }
  83. }

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

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

  92. // 主函数
  93. void loop() {
  94.     int x;
  95.     for (int num = 0; num < 10000; ++num) {
  96.         x = foo2(num);
  97.     }
  98. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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,这个具体上网简单学习一下你就会了。

我举一个简单的例子:
  1. void delay(j)     //将括号里的数赋值给j
  2.   {
  3.   uint i;
  4.   for(i=0;i<j;i++);  //根据j的大小确定时间长度,
  5.   }
复制代码

然后mian函数里就可以直接赋值调用了。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 04:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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