找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3187|回复: 6
收起左侧

为什么51单片机的定时器有几率卡死?

[复制链接]
ID:743496 发表于 2020-7-11 00:07 | 显示全部楼层 |阅读模式
这个程序就是四个按键按键控制十个LED灯,LED1,LED2,LED3,LED4是对应定时显示的灯其中两个按键各要控制四个灯,定时那个按键是按三次,分别亮LED2、3、4、对应三种定时时间,按第四次关闭定时器LED1灯。

问题是:
1.为什定时器正在运行的时,疯狂乱按除了定时按键之外的其他按键,有很大几率会导致定时器卡死,定时灯也就不会自动熄,除非把定时器关掉,重新打开。
2.定时器运行的时候,按其他键的频率比较慢,或不按其他按键,这样定时正常,不会卡死。

我自学比较菜,看着程序逻辑也是正确的啊,就是找不到BUG在哪里,实在不知道该怎么办了,求帮帮忙。





51hei图片20200711000003.png
回复

使用道具 举报

ID:213173 发表于 2020-7-11 06:37 | 显示全部楼层
图片不好测试,把原码发上来帮你看看。理论上不可能出现定时器卡死。
回复

使用道具 举报

ID:743496 发表于 2020-7-11 12:23 | 显示全部楼层
wulin 发表于 2020-7-11 06:37
图片不好测试,把原码发上来帮你看看。理论上不可能出现定时器卡死。

#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;         //按键计数标志A
uchar numB;         //按键计数标志B
uchar numC;         //按键计数标志C
uchar numD;         //按键计数标志D                                                                                                                
int X;
uchar Flag;         //定时标志

void Delay1ms(uint xms)        //延时函数
{
        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 发表于 2020-7-11 14:03 | 显示全部楼层
有没有可能是接线出现了问题
回复

使用道具 举报

ID:708136 发表于 2020-7-11 14:33 | 显示全部楼层
按键P0口有没上拉
回复

使用道具 举报

ID:213173 发表于 2020-7-12 10:45 | 显示全部楼层
MCV1121 发表于 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;         //按键计数标志A
  23. uchar numB;         //按键计数标志B
  24. uchar numC;         //按键计数标志C
  25. uchar numD;         //按键计数标志D                                                                                                               
  26. //int X;
  27. //uchar Flag;         //定时标志
  28. /*
  29. void Delay1ms(uint xms)        //延时函数
  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. }
复制代码
回复

使用道具 举报

ID:801878 发表于 2020-7-12 20:52 | 显示全部楼层
关闭电源,导入后重启试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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