找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机程序电机一转数码管灭了?

[复制链接]
跳转到指定楼层
楼主
ID:785261 发表于 2020-11-14 00:27 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当电机一转,数码管就灭了,偶尔闪一下,不知咋回事

IMG20201113152207.jpg (1.09 MB, 下载次数: 41)

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

使用道具 举报

沙发
ID:785261 发表于 2020-11-14 00:33 来自手机 | 只看该作者
程序是这个,电机一转,数码管就灭了

  1. #include<reg51.h>
  2. #include<intrins.h>
  3. void zhongduan();
  4. unsigned char num[]={0x00,0x01,0X02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
  5. void delay(unsigned char x);
  6. sbit sw=P3^0;    sbit gw=P3^1;    sbit moshi=P3^2;     sbit yewei=P3^3;        sbit qidong=P3^4;
  7. sbit L1=P1^5;  sbit L2=P1^4; sbit L3=P1^3; sbit L4=P1^2; sbit L5=P1^6; sbit L6=P1^7;sbit L7=P1^1;sbit L8=P1^0;
  8. unsigned char s=0,g=0,i=0,b=0;
  9. unsigned char j,h;
  10. unsigned char aum=0;
  11. unsigned char code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
  12. unsigned char code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
  13. void SETP_MOTOR_FFW(unsigned char n)
  14. {
  15.          unsigned char q,w;
  16.         for(q=0;q<5*n;q++)
  17.         {
  18.                  for(w=0;w<8;w++)
  19.                 {
  20.                         P0 = FFW[w];
  21.                         delay(25);
  22.                 }
  23.         }
  24. }
  25. void SETP_MOTOR_REV(unsigned char n)
  26. {
  27.          unsigned char q,w;
  28.         for(q=0;q<5*n;q++)
  29.         {
  30.                  for(w=0;w<8;w++)
  31.                 {
  32.                         P0 = REV[w];
  33.                         delay(25);
  34.                 }
  35.         }
  36. }
  37. void de(unsigned char z)
  38. {
  39. unsigned char e,r;
  40. for(e=z;e>0;e--)
  41. for(r=110;r>0;r--);
  42. }
  43. sbit SPK=P3^5;


  44. void main()
  45. {
  46. unsigned char N = 3;
  47.    EA=1;
  48. ET1=1;
  49.     TMOD=0x10;
  50. TH1=(65535-10000)/256;
  51. TL1=(65535-10000)%256;
  52. TR1=1;
  53. P2=0x08; P3=0xff; P1=0x00; delay(200); P1=0xff; P3=0x00; delay(200); P3=0xff; P1=0xff;
  54. while(1)
  55. {
  56. sw=1; P2=num[s]; delay(1); sw=0;
  57. gw=1; P2=num[g];delay(1); gw=0;
  58.   if(moshi==0)
  59.      {
  60.   delay(2);
  61.    if(moshi==0)
  62.    {
  63.    while(!moshi);
  64.    b++;
  65.    if(b>2)
  66.    b=1;
  67.    }
  68.    }

  69. if(yewei==0&&b>0)
  70.   {
  71.   delay(2);
  72.   if(yewei==0&&b>0)
  73.   while(!yewei);
  74.    i++;
  75.    if(i>4)
  76.    i=1;
  77.   }

  78. switch(i)
  79.    {
  80.    case 0:
  81.    for(j=0;j<50;j++)

  82.   L1=1;L2=1;L3=1;L4=1; break;

  83. case 1:
  84.    for(j=0;j<50;j++)

  85.    L1=0;L2=1;L3=1;L4=1; break;


  86.   case 2:
  87.    for(j=0;j<50;j++)

  88.    L1=1;L2=0;L3=1;L4=1; break;

  89.   case 3:
  90.    for(j=0;j<50;j++)

  91.    L1=1;L2=1;L3=0;L4=1; break;

  92.    case 4:
  93.    for(j=0;j<50;j++)

  94.    L1=1;L2=1;L3=1;L4=0; break;

  95. default:break;
  96.    }
  97.   switch(b)
  98.    {
  99.    case 0:
  100.    for(j=0;j<100;j++)

  101.    P1=0xff; break;

  102. case 1:
  103.    for(j=0;j<100;j++)

  104.    L5=1;L6=0; break;
  105. case 2:
  106.    for(j=0;j<100;j++)

  107.    L5=0;L6=1; break;

  108.    default:break;
  109.    }
  110.    if(qidong==0&&i>0)
  111.      {
  112.   delay(2);
  113.    if(qidong==0&&i>0)
  114.    {
  115.    while(!qidong);
  116.    g=0;s=6;
  117.    while(1)
  118.   {      
  119.     if(aum==100)
  120.    {
  121.    aum=0;
  122.    g--;
  123.    }
  124.    if(g==-1)
  125.    {
  126.     g=9;
  127.     s--;
  128.     }
  129.     if(s==-1)
  130. {s=0;g=0;}
  131.    if(s==6)
  132.    {L7=0;}
  133.    if(s<5&&s>1)
  134.    {
  135.    L7=1;
  136.    SETP_MOTOR_REV(N);delay(100);SETP_MOTOR_FFW(N);delay(100);
  137.    sw=1; P2=num[s]; delay(1); sw=0;
  138.     gw=1; P2=num[g];delay(1); gw=0;
  139.    }
  140.    if(s<=1)
  141.    {L8=0;}
  142.    if(s<1&&g<1)
  143.    {P1=0xff;
  144.    de(100);
  145.    SPK=0;
  146.    de(100);
  147.    SPK=1;
  148.    }
  149.    sw=1; P2=num[s]; delay(1); sw=0; gw=1; P2=num[g];delay(1); gw=0;
  150.    }
  151.    }
  152.   }

  153. }

  154. }
  155. void delay(unsigned char x)
  156. {
  157.     unsigned char k;
  158. while(x--)
  159. for(k=0;k<255;k++);
  160. }
  161. void zhongduan() interrupt 3 using 0
  162. {
  163.     TH1=(65535-10000)/256;
  164. TL1=(65535-10000)%256;
  165. aum++;

  166. }
复制代码


回复

使用道具 举报

板凳
ID:332444 发表于 2020-11-14 15:33 | 只看该作者
程序问题                                 
回复

使用道具 举报

地板
ID:342954 发表于 2020-11-14 18:04 | 只看该作者
检查程序
回复

使用道具 举报

5#
ID:367934 发表于 2020-11-16 09:07 | 只看该作者
无论是电机还是继电器在实际电路设计中都需要使用一个二极管做保护,防止开关时瞬间电流过大造成控制器件损坏。不过你这个是模拟的不知存不存在这种问题。
你的这个可能是另外一个问题那就是电机的对电流的需求过大,当电机启动时拉低了整个系统的电压,导致数码管供电不足导致偶尔闪烁一下。
回复

使用道具 举报

6#
ID:311846 发表于 2020-11-16 09:28 | 只看该作者
说真的你这程序本来可以很简单的架构的,你写成这样真的懒得看,一就是,数码管的显示函数要不断调用刷新的,估计问题就是进入驱动电机的时候没有调用显示数码管或者很久才显示刷新一次导致的,二就是电压问题。
回复

使用道具 举报

7#
ID:568565 发表于 2020-11-16 10:08 | 只看该作者
看你最后一个while(1),跳进去以后步进电机转的时候没刷新显示,数码管可不就不亮了嘛
回复

使用道具 举报

8#
ID:65956 发表于 2020-11-20 11:25 | 只看该作者
供电不足造成的,电机的电源和单片机工作电源分开就不会了,不然你要用低电压型的单片机,如STC15W系列等
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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