找回密码
 立即注册

QQ登录

只需一步,快速开始

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

无线红外通信系统的接收端 怎么实现把这两个八位数据合并成一个十六位数据并显示?

[复制链接]
ID:477407 发表于 2019-2-21 20:52 | 显示全部楼层 |阅读模式
发送端一共发送给了两个八位数据,红外接收端显示的时候是轮流显示这两个八位数据,怎么实现把这两个八位数据合并成一个十六位数据并显示,由于程序占用的都是a[2]这一个数据码地址,然后两个八位数据轮流传输过来 怎么提取出来这两个八位数据啊····
#include<reg52.h>
#include"12864.h"
#include<intrins.h>  //包含_nop_()函数定义的头文件
sbit IR=P3^2;           //将IR位定义为P3.2引脚
unsigned char a[4];    //储存用户码、用户反码与键数据码、键数据反码
unsigned char om,pm,qm,rm,num1,num2;

unsigned int LowTime,HighTime,num; //储存高、低电平的宽度
void fenjie()
{        
         ?????
        num=num2;
    num<<=8;
    num|=num1;
                     om=num/1000;
                         pm=num%1000/100;
                         qm=num%1000%100/10;
                         rm=num%1000%100%10;

}
bit DeCode(void)        
{

   unsigned char  i,j;
        unsigned char temp;    //储存解码出的数据
        for(i=0;i<4;i++)      //连续读取4个用户码和键数据码
          {
                 for(j=0;j<8;j++)  //每个码有8位数字
                         {
                 temp=temp>>1;  //temp中的各数据位右移一位,因为先读出的是高位数据                                                                        
                           TH0=0;         //定时器清0
                           TL0=0;         //定时器清0
                           TR0=1;         //开启定时器T0
                      while(IR==0)   //如果是低电平就等待
                       ;              //低电平计时
                             TR0=0;         //关闭定时器T0
                           LowTime=TH0*256+TL0;    //保存低电平宽度
                           TH0=0;         //定时器清0
                           TL0=0;         //定时器清0
                           TR0=1;         //开启定时器T0
                          while(IR==1)   //如果是高电平就等待
                               ;                           
                           TR0=0;        //关闭定时器T0
                           HighTime=TH0*256+TL0;   //保存高电平宽度
                           if((LowTime<360)||(LowTime>680))   
                                              return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码                        
                           if((HighTime>400)&&(HighTime<680))   //如果高电平时间在560微秒左右,即计数560/1.085=516次
                                   temp=temp&0x7f;       //(520-100=420, 520+100=620),则该位是0
                           if((HighTime>1400)&&(HighTime<1850)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
                                   temp=temp|0x80;       //(1550-250=1300,1550+250=1800),则该位是1
                     }                                      
           a=temp;        //将解码出的字节值储存在a                                                                                                                                                                        
    }                                                   
  if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码
         return 1;     //解码正确,返回1
}
void init(void)
{
    E=1;
        CS1=0;CS2=0;         
    lcd_clear();
    lcd_init();
        EA=1;        //开启总中断

   ET0=1;       //定时器T0中断允许
   IT0=1;       //外中断的下降沿触发  
    TMOD=0x01;   //使用定时器T0的模式1        
        TR0=0;       //定时器T0关闭
  EX0=1;       //开外中断0

}
void display()
{
省略
}
void main(void)
{               
    init();
        while(1)
        {
           // fenjie();
          display();


    }

}


/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0
  {         
     EX0=0;      //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
          TH0=0;      //定时器T0的高8位清0
         TL0=0;      //定时器T0的低8位清0
          TR0=1;            //开启定时器T0         
          while(IR==0);          //如果是低电平就等待,给引导码低电平计时
          TR0=0;                //关闭定时器T0     
          LowTime=TH0*256+TL0;  //保存低电平时间
          if(((LowTime>8500)&&(LowTime<9500))!=1) {EX0=1;return;}
          TH0=0;      //定时器T0的高8位清0
          TL0=0;      //定时器T0的低8位清0
        fenjie();   TR0=1;            //开启定时器T0
while(IR==1);  //如果是高电平就等待,给引导码高电平计时
         
         
          TR0=0;        //关闭定时器T0
          HighTime=TH0*256+TL0;        //保存引导码的高电平长度
  if((HighTime>4000)&&(HighTime<5000))
                {         
                        DeCode();
                   fenjie();     
                 
          }
                  
        EX0=1;

  }

QQ截图20190221205235.jpg
回复

使用道具 举报

ID:213173 发表于 2019-2-21 21:38 | 显示全部楼层
x=(a[0]<<8)|a[1];

评分

参与人数 1黑币 +10 收起 理由
iofree + 10 真是直截了当!

查看全部评分

回复

使用道具 举报

ID:303383 发表于 2019-2-21 22:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:478073 发表于 2019-2-21 23:09 | 显示全部楼层
高八位数据*255,再for移到int变量中+char型变量值

评分

参与人数 1黑币 +10 收起 理由
areyouok + 10

查看全部评分

回复

使用道具 举报

ID:158375 发表于 2019-2-22 08:21 | 显示全部楼层
十六位数据分为高低两个字节。高低字节,分别显示。
回复

使用道具 举报

ID:123289 发表于 2019-2-22 12:09 | 显示全部楼层
楼对计算机是如何存放数据的,了解不够啊。
只说一点:
计算机只认一个字节的数据(限8位机),即0-255,如果超过255就再开一个字节拼,还不够再开一个再拼。
这样就可以适应任何大小的数据了。

如何把“两个八位数据合并成一个十六位数据”?
看你高兴,可以随便放在任意两个单元的字节中,前后随你定。不过你如何放的,如何定的,你要记住,用的时候也要按你定的规则来用,这样就可以了。
一般会放在连续的两个单元中,且低位在前,高位在后。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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