|
HS0038接收頭,發(fā)射頭940nm
萬(wàn)能紅外遙控器
這個(gè)遙控器主要分為兩種模式
(1)遙控模式
在這個(gè)模式下這個(gè)遙控器可以遙控其他的紅外設(shè)備,和正常的遙控器一樣。
(2)學(xué)習(xí)模式
這個(gè)模式是獲取其他遙控器的用戶碼以及鍵碼,然后把獲取的用戶碼和鍵碼儲(chǔ)存到單片機(jī)的EEPROM中,所以這個(gè)遙控器具有掉電不丟失的功能。
最后一點(diǎn)就是介紹一下遙控器的小燈的功能。小燈起的是指示的功能,在剛開(kāi)機(jī)的時(shí)候,如果是遙控模式小燈閃兩下,學(xué)習(xí)模式小燈閃三下。在遙控模式下按鍵按一下,小燈閃一下。在學(xué)習(xí)模式下,紅外接收頭接收到一幀數(shù)據(jù)小燈閃兩下,連續(xù)接收兩幀數(shù)據(jù)小燈閃四下。按鍵按一下小燈閃一下。
AD畫的學(xué)習(xí)型紅外遙控電路原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (97.37 KB, 下載次數(shù): 15)
下載附件
2024-3-15 14:19 上傳
51hei.png (12.31 KB, 下載次數(shù): 19)
下載附件
2024-3-15 14:19 上傳
單片機(jī)源程序如下:
- /*
- 單片機(jī)型號(hào)STC15F2K60S2,晶振24MHZ
- */
- #include "config.h"
- #include "main.h"
- #include "keyboard.h"
- #include "PWM_Init.h"
- #include "EEPROM.h"
- #include "Infrared_Init.h"
- #include<intrins.h>
- uint8 IR_Send_Code[16][4];
- uint8 xdata IR_Send_Code2[16][4];
- uint8 Send_Flag[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- uint16 timebyte;
- uint8 T0RH = 0; //T0重載值的高字節(jié)
- uint8 T0RL = 0; //T0重載值的低字節(jié)
- uint8 LED_Control = 0;
- bit irflag = 0; //"紅外接收標(biāo)志,收到一幀正確數(shù)據(jù)后置1"
- unsigned char ircode[4]; //"紅外代碼接收緩沖區(qū)"
- bit MODE = 1;
- volatile unsigned char CodeBuff=30;
- void main()
- {
- P1=0XFF;
- LED = 1;
- ConfigTimer2(); //定時(shí)器0 1KHZ
- EEPROM_Init(); //把所有的EEPROM中的數(shù)據(jù)讀到緩存區(qū)中
- EA=1; //總中斷打開(kāi)
- if(Mode_CHO) //判斷要使用什么模式
- {
- MODE = 1; //遙控模式
- PWM_Init(); //產(chǎn)生38K載波
- LED_Control = 2; //小燈閃爍2次 代表控制模式
- }
- else
- {
- MODE = 0; //學(xué)習(xí)模式
- InitInfrared(); //紅外線接收初始化
- LED_Control = 3; //小燈閃爍2次 代表學(xué)習(xí)模式
- }
- while (1)
- {
- KeyDriver(); //按鍵驅(qū)動(dòng)
- if(irflag&&(CodeBuff<16)) //irflag接收完成標(biāo)志,
- {
- irflag=0;
- if(timebyte>=500)
- {
- IR_Send_Code[CodeBuff][0]=ircode[0]; //功能碼
- IR_Send_Code[CodeBuff][1]=ircode[1]; //功能碼反碼
- IR_Send_Code[CodeBuff][2]=ircode[2]; //鍵碼
- IR_Send_Code[CodeBuff][3]=ircode[3]; //鍵碼反碼
- Send_Flag[CodeBuff]=0;
- EEPROM_Write(); //接收第一個(gè)字節(jié)
- }
- if(timebyte<500) //在短時(shí)間內(nèi)收到第二個(gè)字節(jié)則接收
- {
- IR_Send_Code2[CodeBuff][0]=ircode[0]; //功能碼
- IR_Send_Code2[CodeBuff][1]=ircode[1]; //功能碼反碼
- IR_Send_Code2[CodeBuff][2]=ircode[2]; //鍵碼
- IR_Send_Code2[CodeBuff][3]=ircode[3]; //鍵碼反碼
- Send_Flag[CodeBuff]=1;
- EEPROM_Write();
- LED_Control=5; //接收第二個(gè)字節(jié)
- }
- timebyte=0;//從接收到第一幀數(shù)據(jù)開(kāi)始計(jì)時(shí)
- LED_Control += 2; //小燈閃爍2次 接收完成一次小燈閃爍兩次
- }
- }
- }
- /* 配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間 */
- void ConfigTimer2()
- {
- // AUXR &= ~0x04; //定時(shí)器2為12T模式
- // T2L = 0X60; //初始化計(jì)時(shí)值
- // T2H = 0Xf0;
- // AUXR |= 0x10; //定時(shí)器2開(kāi)始計(jì)時(shí)
- // IE2 |= 0x04;
- AUXR &= 0xFB; //?????12T??
- T2L = 0x30; //??????
- T2H = 0xF8; //??????
- AUXR |= 0x10; //???2????
- IE2 |= 0x04;
- }
- void InterruptTimer2() interrupt 12
- {
- static unsigned int i=0,j=0;
- i++;
- timebyte++;//計(jì)算字節(jié)之間的時(shí)間
- if(LED_Control)
- {
- if(!(i%50))
- {
- LED=!LED;
- i=0;
- j++;
- }
- if(j==(2*LED_Control))
- {
- LED_Control=0;
- LED=1;
- j=0;
- }
- }
- if(timebyte>600)
- timebyte=600;
- KeyScan(); //執(zhí)行按鍵掃描
- }
- //中斷服務(wù)程序
- void Interrupt38KPWM() interrupt 3 //中斷入口
- {
- IR = !IR;
- // IE2 &= ~0x04; //若需要手動(dòng)清除中斷標(biāo)志,可先關(guān)閉中斷,此時(shí)系統(tǒng)會(huì)自動(dòng)清除內(nèi)部的中斷標(biāo)志
- // IE2 |= 0x04; //然后再開(kāi)中斷即可
- }
- /* "INT1中斷服務(wù)函數(shù),執(zhí)行紅外接收及解碼 "*/
- void EXINT1_ISR() interrupt 2
- {
- unsigned char i, j;
- unsigned char byt;
- unsigned int time;
- // LED_Control=1;
- //"接收并判定引導(dǎo)碼的9ms低電平"
- time = GetLowTime();
- if ((time<8500*2) || (time>9500*2)) //"時(shí)間判定范圍為8.5~9.5ms," //((time<7833) || (time>8755))
- { //"超過(guò)此范圍則說(shuō)明為誤碼,直接退出 "
- IE1 = 0; //"退出前清零INT1中斷標(biāo)志"
- return;
- }
- //"接收并判定引導(dǎo)碼的4.5ms高電平"
- time = GetHighTime();
- if ((time<4000*2) || (time>5000*2)) //"時(shí)間判定范圍為4.0~5.0ms," //((time<3686) || (time>4608))
- { //"超過(guò)此范圍則說(shuō)明為誤碼,直接退出"
- IE1 = 0;
- return;
- }
- //"接收并判定后續(xù)的4字節(jié)數(shù)據(jù)"
- for (i=0; i<4; i++) //"循環(huán)接收4個(gè)字節(jié)"
- {
- for (j=0; j<8; j++) //"循環(huán)接收判定每字節(jié)的8個(gè)bit"
- {
- //"接收判定每bit的560us低電平 "
- time = GetLowTime();
- if ((time<340*2) || (time>780*2)) //"時(shí)間判定范圍為340~780us, " //((time<313) || (time>718))
- { //"超過(guò)此范圍則說(shuō)明為誤碼,直接退出"
- IE1 = 0;
- return;
- }
- //"接收每bit高電平時(shí)間,判定該bit的值"
- time = GetHighTime();
- if ((time>340*2) && (time<780*2)) //"時(shí)間判定范圍為340~780us," //((time>313) && (time<718))
- { //"在此范圍內(nèi)說(shuō)明該bit值為0"
- byt >>= 1; //"因低位在先,所以數(shù)據(jù)右移,高位為0"
- }
- else if ((time>1460*2) && (time<1900*2)) //"時(shí)間判定范圍為1460~1900us," //((time>1345) && (time<1751))
- { //"在此范圍內(nèi)說(shuō)明該bit值為1"
- byt >>= 1; //"因低位在先,所以數(shù)據(jù)右移, "
- byt |= 0x80; //"高位置1"
- }
- else //"不在上述范圍內(nèi)則說(shuō)明為誤碼,直接退出"
- {
- IE1 = 0;
- return;
- }
- }
- ircode[i] = byt; //"接收完一個(gè)字節(jié)后保存到緩沖區(qū)"
- }
- irflag = 1; //"接收完畢后設(shè)置標(biāo)志"
- IE1 = 0; //"退出前清零INT1中斷標(biāo)志"
- }
復(fù)制代碼
下載:
紅外.zip
(825.45 KB, 下載次數(shù): 36)
2024-3-15 14:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|