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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

為什么51單片機的定時器有幾率卡死?

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:743496 發(fā)表于 2020-7-11 00:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個程序就是四個按鍵按鍵控制十個LED燈,LED1,LED2,LED3,LED4是對應(yīng)定時顯示的燈其中兩個按鍵各要控制四個燈,定時那個按鍵是按三次,分別亮LED2、3、4、對應(yīng)三種定時時間,按第四次關(guān)閉定時器LED1燈。

問題是:
1.為什定時器正在運行的時,瘋狂亂按除了定時按鍵之外的其他按鍵,有很大幾率會導致定時器卡死,定時燈也就不會自動熄,除非把定時器關(guān)掉,重新打開。
2.定時器運行的時候,按其他鍵的頻率比較慢,或不按其他按鍵,這樣定時正常,不會卡死。

我自學比較菜,看著程序邏輯也是正確的啊,就是找不到BUG在哪里,實在不知道該怎么辦了,求幫幫忙。





51hei圖片20200711000003.png (160.57 KB, 下載次數(shù): 84)

51hei圖片20200711000003.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2020-7-11 06:37 | 只看該作者
圖片不好測試,把原碼發(fā)上來幫你看看。理論上不可能出現(xiàn)定時器卡死。
回復

使用道具 舉報

板凳
ID:743496 發(fā)表于 2020-7-11 12:23 | 只看該作者
wulin 發(fā)表于 2020-7-11 06:37
圖片不好測試,把原碼發(fā)上來幫你看看。理論上不可能出現(xiàn)定時器卡死。

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char

//--定義使用的IO口--//
sbit k1=P0^0;  //啟動按鍵
sbit k2=P0^1;
sbit k3=P0^2;
sbit k4=P0^3;  //定時按鍵

//=================================================
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7;
sbit ledA=P3^3;
sbit ledB=P3^4;
//=================================================
uint num;
uchar numA;         //按鍵計數(shù)標志A
uchar numB;         //按鍵計數(shù)標志B
uchar numC;         //按鍵計數(shù)標志C
uchar numD;         //按鍵計數(shù)標志D                                                                                                                
int X;
uchar Flag;         //定時標志

void Delay1ms(uint xms)        //延時函數(shù)
{
        uint i,j;
        for(i=xms;i>0;i--)
          for(j=110;j>0;j--);       
}
void InitTimer0(void)
{
        num = 0;
        numA = 0;
        numB = 0;
        numC = 0;
        numD = 0;
        TMOD = 0x01;        //T0工作方式1
  TH0 = 0x4C;                //50ms
  TL0 = 0x00;
  EA = 1;                //開總中斷
  ET0 = 1;        //開定時器0中斷
//        TR0 = 1;
}
void keyprosA1(void)
{
        if (k1==0)        //啟動鍵
        {
                Delay1ms(10);
                if (k1==0)
                {
                        numA++;
                        if (numA==1)
                        {
                                ledA = 0;
                                led1 = 0;
                                led5 = 0;
                        }
                        else if(numA!=1||X==2)
                        {
                                TR0 = 0;
                                num = 0;
                                numA = 0; numB = 0; numC = 0; numD = 0;
                                P1 = 0xFF;
                                ledA = 1; ledB = 1;
                        }
                }
                while(!k1);
        }
}
void keyprosB2()
{
        if (k2==0&&numA==1)        //按鍵B
        {
                Delay1ms(10);
                if (k2==0)
                {
                        numB++;
                        if (numB==1)
                        {
                                ledB = 0;
                        }
                        else
                        {
                                numB = 0;
                                ledB = 1;
                        }
                }
                while(!k2);
        }
}
void keyprosC3()
{
        if (k3==0&&numA==1)        //按鍵C
        {
                Delay1ms(10);
                if (k3==0)
                {
                        numC++;
                        if(numC==1)
                        {
                                led5 = 1; led6 = 0;
                        }
                        else if(numC==2)
                        {
                                led6 = 1; led7 = 0;
                        }
                        else if(numC==3)
                        {
                                led7 = 1; led8 = 0;
                        }
                        else
                        {
                                numC = 0;
                                led8 = 1; led5 = 0;
                        }
                }
                while(!k3);
        }
}

