×
单片机 > 单片机程序设计 > 详情

HX1838红外无线遥控模块51单片机程序

发布时间:2020-08-31 发布时间:
|

红外无线模块:
1.硬件:红外接收器+遥控器
2.连接方式:接收器的+、-分别连接在单片机的VCC、GND上面,S为信号输出端连接在单片机的IO口上面(例程里面连接在了P3^2引脚)
3.遥控器上面每一个按键对应的键码值已经在程序中给出,程序的内容是用遥控器控制单片机上面的流水灯

 

单片机源程序如下:

#include    //包含单片机寄存器的头文件

#include //包含_nop_()函数定义的头文件

#define uchar unsigned char

#define uint  unsigned int



sbit IRIN=P3^2;         //红外接收器数据线



sbit led1=P1^0;

sbit led2=P1^1;

sbit led3=P1^2;

sbit led4=P1^3;

sbit led5=P1^4;

sbit led6=P1^5;

sbit led7=P1^6;

sbit led8=P1^7;


uchar IRCOM[7];


void delay(unsigned char x) ;


/*******************************************************************/

void main()

{

         unsigned int  a;

   

        IRIN=1;                    //I/O口初始化        

        IE=0x81;                 //允许总中断中断,使能 INT0 外部中断

        TCON=TCON|0x01;               //触发方式为脉冲负边沿触发

        

         while(1)

         {                

            for(a=100;a>0;a--)

   {

     void IR_IN();

   }        

          }

/**********************************************************/

void IR_IN() interrupt 0 using 0

{

        unsigned char j,k,N=0;

        unsigned char q=0;

        EX0 = 0;   

        delay(15);

        if (IRIN==1) 

        { 

                EX0 =1;

                return;

        } 

                   //确认IR信号出现

        while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。

                delay(1);

        

        for (j=0;j<4;j++)         //收集四组数据

        { 

                for (k=0;k<8;k++)        //每组数据有8位

                {

                        while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。

                        {delay(1);}

                        while (!IRIN)          //等 IR 变为高电平

                                delay(1);

                        while (IRIN)           //计算IR高电平时长

                        {

                                delay(1);

                                N++;           

                                if (N>=30)

                                { 

                                        EX0=1;

                                        return;

                                }                  //0.14ms计数过长自动离开。

                        }                        //高电平计数完毕                

                        IRCOM[j]=IRCOM[j] >> 1;     //数据最高位补“0”

                        if(N>=8)

                        {

                                IRCOM[j] = IRCOM[j] | 0x80;                  //数据最高位补“1”

                        }  

                        N=0;

                }

        }

        

        if(IRCOM[2]!=~IRCOM[3])

        { 

                EX0=1;

                return; 

        }

        

        IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位

        IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位

        

        if(IRCOM[5]>9)

        { 

                IRCOM[5]=IRCOM[5]+0x37;

        }

        else

        IRCOM[5]=IRCOM[5]+0x30;

        

        if(IRCOM[6]>9)

        { 

                IRCOM[6]=IRCOM[6]+0x37;

        }

        else

        IRCOM[6]=IRCOM[6]+0x30;


        q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));

    


        switch(q)    //判断按键键码值

        {

                case 0x04:led1=1;led2=0;led3=1;led4=0;led5=1;led6=0;led7=1;led8=0;break;  //(#)

                case 0x19:led1=0;break;  //(0)

                case 0x40:led5=0;break;  //(5)

                case 0x43:led6=0;break;  //(6)

                case 0x44:led4=0;break;  //(4)

                case 0x45:led1=0;break;  //(1)

                case 0x46:led2=0;break;  //(2)

                case 0x47:led3=0;break;  //(3)

                case 0x07:led7=0;break;  //(7)

                case 0x18:led1=0;led2=0;led3=1;led4=1;led5=1;led6=1;led7=1;led8=1;break;  //(上)

                case 0x09:led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;led7=0;led8=0;break;  //(9)

                case 0x08:led1=1;led2=1;led3=1;led4=1;led5=0;led6=0;led7=1;led8=1;break;  //(左)

                case 0x13:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;led8=1;break;  //(ok)

                case 0x51:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=0;led8=0;break;  //(右)

                case 0x15:led8=0;break;  //(8)

                case 0x52:led1=1;led2=1;led3=0;led4=0;led5=1;led6=1;led7=1;led8=1;break;  //(下)

                case 0x16:led1=0;led2=1;led3=0;led4=1;led5=0;led6=1;led7=0;led8=1;break;  // (*)

        

                default :break; 

        }


         EX0 = 1; 

}



/***************延时函数*****************************/

void delay(unsigned char x)    //x*0.14MS

{

        unsigned char i;

        while(x--)

        {

                for (i = 0; i<13; i++) {}

        }

}


关键字:HX1838  红外无线遥控模块  51单片机 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机中RC电容触摸的感应原理解析