红外遥控系统之二:GPIO模拟红外遥控发射

(1)NEC码的发射完整波形图诠释如下(接收与发射反向):

                   

 

(2)用一个GPIO口模拟IR,来输出到另一个接收端,程序如下:
void Simulate_IR_Init(void) //GPIO初始化
{
       MFT4MOD=0;
       PTDIR0_4=1;   //设置输出
       IR_LINE=1;   //默认为高,IR脚的默认电平也是为高
}
void  T_560US(void)
{
        BusWait(_560us); //使用一定的机器时间来耗时,精度可以用示波器来测出
}
void  T_1680US(void)   //3个560US
{
        T_560US();
        T_560US();
        T_560US();
}
void T_500US(void)
{
        BusWait(_500_us);
}
void  T_1MS(void)
{
        T_500US();
        T_500US(); 
}
void T_9MS(void)    //开始码
{
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
}
void T_4_5_MS(void)    //结果码
{
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_500US();
}
void send_d0(void)       //发数据0,参照上述图示反向
{
        IR_LINE=0;
        T_560US();
        IR_LINE=1;
        T_560US();
}
void send_d1(void) //发数据1,参照上述图示反向
{
        IR_LINE=0;
        T_560US();
        IR_LINE=1;
        T_1680US();
}
void send_ir_byte(uchar tp)   //发送一个字节
{
        uchar i;
        for(i=0;i<8;i++)
        {
                if(tp&0x80)
                {
                       send_d1();
                }
                Else
                {
                       send_d0();
                }
                tp<<=1;      //从高位往低位发送
        }
}
void ir_start(void)         //NEC遥控码起始条件
{
        IR_LINE=0;
        T_9MS();
        IR_LINE=1;
        T_4_5_MS();
}
void send_ir_key(uchar key)    //发送单个遥控码的完整程序
{
        Simulate_IR_Init();          //初始化GPIO
        ir_start();                        //NEC起始


        send_ir_byte(IR_USER_CODE);    //客户码
        send_ir_byte(~IR_USER_CODE);   //客户码反码
        send_ir_byte(key);                      //数据码
        send_ir_byte(~key);                    //数据码反码


        IR_LINE=0;
        T_560US();   //为了跟最后一个数据位区别开来,如上图所示


        IR_LINE=1; //恢复默认的高
}

你可能感兴趣的:(数据通讯和网络)