找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602 红外遥控 显示数字!这里的是红外 处理的代码!1602初始化的 可根据1602手册...

[复制链接]
跳转到指定楼层
楼主
ID:687681 发表于 2020-7-18 09:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
# include <reg52.h>
# include "LCD1602.h"

sbit red_jie= P3^2;         // 红外接收引脚,外部中断 0 引脚

bit irpro_ok,irok;
unsigned char IRcord[4];   // 四个字节
unsigned char irdata[33]; // 32位 和 引导码
unsigned char  irtime;//红外用全局变量

void TIM0init(void);          // 定时器 0 初始化
void EX0init(void);          // 外部中断 0 初始化
void Ir_work(void);    //红外键值散转程序
void Ircordpro(void);//红外码值处理函数


int main(void)
{
    EX0init(); //初始化外部中断
    TIM0init();//初始化定时器
        chushihua();
        clear();
        while(1)
        {
            
                if(irok)
                {
                 Ircordpro();
                 irok=1;
                }
                if(irpro_ok)
                {
                  Ir_work();
                }


        }
        return 0;
       

}
void TIM0init(void)//定时器0初始化
{

  TMOD=0x02;//定时器0工作方式2: 八位自动重装模式        2^8=256-1 溢出后进入中断   
  TH0=0x00; //重载值                                                                255*irtime:两个下降沿的时间
  TL0=0x00; //初始化值
  ET0=1;    //开中断
  TR0=1;    // 定时器 0的开关
}
void tim0_isr (void) interrupt 1 //using 1
{
  irtime++;  //用于计数2个下降沿之间的时间
}
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
  static unsigned char  i;             //接收红外信号处理
  static bit startflag;                //是否开始处理标志位

if(startflag)                        
   {                                                 // 范围 越大,兼容性越好,但 误差会增大
    if(irtime<63&&irtime>=33)//引导码 TC9012的头码时间:9ms+4.5ms         (255us)*irtime:两个下降沿的时间
                        i=0;
                    irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
                    irtime=0;
                    i++;
                            if(i==33)
                              {
                                   irok=1;                // 数据发送结束,33个位 全部收集
                                 i=0;
                                  }
          }
           else                                    // 程序运行 第一次先运行这里
                {
                irtime=0;
                startflag=1;
                }

}
void EX0init(void)
{
IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1;   //使能外部中断
EA = 1;    //开总中断
}
void Ir_work(void)//红外键值散转程序
{
       switch(IRcord[2])//判断第三个数码值
                 {
                         case 0x0c:char_data(1,2,'1');break;//1 显示相应的按键值
                         case 0x18:char_data(1,2,'2');break;//2
                         case 0x5e:char_data(1,2,'3');break;//3
                         case 0x08:char_data(1,2,'4');break;//4
                         case 0x1c:char_data(1,2,'5');break;//5
                         case 0x5a:char_data(1,2,'6');break;//6
                         case 0x42:char_data(1,2,'7');break;//7
                         case 0x52:char_data(1,2,'8');break;//8
                         case 0x4a:char_data(1,2,'9');break;//9
             default:break;
                         }

                  irpro_ok=0;//处理完成标志

  }
  void Ircordpro(void)//红外码值处理函数
{
  unsigned char i, j, k;
  unsigned char cord,value;

  k=1;
  for(i=0;i<4;i++)      //处理4个字节
     {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata[k];                //  255us * 7 =1.785ms   选取 1.125 和 2.25 的中间值
          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
             value|=0x80;
          if(j<8)
                    {
                         value>>=1;
                        }
           k++;
         }
     IRcord[i]=value;
     value=0;     
     }
         irpro_ok=1;//处理完毕标志位置1
}



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

使用道具 举报

沙发
ID:748096 发表于 2020-7-24 20:18 | 只看该作者
是89C52单片机的吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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