⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwmms.c

📁 红外遥控密码锁的资料及单片机源码。红外遥控密码锁的资料及单片机源码。红外遥控密码锁的资料及单片机源码。
💻 C
字号:
/* 红外_密码锁
*/
# pragma SYMBOLS,CODE,DEBUG,ot(4)
# include <absacc.h>
# include <reg52.h>
# include <intrins.h>

#define LP 0x10
#define LC 0x20            
#define LD 0x40
#define LE 0x80
#define LB 0x01
#define LA 0x02
#define LF 0x04
#define LG 0x08

#define AA0 (LA+LB+LC+LD+LE+LF)
#define AA1 (LB+LC)
#define AA2 (LA+LB+LD+LE+LG)
#define AA3 (LA+LB+LC+LD+LG)
#define AA4 (LB+LC+LF+LG)
#define AA5 (LA+LC+LD+LF+LG)
#define AA6 (LA+LC+LD+LE+LF+LG)
#define AA7 (LA+LB+LC+LF)
#define AA8 (LA+LB+LC+LD+LE+LF+LG)
#define AA9 (LA+LB+LC+LD+LF+LG)
#define AAA (LA+LB+LC+LE+LF+LG)
#define AAB (LC+LD+LE+LF+LG)
#define AAC (LA+LD+LE+LF)
#define AAD (LB+LC+LD+LE+LG)
#define AAE (LA+LD+LE+LF+LG)
#define AAF (LA+LE+LF+LG)
#define AAL (LD+LE+LF)
#define AAH (LB+LC+LE+LF+LG)
#define AAP (LA+LB+LE+LF+LG)

unsigned char code ascii[]={~AA0,~AA1,~AA2,~AA3,~AA4,~AA5,~AA6,~AA7,~AA8,~AA9,~AAH,~0,~AAE}; /*数码字模*/
unsigned char code password1[]={'5','7','6','1','8'}; /*默认密码*/
unsigned char code password2[]={'8','1','6','7','5'}; /*默认密码*/

unsigned char ir_code[4];
unsigned int volatile dsq0,time;

#define KEY P0
#define DA P2

sbit HW = P3^2;       /*红外接口*/

sbit GND = P1^0;      /*开门指示灯*/
sbit SELECT = P1^5;   /*密码选择*/

sbit BEEP = P1^3;     /*报警音*/
sbit LED  = P1^6;
sbit DRV  = P1^7;     /*开锁驱动*/

bit led;
void YS1(void)     /*延时子程序1,精确延时882微秒*/
{unsigned char i;
 for(i=0;i<100;i++);
 _nop_();
}

void YS2(void)  /*延时子程序2,精确延时4740微秒*/
{unsigned char i;
 for(i=0;i<242;i++)
  {_nop_();_nop_();_nop_();
   _nop_();_nop_();_nop_();
   _nop_();_nop_();_nop_();
   _nop_();
   }
   _nop_();
}

void YS3(void) /*延时程序3,精确延时1000微秒*/
{unsigned char i;
 for(i=0;i<65;i++)
  {_nop_();_nop_();_nop_();
   _nop_();_nop_();_nop_();
   }
}

bit haveBit;
void intsvr0(void) interrupt 0
{unsigned char i,j,ls,dy;
/*红外线解码程序  */
//if (key!=0) return;
EA=0;       /*暂时关闭CPU的所有中断请求*/
for(i=0;i<5;i++)   /* i=10 检测在8820微秒内如果出现高电平就退出解码程序*/
  for(j=0;j<79;j++)
   {if (HW) /*延时882微秒中判断P3.2脚是否出现高电平如果有就退出解码程序*/
    {EA=1;
     return;
    }
   }           /*以上完成对遥控信号的9000微秒的初始低电平信号的识别*/

for(dy=0;dy<1000;dy++) if (HW) break; /*等待高电平避开9毫秒低电平引导脉冲*/
if (dy>999) {EA=1;return;}
YS2();     /*延时4.74毫秒避开4.5毫秒的结果码*/

for(i=0;i<4;i++)
  {ls=0;
   for(j=0;j<8;j++)
   {for(dy=0;dy<1000;dy++) if (HW) break;   /*等待地址码第一位的高电平信号*/
    if (dy>999) {EA=1;return;}
    YS1();
    ls>>=1;                  /*高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态*/
    if (HW)
     {YS3();ls=ls|0x80;}
   }
  ir_code[i]=ls;
  }
     if (ir_code[2]+ir_code[3]==255)
      {haveBit=1;
      }
  EA=1;
}

void init(void)
{SCON=0x50;
  T0=0;IE=0;//IT1=1;
  TMOD=0x21;
  TR0 = 1;                 /* start timer 0 */
  ET0 = 1;                 /* enable timer 0 interrupt */
  TH0=0x4C;
  TL0=0x00;
  T0=1;
}

/*串口初始化 9600                0xfd=19200,0xfd=9600,0xfa=4800,0xf4=2400,0xe8=1200*/
void serial_init ( void )
  {//SCON  = 0x50;
   //TMOD  = 0x20;
  TH1=0xFD;
  PCON = 0;
  TR1   = 1;
  ES=0;
  EA=1;
}

void putbyte(char c)
{
  _nop_();
  _nop_();
  _nop_();
  SBUF=c;
  _nop_();
  _nop_();
  _nop_();
  while (!TI);
  _nop_();
  _nop_();
  _nop_();
  TI=0;
}

/*发送一个定义在程序存储区的字符串到串口*/
void putstring(unsigned char  *puts)
{for (;*puts!=0;puts++)   /*遇到停止符0结束*/
putbyte(*puts);
}

