?? saa3010紅外遙控接收程序.c
字號:
#i nclude <reg52.h>
#define uchar unsigned char
// SAA3010存儲定義
uchar ykcode; //遙控碼(14位的最后8位)
bit ykok; //遙控數據有效標志
uchar ykbnum; //遙控已接收位數
uchar ykbtc; //遙控中斷時 ykbtc=TH1
uchar ykdelay; //遙控延時接收
bdata uchar ykcodetemp; //遙控臨時碼
sbit ykcodetemp0=ykcodetemp^0;
// SAA3010端口定義
//sbit YKIO=P3^3; //遙控使用外部中斷0,接P3.2口
// SAA3010函數原型: 公用函數
void YkInit(void); //遙控接收初始化
unsigned char YkGetcode(void); //返回遙控碼
bit YkTest(void); //檢查有無遙控信號
/*
// SAA3010函數原型: 公用函數
extern void YkInit(void); //遙控接收初始化
extern unsigned char YkGetcode(void); //返回遙控碼
extern bit YkTest(void); //檢查有無遙控信號
*/
/*
// 外部引用四位LED顯示模塊 //
extern unsigned char code tab_duam[]; //位映射
extern void led_send(unsigned char d); //發送子程序
extern void led_cls(void); //清除顯示
extern void led_show(unsigned int n); //顯示數字子程序
extern void led_showhh(unsigned int n); //16進制顯示數字子程序
extern void led_test(void); //4LED測試函數
extern void led_delay(unsigned char ms); //延遲函數
*/
// SAA3010函數內容
void YkInit(void) //遙控接收初始化
{
TMOD=0x11; //TMOD T0,T1均選用方式1(16位定時)
SCON=0x00;
TH1=0;
TL1=0;
IE|=0x89; //SETB EX0 0x1 外部中斷 0 允許
//SETB ET0 0x8 定時器 1 中斷允許
//SETB EA 0x80 開中斷
IP|=0x01; //SETB INT0 中斷優先
TCON |= 0x41; //TCON EX0下降沿觸發,啟動T1 //
ykbnum=0;
ykcodetemp=0;
ykdelay=0;
}
unsigned char YkGetcode(void) //返回遙控碼
{
return(ykcode);
}
bit YkTest(void) //檢查有無遙控信號
{
return(ykok);
}
void intx0() interrupt 0 using 2 //遙控使用外部中斷0,接P3.2口
{
ykbtc=TH1;TH1=0;TL1=0;TR1=1;ET1=1;
switch(ykbnum)
{
case(0):
ykbnum=1;
break;
case(1):
if(ykbtc==6)ykbnum=2;
else ykbnum=0;
break;
case(2):
if(ykbtc==6||ykbtc==9)ykbnum=3;
else ykbnum=0;
break;
case(3):
if(ykbtc==9||ykbtc==6){ykbnum=4;}
else ykbnum=0;
break;
default:
if(ykbnum<7)if(ykbtc==6)ykbnum++;
else ykbnum=0;
else
{
if(ykbtc==6){if(ykcodetemp0)ykcodetemp=ykcodetemp*2+1;
else ykcodetemp=ykcodetemp*2;
ykbnum++;
}
else if(ykbtc==9){ if(ykcodetemp0){ykbnum++;ykcodetemp=ykcodetemp*2;}
else {ykbnum+=2;ykcodetemp=ykcodetemp*2;ykcodetemp=ykcodetemp*2+1;}
}
else if(ykbtc>11&&ykbtc<15)
{ykbnum+=2;ykcodetemp=ykcodetemp*2;ykcodetemp=ykcodetemp*2+1;}
else if(ykbtc>30){EX0=1;}
else ykbnum=0;
}
}
}
void intt1() interrupt 3 using 3 //遙控使用定時計數器1
{
if(ykdelay){ykdelay--;EX0=0;} //ykdelay不為0暫停接收
else
{
if(ykbnum==13) //遙控碼最后一位為0,補0
{
ykcode=ykcodetemp*=2;
ykdelay=3;
EX0=0; //暫停接收
ykok=1; //遙控數據有效
}
else if(ykbnum==14) //遙控碼最后一位為1,不用補
{
ykcode=ykcodetemp;
ykdelay=3;
EX0=0; //暫停接收
ykok=1; //遙控數據有效
}
else EX0=1; //ykbnum不為13,14接收無效,繼續接收
ykbnum=0;
ykcodetemp=0;
}
}
/*
// SAA3010測試主函數內容
main()
{
YkInit();
led_test(); //4LED測試函數
for(;1;) //主程序
{
if (YkTest())
led_showhh(YkGetcode());
led_delay(10);
}
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -