感觉好奇怪,能够红外控制LED灯却控制不了电机

2019-07-16 18:17发布

本帖最后由 愚蠢的萝卜 于 2015-3-24 22:31 编辑

控制电机三种工作状态:全速,减速,停(电机是单片机Moto引脚低电平的时候转动)
但是我开启单片机后 全速的控制是可以的,
但是接着按 减速和停的按钮就不管用了,
只能重新打开单片机,按减速按钮,电机能减速转动,但是很奇怪,电机低速转了一会又自动进入全速状态接着自动停止(我并没有控制它)
但是我控制2个LED灯却很正常。原理图如下

Windows XP Professional-2015-03-22-14-08-44.png

复制代码
PS:我用延时而不用红外控制时电机的全速和低速都能成功实现。

新发现:红外遥控启动电机后LED灯也无法控制了,没反应。

问题总结:
1.一旦红外遥控启动电机后,红外遥控就失效了;
2.红外遥控低速启动自动回到全速并且停止的问题

程序代码如下
  1. /*测试电机能否由红外线控制*/
  2. #include<reg52.h>

  3. sbit IRIN=P3^2;
  4. sbit Moto=P2^1;
  5. sbit LED1=P2^2;          //
  6. sbit LED2=P2^3;         //


  7. unsigned char IrValue[3];
  8. int time;

  9. void DelayMs(unsigned int x);
  10. void Init_0();
  11. void Delay_100us();
  12. void LessSpeed();
  13. void Control();

  14. void main()
  15. {
  16.         LED1=LED2=1;
  17.         IrValue[2]=0x45;//默认停止
  18.         Init_0();
  19.         
  20.         while(1)
  21.         {
  22.                 Control();
  23.         }
  24.         
  25. }


  26. /****************************************************解码程序************************************************************/
  27. void ReadIr() interrupt 0        
  28. {
  29.         unsigned char j,k;
  30.         unsigned int err;
  31.         Time=0;                                         
  32.         DelayMs(70);

  33.         if(IRIN==0)                //确认是否真的接收到正确的信号
  34.         {         
  35.                
  36.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  37.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  38.                 侯,程序死在这里*/        
  39.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
  40.                 {                        
  41.                         DelayMs(1);
  42.                         err--;
  43.                 }
  44.                 if(IRIN==1)                        //如果正确等到9ms低电平
  45.                 {
  46.                         err=500;
  47.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  48.                         {
  49.                                 DelayMs(1);
  50.                                 err--;
  51.                         }
  52.                         for(k=0;k<4;k++)                //共有4组数据
  53.                         {                                
  54.                                 for(j=0;j<8;j++)        //接收一组数据
  55.                                 {

  56.                                         err=60;               
  57.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  58.                                         {
  59.                                                 DelayMs(1);
  60.                                                 err--;
  61.                                         }
  62.                                         err=500;
  63.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  64.                                         {
  65.                                                 DelayMs(1);//0.14ms
  66.                                                 Time++;
  67.                                                 err--;
  68.                                                 if(Time>30)
  69.                                                 {
  70.                                                         EX0=1;
  71.                                                         return;
  72.                                                 }
  73.                                         }
  74.                                         IrValue[k]>>=1;         //k表示第几组数据
  75.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  76.                                         {
  77.                                                 IrValue[k]|=0x80;
  78.                                         }
  79.                                         Time=0;                //用完时间要重新赋值                                                        
  80.                                 }
  81.                         }
  82.                 }
  83.                 if(IrValue[2]!=~IrValue[3])
  84.                 {
  85.                         return;
  86.                 }
  87.         }                        
  88. }

  89. /***********************************************************************************************************/
  90. void DelayMs(unsigned int x)   //0.14ms误差 0us
  91. {
  92. unsigned char i;
  93.   while(x--)
  94. {
  95.   for (i = 0; i<13; i++)
  96. {}
  97. }
  98. }
  99. void Init_0()
  100. {
  101.         IT0=1;//外部中断0跳变沿触发方式(下降沿)
  102.         EX0=1;//打开INT0的中断允许
  103.         EA=1;//打开总中断
  104. }
  105. void Delay_100us()
  106. {
  107.         
  108. unsigned char a,b,c;
  109. for(a=0;a<1;a++)
  110. for(b=0;b<1;b++)
  111. for(c=0;c<28;c++);
  112. }  
  113. void LessSpeed()
  114. {
  115.         while(IrValue[2]==0x15)
  116.         {
  117.         Moto=0;
  118.         Delay_100us();
  119.         Moto=1;
  120.         Delay_100us();
  121.         }
  122. }
  123. void Control()
  124. {
  125.         if(IrValue[2]==0x44)
  126.                 Moto=0;
  127.         else if(IrValue[2]==0x45)
  128.                 Moto=1;
  129.         else if(IrValue[2]==0x15)
  130.                 LessSpeed();
  131.         else if(IrValue[2]==0x0c)
  132.                 LED1=1,LED2=0;
  133.         else if(IrValue[2]==0x5e)
  134.                 LED1=0,LED2=1;
  135.         else if(IrValue[2]==0x18)
  136.                 LED1=LED2=0;
  137. }
复制代码


Windows XP Professional-2015-03-22-14-08-44.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。