专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

红外遥控控制电机的程序

作者:佚名   来源:本站原创   点击数:  更新时间:2010年05月27日   【字体:
//***************************************************************** 
//author:su and me 
//date:2008-12-22 
//一电视机万能遥控器按一电机正转,按二反转,按三电机停转,遥控解码程序,网上 
//程序,加上修改和补充,成形。 
//***************************************************************** 
#include < at89x52.h> 
#define byte unsigned char 
#define dbyte unsigned int 
#define DELAY854USdelay(21) 
#define DELAY934USdelay(23) 
#define DELAY1014USdelay(25) 
#define DELAY2414USdelay(60) 
sbit  hs0038_io=P3^2; 
sbit P20=P2^0; 
sbit P21=P2^1; 
sbit P22=P2^2; 
sbit P23=P2^3; 
byte  temp_data; 
byte  x,y,z; 
byte  data decode[4];//定义4个数组,用来存储代码 

void delay(byte temp)//精确延时时间time=(40*temp+14)us 
{ 
byte j,i; 
for(j=0;j< temp;j++) 
for(i=0;i< 10;i++); 
} 
void mov_zhen() 
{ 
P20=1;//6 
P21=0;//8 
P22=0;//7 
P23=0;//5 
} 
void mov_fan() 
{ 
P20=0; 
P21=0; 
P22=1; 
P23=0; 
} 
void mov_stop() 
{ 
P20=0; 
P21=0; 
P22=0; 
P23=0; 
} 

void main() 
{ 
IT0=1; 
EX0=1; 
EA=1; 
temp_data=0; 
while(1) 
{ 
    if (decode[2]==24)mov_zhen(); 
    if (decode[2]==25)mov_fan(); 
    if (decode[2]==26)mov_stop(); 
} 
void t0(void) interrupt 0 using 2//外部中断0的函数 
{ 
EA=0; 
    for(x=0;x< 10;x++)//九毫秒分为10个0.9毫秒0 
    { 
     //延时0.854毫秒 
     DELAY854US; 
if (hs0038_io==1) //每隔0.854毫秒检测一次 
{ 
x=10;//如果检测到高电平,读取失败 
break;//推出 
} 
     else if(x==9)//如果达到10个0.854毫秒的时间 
        { 
            while(hs0038_io==0);//如果此时是低电平等待 
            DELAY2414US;延时2.414毫秒 
            if(hs0038_io==0)//如果检测到低电平 
               break;//退出 
            else 
               DELAY2414US;//延时2.414毫秒 
//##################################################################### 
            for(y=0;y< 4;y++)//引导码正确,开始读取数据,总共四个字节 
            { 
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
            for(z=0;z< 8;z++)//每个字节为八位 
                { 
                while(hs0038_io==0);//如果为低电平则等待 
                //延时0.911毫秒。0.9毫秒约为0.6毫秒和1.6毫秒的平均值 
                DELAY854US; 
                if(hs0038_io) 
                { 
                   temp_data|=(1<< z);//如果读到高电平,则置位相应位 
                   DELAY1014US; 
                 } 
                 else 
                   temp_data&=(~(1<< z)); 
                } 
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
              decode[y]=temp_data;//把读到的一个字节保存在数组当中 
             } 
//##################################################################### 
       } 
   } 
   EA=1; 
}   


	  
	  
  
  
关闭窗口

相关文章