8路红外遥控开关控制器(可扩展为32路),Infrared remote control switch
关键字:遥控开关,遥控开关电路,红外遥控电路,89C51
C51程序:
C51源码:
/*----------------------------------------
8路红外遥控开关控制器 (SAA3010T电视遥控器)
Copyright 2004/3/27 http://www.cdle.net http://bbs.cdle.net
All rights reserved.
明浩 E-mail: pnzwzw@163.com pnzwzw@cdle.net
只用八路时可以用AT89C2051代替AT89C51 一体化接收头输出端拉P3.2(int0),P1为控制输出端。 可以扩展到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; //定时器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++) //这里起到按键值正确后会有一个延时,防止重复按键 P3_6 = 1; for (de=0; de<30000; de++) P3_6 = 0; DT = 0; } EX0 = 1; } while(1); }
//定时器0中断处理 void timeint(void) interrupt 1 using 2 { TH0=0xFD; TL0=0x1E; //设定时值为800us
if (IRCON<3) { if (IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位 { IRCON2++; IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位 IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位 } else { IRCON++; //填满一个字节,指向下一个变量 IRCON2=0; //计数清零 } } else { TR0 = 0; //关闭定时器 ET0 = 0; //定时器0中断关闭 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: //按关闭电源键,关闭所有继电器 P1 = 0xFF; DT = 1; break; } } } } }
//INT0中断 void INT0Fun(void) interrupt 0 using 2 { EX0 = 0; //外部中断0关闭 ET0 = 1; //定时器0中断打开 TH0=0xFD; TL0=0x1E; //设定时值为800us
for (IRCON=0; IRCON<3; IRCON++) IRCode[IRCON] = 0; IRCON = 0; IRCON2 = 0; //计数清零
TR0 = 1;//开始计数 }
2007615193243.rar
|