//熟悉使用单片机进行红外线遥控解码
//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(); //调用遥控按键显示函数 } } }
上一篇:PIC16F877A单片机的PWM输出程序
下一篇:dsPIC30F6014控制DS18B20温度+CAN总线的发送程序
推荐阅读最新更新时间:2024-11-17 12:41