找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4338|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

論壇一個(gè)大師的程序我仿制后只能計(jì)數(shù)255就歸零了 各位老師幫忙看看

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是論壇一個(gè)大師的程序我仿制后只能計(jì)數(shù)255就歸零了怎么回事,勞煩各位老師看下程序哪兒要改,謝謝!
  1. #include <reg51.h>
  2. sbit key0=P1^0;
  3. sbit key1=P1^1;    //定義key0,key1接口
  4. unsigned char flag,con,mcount;  //flag為計(jì)數(shù)到一秒時(shí)給時(shí)鐘發(fā)的信號
  5. unsigned char count = 0;   
  6. unsigned char seccount =0; //作為時(shí)鐘的秒的計(jì)量單位
  7. unsigned char hour = 0;  //時(shí)鐘的時(shí)
  8. unsigned char min = 0;  //時(shí)鐘的分
  9. unsigned char sec = 0;   //時(shí)鐘的秒
  10. unsigned char keypress0,keypress1,mode,ms,s,ss,start;
  11. unsigned char
  12. Displaynum[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05, 0x10,0xd3,0x48,0x41,0x83,0x21,0x20,0x53,0x00,0x01,0xff,0xfb};  
  13. //數(shù)碼管十六進(jìn)制譯碼表   
  14. unsigned char controlnum[]={0x08,0x04,0x02,0x01}; //控制四個(gè)數(shù)碼管顯示        
  15. unsigned char DisplayBuff[]={0x00, 0x00, 0x00, 0x00}; //每個(gè)數(shù)碼管的值     
  16. void display_state(); //數(shù)碼管顯示子程序
  17. void keyscan();  //鍵盤掃描子程序
  18. void timer();  //秒表子程序
  19. unsigned char count1,flag1,t_adjust=0,tm_adjust=0;
  20. unsigned char bKey0Pressed = 0, bKey1Pressed = 0;
  21. unsigned char ucStatus = 0;
  22. void main()
  23. {
  24.      TMOD = 0x01; //定時(shí)器0工作在模式1,GATE=0,C/t=0,16位模
  25.      TH0= (2^16-5000)/256;//定時(shí)器0 預(yù)存值,
  26.      TL0= (2^16-5000)%256;
  27.      TR0= 1;  //定時(shí)器0 啟動(dòng)      
  28.      ET0= 1;  //定時(shí)器中斷0 允許
  29.      EA= 1;    //開中斷
  30.              IT0=1;   //外部中斷0下降沿觸發(fā)
  31.      IT1=1;   //外部中斷1 下降沿觸發(fā)
  32.      EX0=1;   //外部中斷0允許
  33.      EX1=1;   //外部中斷1允許
  34.      PX1=1;   //外部中斷1 為高優(yōu)先級中斷

  35.   while(1)   //死循環(huán),  
  36.   {
  37.     if(flag == 1)    //時(shí)鐘顯示
  38.     {
  39.            flag = 0;
  40.        sec++;
  41.           if(sec ==60)
  42.              {sec = 0;
  43.               min++;
  44.                 if(min ==60)
  45.                   {min = 0;
  46.                     hour ++;
  47.                      if(hour == 24)
  48.                       {
  49.                         hour = 0;
  50.                        }
  51.                   }
  52.               }
  53.       }
  54.         display_state();
  55.     keyscan();
  56.     timer();  

  57.      }
  58. }
  59. //////////////////////////////////ISR中斷服務(wù)程序,每5ms產(chǎn)生一個(gè)定時(shí)器0 中斷
  60. void Display() interrupt 1
  61.    {
  62.        TH0  = (2^16-5000)/256;
  63.        TL0  = (2^16-5000)%256;

  64.        seccount ++;
  65.            mcount ++;
  66.            keypress0++;
  67.            keypress1++;

  68.        P2=0x00;  //P2口先清零
  69.            P0 = Displaynum[DisplayBuff[count]]; //P0口輸出
  70.               P2 = controlnum[count];  //P2口輸出

  71.            count++;
  72.            if(count==4)
  73.            count=0;
  74.        if(seccount == 200)  //200*5ms=1s
  75.           { seccount =0;
  76.             flag =1;  //每過1秒給時(shí)鐘信號加一秒
  77.           }

  78.     }

  79. ///////////////////////////////////////////
  80. void display_state()
  81. {
  82.   if(mode == 0)  //時(shí)鐘模式,顯示時(shí)間
  83.    {
  84.     DisplayBuff[0] = hour/10;
  85.     DisplayBuff[1] = (hour%10)+10;    //"+10"是為了顯示加點(diǎn)的數(shù)字
  86.     DisplayBuff[2] = min/10;
  87.     DisplayBuff[3] = min%10;
  88.    }
  89.   if(mode == 1)  //秒表模式,顯示秒表
  90.    {
  91.     DisplayBuff[0] = ss +10; //"+10"是為了顯示加點(diǎn)的數(shù)字
  92.     DisplayBuff[1] = s/10;
  93.     DisplayBuff[2] = (s%10)+10;
  94.     DisplayBuff[3] = ms;
  95.     }
  96.    if(mode == 2)  // 計(jì)數(shù)器模式,顯示計(jì)數(shù)
  97.    {
  98.     DisplayBuff[0] = count1/1000;  //千位
  99.     DisplayBuff[1] = (count1-(count1/1000)*1000)/100; //百位
  100.     DisplayBuff[2] = (count1-(count1/100)*100)/10; //十位
  101.     DisplayBuff[3] = count1%10;  //個(gè)位
  102.     }
  103.         if(mode==3)   //顯示時(shí)鐘的秒,
  104.         {
  105.     DisplayBuff[0] = 20; //第一位不顯示
  106.     DisplayBuff[1] = 21; //第二位顯示一個(gè)點(diǎn)
  107.     DisplayBuff[2] = sec/10;//顯示秒的十位
  108.     DisplayBuff[3] = sec%10;//顯示秒的個(gè)位
  109.     }

  110. }  

  111. //**************//  
  112. //鍵盤掃描子程序//
  113. //**************//
  114. void keyscan()
  115. {
  116.     if(!key0 && bKey0Pressed == 0)  //檢測到key0按下
  117.     {
  118.         keypress0 = 0;
  119.              bKey0Pressed = 1;  //防止重入此判斷
  120.         while(!key0);  //如果沒放開,就等下去
  121.     }
  122.     if(key0 && bKey0Pressed == 1) //檢測到key0放開
  123.     {
  124.             bKey0Pressed = 0;  //防止重入此判斷
  125.              if (keypress0<120)        //如果是短按
  126.             {
  127.           if(ucStatus == 0x02)
  128.                         {
  129.                         ucStatus = 0x00;  
  130.                     mode = 0;   //時(shí)鐘模式
  131.                             t_adjust=0;
  132.             }
  133.                 else if(ucStatus == 0x00)
  134.                     {
  135.                          ucStatus = 0x01;
  136.                      mode = 1;  //秒表模式
  137.             }
  138.                         else if(ucStatus == 0x01)
  139.                         {
  140.                             ucStatus = 0x02;
  141.                      mode = 2;   //計(jì)數(shù)模式
  142.             }
  143.         }
  144.                 else if(keypress0>200)  //如果是長按
  145.                         mode=3;  //顯示時(shí)鐘的秒的模式
  146.       }
  147.                  ////////////////////////////////
  148.   if(mode == 0)  //進(jìn)入時(shí)鐘模式后
  149.   {      
  150.     if(!key1 && (bKey1Pressed == 0))
  151.          { keypress1 = 0;
  152.              bKey1Pressed = 1;
  153.         while(!key1);
  154.           }

  155.     if(key1 && (bKey1Pressed == 1))
  156.     {
  157.                bKey1Pressed = 0;
  158.            if(keypress1 >= 200)   //如果是長按
  159.         {
  160.                 t_adjust++;
  161.                         if(t_adjust==3)
  162.                            t_adjust=0;
  163.         }
  164.            else if(keypress1 < 120)  
  165.                    switch (t_adjust)
  166.                          {

  167.                           case 1:{   //調(diào)整分
  168.                                    min++;
  169.                                    sec = 0;
  170.                                            if(min == 60)
  171.                                               min = 0;
  172.                                           }
  173.                                         break;
  174.                            case 2: {   //調(diào)整時(shí)
  175.                                     hour ++ ;
  176.                                     sec = 0;
  177.                                             if(hour == 24)
  178.                                               hour = 0;
  179.                                                 }
  180.                                         break;
  181.                      default:break;
  182.                           }
  183.             }
  184.         }

  185.         else if(mode == 1)  //進(jìn)入秒表模式
  186.       {   
  187.           if(!key1 && bKey1Pressed == 0)
  188.           {
  189.              keypress1 = 0;
  190.                    bKey1Pressed = 1;
  191.             while(!key1);
  192.           }      
  193.           if(key1 && bKey1Pressed == 1)
  194.           {
  195.                   bKey1Pressed = 0;
  196.                  if(keypress1 < 120)  //短按
  197.                         {
  198.                             if(flag1==0) { start=2;flag1=1;}  //start=2代表秒表開始計(jì)時(shí)
  199.                                 else {start=0;flag1=0;} //start=0,秒表停止計(jì)時(shí)
  200.                          }
  201.                          else if(keypress1>200)  //長按
  202.                                start=1;   //秒表清零

  203.                   }
  204.            }
  205. }


  206. void timer()  //秒表子程序
  207. {
  208.    if(mode==1) //進(jìn)入秒表模式才執(zhí)行
  209.    {  
  210.      if(start==1) //清零
  211.      {  
  212. ms = 0;
  213.              s = 0;
  214.              ss = 0;         
  215.              mcount=0;
  216.           }
  217.          if(start==2)  //秒表開始計(jì)時(shí)
  218.          {
  219.        if(mcount==20)   //20*5ms=0.1s
  220.             {
  221.               mcount=0;
  222.                    ms++;
  223.                     if(ms == 10) // 10*0.1s=1s,s++
  224.                            {ms = 0;
  225.                             s ++;
  226.                                  if(s == 100)  //100s
  227.                                     {s = 0;
  228.                                     ss ++;
  229.                                          if(ss == 10)
  230.                                            {ss = 0;
  231.                                            s  = 0;
  232.                                            ms = 0;
  233.                                            }
  234.                                     }
  235.                             }
  236.                 }
  237.         }
  238. if (start==0);//秒表停止
  239.         }

  240. }
  241. //////////////////////
  242. void it0(void) interrupt 0 using 1  //外部中斷0 服務(wù)程序
  243. {
  244.     if(mode==2)   //只有在計(jì)數(shù)模式才執(zhí)行
  245.         {
  246.       count1++;    //每響應(yīng)一次,計(jì)數(shù)加一
  247.       if(count1==10000)  //超出四位時(shí),不能再加
  248.       count1 =9999;
  249.          }
  250. }
  251. void it2(void) interrupt 2 using 2  //外部中斷0 服務(wù)程序
  252. {
  253.     if(mode==2)   //只有在計(jì)數(shù)模式才執(zhí)行
  254.         {
  255.       if(count1!=0)
  256.       {count1--;}  //計(jì)數(shù)減一,不顯示負(fù)數(shù),當(dāng)減到零時(shí)便不能再減
  257.         }
  258. }
