单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:4084|回复:11

21路红外线遥控开关程序

 [复制链接]
ID:70976发表于 2014-12-24 16:02|显示全部楼层
#include< reg51.h>
#include< intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void delay(uchar x);  //x*0.14MS
void delay1(int ms);
void beep();
sbit IRIN = P3^2;       //红外接收器数据线
sbit BEEP = P1^5;       //蜂鸣器驱动线
sbit RELAY1= P1^0;       //继电器驱动线
sbit RELAY2= P1^1;       //继电器驱动线
sbit RELAY3= P1^2;       //继电器驱动线
sbit RELAY4= P1^3;       //继电器驱动线
sbit RELAY5= P1^4;       //继电器驱动线
sbit RELAY6= P1^6;       //继电器驱动线
sbit RELAY7= P1^7;       //继电器驱动线
uchar IRCOM[7];
main()
{
   IRIN=1;               //I/O口初始化
   BEEP=1;
   RELAY1=1;
delay1(10);             //延时
   IE = 0x81;             //允许总中断中断,使能 INT0 外部中断
TCON = 0x01;           //触发方式为脉冲负边沿触发
     while(1);

} //end main
/**********************************************************/
void IR_IN() interrupt 0 using 0
{
     unsigned char i,j,k,N=0;
     EX0 = 0;     //关掉外部中断防止中断的再次发生进入检测引导码阶段(9ms的低电平4.5ms的高电平)
delay(15);
if (IRIN==1)
     { EX0 =1;  //9ms的检测检测结束从新打开外部中断
   return;
}
                   //确认IR信号出现
   while (!IRIN)         //等IR变为高电平,跳过9ms的前导低电平信号。
   {delay(1);}

for (j=0;j<4;j++)       //收集四组数据
{
for (k=0;k<8;k++)       //每组数据有8位
{
   while (IRIN)         //等 IR 变为低电平,跳过4.5ms的引导高电平信号。
   {delay(1);}
   while (!IRIN)       //等 IR 变为高电平
   {delay(1);}
   while (IRIN)         //计算IR高电平时长(0和1的低电平的时长一样的,只要判断高电平时长超过0.56ms并小于1.12ms为1否  则为0)
     {
   delay(1);
   N++;        
if (N>=30)
{
EX0=1;
return;
}             //0.14ms计数过长自动离开。
     }                 //高电平计数完毕          
   IRCOM[j]=IRCOM[j] >> 1;             //数据最高位补“0”
   if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //高电平持续时间大于1.12ms则数据最高位补“1”
   N=0;
}//end for k
}//end for j

   if (IRCOM[2]!=~IRCOM[3])  // 判断有没有误码(有责放弃没有判断键码)
   { EX0=1;
     return;
}
     switch(IRCOM[2])
{   // 显示遥控上的字符按键
   case 0x45:
RELAY1=!RELAY1;  
break;
case 0x46:
   RELAY2=!RELAY2;
break;
case 0x47:
   RELAY3=!RELAY4;  
break;
case 0x44:
     RELAY4=!RELAY4;
break;
case 0x40:
     RELAY5=!RELAY5;
break;
case 0x43:
     RELAY6=!RELAY6;
break;
case 0x07:
     RELAY7=!RELAY7;
break;
case 0x15:
     RELAY1=!RELAY1;
break;
   case 0x09:

break;
case 0x19:
   ........
break;
case 0x0d:
   ........
break;  
case 0x16:  
   .........;
break;
case 0x0c:  
   .........
break;
case 0x18:
............  
break;
case 0x5e:
................  
break;
case 0x08:
   ..............
break;
case 0x1c:

break;
case 0x5a:

break;
   case 0x42:

break;
case 0x52:

break;
case 0x4a:

break;
}
     beep();
     EX0 = 1;
}

/**********************************************************/
void beep()
{
   unsigned char i;
   for (i=0;i<100;i++)
   {
   delay(4);
   BEEP=!BEEP;             //BEEP取反
   }
   BEEP=1;               //关闭蜂鸣器
}
/**********************************************************/
void delay(unsigned char x)   //x*0.14MS
{
unsigned char i;
   while(x--)
{
   for (i = 0; i<13; i++) {}
}
}

/**********************************************************/
void delay1(int ms)
{
unsigned char y;
   while(ms--)
{
   for(y = 0; y<250; y++)
   {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   }
}
}

ID:70769发表于 2014-12-24 20:30|显示全部楼层
GOOD!!!
ID:67573发表于 2014-12-25 14:01|显示全部楼层
ID:71125发表于 2014-12-27 15:45来自手机|显示全部楼层
有图纸吗?楼主
ID:72947发表于 2015-1-31 20:25来自手机|显示全部楼层
谢谢楼主分享!!!
ID:73964发表于 2015-3-2 21:43|显示全部楼层
很不错的
ID:73030发表于 2015-3-3 10:25来自手机|显示全部楼层
楼主挺强,不错
ID:80482发表于 2015-5-19 16:13|显示全部楼层
找了好久啊
ID:194844发表于 2017-5-1 19:42|显示全部楼层
有图纸吗?楼主
ID:225259发表于 2017-8-6 18:20|显示全部楼层
看不懂,发射的信号是怎样的?
ID:251082发表于 2017-12-24 11:51|显示全部楼层
拿来玩下谢谢分享
ID:577916发表于 2019-7-4 15:50|显示全部楼层

谢谢楼主分享!!!

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网