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