Altium Designer画的电子密码锁原理图和PCB图如下:(51hei附件中可下载工程文件)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #define GPIO_DIG P0
- #define GPIO_KEY P1
- sbit JINGBAO=P2^0;
- sbit SUO=P2^1;
- void KeyDown();
- unsigned char DIG_CODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- unsigned char A[6],X,Q;
- unsigned S,M,H;
- unsigned char KeyValue;
- void Delay10ms(unsigned int c)
- {
- unsigned char a,b;
- for(;c>0;c--)
- for (b=38;b>0;b--)
- for(a=13;a>0;a--);
- }
- void KeyDown(void)
- {
- char a=0,K,CWCS;
- GPIO_DIG=0x00;
- GPIO_KEY=0X0f;
- if(GPIO_KEY!=0x0f)
- {
- Delay10ms(1);
- if(GPIO_KEY!=0x0f)
- {
- GPIO_KEY=0X0F;
- switch(GPIO_KEY)
- {
- case(0x07):KeyValue=1;break;//0000 0111
- case(0x0b):KeyValue=2;break;//0000 1011
- case(0x0d):KeyValue=3;break;//0000 1101
- }
- GPIO_KEY=0XF0;
- switch(GPIO_KEY)
- {
- case(0xe0):if(KeyValue==1)K=0;if(KeyValue==2)K=10;if(KeyValue==3)K=11;break;
- case(0xd0):K=KeyValue;break;
- case(0xb0):K=KeyValue+3;break;
- case(0x70):K=KeyValue+6;break;
- }
- if(K<10&&X<6)
- {
- A[X]=K;
- X++;
- }
- if(K==10&&X>0) X--;//删除功能
- if(X==6&&K==11)//输入6位数后,按确认键
- {
- if(A[0]==6&&A[1]==6&&A[2]==6&&A[3]==6&&A[4]==6&&A[5]==6)//判断和设置密码
- {
- X=0;//密码正确要将X重新置0
- SUO=1;//密码正确,开锁
- Delay10ms(2500);//开锁后延时
- SUO=0;//延时一定时间后自动上锁
- CWCS=0; //将之前的错误次数清零
- }
- else
- {
- CWCS++;
- P3=0x00;
- X=0;
- while(CWCS==3)
- {
- JINGBAO=1;//报警
- Delay10ms(5000);//报警延时
- JINGBAO=0;//报警解除
- CWCS=0;//将之前的错误次数清零
- }
- }
- }
- while((a<20)&&(GPIO_KEY!=0xf0))
- {
- Delay10ms(35);
- if(X>=1)
- {
- Q=A[0];
- P0=DIG_CODE[Q];
- P3=0x01;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=2)
- {
- Q=A[1];
- P0=DIG_CODE[Q];
- P3=0x02;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=3)
- {
- Q=A[2];
- P0=DIG_CODE[Q];
- P3=0x04;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=4)
- {
- Q=A[3];
- P0=DIG_CODE[Q];
- P3=0x08;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=5)
- {
- Q=A[4];
- P0=DIG_CODE[Q];
- P3=0x10;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=6)
- {
- Q=A[5];
- P0=DIG_CODE[Q];
- P3=0x20;
- Delay10ms(1);
- P3=0x00;
- }
- a++;
- }
- }
- }
- else{ //不输入密码时显示时间
- if(X==0)
- {
- P0=DIG_CODE[S%10];
- P3=0x20;
- Delay10ms(1);
- P3=0x00;
-
- P0=DIG_CODE[S/10];
- P3=0x10;
- Delay10ms(1);
- P3=0x00;
-
- P0=DIG_CODE[M%10];
- P3=0x08;
- Delay10ms(1);
- P3=0x00;
-
- P0=DIG_CODE[M/10];
- P3=0x04;
- Delay10ms(1);
- P3=0x00;
-
- P0=DIG_CODE[H%10];
- P3=0x02;
- Delay10ms(1);
- P3=0x00;
-
- P0=DIG_CODE[H/10];
- P3=0x01;
- Delay10ms(1);
- P3=0x00;
- }
- }
- }
-
-
- void main()
- {
- JINGBAO=0;
- SUO=0;
- TMOD=0x01;//0000 0001 16位定时器
- EA=1;
- ET0=1;
- TH0=(65536-1000)/256;//赋初值,设置定时时间1毫秒
- TL0=(65536-1000)%256;
- TR0=1;
- while(1)
- {
- P3=0x00;
- P1=0x0f;
- KeyDown();
- if(X>=1)
- {
- Q=A[0];
- P0=DIG_CODE[Q];
- P3=0x01;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=2)
- {
- Q=A[1];
- P0=DIG_CODE[Q];
- P3=0x02;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=3)
- {
- Q=A[2];
- P0=DIG_CODE[Q];
- P3=0x04;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=4)
- {
- Q=A[3];
- P0=DIG_CODE[Q];
- P3=0x08;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=5)
- {
- Q=A[4];
- P0=DIG_CODE[Q];
- P3=0x10;
- Delay10ms(1);
- P3=0x00;
- }
-
- if(X>=6)
- {
- Q=A[5];
- P0=DIG_CODE[Q];
- P3=0x20;
- Delay10ms(1);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电子密码锁.rar
(781.07 KB, 下载次数: 138)
|