📄 hwmms.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 + -