復(fù)制代碼

33a584c2ffed33928667cc4a41711c48_111621q90xb3lwexhbzx2a.png (26.72 KB, 下載次數(shù): 130)

33a584c2ffed33928667cc4a41711c48_111621q90xb3lwexhbzx2a.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:353831 發(fā)表于 2018-9-12 17:36 | 只看該作者
各位老師圖片上傳錯(cuò)了,不是這個(gè)圖片
回復(fù)

使用道具 舉報(bào)

板凳
ID:155507 發(fā)表于 2018-9-12 19:19 | 只看該作者
你用
unsigned char count = 0;   
unsigned char count1,flag1,t_adjust=0,tm_adjust=0;

unsigned char的取值范圍是0-255
char是有長度的,你好好看看書,會有詳細(xì)的解釋

unsigned char是8位的,占一個(gè)寄存器,  無符號字符型,范圍(0-255)
unsigned int是16位,    占2個(gè)寄存器,   無符號整型 范圍(0-65,535)
unsigned long是32位, 占4個(gè)寄存器,   無符號整型 范圍(0-4,294,967,296)

評分

參與人數(shù) 1黑幣 +30 收起 理由
yousunny + 30 很給力!

查看全部評分

回復(fù)

使用道具 舉報(bào)

地板
ID:353831 發(fā)表于 2018-9-12 20:00 | 只看該作者
angmall 發(fā)表于 2018-9-12 19:19
你用
unsigned char count = 0;   
unsigned char count1,flag1,t_adjust=0,tm_adjust=0;

