找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3210|回復: 10
打印 上一主題 下一主題
收起左側(cè)

單片機如何實現(xiàn)99999倒計時?這個程序有問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:880458 發(fā)表于 2021-2-2 16:47 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
#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];   //數(shù)碼管顯示秒數(shù)個位,即P0^3;
        wei1 = 0;
        delay(1);
        wei1 = 1;
        
        duan = table[shi];   //數(shù)碼管顯示秒數(shù)個位,即P0^3;
        wei2 = 0;
        delay(1);
        wei2 = 1;
        
duan = table[bai];   //數(shù)碼管顯示秒數(shù)個位,即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 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:267932 發(fā)表于 2021-2-2 17:00 | 只看該作者
uchar shu,   注意你的變量類型
回復

使用道具 舉報

板凳
ID:716656 發(fā)表于 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 發(fā)表于 2021-2-2 20:32 | 只看該作者
數(shù)太大了,全部使用uint64_t型最好
回復

使用道具 舉報

5#
ID:213173 發(fā)表于 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;//長整型數(shù)據(jù)
  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 發(fā)表于 2021-2-2 22:12 | 只看該作者
unsigned char 類型最大只能到255,所以你的 shu=999實際只是相當于 shu=231而已,你竟然還想99999倒計時呢,unsigned int 最大也只到65535,要能支持99999的話至少要用long。
回復

使用道具 舉報

7#
ID:592807 發(fā)表于 2021-2-3 09:01 | 只看該作者
hantu 發(fā)表于 2021-2-2 22:12
unsigned char 類型最大只能到255,所以你的 shu=999實際只是相當于 shu=231而已,你竟然還想99999倒計時呢 ...

只要他合理處理給每一個位數(shù),個十百千萬..都單開一個全局變量的話,或者每三位數(shù)一個全局變量的話,uchar也是可以的。
回復

使用道具 舉報

8#
ID:320306 發(fā)表于 2021-2-3 09:25 | 只看該作者
建議5樓把仿真文件也發(fā)一下!
回復

使用道具 舉報

9#
ID:882291 發(fā)表于 2021-2-3 10:02 | 只看該作者
注意數(shù)據(jù)類型
回復

使用道具 舉報

10#
ID:880458 發(fā)表于 2021-2-5 14:13 | 只看該作者
wulin 發(fā)表于 2021-2-2 21:36
unsigned char   8位
unsigned int     16位
unsigned long   32位

大佬,為什么我用你的程序數(shù)碼管一直閃
回復

使用道具 舉報

11#
ID:213173 發(fā)表于 2021-2-5 19:39 | 只看該作者
單片機55818 發(fā)表于 2021-2-5 14:13
大佬,為什么我用你的程序數(shù)碼管一直閃

單片機分解處理 long 長整型數(shù)據(jù)耗時過長導致主循環(huán)周期*6超過20ms,所以發(fā)生閃爍。有多種解決方法:
1.提高時鐘頻率,24MHz以上。
2.分時完成分解數(shù)據(jù)。
3.降低顯示位數(shù),使顯示數(shù)據(jù)控制在16位(65535)以內(nèi)。
分時分解數(shù)據(jù)示例:
  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;//長整型數(shù)據(jù)
  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. }

復制代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表