久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3354|回復: 10
收起左側

單片機如何實現99999倒計時?這個程序有問題

[復制鏈接]
ID:880458 發表于 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];   //數碼管顯示秒數個位,即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;
                }
        }                                          
}

回復

使用道具 舉報

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型最好
回復

使用道具 舉報

ID:213173 發表于 2021-2-2 21:36 | 顯示全部樓層
unsigned char   8位
unsigned int     16位
unsigned long   32位   
無標題.jpg

  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. }

復制代碼



回復

使用道具 舉報

ID:462827 發表于 2021-2-2 22:12 | 顯示全部樓層
unsigned char 類型最大只能到255,所以你的 shu=999實際只是相當于 shu=231而已,你竟然還想99999倒計時呢,unsigned int 最大也只到65535,要能支持99999的話至少要用long。
回復

使用道具 舉報

ID:592807 發表于 2021-2-3 09:01 | 顯示全部樓層
hantu 發表于 2021-2-2 22:12
unsigned char 類型最大只能到255,所以你的 shu=999實際只是相當于 shu=231而已,你竟然還想99999倒計時呢 ...

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

使用道具 舉報

ID:320306 發表于 2021-2-3 09:25 | 顯示全部樓層
建議5樓把仿真文件也發一下!
回復

使用道具 舉報

ID:882291 發表于 2021-2-3 10:02 | 顯示全部樓層
注意數據類型
回復

使用道具 舉報

ID:880458 發表于 2021-2-5 14:13 | 顯示全部樓層
wulin 發表于 2021-2-2 21:36
unsigned char   8位
unsigned int     16位
unsigned long   32位

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

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线免费观看视频 | 一级欧美 | 久久av一区二区三区 | av免费网站在线观看 | 久久久久久成人 | 国产精彩视频在线观看 | 精品在线一区二区三区 | 午夜久久久久久久久久一区二区 | 国产一区三区视频 | 国产精品久久久久久吹潮日韩动画 | 综合自拍 | 精品亚洲一区二区 | 尤物视频在线免费观看 | 亚洲欧美日韩一区二区 | 亚洲一区二区三区免费在线观看 | 国产亚洲精品美女久久久久久久久久 | 99精品一区二区 | 91日b| 精品视频在线一区 | 中文字幕1区2区3区 日韩在线视频免费观看 | 97成人精品 | 欧美色偷拍 | 久久久人成影片免费观看 | 亚洲欧美日韩精品久久亚洲区 | 成人在线视频免费观看 | 欧美影院久久 | 高清视频一区二区三区 | 欧美色性 | 欧美成人免费在线 | 国产乱码精品一区二区三区五月婷 | 亚洲自拍偷拍视频 | 影音先锋中文字幕在线观看 | 亚洲免费人成在线视频观看 | 91综合在线视频 | 国产精品精品视频一区二区三区 | 中文字幕国产高清 | 日韩图区 | 99久久久国产精品 | 久久久久久久久久久久久久久久久久久久 | 欧美日韩国产精品一区二区 | 国产美女自拍视频 |