弄了一晚上,终于能用红外遥控器控制步进电机了

  1. 单片机STC89C52RC
  2. 遥控器CarMP3遥控器 共21键
  3. 步进电机28BYJ48    5V减速步进电机
  4. 步进电机驱动板ULN2003AN
  5. 红外接头1838
经过多次尝试,借鉴一些其他的资料,终于能控制步进电机了,使按键k在按下的状态电机一直转,
松开电机停止
代码如下:代码漏洞较多,欢迎指正和提出优化方案

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit P20=P2^0;				//数码管
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P27=P2^7;
sbit IRIN=P3^2;				//红外接口
uint dis[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,//数码管1-f
                      0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uint light[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint motor[4]={0x03,0x06,0x0c,0x09};			 //步进电机
uchar dat[4][8];			 //红外接收2进制存储矩阵
uchar ans[4],pow[8]={128,64,32,16,8,4,2,1};		 //十进制码
void delay(uint x)
{
    uint t,i;
	for(i=1;i<=x;i++)
	for(t=1;t<=13;t++);
}
void moto()
{

	}
void display(uchar qian,uchar bai,uchar shi,uchar ge)  //数码管显示
{

	P20=0;
	P0=dis[ge];
	delay(30);
    P20=1;

	P21=0;
	P0=dis[shi];
	delay(30);
    P21=1;

	P22=0;
	P0=dis[bai];
	delay(30);
    P22=1;

	P23=0;
	P0=dis[qian];
	delay(30);
    P23=1;
}
void IR_IN() interrupt 0 using 0
{

   uchar t,i,n=0;
   delay(15);
                           //确认IR信号出现
   while (!IRIN)    //等IR变为高电平,跳过9ms的前导低电平信号。
    {delay(1);}
   for(t=0;t<4;t++)			//接收4*8位码
   {
      for(i=0;i<8;i++)
	  {
	     n=0;
		 while(!IRIN) delay(1);
		 while(IRIN)
		 {
		    n++;
			delay(1);
			if(n>30) return;
		 }
		 if(n>8) dat[t][i]=1;
		 else dat[t][i]=0;
	  }
   }
   for(t=0;t<4;t++)			  //转十进制,判断方便
   {
      ans[t]=0;
	  for(i=0;i<8;i++)
	    ans[t]+=(dat[t][i]*pow[i]);
	}
	n=0;
	if(ans[2]==145)		   //步进电机转动
   	{
	  while(1)
	  {
	   if(IRIN&&n<30) n++;
	   else if(!IRIN) n=0;
	   if(n>5) delay(10);

	   else{
	   P1=motor[0];
	   delay(100);
	   P1=motor[1];
	   delay(100);
	   P1=motor[2];
	   delay(100);
	   P1=motor[3];
	   delay(100); }P1=0xff;
	   if(n>=30) return;  、//判断按键是否松开

	  }

	 }

}

int main()
{
   int number;
   IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断
   TCON = 0x01;               //触发方式为脉冲负边沿触发
   while(1)
   {   

       switch(ans[2])
	   {
	      case 180:number=0;break;
	      case 152:number=1;break;
		  case 140:number=2;break;
		  case 189:number=3;break;
		  case 136:number=4;break;
		  case 156:number=5;break;
		  case 173:number=6;break;
		  case 161:number=7;break;
		  case 165:number=8;break;
		  case 144:number=111; break;
		 // default:ans[2]=180; P27=0; delay(300);P27=1;
		}
	  // P1=light[number];
	/*   if(number==1)
	   {
	   number=0;
	   ans[2]=180;
	   while(IRIN==0)
	   {
       P1=motor[0];
	   delay(100);
	   P1=motor[1];
	   delay(100);
	   P1=motor[2];
	   delay(100);
	   P1=motor[3];
	   delay(100);
	   }
	   P1=0xff;
	   }
	   else	 */
	   display(0,ans[2]/100,(ans[2]%100)/10,ans[2]%10); //显示键码	 

	}
   return 0;
}

0 条评论

What is 9 + 6 ?
Please leave these two fields as-is:
不答对这道小题,是不给通过的哦

昵称

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

沙发空缺中,还不快抢~