NEC红外通讯协议的问题

为什么我写的nec红外协议,通过遥控器单片机,通过串口传输到电脑上四个字节只传了一个字节?


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit IR=P3^2;
uchar IRtime;
uchar IRdata[33];
uchar IRcord[4];
bit IRprook,IRok;//标志位
void init()
{  
    TMOD = 0x22; //定时器0和定时器1工作方式28位自动重装
    TH0 = 0x00;  //高8位装入0那么定时器溢出一次的时间是256个机器周期
    TL0 = 0x00;
    EA = 1;      //总中断
    ET0 = 1;       //定时器0中断
    TR0 = 1;     //启动定时器0

    IT0 = 1;       //设置外部中断0为跳沿触发方式,来一个下降沿触发一次
    EX0 = 1;       //启动外部中断0

    TH1 = 0xfd;  //此溢出率为波特率9600
    TL1 = 0xfd;
    TR1 = 1;     //启动定时器1
    SM1 = 1;     //设置串口工作方式110位异步
}

void time() interrupt 1
{
    IRtime++;
}

void jiance() interrupt 0
{
    static bit biaozhi;
    static uchar i;
    if(biaozhi)
    {
        if((IRtime<53)&&(IRtime>=32))
            i=0;
        IRdata[i]=IRtime;
        IRtime=0;
         i++;
         if(i==33)
         {
             i=0;
             IRok=1;
            
         }
    }
    else
    {
        biaozhi=1;
        IRtime=0;
    }
    
}

void jiema() 
{
    uchar k,i,j,zijie,cove;
    k=1;
    for(i=0;i<4;i++)
    {
        for(j=0;j<8;j++)
        {  cove=IRdata[k];
            if(cove>5)
            zijie|=0x80;
            if(j<7)
            {
                zijie=zijie>>1;
            }
            k++;
        }
        IRcord[i]=zijie;
        zijie=0;
    }
    IRprook=1;
}

void main()
{  uchar i;
    init();
    while(1)
    {
    if(IRok==1)
    {
        jiema();
        IRok=0;
        if(IRprook)
        {
        for(i=0;i<=3;i++)
        {
            SBUF = IRcord[i];
            while(!TI)
      TI=0;                
        }
            IRprook=0;
        }
    }
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 看下这篇博客,也许你就懂了,链接:【字符设备驱动】 -- NEC红外通信原理|红外协议|红外驱动|红外编解码|红外遥控器...
  • 除此之外, 这篇博客: 红外遥控NEC协议总结中的 三、NEC协议脉冲数据码介绍 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    在这里插入图片描述
    除了引导码、用户码和数据码以外,协议最后还有一个1bit的停止位,用于数据发送完毕判断。

    一个NEC数据帧占用的时间长度包括:(引导码,9ms的高电平和4.5ms的低电平,然后是32位数据[其中包括:两字节用户码,第三字节是数据码,第四字节是数据反码]和1位停止位):即引导码:(9+4.5)ms + 32位数据[全是高电平时,(32x2.25)ms; 全是低电平时,(32x1.12)ms] + 1位停止位(0.5625ms),所以一帧数据所占用的时间范围是:
    9+4.5+35.84+0.5625 = 49.9025ms < frame_data_time(NEC) < 9+4.5+72+0.5625 = 86.0625ms


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^