?? 紅外接收.txt
字號:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
/*********************************************
紅外編碼_紅外通信
*********************************************/
data uchar tab[80];
uchar i=0,l=0;
bit sentok=0;
/******************************************/
void initTimer(void)
{
TMOD=0x1; //計數方式1
TH0=0x0; //從0開始計數
TL0=0x0;
}
/**********************************************/
void initUart(void)
{
TMOD|=0x20; //再開計數方式2
SCON=0x50; //8(10)位串口波特率方式1
PCON|=0x80; //波特率加倍
TH1=0xfa; //波特率設定為 :57600 //4.8K
TL1=0xfa;
TR1=1; //開定時計數器1
ES=1; //允許串口中斷
}
/***************************************/
void sentstr()
{
i=0;
l=0;
IE0=0; //外部0中斷標志位
EX0=1; //允許外部中斷中斷
}
////////////////////////////////////////////
void check()
{
uchar n,p=0;
if(tab[0]==0x20)
{
for(n=34;n<49;n++,n++)
{
if(tab[n]==0x03 | tab[n]==0x04 | tab[n]==0x05)
p=p>>1;
else
if(tab[n]==0x07 | tab[n]==0x08 | tab[n]==0x09)
{
p=p>>1;
p|=0x80;
}
else break;
}
return(p);
}
}
/////////////////////////////////////////////////////////////
void main(void)
{
char KEY;
IT0=1; //外部下降沿邊沿觸發中斷
EX0=1; //允許外部INT0中斷
initTimer();
initUart();
EA=1; //開總中斷
while(1)
{
if(sentok)
{
sentok=0;
KEY=check();
sentstr();
}
}
}
///////////////////////////////////////////////////
void int0(void) interrupt 0 //外部中斷0
{
if(l==0)
{
TR0=1; //定時計數開始
ET0=1; //允許定時器T0溢出中斷
}
else
if(l<33)
{
tab[i++]=TH0;
tab[i++]=TL0;
TH0=0x0;
TL0=0x0;
}
else
if(l==33)
{
tab[i++]=TH0;
tab[i++]=TL0;
TH0=0x0;
TL0=0x0;
TR0=0;
ET0=0;
EX0=0;
sentok=1;
}
l++;
}
////////////////////////////////////////////////
void timer0(void) interrupt 1 //定時計數中斷
{
ET0=0; //允許定時器溢出中斷
TR0=0; //T0停止計數
i=0;
l=0;
TH0=0x0;
TL0=0x0;
}
/**********************************************/
void uart(void) interrupt 4 //串口中斷
{
if(RI)
{
RI=0; //接收中斷標志,只能由軟件清零
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -