|
wujinlin(VIP会员)
头衔:社区公民
帮派:无帮无派
帖数:26
金钱:380
积分:112
注册时间:2020/12/30
|
51单片机多路红外遥控开关制作 源程序代码 单片机源程序如下: #include <reg52.h> typedef unsigned int u16; typedef unsigned char u8; sbit l1=P0^0; sbit l2=P0^1; sbit l3=P0^2; sbit l4=P0^3; sbit l5=P0^4; sbit l6=P0^5; sbit l7=P1^0; sbit l8=P1^1; sbit l9=P1^2; sbit l10=P1^3; sbit l11=P1^4; sbit l12=P1^5; sbit IRIN=P3^2; u8 IrValue[14]; u8 Time;a;z1;z2;s1;s2;s3;s4;s5;s6;s7;s8;s9;s10;s11;s12; u8 DisplayData[14]; u8 code smgduan[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76}; //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码 void delay(u16 i) { while(i--); } void xs() { if(z1==0x06&&z2==0x7d&&s1==1) { l1=0; } if(z1==0x06&&z2==0x7d&&s1==2) { l1=1;s1=0; } if(z1==0x06&&z2==0x6f&&s2==1) { l2=0; } if(z1==0x06&&z2==0x6f&&s2==2) { l2=1; s2=0;} if(z1==0x3f&&z2==0x5e&&s3==1) { l3=0;} if(z1==0x3f&&z2==0x5e&&s3==2) { l3=1; s3=0;} if(z1==0x3f&&z2==0x39&&s4==1) { l4=0; } if(z1==0x3f&&z2==0x39&&s4==2) { l4=1; s4=0;} if(z1==0x06&&z2==0x7f&&s5==1) { l5=0; } if(z1==0x06&&z2==0x7f&&s5==2) { l5=1; s5=0; } if(z1==0x6d&&z2==0x79&&s6==1) { l6=0;} if(z1==0x6d&&z2==0x79&&s6==2) { l6=1; s6=0;} if(z1==0x3f&&z2==0x7f &&s7==1) { l7=0;} if(z1==0x3f&&z2==0x7f &&s7==2) { l7=1; s7=0;} if(z1==0x06&&z2==0x39&&s8==1) { l8=0; } if(z1==0x06&&z2==0x39&&s8==2) { l8=1; s8=0;} if(z1==0x6d&&z2==0x77&&s9==1) { l9=0;} if(z1==0x6d&&z2==0x77&&s9==2) { l9=1; s9=0;} if(z1==0x66&&z2==0x5b&&s10==1) { l10=0; } if(z1==0x66&&z2==0x5b&&s10==2) { l10=1; s10=0;} if(z1==0x6d&&z2==0x5b&&s11==1) { l11=0; } if(z1==0x6d&&z2==0x5b&&s11==2) { l11=1; s11=0; } if(z1==0x66&&z2==0x77&&s12==1) { l12=0;} if(z1==0x66&&z2==0x77&&s12==2) { l12=1; s12=0;} if(z1==0x66&&z2==0x6d){P0=0xff; P1=0xff;} if(z1==0x66&&z2==0x66){P0=0x00; P1=0x00; } } void IrInit() { IT0=1;//下降沿触发 EX0=1;//打开中断0允许 EA=1; //打开总中断 IRIN=1;//初始化端口 } void main() { IrInit(); while(1) { xs(); } } void ReadIr() interrupt 0 { u8 j,k; u16 err; Time=0; delay(700); //7ms if(IRIN==0) //确认是否真的接收到正确的信号 { err=1000; //1000*10us=10ms,超过说明接收到错误的信号 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时 侯,程序死在这里*/ while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去 { delay(1); err--; } if(IRIN==1) //如果正确等到9ms低电平 { err=500; while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去 { delay(1); err--; } for(k=0;k<4;k++) //共有4组数据 { for(j=0;j<8;j++) //接收一组数据 { err=60; while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去 { delay(1); err--; } err=500; while((IRIN==1)&&(err>0)) //计算高电平的时间长度。 { delay(10); //0.1ms Time++; err--; if(Time>30) { return; } } IrValue[k]>>=1; //k表示第几组数据 if(Time>=8) //如果高电平出现大于565us,那么是1 { IrValue[k]|=0x80; } Time=0; //用完时间要重新赋值 } } } if(IrValue[2]!=~IrValue[3]) { return; } z1 = smgduan[IrValue[2]/16]; z2= smgduan[IrValue[2]%16]; if(z1==0x06&&z2==0x7d) { s1++; } if(z1==0x06&&z2==0x6f) { s2++; } if(z1==0x3f&&z2==0x5e) { s3++; } if(z1==0x3f&&z2==0x39) { s4++; } if(z1==0x06&&z2==0x7f) { s5++; } if(z1==0x6d&&z2==0x79) { s6++; } if(z1==0x3f&&z2==0x7f ) { s7++; } if(z1==0x06&&z2==0x39) { s8++; } if(z1==0x6d&&z2==0x77) { s9++; } if(z1==0x66&&z2==0x5b) { s10++; } if(z1==0x6d&&z2==0x5b) { s11++; } if(z1==0x66&&z2==0x77) { s12++; } } } 这家伙很懒,什么也没有留下! |
等级: |
2020/12/30 22:39:32
|