4 7
您的位置: 电子制作DIY -> 单片机 -> 51单片机 -> 51单片机多路红外遥控开关制作 源程序代码
本帖共有607个阅读者
发表帖子 发表投票 回复主题
51单片机多路红外遥控开关制作 源程序代码
尊贵身份标志
wujinlin(VIP会员)
wujinlin
头衔:社区公民
帮派:无帮无派
帖数:26
金钱:380
积分:112
注册时间:2020/12/30
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
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++;  
}
}  
}

这家伙很懒,什么也没有留下!
等级:VIP会员 参考IP地址:*.*.*.*
2020/12/30 22:39:32
Copyright © 2011 电子制作DIY. All rights reserved.电子制作DIY7419 Call, 1 Queries, Processed in 160.156 millisecond(2),