标题: 为什么单片机老是死机?旋转编码器时转的慢没有事 [打印本页]

作者: qiang275129042    时间: 2018-4-16 18:41
标题: 为什么单片机老是死机?旋转编码器时转的慢没有事
现象是这样的旋转编码器时转的慢没有事!转的快单片机就死机了!大家帮我看看是什么问题!

单片机源程序如下:
  1. #include <STC12C5A60S2.H>
  2. typedef unsigned int uint;
  3. typedef unsigned char uchar;
  4. sbit wela = P1^1;
  5. sbit dula = P1^2;
  6. sbit LED=P1^0;
  7. sbit AA=P3^7; //编码加
  8. sbit BB=P3^6; //编码减
  9. uint flage,status,current_bmb,counter = 0,
  10. p,dataa;
  11. float PA;
  12. static uint m,tm;
  13. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  14.                             0x07,0x7f,0x6f};
  15. void delay(unsigned char i)
  16. {
  17. unsigned char j,k;
  18. for(j=i;j>0;j--)
  19.    for(k=110;k>0;k--);
  20. }                                                                                       
  21. void datakae()
  22. {   
  23. status=BB;        //一直赋值!
  24. while(0==AA)//当AA条件允许进入主循环!并且BB上次的值保持为临近状态!
  25.   {   
  26.    current_bmb=BB;
  27.    flage=1;
  28.              }
  29. if(1==flage)
  30.   {
  31.         flage=0;
  32. if((0==current_bmb)&&(1==status))   
  33.             {
  34.           tm++;
  35.           if(tm>=1000)
  36.          {
  37.            tm=1000;         
  38.                }
  39.                 }
  40. if((0==status)&&(1==current_bmb))
  41.     {  
  42.          tm--;
  43.          if(tm<=10)
  44.          {
  45.            tm=10;         
  46.                }                           
  47.                     }
  48.              }                                                                                                                                                                                 
  49.                   }
  50. void display()
  51. {
  52.    P0=table[dataa%10];//个
  53.    dula=1;
  54.    dula=0;

  55.    P2=0xfe;
  56.    wela=1;
  57.    wela=0;
  58.    delay(2);

  59.    P0=table[dataa%100/10];        //十      
  60.    dula=1;
  61.    dula=0;

  62.    P2=0xfd;
  63.    wela=1;
  64.    wela=0;
  65.    delay(2);

  66. P0=table[dataa%1000/100];
  67.    dula=1;
  68.    dula=0;

  69.    P2=0xfb;         //        百
  70.    wela=1;
  71.    wela=0;
  72.    delay(2);
  73.                              
  74. P0=table[dataa%10000/1000];
  75.    dula=1;
  76.    dula=0;

  77.    P2=0xf7;//千
  78.    wela=1;
  79.    wela=0;
  80.    delay(2);
  81.                   }
  82. void huansuan()
  83. {
  84. m=10000/tm;
  85. dataa=tm;
  86.             }
  87. //定时器T1初始化
  88. void initial()
  89. {
  90.   LED=0;
  91.   P1M1 = 0x00;
  92.   P1M0 = 0xFF;
  93.   counter=0;
  94.   EA = 1;
  95.   TR0 = 1;
  96.   TMOD = 0x01;
  97.   TH0 = (65535-1000)/256;         //1ms
  98.   TL0 = (65535-1000)%256;
  99.   ET0 = 1;
  100. }                              
  101. //主程序
  102. void main()
  103. {
  104.    tm=250;
  105.   initial();
  106. while(1)
  107. {
  108. huansuan();
  109. datakae();
  110.   display();
  111.   LED=0;
  112.         }
  113.          }
  114. void timer0_int()interrupt 1 using 0
  115. {
  116. TH0 = (65535-1000)/256;//1ms产生一次中断
  117. TL0 = (65535-1000)%256;
  118. counter++;
  119. if(counter==m)
  120. {
  121.   LED=1;
  122.   for(p=0;p<150;p++);
  123.   counter=0;
  124.           }        else LED=0;
  125.                                                                            
  126.                    }
复制代码



作者: ths3201    时间: 2018-4-16 19:13
好长啊!代码又不能调试,为什么不去玩stm32
作者: qiang275129042    时间: 2018-4-16 19:21
说重点!啥问题!我急死了!
作者: 雨沐林枫    时间: 2018-4-16 20:31
是不是越界问题
作者: 怪怪爱玩    时间: 2018-9-22 15:59
这个循环有问题,我也试过这样的程序,单片机好像反应不过来,
作者: wulin    时间: 2018-9-22 17:14
速度慢时可以正常工作,速度块时出错,这样看来你的程序有缺陷并且与速度有关。从你的程序看运行效率非常低。主要表现在:1数码管动态显示使用了软件延时,2.中断函数中竟然也用了软件延时。这些都会影响CPU及时查询AA状态。
作者: junqingxue    时间: 2018-9-25 17:04
同意6楼的说法




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1