void keyprosD4()
{
        if (k4==0&&numA==1)        //定時鍵D
        {
                Delay1ms(10);
                if (k4==0)
                {
                        numD++;
                        if (numD==1)
                        {
                                num = 0;
                                TR0 = 1;
                                led1 = 1;
                                led2 = 0;
                                Flag = 1;
                        }
                        else if (numD==2)
                        {
                                TR0 = 0;
                                num = 0;
                                TR0 = 1;
                                led2 = 1;
                                led3 = 0;
                        }
                        else if (numD==3)
                        {
                                TR0 = 0;
                                num = 0;
                                TR0 = 1;
                                led3 = 1;
                                led4 = 0;
                        }
                        else
                        {
                                TR0 = 0;
                                num = 0;
                                numD = 0;
                                led4 = 1;
                                led1 = 0;
                        }       
                }
                while(!k4);
        }
}
void time0()        //定時
{
        if (numD==1&&num==40)
        {
                P1=0xFF;
                num = 0;
                numA = 0; numB = 0; numC = 0; numD = 0;
                ledA = 1; ledB = 1;
        }
        else if (numD==2&&num==80)
        {
                P1=0xFF;
                num = 0;
                numA = 0; numB = 0; numC = 0; numD = 0;
                ledA = 1; ledB = 1;
        }
        else if(numD==3&&num==120)
        {
                P1=0xFF;
                num = 0;
                numA = 0; numB = 0; numC = 0; numD = 0;
                ledA = 1; ledB = 1;
        }
}
void main()
{
        InitTimer0();
        while(1)
        {
                keyprosA1();
                keyprosB2();
                keyprosC3();
                keyprosD4();
                time0();
        }
}
void Timer0Interrupt() interrupt 1
{
    TH0 = 0x4C;  //50ms
    TL0 = 0x00;
                num++;
}

回復

使用道具 舉報

地板
ID:801561 發(fā)表于 2020-7-11 14:03 | 只看該作者
有沒有可能是接線出現(xiàn)了問題
回復

使用道具 舉報

5#
ID:708136 發(fā)表于 2020-7-11 14:33 | 只看該作者
按鍵P0口有沒上拉
回復

使用道具 舉報

6#
ID:213173 發(fā)表于 2020-7-12 10:45 | 只看該作者
MCV1121 發(fā)表于 2020-7-11 12:23
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char

