找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3693|回复: 10
打印 上一主题 下一主题
收起左侧

keil debug卡在箭头处不动,问题出在哪里?

[复制链接]
跳转到指定楼层
楼主
求教大神 谢谢大家

硬件仿真也是卡在同样的地方不动,同时,实体电路控制步进电机的3个IO都是低电平

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit maicong=P2^5;//电机脉冲输出,初始低电平
  5. sbit fangxiang=P2^6;//电机方向输出,初始化后低电平
  6. sbit EN=P2^7;//电机使能,初始高电平
  7. sbit XWKG=P2^4;//初始位置确认端口,低电平有效,调用ZIJIAN子程序
  8. sbit k0=P1^0;//启动,调用START子程序
  9. sbit k1=P1^1;//停止,调用TINGZHI子程序
  10. sbit k2=P1^2;//速度加,调用SUDUZ子程序
  11. sbit k3=P1^3;//速度减,调用SUDUJ子程序
  12. sbit k4=P1^4;//步长加,调用BUCHANGZ子程序
  13. sbit k5=P1^5;//步长减,调用BUCHANGJ子程序

  14. uint tt=200;//是否需要??
  15. uint step=1100;//同上
  16. uint num=18;
  17. void keyscan();//键盘扫描程序,程序完成
  18. void delayms(uint ms);//毫秒级可变延时程序
  19. void delayus(uint us);//微秒级可变延时程序,用于低电平输出延时,改变低电平时长就调整了频率。
  20. void delay(uint us);//微秒级延时程序,用于脉冲高电平输出延时
  21. void baidong();//
  22. void ZIJIAN();//程序完成
  23. void START();//对应k0
  24. void TINGZHI();//对应k1
  25. void SUDUZ();//对应k2
  26. void SUDUJ();//对应k3
  27. void BUCHANGZ();//对应k4
  28. void BUCHANGJ();//对应k5
  29. void JIUQIANYISHEN();//对应k6
  30. void main(void)
  31. {
  32.             maicong = 0;
  33.         fangxiang = 1;
  34.         IT1 = 1;                       
  35.         EX1 = 1;                        
  36.         EA = 1;                        
  37.         ZIJIAN();      
  38.         while(1);//等待按键指令,此时PWM=0;DIR=0。
  39. }
  40. /*低一级的外部中断2,负责按键的操作,即启动、停止、加减速、步长加减、自动运行程序的启动*/
  41. void exint1() interrupt 2           //(location at 0013H)
  42. {              
  43.     keyscan();                                 
  44. }
  45. void keyscan()
  46. {
  47. while(1)
  48. {
  49.              if(k0==0)        START();
  50.         else if(k1==0)        TINGZHI();//停止,回初始位(有两种可能,拔出或到底)
  51.         else if(k2==0)        SUDUZ();//速度增
  52.         else if(k3==0)        SUDUJ();//速度减
  53.         else if(k4==0)        BUCHANGZ();//步长增
  54.         else if(k5==0)        BUCHANGJ();//步长减
  55.         else if(XWKG==0) ZIJIAN();//初始位开关开,电机换向,转动
  56. }
  57. }

  58. void ZIJIAN()
  59.   {
  60.                 EN=0;//电机使能,可以自由转动
  61.                 fangxiang=1;
  62.                 while(XWKG==0)
  63.          {
  64.     maicong=1;
  65.     delay(1);
  66.     maicong=0;
  67.                 delayus(tt);
  68.         }
  69.                while(XWKG==1)
  70.                         {
  71.         fangxiang=0;
  72.         maicong=1;
  73.     delay(1);
  74.     maicong=0;
  75.                 delayus(tt);//此处需配合限位开关确定转动角度      

  76.                 }
  77.                   EN=1;//电机使能,不能自由转动
  78.             delayms(50);
  79. }               
  80. void START()
  81.   {
  82.                 EN=0;
  83.                 step=1100;//50*55最大移动步数,有可能触发限位开关
  84.                 delayms(50);
  85.                 while(1)
  86.                                 {                  
  87.                   baidong();
  88.                         }
  89. }
  90. void TINGZHI()
  91. {
  92.         while(1);   
  93. }

  94. void SUDUZ()
  95. {
  96.    tt=tt-5;
  97.    if(tt<1)
  98.     tt=1;
  99.     while(k2==0);
  100. }

  101. void SUDUJ()
  102. {
  103.    tt=tt+5;
  104.    if(tt>255)
  105.     tt=255;
  106.     while(k3==0);
  107. }

  108. void BUCHANGZ()
  109. {
  110.    step=step+5;
  111.    if(step>2750)
  112.     step=2750;
  113.     while(k4==0);
  114. }

  115. void BUCHANGJ()
  116. {
  117.    step=step-5;
  118.    if(step<50)
  119.     step=50;
  120.     while(k5==0);
  121. }


  122. /*外部中断0(最高级),负责打断外部中断 2,即限位开关的触发*/

  123. void exint0() interrupt 0           //(location at 0003H)
  124. {
  125.     while(1);
  126. }


  127.       

  128. void baidong()
  129.         {
  130.          EN=0;//电机使能,可以自由转动

  131.        while(step--)//step取值范围小于细分*55
  132.          {
  133.     maicong=1;//初始pwm输出为低电平,开始动作就要变为高电平(共阴接法)
  134.     delay(1);//延时4微秒,脉冲宽度为5微秒
  135.     maicong=0;//低电平
  136.     delayus(tt);//延时9微秒,低电平宽度10微秒,调整此延时数值更改速度
  137.          }
  138.    fangxiang=~fangxiang;//换向
  139.         }
  140. void delay(uint xus)
  141.         {
  142.                 uint m;
  143.                 for(m=0;m<xus;++m);
  144.                
  145.         }
  146. void delayus(uint tt)
  147.         {
  148.                 uint n;
  149.                 for(n=0;n<tt;++n);//可变延时程序???
  150.         }
  151. void delayms(uint xms)
  152.         {
  153.                 uint x,y;
  154.                 for(x=0;x<xms;++x)
  155.                 for(y=0;y<110;++y);
  156.         }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2021-10-9 16:56 | 只看该作者
