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