- //熟悉使用单片机进行红外线遥控解码
- //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(); //调用遥控按键显示函数
- }
- }
- }
|