找回密码
 立即注册

QQ登录

只需一步,快速开始

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

此程序下载到单片机后为什么电机会乱转?

[复制链接]
跳转到指定楼层
楼主
ID:334234 发表于 2020-4-5 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
预想功能:按下按键,电机反转5S后,延时一会,再以相同速度正转5S,停止
现在的现象:下载程序后电机乱转的,求求大佬了
单片机源程序如下:
  1. #include"reg51.h"
  2. #define uint16 unsigned int
  3. #define uint8  unsigned char
  4. #define GPIO_MOTOR P1


  5. sbit k1=P3^1;



  6. unsigned char code FFS[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//·′×a
  7. unsigned char code FFN[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//Õy×a
  8. typedef unsigned int u16;

  9. unsigned char Direction,Speed;
  10. void Delay(unsigned int t);
  11. void Motor();

  12. void Motor()
  13. {
  14.   unsigned char i;
  15.         for(i=0;i<8;i++)
  16.         {
  17.     if(Direction==1)
  18.                         GPIO_MOTOR=FFS[i]&0x1f;
  19.      if(Direction==0)
  20.                         GPIO_MOTOR=FFN[i]&0x1f;
  21.                  Delay(Speed);
  22.                
  23. }

  24. }

  25. void Delay(unsigned int t)//t=5000Ñó3ù4s
  26. {
  27.    unsigned int k;
  28.          while(t--)
  29.    {
  30.     for(k=0;k<80;k++)
  31.     {}
  32. }


  33. }


  34. void main(void)
  35. {

  36.         
  37.           TMOD=0x10;
  38.            TH1=0x3C;
  39.            TL1=0xB0;
  40.            EA=1;
  41.            ET1=1;
  42.            TR1=0;
  43.         
  44.         
  45.          while(1)
  46.          {
  47.    if(k1==1)
  48.    {
  49.     Delay(1);
  50.                  if(k1==1)
  51.                  {
  52.                        TR1=1;
  53.         Direction=1;
  54.                            Speed=10;  
  55.          
  56. }  


  57. }
  58. else
  59.         {
  60.                
  61.                 Delay(5000);
  62.     TR1=0;
  63.         
  64. }
  65.         
  66. }

  67. }


  68. void timer()  interrupt 3
  69. {
  70. static u16 i;
  71.            TH1=0x3C;
  72.            TL1=0xB0;
  73.      i++;
  74.         

  75.   if(i==100)
  76.         {
  77.                   Delay(5000);
  78.                    Delay(5000);
  79.                   Delay(5000);
  80.                   Direction=0;
  81.                    Speed=10;
  82.                   i=0;
  83.                
  84. }
  85.                         Motor();

  86. }
复制代码

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

使用道具 举报

沙发
ID:68468 发表于 2020-4-5 21:15 | 只看该作者
从程序看,你的电机是一个步进电机,FFS[]、FFN[]数组分别是正反转数组;我暂时还不知道电机为什么会乱转,但从程序本身来看还是有点问题的。首先,我看不出程序是怎么实现“电机反转5S后,延时一会,再以相同速度正转5S,停止”的;其次,在中断服务函数中不应有Delay(5000)这样的长延时函数。
从我的角度来处理,我会先把程序最小化,只在主函数中保留 Motor()函数,其他的按键、定时中断均先屏蔽掉, Motor()函数也只留FFS数组,单独试电机是否能正转,再换成FFN数组,试电机能否反转,再加入按键功能,延时正反转功能。最终实现既定功能。
回复

使用道具 举报

板凳
ID:487821 发表于 2020-4-7 00:06 | 只看该作者
这代码写得也太乱了吧,你自己改延时函数应该 就行了,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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