⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ta8435bujing.c

📁 通过红外遥控,实现对步进电机的正反转控制.
💻 C
字号:
#include <reg52.H>
//#include<interins.h>
#define uint unsigned int
#define uchar unsigned char
/****************外部变量部分******************/
 uchar m,s=3,t,tt=0;
 uchar bb=0;
 sbit ck1=P2^0;
 sbit cw=P2^1;
 sbit en1=P2^2;
 sbit en2=P2^3;
 sbit m1=P2^4;
 sbit m2=P2^5;
 sbit d1=P1^7;
 sbit d0=P0^0;
 sbit d2=P0^2;
 
 /***************外部变量部分 ****************/
 /***************函数申明部分*****************/
void shu();
void hong();
hongjue();
/***************函数申明部分*****************/
 void init()		 //初始化/
{
	EA=1;
	TMOD=0x01;
	TH0=(65536-100)/256;
	TL0=(65536-100)%256;
	ET0=1;
	EX0=1;
	IT0=1;
	d1=0;
}
 
 /*********************************红外部分**********************//////////
  sbit IR_RE=P3^2;
bit   k=0;                                      //红外解码判断标志位,为0则为有效信号,为1则为无效
 uchar n=0;                                      //用来控制外部中断

                     
 uchar  data date[4];                           //date数组为存放地址原码,反码,数据原码,反码 
		  
  delay(int z)
{
	  int s,t;
	  for(s=z;s>0;s--)
	  for(t=10;t>0;t--);

 }

			
/*--------------------------延时1ms程子程序-----------------------*/
delay1000()             
{
   uint i,j;
   for(i=0;i<1;i++)
     for(j=0;j<124;j++)
     ;
}

/*---------------------------延时882us子程序-----------------------*/

delay882()
{
   uint i,j;
   for(i=0;i<1;i++)                  
     for(j=0;j<109;j++)
     ;
}

/*--------------------------延时2400us程子程序-----------------------*/

delay2400()                                          
{
   uint i,j;
   for(i=0;i<3;i++)          
     for(j=0;j<99;j++)
      ;
}


/*----------------------------------------------------------*/
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/

void IR_decode()
{
  uchar  i,j;
  while(IR_RE==0);
  delay2400();
  if(IR_RE==1)                               //延时2.4ms后如果是高电平则是新码
  {
     delay2400(); 					  //延时4.8ms避开4.5ms的高电平                          
	 for(i=0;i<4;i++)
	 {
	   for(j=0;j<8;j++)
	   {
           while(IR_RE==0);                       //等待地址码第1位高电平到来
           delay882();                         //延时882Us判断此时引脚电平
           if(IR_RE==0)
           {       
			  date[i]>>=1;
			  date[i]=date[i]&0x7f;			  
           }
           else if(IR_RE==1)
		   {
			  delay1000();
			  date[i]>>=1;
			  date[i]=date[i]|0x80;
		   }
		}                                    //1位数据接收结束
     }
}
}										//32位二进制码接收结束


void hong() interrupt 0
{    
   uint i;
   for(i=0;i<4;i++)
   {  
     delay1000();
	 if(IR_RE==1){k=~k;}                   //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
   }

   if(k==0)
   { 
   EX0=0;                           //检测到有效信号关中断,防止干扰
   IR_decode(); 
   }
   hongjue();
  	EX0=1;
   m=0;	  		
}
 ///////////***************************红外部分************************//////////////////
/**************************电机部分******************////////

 hongjue() 
{	
	 switch(date[3])
	 {
	    case 0xf6:s=0;
		  tt++;
		  TR0=1;
		  d2=0;
		  if(tt>=2)
		  {
		   	tt=0;
			TR0=0;
		  }
		  		break;
		  case 0xf1:s=1;
		  bb++;
		  if(bb>=4)
		  bb=3;
		  		break;
		  case 0xe5:s=2;
		  bb--;
		  if(bb<=0)
		  bb=0;
		  		break;
		 
		case 0xf5:s=3;//左				break;
		case 0xe1:s=4;	//右
				break;

	//	case 0xfe:s=1;
	//			break;
	//	case 0xfe:s=1;
	//			break;

	}

	return(s);

}

void shu()		 //速度调节部分
{
	if((s==0)&&(m==10))	 //kai bu jing
	   {	m=0;
			m1=1;
			m2=1;
			en1=1;
			en2=1;
	    	ck1=~ck1;	
	
		}
	if((s==1)&&(bb==1)&&(m==10)) //yi ji tiao su
	{		
		m=0;
		m1=0;
		m2=1;
		en1=1;
		en2=1; 
		ck1=~ck1;
	}	   
	if((s==1)&&(bb==2)&&(m==8)) //er ji tiao su
	{	
		m=0;
		m1=0;
		m2=1;
		en1=1;
		en2=1;	 	
		ck1=~ck1;
	}	  
	if((s==1)&&(bb==3)&&(m==8)) //san ji tiao su
	{	
		m=0;
		m1=1;
		m2=0;
		en1=1;
		en2=1;
		ck1=~ck1;


	}
	if((s==1)&&(bb==3)&&(m==8)) //shi ji tiao su
	{	
		m=0;
		m1=0;
		m2=0;
		en1=1;
		en2=1;
		ck1=~ck1;


	}
	if((s==2)&&(bb==2)&&(m==8)) //yi ji jian su
	{	 
	    m=0;
		m1=1;
		m2=0;
		en1=1;
		en2=1;
		ck1=~ck1;

	}				 
	if((s==2)&&(bb==1)&&(m==8)) //er ji jian su
	{
		m=0;
		m1=0;
		m2=1;
		en1=1;
		en2=1;	 	
		ck1=~ck1;
	}
	if((s==2)&&(bb==1)&&(m==8)) //san ji jian su
	{
		m=0;
		m1=0;
		m2=1;
		en1=1;
		en2=1;	 	
		ck1=~ck1;
	}
	if((s==2)&&(bb==0)&&(m==10)) //huan hui cong qi su du 
	{
		m=0;
		m1=1;
		m2=1;
		en1=1;
		en2=1;
		ck1=~ck1;	
	
	}
	if(s==3&&m==10)	   //zuo zhung wan
	{
		m=0;
		m1=0;
		m2=1;
		en1=1;
		en2=0;
	   	ck1=~ck1;
	}
	if(s==4&&m==10)	//you zhuang wan
	{
		m=0;
		m1=0;
		m2=1;
		en1=0;
		en2=1;
		ck1=~ck1;	
	}
}
/****************************电机部分****************/
void time() interrupt 1	 //调速中断
{
	d0=0;
	TH0=(65536-100)/256;
	TL0=(65536-100)%256;
	m++;
    shu();
	d0=1;
}
 
void main()
{
init();
while(1);



}







































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -