密碼鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS = P2^6 ;
- sbit RW = P2^5;
- sbit E = P2^7;
- sbit P3_0=P3^0;
- sbit P3_1=P3^1;
- uchar b,c,d,n,g=0,e=0;
- uchar o=0,t=0,m=0;
- uchar a[2][6];
- uint j;
- void fbusy(void);
- void write_command(uchar com);
- void write_data(uchar j);
- void LCD_init(void);
- void string(uchar ad ,uchar *s);
- void lcd_test(void);
- void input1(void);
- void panduan(void);
- void jinggao(void);
- void delay();
- void delay1(unsigned char x);
- void key(void);
- void delay(unsigned int k)
- {
- unsigned int i,j;
- for(i=0;i<k;i++)
- for(j=0;j<121;j++)
- {
- ;
- }
- }
- void fbusy(void) //忙函數
- {
-
- RS = 0;
- RW = 1;
- E = 1;
- E=0;
- while(P0 & 0x80)
- {E = 0;E=1;}
- delay(1);
- }
- void write_command(uchar com) //寫命令函數
- { fbusy();
- E = 0;
- RS = 0;
- RW = 0;
- E=1;
- P0 = com;
- E = 0;
- delay(1);
- }
- void write_data(uchar j) //寫數據函數
- {
- fbusy();
- E = 0;
- RS = 1;
- RW = 0;
- E=1;
- P0 = j;
- E=0;
- delay(1);
- }
- void LCD_init(void) //LCD初始化
- { write_command(0x38);
- write_command(0x01);
- write_command(0x0e);
- write_command(0x14);
- delay(1);
- }
- void string(uchar ad, uchar *s)
- { write_command(ad);
- while(*s>0)
- { write_data(*s++);
- delay(100);
- }
- }
-
- void delay1(unsigned char x) //大延遲函數
- {
- unsigned char i,j,k;
- do
- {
- for(i=10;i>0;i--)
- for(j=100;j>0;j--)
- for(k=249;k>0;k--);
- }
- while(--x);
- }
-
-
- void key() //鍵盤
- {
- while(1)
- {
- if(m>2) //輸錯三次
- {
- LCD_init();
- for(t=0;t<100;t++)
- {
- P3_1=0;
- delay(10);
- P3_1=1;
- delay(10);
- }
- jinggao(); //警告
- delay1(5);
- m=0;
- input1();
-
- }
- P1=0xf0;
- if(P1!=0xf0)
- {
- delay(150);
- if(P1!=0xf0)
- {
- switch(P1)
- {
-
- case 0x70:b=0;break;
- case 0xb0:b=1;break;
- case 0xd0:b=2;break;
- case 0xe0:b=3;break;
- default:break;
- }
- P1=0x0f;
- switch(P1)
- {
- case 0x07:c=0;break;
- case 0x0b:c=1;break;
- case 0x0d:c=2;break;
- case 0x0e:c=3;break;
- default:break;
- }
- d=(4*b+c);
- if(d==10) //更改鍵
- {
- delay1(1);
- if(e>=1)
- {
- write_command(0x04);
- write_data(' ');
- write_command(0x06);
- e--;
- }
- }
-
- if(d==11) //設置新密碼
- {
- delay1(2);
- g=1;e=0;o=1;
- LCD_init();
- string(0x80,"new code:");
- if(e<6)
- {
- key();
- write_data('0'+d);
- a[g][e]=d;
- e++;
- }
- for(e=0;e<6;e++)
- {
- a[0][e]=a[1][e];
- }
- LCD_init();
- string(0x80,"Reset");
- string(0xc0,"Successfully");
- delay1(2);
- o=0;e=0;
- input1();
- key();
-
- }
- if(d<=9)
- {
- if(e<6)
- {
- write_data('0'+d);
- a[g][e]=d;
- e++;
- delay1(1);
- if(g==0&e>5)
- {
- e=0;g++;
- delay1(2);
- LCD_init();
- string(0x80,"set");
- string(0xc0,"successfully");
-
- delay1(2);
- input1();
- }
- if(g>0&e>5)
- {
- delay1(1);
- LCD_init();
- if(o==0)
- panduan();
- if(o==1)
- break;
- }
- }
- }
-
- }
- }
- }
- }
- void panduan()
- {
- n=1;g=1;
- for(e=0;e<6;e++)
- {
- if(a[0][e]!=a[1][e]) //第一次輸入與第二次輸入不同為n=0
- {
- n=0;
- }
- }
- if(n==1) //相同
- {
- P3_0=1;
- LCD_init();
- string(0x80,"Right");
- delay1(5);
- input1();
- e=0;m=0;
- key();
- }
- if(n==0) //不同
- {
- P3_0=0;
- LCD_init();
- string(0x80,"Error");
- delay1(3);
- input1();
- e=0;m=m+1;
- key();
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
密碼鎖.zip
(137.74 KB, 下載次數: 54)
2018-4-27 14:54 上傳
點擊文件名下載附件
|