/************************************************************************
9(L) + 4.5(H) = 13.5 START 单位:MS
0.56(L) + 0.565(H) = 1.125 '0'
0.56(L) + 1.685(H) = 2.245 '1'
9(L) + 2.5(H) = 11.5 STOP
4个字节 两个部分
第一部分 遥控器辨识码
第二部分 操作码
问题:
我这是写的一个遥控器解码的程序,用的芯片是STC15F2K60S2
用示波器查看遥控器的辨识码是 0x00 0xFD
读取红外一体化接收用的是P11,利用捕获的下降沿中断
在中断中读取脉冲的间隔来判断是‘1’,还是‘0’
然后利用位运算将数据存到全局变量Code中
用串口将解码显示出来
可是在中断中左移和右移的情况不同,左移的数据有点怪,辨识码不是0x00 0xFD 总是0xFF 0xFF
理论上应该都是一样的啊,请问有没有朋友遇到过类似情况,请问各位有什么见解?
*****************************************************************************/
#include <IAP15F2K61S2.h>
#include <intrins.h>
#include "Uart.h"
#define uchar unsigned char
#define uint unsigned int
//调试标志
#define DEBUG_BIT 0
#define DEBUG_BIT2 1
unsigned long int Code = 0;
char Bit = 31;
char Bit2 = 0;
uint Time_Span = 0; // 时间间隔
uchar Start = 0; // 开始标志
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE6; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void Timer0Init() //100微秒@24.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x00; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0开始计时
ET0 = 0;
}
void CCP0Init()
{
CCAPM0 = 0x11;
CCF0 = 0;
}
void CCP0() interrupt 7
{
TR0 = 0; //关闭定时器
Time_Span = (TH0<<8)+TL0; //读出间隔
TH0 = 0x00; //清零
TL0 = 0x00;
TR0 = 1; //开启定时器
#if DEBUG_BIT //串口读回的数据有点怪
if(Bit>=0)
{
if(Time_Span>=1000 && Time_Span<1300)
{
Code = Code & (~(0x00000001<<Bit));
Bit--;
}
if(Time_Span>=2000 && Time_Span<2500)
{
Code = Code | (0x00000001<<Bit);
Bit--;
}
}
#endif
#if DEBUG_BIT2 //数据正常
if(Bit2<=31)
{
if(Time_Span>=1000 && Time_Span<1300)
{
Code = Code & (~(0x80000000>>Bit2));
Bit2++;
}
if(Time_Span>=2000 && Time_Span<2500)
{
Code = Code | (0x80000000>>Bit2);
Bit2++;
}
}
#endif
CCF0 = 0;
}
void Delay200ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 10;
j = 31;
k = 147;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
UartInit();
Timer0Init();
CCP0Init();
EA = 1;
while(1)
{
#if DEBUG_BIT
if(Bit<0)
{
sendChar_Uart((Code>>24)&0xFF);
sendChar_Uart((Code>>16)&0xFF);
sendChar_Uart((Code>>8)&0xFF);
sendChar_Uart(Code&0xFF);
Delay200ms();
Bit=31;
}
#endif
#if DEBUG_BIT2
if(Bit2>31)
{
sendChar_Uart((Code>>24)&0xFF);
sendChar_Uart((Code>>16)&0xFF);
sendChar_Uart((Code>>8)&0xFF);
sendChar_Uart(Code&0xFF);
Delay200ms();
Bit2=0;
}
#endif
}
} |