先了解while(1)的用途,再写程序。
回复

使用道具 举报

板凳
ID:970742 发表于 2021-10-9 19:55 | 只看该作者
wulin 发表于 2021-10-9 16:56
先了解while(1)的用途,再写程序。

谢谢,连while语句都没到呢
回复

使用道具 举报

地板
ID:162811 发表于 2021-10-9 20:06 | 只看该作者
wulin 发表于 2021-10-9 16:56
先了解while(1)的用途,再写程序。

48行的while(1)?
回复

使用道具 举报

5#
ID:624769 发表于 2021-10-9 20:17 | 只看该作者

正解,同样还有95行,135行,虽然没有启用,但是这样写法本来就不该存在。
回复

使用道具 举报

6#
ID:970742 发表于 2021-10-9 20:21 | 只看该作者
188610329 发表于 2021-10-9 20:17
正解,同样还有95行,135行,虽然没有启用,但是这样写法本来就不该存在。

程序是慢慢改的,前面的问题都没解决,后面再怎么地也是没有的话
回复

使用道具 举报

7#
ID:624769 发表于 2021-10-9 20:57 | 只看该作者
wangzhg 发表于 2021-10-9 20:21
程序是慢慢改的,前面的问题都没解决,后面再怎么地也是没有的话

抱歉啊,我只是回答地板的问题。 你的问题我是实在不知道怎么回答……

想问你是不是没按下一步,或者F5运行,又怕被你打。
不过介于While(1); 都不是问题的前提下,我现在还是鼓起勇气,问一下,点击运行了么?
回复

使用道具 举报

8#
ID:970742 发表于 2021-10-10 21:19 来自触屏版 | 只看该作者
看来还是打酱油的比较多,还是得自己琢磨!
回复

使用道具 举报

9#
ID:161164 发表于 2021-10-11 00:25 | 只看该作者
wangzhg 发表于 2021-10-10 21:19
看来还是打酱油的比较多,还是得自己琢磨!

用你的代码直接编译运行没问题
所以你还是自己琢磨吧~


回复

使用道具 举报

10#
ID:213173 发表于 2021-10-11 07:46 | 只看该作者
wangzhg 发表于 2021-10-9 19:55
谢谢,连while语句都没到呢

你没有点击“运行”,当然停留在main函数的第一行等待操作指令。
回复

使用道具 举报

11#
ID:624769 发表于 2021-10-11 18:52 | 只看该作者
wulin 发表于 2021-10-11 07:46
你没有点击“运行”,当然停留在main函数的第一行等待操作指令。

何苦呢……
我问他有没有点击运行,24小时之后,都被说成打酱油的了。

你又何苦步我后尘呢???
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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