標(biāo)題:
8路紅外遙控開關(guān)控制器(可擴(kuò)展為32路)
[打印本頁]
作者:
51黑tt
時(shí)間:
2016-3-6 14:46
標(biāo)題:
8路紅外遙控開關(guān)控制器(可擴(kuò)展為32路)
本帖最后由 51黑tt 于 2016-3-6 14:47 編輯
論壇上有一些希望能DIY多路的紅外遙控開關(guān),我在此做了一個(gè)DOME版的,同樣用我熟悉的SAA3010T的解碼程序(省下了不少時(shí)間),程
序可以直接用于AT89C51或AT89C2051或相容的芯片,用2051時(shí),P1.0,P1.1要用10K電阻上拉。使用一體化接收頭時(shí)電源方面一定要做好濾波
,如用大的濾波電容使直流更加的穩(wěn)定,用104(0.1uF)的小電容去掉高頻等等,只有這樣才能在一定程序上提高抗干擾性。在程序方面,
我這里做的很簡(jiǎn)單,用了遙控器的1-8號(hào)鍵做1-8的繼電器控制,按一下為繼電器通,再按一下為繼,二次按鍵的間隔時(shí)間大約在1秒鐘,這
樣就可以避免按一次鍵會(huì)使繼電器返復(fù)通斷(按一次鍵的時(shí)間不定發(fā)送鍵值的次數(shù)也不定)。還用了遙控的電源按鍵,按下時(shí)所有斷電器關(guān)
閉。這個(gè)電路如果使用AT89C51的話可以找到32路或更多的控制。有網(wǎng)友說要做兼容多遙控學(xué)習(xí)型的,我想也是可行的,那會(huì)用到IC2器件,
存儲(chǔ)收到的數(shù)據(jù)做為學(xué)習(xí),接收時(shí)再對(duì)比對(duì),但是如果你的數(shù)據(jù)較多的話會(huì)造成速度慢等問題。我個(gè)人認(rèn)為還是用專一的遙控器好點(diǎn),比如
說你用電視遙控去遙控電視和紅外開關(guān),當(dāng)你要開電視或許同時(shí)會(huì)觸發(fā)到紅外開關(guān)。
C51源碼:
/*----------------------------------------
8路紅外遙控開關(guān)控制器
(SAA3010T電視遙控器)
All rights reserved.
明浩 E-mail: pnzwzw@163.com
pnzwzw@cdle.net
只用八路時(shí)可以用AT89C2051代替AT89C51
一體化接收頭輸出端拉P3.2(int0),P1為控制輸出端。
可以擴(kuò)展到32路或更多
輸出為低電平有效
----------------------------------------*/
#include <AT89x51.h>
static unsigned char data IRCode[3],IRCON,IRCON2;
static unsigned char data DT;
void main(void)
{
unsigned int de;
TMOD = 0x01; //定時(shí)器0方式1
EA = 1; //允許CPU中斷
IT0 = 1; //INT0下降沿有效
EX0 = 1; //開INT0中斷;
do
{
for (de=0; de<10000; de++)
P3_6 = 1;
for (de=0; de<10000; de++)
P3_6 = 0;
if (DT)
{
for (de=0; de<30000; de++) //這里起到按鍵值正確后會(huì)有一個(gè)延時(shí),防止重復(fù)按鍵
P3_6 = 1;
for (de=0; de<30000; de++)
P3_6 = 0;
DT = 0;
}
EX0 = 1;
}
while(1);
}
//定時(shí)器0中斷處理
void timeint(void) interrupt 1 using 2
{
TH0=0xFD;
TL0=0x1E; //設(shè)定時(shí)值為800us
if (IRCON<3)
{
if (IRCON2<8) //每中斷一次讀一次遙控接收頭的狀態(tài),每二次為遙控編碼中的一個(gè)位
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1; //每讀一次放入變量中的二進(jìn)制的一個(gè)位,每次左移一位
IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填滿一個(gè)字節(jié),一個(gè)字節(jié)存放遙控編碼4個(gè)位
}
else
{
IRCON++; //填滿一個(gè)字節(jié),指向下一個(gè)變量
IRCON2=0; //計(jì)數(shù)清零
}
}
else
{
TR0 = 0; //關(guān)閉定時(shí)器
ET0 = 0; //定時(shí)器0中斷關(guān)閉
if ((IRCode[1]!=0xFF) && (IRCode[2]!=0xFF))
{
if (IRCode[1] == 0x55)
{
switch (IRCode[2])
{
case 0xAB: //1-8鍵控制
P1_0 = ~P1_0;
DT = 1;
break;
case 0xAC:
P1_1 = ~P1_1;
DT = 1;
break;
case 0xAD:
P1_2 = ~P1_2;
DT = 1;
break;
case 0xB2:
P1_3 = ~P1_3;
DT = 1;
break;
case 0xB3:
P1_4 = ~P1_4;
DT = 1;
break;
case 0xB4:
P1_5 = ~P1_5;
DT = 1;
break;
case 0xB5:
P1_6 = ~P1_6;
DT = 1;
break;
case 0xCA:
P1_7 = ~P1_7;
DT = 1;
break;
case 0xD2: //按關(guān)閉電源鍵,關(guān)閉所有繼電器
P1 = 0xFF;
DT = 1;
break;
}
}
}
}
}
//INT0中斷
void INT0Fun(void) interrupt 0 using 2
{
EX0 = 0; //外部中斷0關(guān)閉
ET0 = 1; //定時(shí)器0中斷打開
TH0=0xFD;
TL0=0x1E; //設(shè)定時(shí)值為800us
for (IRCON=0; IRCON<3; IRCON++)
IRCode[IRCON] = 0;
IRCON = 0;
IRCON2 = 0; //計(jì)數(shù)清零
TR0 = 1;//開始計(jì)數(shù)
}
復(fù)制代碼
作者:
西林杰哥
時(shí)間:
2016-3-10 00:32
我的微信SUN469923905請(qǐng)大神指教
作者:
tomgay
時(shí)間:
2017-5-1 19:35
verygood!
作者:
gaoshucheng88
時(shí)間:
2017-5-2 10:46
有制作教程嗎,
作者:
474201428
時(shí)間:
2017-5-23 02:53
先做個(gè)記號(hào),有空鉆研一下程序
作者:
820590074
時(shí)間:
2017-5-28 13:11
謝謝分享。謝謝奉獻(xiàn)。謝謝樓主。
作者:
都市郎
時(shí)間:
2018-2-20 00:43
樓主請(qǐng)教下,為什么程序編譯通過,可燒錄到單片機(jī)什么反應(yīng)都沒有。程序如下:/**********************BST-V51實(shí)驗(yàn)開發(fā)板例程************************
作者:
都市郎
時(shí)間:
2018-2-20 00:43
/**********************BST-V51實(shí)驗(yàn)開發(fā)板例程************************
* 平臺(tái):BST-V51 + Keil U3 + STC89C52
* 名稱:8路紅外遙控開關(guān)控制器
* 日期:2018-1-17
* 晶振:11.0592MHZ
(SAA3010T電視遙控器)
All rights reserved.
明浩 E-mail:
pnzwzw@163.com
pnzwzw@cdle.net
只用八路時(shí)可以用AT89C2051代替AT89C51
一體化接收頭輸出端拉P3.2(int0),P1為控制輸出端。
可以擴(kuò)展到32路或更多
輸出為低電平有效
******************************************************************/
#include<AT89X51.h>
static unsigned char data IRCode[3],IRCON,IRCON2;
static unsigned char data DT;
void main(void)
{
unsigned int de;
TMOD = 0x01; //定時(shí)器0方式1
EA = 1; //允許CPU中斷
IT0 = 1; //INT0下降沿有效
EX0 = 1; //開INT0中斷;
do
{
for (de=0; de<10000; de++)
P3_6 = 1;
for (de=0; de<10000; de++)
P3_6 = 0;
if (DT)
{
for (de=0; de<30000; de++) //這里起到按鍵值正確后會(huì)有一個(gè)延時(shí),防止重復(fù)按鍵
P3_6 = 1;
for (de=0; de<30000; de++)
P3_6 = 0;
DT = 0;
}
EX0 = 1;
}
while(1);
}
//定時(shí)器0中斷處理
void timeint(void) interrupt 1 using 2
{
TH0=0xFD;
TL0=0x1E; //設(shè)定時(shí)值為800us
if (IRCON<3)
{
if (IRCON2<8) //每中斷一次讀一次遙控接收頭的狀態(tài),每二次為遙控編碼中的一個(gè)位
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1; //每讀一次放入變量中的二進(jìn)制的一個(gè)位,每次左移一位
IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填滿一個(gè)字節(jié),一個(gè)字節(jié)存放遙控編碼4個(gè)位
}
else
{
IRCON++; //填滿一個(gè)字節(jié),指向下一個(gè)變量
IRCON2=0; //計(jì)數(shù)清零
}
}
else
{
TR0 = 0; //關(guān)閉定時(shí)器
ET0 = 0; //定時(shí)器0中斷關(guān)閉
if ((IRCode[1]!=0xFF) && (IRCode[2]!=0xFF))
{
if (IRCode[1] == 0x55)
{
switch (IRCode[2])
{
case 0x0C: //1-8鍵控制已改為MP3通用遙控器
P1_0 = ~P1_0;
DT = 1;
break;
case 0x18:
P1_1 = ~P1_1;
DT = 1;
break;
case 0x5E:
P1_2 = ~P1_2;
DT = 1;
break;
case 0x08:
P1_3 = ~P1_3;
DT = 1;
break;
case 0x1C:
P1_4 = ~P1_4;
DT = 1;
break;
case 0x5A:
P1_5 = ~P1_5;
DT = 1;
break;
case 0x42:
P1_6 = ~P1_6;
DT = 1;
break;
case 0x52:
P1_7 = ~P1_7;
DT = 1;
break;
case 0x45: //按關(guān)閉電源鍵,關(guān)閉所有繼電器
P1 = 0xFF;
DT = 1;
break;
}
}
}
}
}
//INT0中斷
void INT0Fun(void) interrupt 0 using 2
{
EX0 = 0; //外部中斷0關(guān)閉
ET0 = 1; //定時(shí)器0中斷打開
TH0=0xFD;
TL0=0x1E; //設(shè)定時(shí)值為800us
for (IRCON=0; IRCON<3; IRCON++)
IRCode[IRCON] = 0;
IRCON = 0;
IRCON2 = 0; //計(jì)數(shù)清零
TR0 = 1;//開始計(jì)數(shù)
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1