Altium Designer畫的電子密碼鎖原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (40.52 KB, 下載次數: 51)
下載附件
2018-6-8 03:45 上傳
0.png (21.72 KB, 下載次數: 53)
下載附件
2018-6-8 03:45 上傳
0.png (46.58 KB, 下載次數: 46)
下載附件
2018-6-8 03:46 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (25.3 KB, 下載次數: 55)
下載附件
2018-6-8 03:45 上傳
單片機源程序如下:
- #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)
2018-6-8 03:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|