您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 金融资料 > 基于51单片机的NEC红外解码
基于51单片机的NEC红外解码张静高佳华NEC编码•头码:9ms高电平+4.5ms低电平•码0:0.56ms高电平+0.56ms低电平•码1:0.56ms高电平+1.68ms低电平•结束位:0.56ms高电平•发码顺序为先发低位再发高位•单键码:头码+16位系统码+8位数据码+8位数据码反码•连续键码(发简码):9ms高电平+2.25ms低电平•简码重复周期:108msNEC编码硬件红外OUT脚接到了单片机P3^3中断接口38K载波信号HS0038矩形波信号单片机中断接口是否有上升沿/读取时间/时间清零引导标志位是否为11时间是否为0、1、22错误,引导标志置0,时间置0,中断置0有0时间是否满足引导码是引导标志置1,中断计数置0,时间清零否时间清零0中断计数+1,数据位移,低位置0中断计数+1,数据位移,低位置0中断计数为8/16/24/3224数据储存8地址储存16地址进行相加校验是否成功失败所有数据清零成功32数据校验是否成功否数据清零是输出数据程序流程图主函数TMOD&=0xF0;//将TMOD的低4位定时器0控制部分清零TMOD|=0x01;//设置定时器0为方式1TL0=0x33;//设置定时器0初值低8位TH0=0xFE;//设置定时器0初值高8位TR0=1;//启动定时器0ET0=1;//Timer0中断允许IT1=1;//下降沿触发方式EX1=1;//外部INT1中断允许EA=1;//开全局中断LCD1602_init();//调用1602液晶初始化函while(1)定时器中断voidTimer0(void)interrupt1{//定时250微秒TL0=0x33;//重新给TL0赋初值TH0=0xFE;//重新给TH0赋初值tmr_times++;//计时周期自加//******************************************}接收信号中断voidINIT1(void)interrupt2{EA=0;TH0=0xfe;TL0=0x33;//循环时间int_times++;if(head_ok==0){if(tmr_times0x31&tmr_times两次中断时间间隔13.5ms{head_ok=1;//引导时间为1进入01判断int_times=0;tmr_times=0;lanth=0;}else{0x37)wrong();//信息清零}}0/1判断voidone_zero(){lanth=0;if((tmr_times2)&(tmr_times7))//信号时长{lanth=0;}elseif((tmr_times7)&(tmr_times13)){lanth=1;}}接收信号存储one_zero();//01判断code_data=code_data1;//右移一位以存储信息if(lanth==1){code_data|=0x80;//最高位为1}else{code_data&=0x7f;//最高位为0}tmr_times=0;//引导时间清零lanth=0;对信号进行校验if(int_times==8)//用户地址赋值{address=code_data;}elseif(int_times==16)//地址检验{if(code_data+address!=0xff)wrong();}elseif(int_times==24)//数据码记录{code_data1=code_data;}elseif(int_times==32)//数据码校验/校验正确,显示{int_times=0;head_ok=0;if(code_data1==~code_data){flagf=1;shuju=code_data1;}elseflagf=0;}错误数据清零voidwrong(){int_times=0;tmr_times=0;head_ok=0;code_data=0;lanth=0;flagf=0;}LCD1602显示voidLCD1602_init(void){Delay1602(1500);//调用延时函数LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示Delay1602(500);//调用延时函数LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示Delay1602(500);//调用延时函数LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x38);//8位数据总线,两行显示模式,5*7点阵显示LCD1602_Write_com_busy(0x08);//显示功能关,无光标LCD1602_Write_com_busy(0x01);//清屏LCD1602_Write_com_busy(0x06);//写入新的数据后,光标右移,显示屏不移动LCD1602_Write_com_busy(0x0C);//显示功能开,无光标}谢谢
本文标题:基于51单片机的NEC红外解码
链接地址:https://www.777doc.com/doc-4226943 .html