基于51单片机的NEC红外解码研讨.pptVIP

  • 10
  • 0
  • 约2.55千字
  • 约 15页
  • 2017-05-08 发布于湖北
  • 举报
基于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低电平 简码重复周期:108ms NEC编码 硬件 红外OUT脚接到了单片机P3^3中断接口 需求分析 思想:上升沿中断触发,时间清零 38K载波信号 HS0038 矩形波信号 单片机中断接口 是否有上升沿 /读取时间 /时间清零 引导标志位是否为1 1 时间是否为0、1、2 2 错误,引导标志置0,时间置0,中断置0 有 0 时间是否满足引导码 是 引导标志置1,中断计数置0,时间清零 否 时间清零 0 中断计数+1,数据位移,低位置0 中断计数+1,数据位移,低位置0 中断计数为8/16/24/32 24 数据储存 8 地址储存 16 地址进行相加校验是否成功 失败 所有数据清零 成功 32 数据校验是否成功 否 数据清零 是 输出数据 程序流程图 主函数 TMOD = 0xF0; //将TMOD的低4位定时器0控制部分清零 TMOD |= 0x01; //设置定时器0为方式1 TL0 = 0x33; //设置定时器0初值低8位 TH0 = 0xFE; //设置定时器0初值高8位 TR0 = 1; //启动定时器0 ET0 = 1; //Timer0中断允许 IT1 = 1; //下降沿触发方式 EX1 = 1; //外部INT1中断允许 EA = 1; //开全局中断 LCD1602_init(); //调用1602液晶初始化函 while (1) 定时器中断 void Timer0(void)interrupt 1 { //定时250微秒 TL0 = 0x33; //重新给TL0赋初值 TH0 = 0xFE; //重新给TH0赋初值 tmr_times++;//计时周期自加 //****************************************** } 接收信号中断 0/1判断 void one_zero() { lanth = 0; if ((tmr_times 2) (tmr_times 7))//信号时长 { lanth = 0; } else if ((tmr_times 7) (tmr_times 13)) { lanth = 1; } } 接收信号存储 one_zero();//01判断 code_data = code_data 1;//右移一位以存储信息 if (lanth == 1) { code_data |= 0x80;//最高位为1 } else { code_data = 0x7f;//最高位为0 } tmr_times = 0;//引导时间清零 lanth = 0; 对信号进行校验 if (int_times == 8)//用户地址赋值 { address = code_data; } else if (int_times == 16)//地址检验 { if (code_data + address != 0xff) wrong(); } else if (int_times == 24)//数据码记录 { code_data1 = code_data; } else if (int_times == 32) //数据码校验/校验正确,显示 { int_times = 0; head_ok = 0; if (code_data1 == ~code_data) { flagf = 1; shuju = code_data1; } else flagf = 0; } 错误数据清零 void wrong() { int_times = 0; tmr_times = 0; head_ok = 0; code_data = 0; lanth = 0; flagf = 0; } LCD1602显示 void LCD1602_init(void) { Delay1602(1500); //调用延时函数

文档评论(0)

1亿VIP精品文档

相关文档