?? main.c
字號:
/*----------------------------------------
紅外遙控解碼
(M50560電視遙控器)
Copyright 2005/9/13
All rights reserved.
明浩 E-mail: pnzwzw@163.com pnzwzw@cdle.net
一體化接收頭輸出端拉P3.2(int0),P1為控制輸出端。
可以擴展到32路或更多
輸出為低電平有效
----------------------------------------*/
#include <AT89x051.h>
void InitCom(void);
void ComOutChar(unsigned char OutData);
void DelayA(void);
void DelayB(void);
void main(void)
{
unsigned int TempCyc;
InitCom(); //初始化串口
EA = 1; //允許CPU中斷
IT0 = 1; //INT0下降沿有效
EX0 = 1; //開INT0中斷;
ComOutChar(1);
ComOutChar(5);
ComOutChar(3);
do
{
for (TempCyc=0; TempCyc<35000; TempCyc++)
P3_7 = 0;
for (TempCyc=0; TempCyc<30000; TempCyc++)
P3_7 = 1; //工作指示LED
}
while(1);
}
//INT0中斷
void INT0Fun(void) interrupt 0 using 2
{
unsigned char IRCode[2], IROK;
unsigned int TempCyc, TempCycB, TempCycA;
EX0 = 0; //外部中斷0關閉
IROK = 0;
DelayA(); //延時等待引導碼的前半部結束
DelayA();
if (!P3_2) //檢驗前半部是否過早結束,防干擾
{
for (TempCycA=0; TempCycA<2; TempCycA++)
{
DelayA();
if (P3_2) //檢驗前半部是否過早結束,防干擾
{
for (TempCyc=0; TempCyc<300; TempCyc++)
if (!P3_2) break; //等待第一個位,
if (TempCyc<300) //超時檢驗
{
for (TempCyc=0; TempCyc<8; TempCyc++)
{
while(!P3_2); //等待P3_2拉高,開始位的下部分
DelayB(); //這里沒設超時,實際應用在多功能的設計時應設超時
IRCode[TempCycA] = IRCode[TempCycA]>>1;
if (P3_2) //當延時750us后P3_2仍為高則當前位為1
{
IRCode[TempCycA] = IRCode[TempCycA] | 0x80;
for (TempCycB=0; TempCycB<100; TempCycB++)
if (!P3_2) break; //等待下個位 當位1時高電平為1.5ms,
if (TempCycB>99) //之前已延時了750us, 所以超時應大于1.5ms-750us
goto endchk; //這里最大為1ms
}
}
}
else
goto endchk; //超時
}
else
goto endchk;
IROK++; //當自定碼和數(shù)據(jù)碼都完成時為2
}
}
endchk:
if (IROK==2)
{
ComOutChar(IRCode[0]);
ComOutChar(IRCode[1]); //連接PC串口查看自定義碼和數(shù)據(jù)碼
if (IRCode[1]==0x10) //1號鍵 //只演示點亮2只LED,讀者可以自行擴展控制別的器件
P1_7 = ~P1_7;
if (IRCode[1]==0x11) //2號鍵
P1_6 = ~P1_6;
for (TempCyc=0; TempCyc<300; TempCyc++)
DelayA(); //延時
}
EX0 = 1;
}
//向串口輸出一個字符(非中斷方式)
void ComOutChar(unsigned char OutData)
{
SBUF = OutData; //輸出字符
while(!TI); //空語句判斷字符是否發(fā)完
TI = 0; //清TI
}
//串口初始化 晶振為12M 方式1 波特率4800
void InitCom(void)
{
SCON = 0x50; //串口方式1,允許接收
TMOD = 0x21; //定時器1定時方式2,定時0為模式1,16位模式
TCON = 0x40; //設定時器1開始計數(shù)
TH1 = 0xF3; //設波特率為4800
TL1 = 0xF3;
PCON = 0x80; //波特率加倍控制,SMOD位
RI = 0; //清收發(fā)標志
TI = 0;
TR1 = 1; //啟動定時器
}
void DelayA(void)
{
unsigned int TempCyc;
for (TempCyc=0; TempCyc<650; TempCyc++); //3.5
}
void DelayB(void)
{
unsigned int TempCyc;
for (TempCyc=0; TempCyc<93; TempCyc++); // 0.75ms
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -