找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 4312|回复: 0
收起左侧

无线解码

[复制链接]
ID:40847 发表于 2012-5-25 17:55 | 显示全部楼层 |阅读模式

在这个程序里有一条我不知道什么意思,看了好几天也没搞懂,请帮我解一下:Rem_Code[j]++;

 

 

 

 

 

 ; 效果:按手持式4键发射器上的任意按键,程序能解码出来,并在发光管上显示
 ;======= 模拟 pt2272 接收=========================
************************************************/

#include"AT89x52.h"
//#include"global.h"
#include"intrins.h"
#include"51hei.H"

#define  uchar  unsigned char
#define  uint   unsigned int

uchar Rem_Code[3];
uint TimeCount;
sbit Get_Rem=P3^2;

/* //延时函数
void Delay100us(void)
{
 uchar i;
 for(i=0;i<55;i++)
 {
  _nop_();
 }
}
*/

void delay8(uint t)
{
while(--t);
}

void Delay100us(void)
{
delay8(13); //8-18
}

//因为他的格式是00表示"0"11表示"1"01表示"F"所以我们要把12位乘以2等于24位刚好是3个字节
//第一二个字节是地址码,第三个字节是数据码
//发射芯片采用的是PT2262芯片用4.7M的震荡电阻315M发射
//遥控我们全部默认地址码是 FFFFFFFF 单片机解码出来就是0x55 0x55
//遥控处理函数
void Remote_Process(void)
{
 uchar i,j,Count=0;
 Delay100us();
 if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0
 {//等于0后表示按键释放
  TimeCount--;
 }
 if(Get_Rem==0)//如果有低电平就进入解码
 { 
  for(Count=0;Count<100;Count++)//判断12毫秒左右的引导码
    {
     Delay100us();//100us*100=10ms
     if(Get_Rem==1)//如果在延时10毫秒期间有高电平出现就是干扰信号退出解码
     {
      return;
     }
    }
   while(Get_Rem==0);//等待低电平结束
   for(j=0;j<3;j++)//8位地址码加4位数据码
     {
    for(i=0;i<8;i++)
    {
     Count=0;
    do
    {
     Delay100us();
     Count++;
     if(Count>20)//如果在大于2毫秒高电平还没有结束认为是干扰退出解码
     {//理论上是1.2毫秒,我们2毫秒留有余量,防止遥控批量中的误差
      return;
     }
    }while(Get_Rem==1);//计算高平时间并等待结束
    Count=0;
    do
    {
     Delay100us();
     Count++;
     if(Count>20)//如果在大于2毫秒低平还没有结束认为是干扰退出解码
     {
      return;
     }
    }while(Get_Rem==0);//计算低电平时间并等待结束
    Rem_Code[j]<<=1;//数据从高位开始接收所以每次向左移一位
          if(Count<8)//如果低电平时间小于800毫秒认为该位为1
          {
     Rem_Code[j]++;
          }
     }
  }
  //huqin
        ACC=Rem_Code[2];
        if(ACC==0xc0)
  P0=0xef;
  if(ACC==0x30)
  P0=0xdf;
  if(ACC==0x0c)
  P0=0xbf;
  if(ACC==0x03)
  P0=0x7f;
  

   if(TimeCount==0)//为0表示是新的一次按下对其进行处理
   {//如过该值大于0表示已经按下不在处理,保证按下一次只做一次处理
   // if((Rem_Code[0]==Addr_Code_H)&&(Rem_Code[0]==Addr_Code_L))
   // {
//     if(Rem_Code[2]==Key_A)//如果数据与A键的值相等表示A键按下对其处理
  //   {//试验用A键来控制继电器的开关
     // Com_Relay;//继电器取反
     // Nokia3310();//显示继电器的状态
     // Bz_Out();//蜂鸣器响一声
   //  }
   // }
   //P2_2=0;
   }
   TimeCount=1000;//按键按下标志
 }
}


void main()
{
AUXR=0x01;
P1_4=0;
guandz();
guanled();

 while(1)
 {
  Remote_Process();//遥控处理
 }

}

回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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