找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2570|回复: 5
收起左侧

求大神帮忙讲解一下这个红外接收程序

[复制链接]
ID:160317 发表于 2017-4-30 22:36 | 显示全部楼层 |阅读模式
#include <reg52.H>
#include <intrins.h>

#define uchar unsigned char   
#define uint  unsigned int  

uchar code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0X77,0X7c,0X39,0X5e,0X79,0X71,0x00};

sbit IR=P3^2;
sbit we1=P1^0;
sbit we2=P1^1;
sbit we3=P1^2;
sbit we4=P1^3;                 

uchar        N[4];                                 //识别码,数据码存放
uchar   X1,X2;

void XSQ(void);
void YS(uchar time);

/****************** 主函数 *******************/
void main(void)
{
       
  X1=X2=0;


  IT0 = 1;
  EX0 = 1;
  EA  = 1;

  while(1)
  {
   XSQ();
  }
}

/**********************数码管显示函数************************/
void XSQ(void)
{
         we1=0;
     we2=0;
         we3=0;
         we4=0;
     we1=0;P0=tab[X1];we2=1;YS(1);       
     we2=0;P0=tab[X2];we1=1;YS(1);
}

/********************** 外部中断函数************************/
void exint0() interrupt 0
{          
   uint cnt;
   uchar i;

   EX0 = 0;
   cnt = 0;       
       
   while(!IR)
   {
   cnt++;
    }                             //记录引导码时间
   if(cnt < 1000)
                   {EX0=1;return;}                   //9ms的计数值(12MHz:1000< cnt <1500)
          
   cnt = 0;
                            
   while(IR)
    {
       
   if(cnt++>400)
                   {EX0=1;return;}
                }        //防卡死,超时保护(12MHz: > 300)   
   if(cnt<200)
                   {EX0=1;return;}
                           //(12MHz不分频: <260)            
          
   for(i=0; i<32; i++)                             //读取32位位码
       {
         cnt = 0;                                                                                                                                               
         while(!IR);                       
         while(IR)
                 if(cnt++ > 200)
                         {EX0=1;return;}  //超时保护(12MHz:>=200)
         N[i/8] >>= 1;
         if(cnt>60) N[i/8] |= 0x80;                //0和1的计数界线(12MHz:< 109)   
       }

         if(N[0] == ~N[1] && N[2] == ~N[3])            //校验识别码,数据码       
           {
          
                X1 = N[2]/16;
                X2 = N[2]%16;
           }

        EX0 = 1;
                         
}

/***************************************************************
延时程序
1ms×time       (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
     uchar i,j;
         for(i=0; i<time; i++)
     for(j=0; j<247; j++)_nop_();

}

回复

使用道具 举报

ID:160317 发表于 2017-4-30 22:37 | 显示全部楼层
void exint0() interrupt 0
{         
   uint cnt;
   uchar i;

   EX0 = 0;
   cnt = 0;        
        
   while(!IR)
   {
   cnt++;
    }                             //记录引导码时间
   if(cnt < 1000)
                   {EX0=1;return;}                   //9ms的计数值(12MHz:1000< cnt <1500)
           
   cnt = 0;
                           
   while(IR)
    {
        
   if(cnt++>400)
                   {EX0=1;return;}
                }        //防卡死,超时保护(12MHz: > 300)   
   if(cnt<200)
                   {EX0=1;return;}
                           //(12MHz不分频: <260)            
           
   for(i=0; i<32; i++)                             //读取32位位码
       {
         cnt = 0;                                                                                                                                                
         while(!IR);                       
         while(IR)
                 if(cnt++ > 200)
                         {EX0=1;return;}  //超时保护(12MHz:>=200)
         N[i/8] >>= 1;
         if(cnt>60) N[i/8] |= 0x80;                //0和1的计数界线(12MHz:< 109)   
       }

         if(N[0] == ~N[1] && N[2] == ~N[3])            //校验识别码,数据码        
           {
           
                X1 = N[2]/16;
                X2 = N[2]%16;
           }

        EX0 = 1;
                        
}
他的这个时间是怎么算的啊????求大神带我飞啊!!!
回复

使用道具 举报

ID:160317 发表于 2017-4-30 23:18 | 显示全部楼层
还有超时保护是什么意思啊???
回复

使用道具 举报

ID:167933 发表于 2017-4-30 23:38 | 显示全部楼层
建议你先看一下红外通信原理,红外接收数据解码的方式跟编码类似。时间的计算也是根据数据格式当中的高低电平的时间来定的。我最近也在学习红外通信这一块,希望能对你有所帮助。相互学习,共同进步。
QQ图片20170430233609.png
QQ图片20170430233617.png
回复

使用道具 举报

ID:160317 发表于 2017-5-1 14:52 来自手机 | 显示全部楼层
这个我都知道,我想问这个程序中的38k是怎么算出来的
回复

使用道具 举报

ID:160317 发表于 2017-5-1 14:53 来自手机 | 显示全部楼层
不是,看错了,我想问cnt++的时间怎么算出来的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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