關(guān)于我們
18925580829
13926563901
發(fā)布時間:2018-04-09 瀏覽量:
標簽:
it |
#include
#include
typedef unsigned char uChar8;
typedef unsigned int uInt16;
bit IR_OK;
bit Pro_OK;
sbit SEG_SELECT = P2^7;
sbit BIT_SELECT = P2^6;
sbit IR = P3^2; //紅外接口
uChar8 g_IR_Time = 0;
uChar8 HL_PeriodArr[33] = {0};
uChar8 IRCord[4] = {0};
//void LedDisplay(void)
//{
//
//}
void IR_Pro(void) // 將時間値轉(zhuǎn)換為邏輯電平
{
uChar8 ujVal;
uChar8 uiVal;
uChar8 TL_Time;
uChar8 ByteVal;
uChar8 uNum = 1; // 避開第一個元素(引導(dǎo)碼)
for(uiVal = 0; uiVal < 4; uiVal++) //四個字節(jié)(用戶碼、用戶反碼、數(shù)據(jù)碼、數(shù)據(jù)反碼)的數(shù)據(jù)
{
for(ujVal = 0; ujVal < 8; ujVal++)
{
TL_Time = HL_PeriodArr[uNum];
if(TL_Time > 6) // 我們以中間値(1.685ms)作為判斷標準,說明是邏輯“1”
ByteVal |= 0x80;
else
ByteVal = ByteVal; // 說明為邏輯“0”
if(ujVal < 7)
{
ByteVal >>= 1;
}
uNum++; // 判斷下一個
}
IRCord[uiVal] = ByteVal;
ByteVal = 0x00;
}
if(IRCord[2] == ~IRCord[3])
{
Pro_OK = 1; // 處理工作完成
}
}
void Time0_Init(void)
{
TMOD |= 0x02; // 讓定時器工作在方式2,8位自動重裝
TH0 = 0;
TL0 = 0;
TR0 = 1; // 啟動定時器0
ET0 = 1;
}
void EX0_Init(void)
{
IT0 = 1; // 下降沿觸發(fā)
EX0 = 1; // 開外部中斷
EA = 1; // 開總中斷
}
void UART_Init(void)
{
TMOD &= 0x00; //清空定時器1
TMOD |= 0x21; //定時器1工作于方式2
TH1 = 0xfd; //為定時器1賦初值
TL1 = 0xfd; //等價于將波特率設(shè)置為9600
ET1 = 0; //防止中斷產(chǎn)生不必要的干擾
TR1 = 1; //啟動定時器1
SCON |= 0x40; //串口工作于方式1,不允許接收
}
void main (void)
{
UART_Init();
EX0_Init();
Time0_Init();
while(1)
{
if(IR_OK) // 說明解碼完成
{
IR_OK = 0;
IR_Pro(); // 處理時間値
}
if(Pro_OK)
{
Pro_OK = 0;
TI = 1;
printf("\n");
printf(" YuanQuan \n");
printf(" 努力! ");
printf("%x--%x--%x--%x\n",(uInt16)IRCord[0], (uInt16)IRCord[1], (uInt16)IRCord[2], (uInt16)IRCord[3]);
while(!TI); TI = 0;
}
//LedDisplay(IRCord);
}
}
void Timer0_ISR(void) interrupt 1
{
g_IR_Time++; // 每過256 * (12/11.0592)us
}
void EX0_ISR(void) interrupt 0 // 34個下降沿存儲完畢,這樣紅外解碼完成
{
// 存時間値到HL_PeriodArr[33]
static uChar8 uCounter; // 計數(shù),范圍為0~32
static bit StartFlag = 0;
if(!StartFlag) // 第一個下降沿,表示解碼開始
{
StartFlag = 1;
g_IR_Time = 0;
}
else if(StartFlag) // 從第二個開始一直到第33個下降沿
{
if((g_IR_Time < 50) && (g_IR_Time >= 32)) // 則說明這里是引導(dǎo)碼
uCounter = 0;
HL_PeriodArr[uCounter] = g_IR_Time; // 存的是時間値
g_IR_Time = 0; // 為下次存?zhèn)幾鰷蕚?/span>
uCounter++;
if(33 == uCounter) // 說明33次已經(jīng)存夠了
{
uCounter = 0;
IR_OK = 1; // 真正的存時間的任務(wù)已經(jīng)完成
StartFlag = 0;
}
}
}