找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2460|回复: 10
打印 上一主题 下一主题
收起左侧

单片机如何实现99999倒计时?这个程序有问题

[复制链接]
跳转到指定楼层
楼主
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int
        
#define duan P1

sbit wei1 = P0^5;
sbit wei2 = P0^4;
sbit wei3 = P0^3;
sbit wei4 = P0^2;
sbit wei5 = P0^1;
sbit wei6 = P0^0;

uchar shu, z, ge, shi, bai, qian, wan, sw;
uchar code table[]={0xc0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90};

void timer1()
{
        shu = 999;
        TMOD = 0x01;
        TH1 = (65536 - 50000)/256;
        TL1 = (65536 - 50000)%256;
        
        ET1 = 1;
        TR1 = 1;
        EA = 1;
}

void delay(int t)
{
                int i,j;                                                               
               
                for(j=0;j<t;j++)                                
                {
                        for(i=0;i<122;i++);          //空跑122次为1ms
                }
}

void display (uchar shu)
{
        ge = shu%10;
        shi = shu/10%10;
        bai = shu/100%10;
        qian = shu/1000%10;
        wan = shu/10000%10;
        sw = shu/100000/10;
        duan = table[ge];   //数码管显示秒数个位,即P0^3;
        wei1 = 0;
        delay(1);
        wei1 = 1;
        
        duan = table[shi];   //数码管显示秒数个位,即P0^3;
        wei2 = 0;
        delay(1);
        wei2 = 1;
        
duan = table[bai];   //数码管显示秒数个位,即P0^3;
        wei3 = 0;
        delay(1);
        wei3 = 1;
        

        
        
        
}

void  main ()
{
        timer1();
        while(1)
        {
                display(shu);
        }
}

