找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2317|回复: 3
打印 上一主题 下一主题
收起左侧

这个程序能正确还原红外码吗?

[复制链接]
跳转到指定楼层
楼主
ID:149988 发表于 2017-2-24 16:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个显示红外遥控器红外码的程序,大家看,它能正确还原红外码吗?
//**************LCD1602显示接收到的红外线键值*******************/
#include<reg51.h>
#include"lcd.h"
sbit IRIN=P3^2;
unsigned char code CDIS1[13]={" Red Control "};
unsigned char code CDIS2[13]={" IR-CODE:--H "};
unsigned char IrValue[6];
unsigned char Time;
void IrInit();
void DelayMs(unsigned int );
/****************************主函数*******************************/
void main()
{
        unsigned char i;
        IrInit();       
        LcdInit();
        LcdWriteCom(0x80);
        for(i=0;i<13;i++)
        {
                LcdWriteData(CDIS1[i]);       
        }
        LcdWriteCom(0x80+0x40);
        for(i=0;i<13;i++)
        {
                LcdWriteData(CDIS2[i]);       
        }
        while(1)
        {
                IrValue[4]=IrValue[2]>>4;                          //高位
                IrValue[5]=IrValue[2]&0x0f;                //低位       
                if(IrValue[4]>9)
                {
                        LcdWriteCom(0xc0+0x09);                        //设置显示位置
                        LcdWriteData(0x37+IrValue[4]);        //将数值转换为该显示的ASCII码
                }
                else
                {
                        LcdWriteCom(0xc0+0x09);
                        LcdWriteData(IrValue[4]+0x30);        //将数值转换为该显示的ASCII码
                }       
                if(IrValue[5]>9)
                {
                        LcdWriteCom(0xc0+0x0a);
                        LcdWriteData(IrValue[5]+0x37);                //将数值转换为该显示的ASCII码
                }
                else
                {
                        LcdWriteCom(0xc0+0x0a);
                        LcdWriteData(IrValue[5]+0x30);                //将数值转换为该显示的ASCII码
                }       
        }
}                                                                         
/******************************延时*********************************/
void DelayMs(unsigned int x)   //0.14ms误差 0us
{
        unsigned char i;
        while(x--)
        {
                for (i=0; i<13; i++)
                {}
        }
}
/************************初始化红外线接收*************************/
void IrInit()
{
        IT0=1;//下降沿触发
        EX0=1;//打开中断0允许
        EA=1;        //打开总中断
        IRIN=1;//初始化端口
}
/**********************读取红外数值的中断函数************************/
void ReadIr() interrupt 0
{
        unsigned char j,k;
        unsigned int err;  //定义err双字节寄存器
        Time=0;                                         
        DelayMs(70);
        if(IRIN==0)         //如果IRIN==0即P3^2==0口接到引导码下降沿,确认接收到正确的信号
        {         
                err=1000;         //寄存器err输入值1000,等待时间限制10ms,检测9ms低电平引导码
/*两个条件都为真是循环,有一个条件为假跳出循环,免得程序出错,程序死在这里*/       
                while((IRIN==0)&&(err>0))        //在err=0之前IRIN=1,接收到9ms的低电平,接收到正确信号,等待9ms的起始高电平过去                 
                {                                            //在err=0之后IRIN=0,接收到大于9ms的低电平,接收到错误信号
                        DelayMs(1);
                        err--;     //减1000次延时10ms
                }
                if(IRIN==1)         //如果IRIN=1,正确等到9ms低电平,如果IRIN=0,等到错误信号,程序调回大循环
                {
                        err=500;         //寄存器err输入值500,等待时间限制5ms,检测4.5ms高电平引导码   
                        while((IRIN==1)&&(err>0))        //在err=0之前IRIN=0,接收到4.5ms的高电平,接收到正确信号,等待4.5ms的起始高电平过去
                        {                                            //在err=0之后IRIN=1,接收到大于4.5ms的低电平,接收到错误信号
                                DelayMs(1);
                                err--;     //减500次延时5ms
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据
                                {
                                        err=60;         //寄存器err输入值60,等待时间限制0.6ms,检测0.56ms低电平0码或1码的低电平起始部分                
                                        while((IRIN==0)&&(err>0)) //在err=0之前IRIN=1,接收到0.56ms的低电平,接收到正确信号,等待信号前面的560us低电平过去
                                        {                         //在err=0之后IRIN=0,接收到大于0.56ms的低电平,接收到错误信号
                                                DelayMs(1);
                                                err--;   //减60次延时0.6ms
                                        }
                                        err=100;         //寄存器err输入值100,等待时间限制14ms
                                        while((IRIN==1)&&(err>0))         //如果IRIN=1时间维持4-5个err,信号为0,如果IRIN=1时间维持>12个err,信号为1,
                                        {
                                                DelayMs(1);  //0.14ms
                                                Time++;      //通过Time检测高电平持续的时间
                                                err--;
                                                if(Time>22)  //如果Time>22时间维持>22个err,信号为1,
                                                {
                                                        EX0=1;
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                         //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:165046 发表于 2017-3-14 22:53 | 只看该作者
可以通过上板实验来验证啊,找一个有键码值得红外遥控,然后对照键码表检验就行了!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:149988 发表于 2017-3-15 08:16 | 只看该作者

RE: 这个程序能正确还原红外码吗?

zhaok2013 发表于 2017-3-14 22:53
可以通过上板实验来验证啊,找一个有键码值得红外遥控,然后对照键码表检验就行了!

原开发版,以下简称板。板带例程,板带遥控,同一个键按一次,按两次,按三次......值都不一样,且所有键值都与板带资料中键值不一样。是何原因?谢谢
回复

使用道具 举报

地板
ID:386703 发表于 2018-8-27 14:17 | 只看该作者
转换成ASCII为什么有的加0x30,有的加0x37
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表