为什么我写的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工作方式2,8位自动重装
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; //设置串口工作方式1,10位异步
}
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;
}
}
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
除了引导码、用户码和数据码以外,协议最后还有一个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