#define CR putstring("\r\n")   /*CR=回车换行*/

void putch(unsigned char ui)
{unsigned char ls;

ls=(ui/100+0x30);
putbyte(ls);
ls=((ui%100)/10+0x30);
putbyte(ls);
ls=(ui%10+0x30);
putbyte(ls);
}

// 50ms 11.0592MHz
unsigned char sec;
void time_0 (void) interrupt 1
{TL0=0x00;
 TH0=0x4c;
 if(dsq0!=0) dsq0--;
 if(time!=0) time--;

 if (sec!=0)
   sec--;
 else
   {LED=~(LED & led);
    sec=10;
   }
}

void ndelay(void)         /*按键延时*/
{unsigned char i;
  for(i=0;i<200;i++) _nop_();
}

unsigned char scankey(void)
{unsigned char temp;
 if (haveBit)
   {haveBit=0;
    switch (ir_code[2])
     {case 0:
        return '1';
      break;
      case 1:
        return '2';
      break;
      case 2:
        return '3';
      break;
      case 3:
        return '4';
      break;
      case 4:
        return '5';
      break;
      case 5:
        return '6';
      break;
      case 6:
        return '7';
      break;
      case 7:
        return '8';
      break;
      case 8:
        return '9';
      break;
      case 9:
        return '0';
      break;
      case 15:
        return 'S';
      break;
//      case 11:
//       return 'A';
//      break;
     }
   }

 KEY=0x0f;ndelay();temp=KEY;temp&=0xf;  /*是否有按键?*/
 if (temp==0xf) return 0;               /*没有,返回 0*/
 KEY=0x7f;ndelay();temp=KEY;temp&=0xf;  /*扫描第一行*/
 if (temp!=0xf) {temp+=0x70;goto have;} /*有按键,行列数据合成,进行键盘译码*/
 KEY=0xbf;ndelay();temp=KEY;temp&=0xf;  /*扫描第二行*/
 if (temp!=0xf) {temp+=0xb0;goto have;} /*有按键,行列数据合成,进行键盘译码*/
 KEY=0xdf;ndelay();temp=KEY;temp&=0xf;  /*扫描第三行*/
 if (temp!=0xf) {temp+=0xd0;goto have;} /*有按键,行列数据合成,进行键盘译码*/
 KEY=0xef;ndelay();temp=KEY;temp&=0xf;  /*扫描第四行*/
 if (temp!=0xf) {temp+=0xe0;goto have;} /*有按键,行列数据合成,进行键盘译码*/
 return 0;
have:          /*键盘译码*/
/*
238(A) 237(B) 235(C) 231(D)
222(0) 221(1) 219(2) 215(3)
190(4) 189(5) 187(6) 183(7)
126(8) 125(9) 123(:) 119(S)
*/
 switch(temp)
  {case 119:
    return 'S';
   break;
   case 183:
    return '8';
   break;
   case 215:
    return '4';
   break;
   case 231:
    return 'D';
   break;

   case 123:
    return ':';
   break;
   case 187:
    return '7';
   break;
   case 219:
    return '3';
   break;
   case 235:
    return 'C';
   break;
   case 125:
    return '0';
   break;
   case 189:
    return '6';
   break;
   case 221:
    return '2';
   break;
   case 237:
    return 'B';
   break;

   case 126:
    return '9';
   break;
   case 190:
    return '5';
   break;
   case 222:
    return '1';
   break;
   case 238:
    return 'A';
   break;
  }
}


unsigned char pass[12];
unsigned char count;
unsigned char err;

/*开锁*/
void open(void)
{unsigned char i;
if (SELECT)
 {for(i=0;i<5;i++)          /*密码比较*/
  {if (password1[i]!=pass[i]) break;}
 }
else
 {for(i=0;i<5;i++)          /*密码比较*/
  {if (password2[i]!=pass[i]) break;}
 }

 if (i==5) {DRV=0;BEEP=1;dsq0=10;while(dsq0);DRV=1;count=0;err=0;BEEP=0;led=0;return;}  /*如果密码正确,开锁*/
 err++;
 dsq0=100;
 BEEP=1;
 DA=ascii[12];
 while(dsq0);
 DA=ascii[11];
 BEEP=0;
}

void main(void)
{unsigned char ch;
 BEEP=0;
 GND=0;
 init();
 serial_init();
 IT0=1; /*设定int0的触发方式为脉冲负边沿触发*/
 EX0=1; /*开INT0中断*/
 putstring("红外译码 Ver 1.00");CR;
 putstring("程序:郑海昕");CR;
 putstring("TEL:024-81055867 ");CR;
 count=0;
 while(1)
  {if (time==0 && err<3){count=0;err=0;BEEP=0;led=0;}
   if (haveBit)
    {//haveBit=0;
     putstring("用户码");putbyte('=');putch(ir_code[0]);putbyte(' ');
     putstring("数据码");putbyte('=');putch(ir_code[2]);putbyte(' ');CR;
    }
   ch=scankey();
   if (ch)
     {time=400;
      led=1;
      if (ch!='S' && ch!='A' && err<3)
        {pass[count]=ch;
         if (count<12) count++;
//         DA=ascii[ch-'0'];
         DA=ascii[10];
         dsq0=60;
         while(dsq0);
         DA=ascii[11];
        }
      if (ch=='A') {count=0;err=0;BEEP=0;led=0;}
      if (ch=='S' && err<3) {count=0;open();}
      if (err>=3) BEEP=1;
     }
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -