单片机学习小组
直播中

尚文清

7年用户 1556经验值
私信 关注

PIC16F877A单片机接收BA5104红外线遥控解码程序

  • //熟悉使用单片机进行红外线遥控解码
  • //1、首先根据BA5104遥控IC的编码形式进行解码
  • //2、把解码出来的按键用LED指示
  • //**************************************************
  • //**************************************************
  • //硬件设置:
  • //1、SW1开关2闭合,其他断开
  • //2、SW2开关1闭合,其他断开
  • //3、SW4开关全部闭合
  • //**************************************************
  • //**************************************************
  • //*****************定义头文件**********************
  • //**************************************************
  • #include
  • #include"delay.h"
  • //**************************************************
  • //******************定义配置位*********************
  • //**************************************************
  • __CONFIG(0x3545);
  • //FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护
  • //RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器
  • //**************************************************
  • //******************定义常量***********************
  • //**************************************************
  • #define uchar unsigned char
  • #define uint  unsigned int
  • #define IR  RE2
  • //**************************************************
  • //******************定义变量***********************
  • //**************************************************
  • uint rdata1,data;
  • //***********************************************
  • //函 数 名:port_init();
  • //入口参数:无
  • //出口参数:无
  • //函数作用:端口初始化
  • //说    明:
  • //***********************************************
  • void port_init(void)
  • {
  •   PORTA=0X00;    //设置RA口输出低电平
  •   PORTD=0X00;    //设置RD口输出低电平
  •   PORTE=0X00;    //设置RE口输出低电平
  •   ADCON1=0X07;   //设置RA口,RE口为普通IO口
  •   TRISA=0X00;    //设置RA口为输出口
  •   TRISD=0X00;    //设置RD口为输出口
  •   TRISE=0X04;    //设置RE2口为输入口,其他为输出口
  •   OPtiON=0X8F;   //分频给WDT,分频比为128
  • }
  • //***********************************************
  • //函 数 名:scan();
  • //入口参数:无
  • //出口参数:无
  • //函数作用:遥控接收扫描函数
  • //说    明:
  • //***********************************************
  • void scan(void)
  • {
  •   uchar i,count=0;
  •   rdata1=0;                  //变量清零
  •   IR=0;                      //先输入低电平
  •   if(IR)                     //判断是否有遥控信号,高电平为有遥控信号
  •   {
  •     while(IR){CLRWDT();;}    //等待32ms延时
  •     for(i=0;i<12;i++)        //依次接收12位数据
  •     {
  •       while(!IR)             //等待低电平信号结束
  •       {
  •         DelayUs(20);         //延时50us, 20*2.5us=50us
  •         count++;
  •         if(count>25){break;} //延时大于1.25ms,跳出
  •       }
  •       if(count<7){return;}   //延时小于300us,为干扰跳出
  •       else if((count>6)&&(count<11)){rdata1|=0x00;} //延时在350-500us,判定为0
  •       else if(count>20){rdata1|=0x01;} //延时在1ms,判定为1
  •       rdata1=rdata1<<1;                //移位准备接收下一位数据
  •       count=0;                         //变量清零
  •       while(IR){CLRWDT();}             //等待高电平结束,接收下一位
  •     }
  •   }
  • }
  • //***********************************************
  • //函 数 名:delayms(uchar time);
  • //入口参数:time
  • //出口参数:无
  • //函数作用:延时
  • //说    明:
  • //***********************************************
  • void delayms(uchar time)
  • {
  •   uint i;
  •   while(time--)
  •   {
  •     for(i=93;i>0;i--){;}
  •   }
  • }
  • //***********************************************
  • //函 数 名:buzzer();
  • //入口参数:无
  • //出口参数:无
  • //函数作用:产生警报声
  • //说    明:
  • //***********************************************
  • void buzzer(void)
  • {
  •   RA5=1;         //RE1输出高电平
  •   delayms(200);
  •   RA5=0;         //RE1输出低电平
  • }
  • //***********************************************
  • //函 数 名:display();
  • //入口参数:无
  • //出口参数:无
  • //函数作用:显示函数
  • //说    明:
  • //***********************************************
  • void display(void)
  • {
  •   switch(data)
  •   {
  •     case 0x0D81:RD0=!RD0;buzzer();break;
  •     case 0x0D82:RD1=!RD1;buzzer();break;
  •     case 0x0D84:RD2=!RD2;buzzer();break;
  •     case 0x0D88:RD3=!RD3;buzzer();break;
  •     case 0x0D90:RD4=!RD4;buzzer();break;
  •     case 0x0DA0:RD5=!RD5;buzzer();break;
  •     case 0x0DC3:RD6=!RD6;buzzer();break;
  •     case 0x0DC6:RD7=!RD7;buzzer();
  •   }
  • }
  • //***********************************************
  • //函 数 名:main();
  • //入口参数:无
  • //出口参数:无
  • //函数作用:MAIN函数
  • //说    明:
  • //***********************************************
  • void main(void)
  • {
  •   port_init();            //调用端口初始化函数
  •   while(1)
  •   {
  •     scan();               //调用遥控扫描函数
  •     if(data!=rdata1)
  •     {
  •       data=rdata1&0x0fff; //保留接收数据的低12位
  •       display();          //调用遥控按键显示函数
  •     }
  •   }
  • }




更多回帖

发帖
×
20
完善资料,
赚取积分