找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么单片机老是死机?旋转编码器时转的慢没有事

[复制链接]
ID:51533 发表于 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.                    }
复制代码


评分

参与人数 1黑币 +5 收起 理由
QQwert + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:309495 发表于 2018-4-16 19:13 | 显示全部楼层
好长啊!代码又不能调试,为什么不去玩stm32
回复

使用道具 举报

ID:51533 发表于 2018-4-16 19:21 | 显示全部楼层
说重点!啥问题!我急死了!
回复

使用道具 举报

ID:309572 发表于 2018-4-16 20:31 | 显示全部楼层
是不是越界问题
回复

使用道具 举报

ID:227864 发表于 2018-9-22 15:59 | 显示全部楼层
这个循环有问题,我也试过这样的程序,单片机好像反应不过来,
回复

使用道具 举报

ID:213173 发表于 2018-9-22 17:14 | 显示全部楼层
速度慢时可以正常工作,速度块时出错,这样看来你的程序有缺陷并且与速度有关。从你的程序看运行效率非常低。主要表现在:1数码管动态显示使用了软件延时,2.中断函数中竟然也用了软件延时。这些都会影响CPU及时查询AA状态。
回复

使用道具 举报

ID:222079 发表于 2018-9-25 17:04 | 显示全部楼层
同意6楼的说法
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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