void T_timer1(void) interrupt 3
{
                TH1 = (65536 - 50000)/256;
          TL1 = (65536 - 50000)%256;  
                z++;
        if(z == 10)
        {
                shu--;                   //999999ge %10
                if(shu == 0)
                {
                        TR1 = 0;
                }
        }                                          
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:267932 发表于 2021-2-2 17:00 | 只看该作者
uchar shu,   注意你的变量类型
回复

使用道具 举报

板凳
ID:716656 发表于 2021-2-2 17:26 | 只看该作者
        shu = 999;
        TMOD = 0x01;
        TH1 = (65536 - 50000)/256;
        TL1 = (65536 - 50000)%256;
        
        ET1 = 1;
        TR1 = 1;
        EA = 1;
这是用到定时器几啊
回复

使用道具 举报

地板
ID:871393 发表于 2021-2-2 20:32 | 只看该作者
数太大了,全部使用uint64_t型最好
回复

使用道具 举报

5#
ID:213173 发表于 2021-2-2 21:36 | 只看该作者
unsigned char   8位
unsigned int     16位
unsigned long   32位   


  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long        
  5. #define duan P1
  6. /*
  7. sbit wei1 = P0^5;
  8. sbit wei2 = P0^4;
  9. sbit wei3 = P0^3;
  10. sbit wei4 = P0^2;
  11. sbit wei5 = P0^1;
  12. sbit wei6 = P0^0;
  13. */
  14. ulong shu = 999999;//长整型数据
  15. uchar z,j;
  16. uchar code table[]={0xc0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90};

  17. void timer1()
  18. {
  19.         TMOD = 0x10;//T1模式1
  20.         TH1 = (65536 - 50000)/256;
  21.         TL1 = (65536 - 50000)%256;
  22.         ET1 = 1;
  23.         TR1 = 1;
  24.         EA = 1;
  25. }
  26. /*
  27. void delay(uint t)
  28. {
  29.         uint i,j;                                                                       
  30.         for(j=0;j<t;j++)                                
  31.                 for(i=0;i<122;i++);          //空跑122次为1ms
  32. }*/

  33. void display (ulong shu)
  34. {       
  35.         uchar i,a[6];
  36.         ulong num;
  37.         num=shu;
  38.         for(i=6;i>0;i--)
  39.         {
  40.                 a[i-1] = table[num%10];
  41.                 num/=10;
  42.         }
  43.         P0&=0xc0;
  44.         duan = a[j];
  45.         P0|=(0x01<<j);
  46.         j=++j%6;
  47. }

  48. void  main ()
  49. {
  50.         timer1();
  51.         while(1)
  52.         {
  53.                 display(shu);
  54.         }
  55. }

  56. void T_timer1(void) interrupt 3
  57. {
  58.         TH1 = (65536 - 50000)/256;
  59.         TL1 = (65536 - 50000)%256;  
  60.         z++;
  61.         if(z == 10)
  62.         {
  63.                 z = 0;//清0
  64.                 shu--;
  65.                 if(shu == 0)
  66.                 {
  67.                         TR1 = 0;
  68.                 }
  69.         }                                          
  70. }

复制代码



回复

使用道具 举报

6#
ID:462827 发表于 2021-2-2 22:12 | 只看该作者
unsigned char 类型最大只能到255,所以你的 shu=999实际只是相当于 shu=231而已,你竟然还想99999倒计时呢,unsigned int 最大也只到65535,要能支持99999的话至少要用long。
回复

使用道具 举报

7#
ID:592807 发表于 2021-2-3 09:01 | 只看该作者
hantu 发表于 2021-2-2 22:12
unsigned char 类型最大只能到255,所以你的 shu=999实际只是相当于 shu=231而已,你竟然还想99999倒计时呢 ...

只要他合理处理给每一个位数,个十百千万..都单开一个全局变量的话,或者每三位数一个全局变量的话,uchar也是可以的。
回复

使用道具 举报

8#
ID:320306 发表于 2021-2-3 09:25 | 只看该作者
建议5楼把仿真文件也发一下!
回复

使用道具 举报

9#
ID:882291 发表于 2021-2-3 10:02 | 只看该作者
注意数据类型
回复

使用道具 举报

10#
ID:880458 发表于 2021-2-5 14:13 | 只看该作者
wulin 发表于 2021-2-2 21:36
unsigned char   8位
unsigned int     16位
unsigned long   32位

大佬,为什么我用你的程序数码管一直闪
回复

使用道具 举报

11#
ID:213173 发表于 2021-2-5 19:39 | 只看该作者
单片机55818 发表于 2021-2-5 14:13
大佬,为什么我用你的程序数码管一直闪

单片机分解处理 long 长整型数据耗时过长导致主循环周期*6超过20ms,所以发生闪烁。有多种解决方法:
1.提高时钟频率,24MHz以上。
2.分时完成分解数据。
3.降低显示位数,使显示数据控制在16位(65535)以内。
分时分解数据示例:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long        
  5. #define duan P1
  6. /*
  7. sbit wei1 = P0^5;
  8. sbit wei2 = P0^4;
  9. sbit wei3 = P0^3;
  10. sbit wei4 = P0^2;
  11. sbit wei5 = P0^1;
  12. sbit wei6 = P0^0;
  13. */
  14. ulong shu = 999999;//长整型数据
  15. uchar z,j;
  16. uchar code table[]={0xc0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90};

  17. void timer1()
  18. {
  19.         TMOD = 0x10;//T1模式1
  20.         TH1 = (65536 - 50000)/256;
  21.         TL1 = (65536 - 50000)%256;
  22.         ET1 = 1;
  23.         TR1 = 1;
  24.         EA = 1;
  25. }
  26. /*
  27. void delay(uint t)
  28. {
  29.         uint i,j;                                                                        
  30.         for(j=0;j<t;j++)                                
  31.                 for(i=0;i<122;i++);          //空跑122次为1ms
  32. }*/

  33. void display (ulong shu)
  34. {        
  35.         static uchar a[6];
  36.         ulong num;
  37.         num=shu;
  38.         switch(j)
  39.         {
  40.                 case 0: a[0]=table[num/100000%10];break;
  41.                 case 1: a[1]=table[num/10000%10];break;
  42.                 case 2: a[2]=table[num/1000%10];break;
  43.                 case 3: a[3]=table[num/100%10];break;
  44.                 case 4: a[4]=table[num/10%10];break;
  45.                 case 5: a[5]=table[num%10]; break;
  46.         }
  47.         P0&=0xc0;
  48.         duan = a[j];
  49.         P0|=(0x01<<j);
  50.         j=++j%6;
  51. }

  52. void  main ()
  53. {
  54.         timer1();
  55.         while(1)
  56.         {
  57.                 display(shu);
  58.         }
  59. }

  60. void T_timer1(void) interrupt 3
  61. {
  62.         TH1 = (65536 - 50000)/256;
  63.         TL1 = (65536 - 50000)%256;  
  64.         z++;
  65.         if(z == 10)
  66.         {
  67.                 z = 0;//清0
  68.                 shu--;
  69.                 if(shu == 0)
  70.                 {
  71.                         TR1 = 0;
  72.                 }
  73.         }
  74. }

复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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