謝謝指點(diǎn)
回復(fù)

使用道具 舉報(bào)

5#
ID:353831 發(fā)表于 2018-9-12 21:11 | 只看該作者
angmall 發(fā)表于 2018-9-12 19:19
你用
unsigned char count = 0;   
unsigned char count1,flag1,t_adjust=0,tm_adjust=0;

謝謝老師指導(dǎo)!另外還有個(gè)問題請教,現(xiàn)在可以超岀255計(jì)數(shù)了只是按鍵計(jì)數(shù)太快按一下有時(shí)加幾個(gè)數(shù),程序那兒需要修改?
回復(fù)

使用道具 舉報(bào)

6#
ID:308437 發(fā)表于 2018-9-12 22:25 | 只看該作者
給你幾個(gè)建議吧:你要對一些書籍比較敏感:255,65535,128這些字符類型的范圍,的臨界點(diǎn),必須要記住的。通常到某一個(gè)數(shù),就不再增加,就是數(shù)據(jù)類型定義錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

7#
ID:397250 發(fā)表于 2018-9-12 23:00 | 只看該作者
試試檢索一下吧
回復(fù)

使用道具 舉報(bào)

8#
ID:261288 發(fā)表于 2018-9-13 22:21 | 只看該作者
wl020807 發(fā)表于 2018-9-12 21:11
謝謝老師指導(dǎo)!另外還有個(gè)問題請教,現(xiàn)在可以超岀255計(jì)數(shù)了只是按鍵計(jì)數(shù)太快按一下有時(shí)加幾個(gè)數(shù),程序那兒需 ...

建議:按鍵加延時(shí)消抖程序。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表