本帖最后由 lbq691477940 于 2019-6-1 16:06 編輯
單片機(jī)藍(lán)牙遙控模塊 紅外遙控學(xué)習(xí)轉(zhuǎn)發(fā)模塊 附源程序
用安卓手機(jī)按制所有帶紅外遙控器的家電、設(shè)備 一個(gè)APP界面可以學(xué)習(xí)家里所有以38K紅外載波編碼的任意紅外遙控器,再也不用看場(chǎng)電視要拿好幾個(gè)紅外遙控器了。 如:空調(diào)、電視、機(jī)頂盒、風(fēng)扇、臺(tái)燈..........等等,常用的按鍵學(xué)習(xí)在手機(jī)APP中,從而達(dá)到一機(jī)在手控制家里的所有家電的目的。
單片機(jī)源程序如下:
- /***************************************************************************************************
- 單片機(jī):
- STC11F02E或兼容芯片
- 晶振:
- 11.0592Mhz
- 波特率:57600
- 紅外接收:
- P3.3口即外部中斷1(此引腳不可自由更改)
- 定時(shí)器0:
- 1.接收紅外碼時(shí)為12T/16位計(jì)數(shù)模式不使用定時(shí)器0中斷功能
- 2.發(fā)射紅外碼時(shí)為1T/8位自重載模式且用定時(shí)器0產(chǎn)生38Khz=13uS中斷功能
- 定時(shí)器1:
- 為1T/8位自重載模式作為串口波特率發(fā)生器(使能波特率加倍)
- 紅外發(fā)射管:
- 為P1.0口驅(qū)動(dòng)NPN三極管(此引腳可自由更改)
- 紅外發(fā)射狀態(tài)指標(biāo)燈:
- 為P3.4口驅(qū)動(dòng)LED低電平有效(此引腳可自由更改)
- /***************************************************************************************************/
- #include <STC12C5A60S2.H>
- #define uchar unsigned char
- #define uint unsigned int
- /***************************************************************************************************/
- #define IR_BYTE 200 //接收的最大位數(shù)為500位
- /***************************************************************************************************/
- sbit IR_IN = P3^3; //一體化紅外接收頭的輸出腳連到此腳作為紅外線輸入
- sbit LED = P3^4; //狀態(tài)指標(biāo)燈
- sbit IR_out = P1^0; //紅外發(fā)射管控制腳,驅(qū)動(dòng)NPN三極管J3印字即S8050貼片
- /***************************************************************************************************/
- bit UART_RI; //串口接收完成標(biāo)志位
- bit flag; //發(fā)射高電平碼還是低電平碼標(biāo)志位
- bit IR_OK; //紅外線接收完成標(biāo)志位
- uchar idata IR_data[IR_BYTE]; //紅外接收及串口接收緩沖區(qū)
- uint IR_re; //紅外接收的數(shù)據(jù)個(gè)數(shù)計(jì)數(shù)器
- uint UART_re; //串口接收的數(shù)據(jù)個(gè)數(shù)計(jì)數(shù)器
- uint count; //中斷計(jì)數(shù)
- /***************************************************************************************************
- 名稱:sys_initial
- 功能:系統(tǒng)初始化
- //如果外部中斷是僅下降沿觸發(fā),要求必須在相應(yīng)的引腳維持高電平至少1個(gè)系統(tǒng)時(shí)鐘,而且低電平也要持續(xù)至少一個(gè)系統(tǒng)
- 時(shí)鐘,才能確保該下降沿被CPU檢測(cè)到
- //如果外部中斷是低電平可觸發(fā),則要求必須在相應(yīng)的引腳維持低電平至少2個(gè)系統(tǒng)時(shí)鐘,這樣才能確保CPU能夠檢測(cè)到該低電平信號(hào)
- /***************************************************************************************************/
- void sys_initial()
- {
- PCON |= 0x80; //使能波特率倍速位SMOD
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
- AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
- TMOD &= 0x0F; //清除定時(shí)器1模式位
- TMOD |= 0x21; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式/設(shè)定定時(shí)器0為16位方式
- TH1 = TL1 = 0xF4; //設(shè)定定時(shí)初值 11.0592Mhz / 57600
- ET1 = 0; //禁止定時(shí)器1中斷
- TR1 = 1; //啟動(dòng)定時(shí)器1
-
- ES = REN = 1; //允許串口接收中斷
- IT1 = 1; //設(shè)置INT1的中斷類型 (1:低電平觸發(fā) 0:下降沿觸發(fā))
- EX1 = 1; //使能INT1中斷
- EA = 1; //使能總中斷
- IR_OK = 0;
- }
- /***************************************************************************************************
- 名稱:com
- 功能:串口發(fā)送字符數(shù)據(jù);
- 形參:TS=數(shù)據(jù)指針;n=字符長(zhǎng)度
- /***************************************************************************************************/
- void UART1_SEND(uchar *TS,uchar n)
- {
- uchar m;
- for(m = 0;m < n;m++)
- {
- SBUF = *(TS + m);
- while(!TI);
- TI = 0;
- }
- }
- /***************************************************************************************************/
- void main()
- {
- uint i;
- sys_initial();
- LED = 0;
- while(1)
- {
- if(UART_RI) //接收成功
- {
- ES = 0; //禁止串口中斷
- UART_RI = 0; //清除串口接收完成標(biāo)志位
- /***************************************************************************************************************/
- if((IR_data[0] == 0xFE) && (IR_data[1] == 0xFD) && (UART_re > 10))
- {//判斷接收到的前二個(gè)指令碼是否為 0xFE和0xFD且大于10個(gè)數(shù)據(jù)
- EX1 = 0; //進(jìn)行紅外發(fā)碼前先關(guān)閉外部中斷0
- PT0 = ET0 = 1; //設(shè)定時(shí)器0中斷優(yōu)先及允許定時(shí)器0中斷
- if(UART_re % 2) //如果收到的是單個(gè)字節(jié)則自行加一個(gè)緩沖區(qū)數(shù)據(jù)
- {
- UART_re += 1;
- IR_data[UART_re] = 2;//隨便給個(gè)值即可
- }
- /***************************************************************************************/
- for(i = 2;i < UART_re;i++)
- {
- flag = ~(bit)(i % 2); //紅外發(fā)送標(biāo)志=1
- TF0 = count = 0; //中斷計(jì)數(shù)=0
- TR0 = 1; //啟動(dòng)定時(shí)器0
- // if(IR_data[ i] <= 5)
- // {
- // IR_data[ i] = 5;
- // }
- while(count < (IR_data[ i] * 90 / 13));
- TR0 = 0; //關(guān)閉定時(shí)器0
- }
- /***************************************************************************************
- for(i = 2;i < UART_re;)
- {
- //編碼中的低電平
- flag = 1; //紅外發(fā)送標(biāo)志=1
- TF0 = count = 0; //中斷計(jì)數(shù)=0
- TR0 = 1; //啟動(dòng)定時(shí)器0
- while(count < (IR_data[ i] * 90 / 13));
- TR0 = 0;
- i++;//關(guān)閉定時(shí)器0
- //編碼中的高電平
- flag = 0; //紅外發(fā)送標(biāo)志
- TF0 = count = 0; //中斷計(jì)數(shù)=0
- TR0 = 1; //啟動(dòng)定時(shí)器0
- while(count < (IR_data[ i] * 90 / 13));
- TR0 = 0; //關(guān)閉定時(shí)器0
- }
- /***************************************************************************************/
- SBUF = 0xFC; //發(fā)射完成返回一個(gè)0xFC給PC機(jī)表示發(fā)射完畢
- while(!TI);
- TI = 0;
- /***************************************************************************************/
- EX1 = 1; //紅外發(fā)碼發(fā)完后才再次允許外部中斷0
- }
- for(UART_re = IR_BYTE;UART_re > 0;UART_re--)
- IR_data[UART_re] = 0; //清除串口接收區(qū),且將UART_re清0
- LED = IR_out = 0; //紅外管 = 0不發(fā)光
- ES = 1; //重新允許串口中斷
- /***************************************************************************************************************/
- }
- }
- }
- /***************************************************************************************************************/
- void timer0(void) interrupt 1
- {
- count += 1;
- if(flag == 1) //如果紅外發(fā)送標(biāo)志=1
- {
- //這里可以改為=1不取反另用ne555產(chǎn)生38K信號(hào)與IR_out口的信號(hào)相與后接IR
- LED = ~LED; //紅外發(fā)射指示狀態(tài)=取反
- }
- else
- {
- IR_out = 0; //紅外管=0不發(fā)光
- }
- }
- /***************************************************************************************************************/
復(fù)制代碼
|