樓主注意:標準51單片機P0做按鍵檢測要加上拉電阻。
  1. #include "reg52.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. //--定義使用的IO口--//
  5. sbit k1=P0^0;  //啟動按鍵
  6. sbit k2=P0^1;
  7. sbit k3=P0^2;
  8. sbit k4=P0^3;  //定時按鍵

  9. //=================================================
  10. sbit led1=P1^0;
  11. sbit led2=P1^1;
  12. sbit led3=P1^2;
  13. sbit led4=P1^3;
  14. sbit led5=P1^4;
  15. sbit led6=P1^5;
  16. sbit led7=P1^6;
  17. sbit led8=P1^7;
  18. sbit ledA=P3^3;
  19. sbit ledB=P3^4;

  20. //=================================================
  21. uint num;
  22. bit   numA;         //按鍵計數(shù)標志A
  23. uchar numB;         //按鍵計數(shù)標志B
  24. uchar numC;         //按鍵計數(shù)標志C
  25. uchar numD;         //按鍵計數(shù)標志D                                                                                                               
  26. //int X;
  27. //uchar Flag;         //定時標志
  28. /*
  29. void Delay1ms(uint xms)        //延時函數(shù)
  30. {
  31.         uint i,j;
  32.         for(i=xms;i>0;i--)
  33.                 for(j=110;j>0;j--);
  34. }*/
  35. void InitTimer0(void)
  36. {
  37.         num = 0;
  38.         numA = 0;
  39.         numB = 0;
  40.         numC = 0;
  41.         numD = 0;
  42.         TMOD = 0x01;        //T0工作方式1
  43.         TH0 = 0x4C;      //50毫秒@11.0592MHz
  44.         TL0 = 0x00;
  45.         EA = 1;                //開總中斷
  46.         ET0 = 1;        //開定時器0中斷
  47.         TR0 = 1;
  48. }
  49. void key_scan(void)
  50. {
  51.         static uint count=0;
  52.         static bit sign=0;
  53.         if (!k1||!k2||!k3||!k4)
  54.         {
  55.                 count++;
  56.                 if(count>=10 && sign==0)    //啟動鍵
  57.                 {
  58.                         sign=1;
  59.                         if(!k1)
  60.                         {
  61.                                 numA=~numA;
  62.                         }
  63.                         if(!k2 && numA!=0)
  64.                         {
  65.                                 numB++;
  66.                                 if (numB==2)
  67.                                 {
  68.                                         numB=0;
  69.                                 }
  70.                         }
  71.                         if(!k3 && numA!=0)//按鍵C
  72.                         {
  73.                                 numC++;
  74.                                 if(numC>=4)
  75.                                 {
  76.                                         numC=0;
  77.                                 }
  78.                         }
  79.                         if(!k4 && numA!=0)        //定時鍵D
  80.                         {
  81.                                 numD++;
  82.                                 num=numD*40;
  83.                                 if (numD>=4)
  84.                                 {       
  85.                                         numD=0;
  86.                                         numA=0;
  87.                                 }
  88.                         }
  89.                 }
  90.         }
  91.         else
  92.         {
  93.                 count=0;
  94.                 sign=0;
  95.         }
  96. }

  97. void function()
  98. {
  99.         if(numA)
  100.         {
  101.                 ledA = 0;
  102.                 ledB=numB;
  103.                 P1=~((0x01<<(4+numC))|(0x01<<numD));
  104.         }
  105.         else
  106.         {
  107.                 numA = 0;
  108.                 numB = 0;
  109.                 numC = 0;
  110.                 numD = 0;
  111.                 ledA = 1;
  112.                 ledB = 1;
  113.                 P1=0xff;
  114.         }
  115. }
  116. void main()
  117. {
  118.         InitTimer0();
  119.         while(1)
  120.         {
  121.                 key_scan();
  122.                 function();
  123.         }
  124. }
  125. void Timer0Interrupt() interrupt 1
  126. {
  127.         TH0 = 0x4C;      //50毫秒
  128.         TL0 = 0x00;
  129.         if(numA==1 && numD!=0)
  130.         {
  131.                 num--;
  132.                 if(num==0)
  133.                 {
  134.                         numA = 0;
  135.                 }
  136.         }
  137. }
復制代碼
回復

使用道具 舉報

7#
ID:801878 發(fā)表于 2020-7-12 20:52 | 只看該作者
關(guān)閉電源,導入后重啟試試
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产一区二区三区动漫 | 国产精品自产拍在线观看蜜 | 亚洲精品一 | 密室大逃脱第六季大神版在线观看 | 亚洲久久在线 | 在线观看中文字幕dvd播放 | 免费艹逼视频 | 国产精品一区一区 | 日韩在线视频免费观看 | 亚洲成人一区 | 一区二区av | 欧洲精品码一区二区三区免费看 | 国产在线1 | va在线| 国产98色在线 | 日韩 | a级免费观看视频 | 成人福利电影 | 成在线人视频免费视频 | 毛片视频观看 | 97精品超碰一区二区三区 | 日日操视频 | 日本午夜精品一区二区三区 | 欧美精品被 | 国产免费看 | zzzwww在线看片免费 | 81精品国产乱码久久久久久 | 一级日韩 | 国产精品毛片av | 午夜影院网站 | 四虎影院欧美 | 久久高潮 | 在线色网站 | 国产精品一区二区在线 | 国产精品久久久久久久久久久久久久 | 精品中文字幕视频 | 午夜理伦三级理论三级在线观看 | 欧美日日| 亚洲97 | 久久久久亚洲视频 | 青草青草久热精品视频在线观看 | 九九九久久国产免费 |