密碼鎖的仿真程序由延時(shí)、報(bào)警延時(shí)、鍵盤掃描、LCD寫命令、LCD寫函數(shù)、LCD初始化、密碼顯示、error、open、“*”顯示子程序和主程序構(gòu)成。 延時(shí):一段設(shè)定好時(shí)間的延時(shí)。 報(bào)警延時(shí):延時(shí)并且報(bào)警器工作。 鍵盤掃描:掃描出鍵盤上被按下的鍵,并且對應(yīng)到A、B、0~9。 LCD寫命令:選擇指令寄存器。 LCD寫函數(shù):選擇數(shù)據(jù)寄存器。 LCD初始化:初始化LCD。 密碼顯示:在LCD上顯示鍵入數(shù)值。 Error:LCD顯示error并且紅色LED點(diǎn)亮。 Open:LCD顯示open并且綠色LED閃爍。 “*”顯示:將在LCD上顯示的數(shù)值在一段時(shí)間后變化為“*”。 主程序:設(shè)定6 位數(shù)的密碼,進(jìn)行對6位鍵入數(shù)值的和設(shè)定數(shù)值的對比,并且在前5位數(shù)值輸入后進(jìn)行一位位數(shù)移動,在第六位密碼輸入結(jié)束后進(jìn)行密碼正誤判斷。密碼正確則顯示open,并且綠燈閃爍,密碼錯(cuò)誤顯示error,紅燈常亮,報(bào)警器報(bào)警,在顯示open/error一段時(shí)間后復(fù)位,可再次鍵入新密碼,進(jìn)行新一輪的密碼判斷。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- sbit RS=P1^0; //寄存器選擇
- sbit RW=P1^1; //讀寫控制
- sbit EN=P1^2; //使能
- sbit ledg=P1^3; //紅指示燈
- sbit ledr=P1^7; //藍(lán)指示燈
- sbit relay=P1^4; //鎖
- sbit buzz=P1^6; //報(bào)警器
- char table0[ ]= "error"; //顯示
- char table1[ ] = "open";
- char table2[] = "password:";
- int temp,ch,m0 ,m1 ,p,n0 ,n1 ,n2 ,n3 ,n4 ,n5;
- void delay(int z) //延時(shí)
- {
- int x,c;
- for(x=z;x >0;x -- )
- for(c= 100;c >0;c--);
- }
- void Tdelay(int z) //報(bào)警延時(shí)
- {
- int x,c;
- for(x=z;x >0;x -- )
- for(c= 100;c >0;c--)
- buzz=!buzz;
- }
- keyscan( ) //鍵盤掃描
- { temp=P2&0xf0; //掃描行
- P2=0xfe;
- delay(1);
- temp=P2&0xf0;
- while(temp!=0xf0)
- {
- switch(temp) //789數(shù)字設(shè)定
- {
- case 0xe0:ch='7';break;
- case 0xd0:ch='8';break;
- case 0xb0:ch='9';break;
- default:ch=p;break;
- }
- while(temp!=0xf0) //等待鍵盤松開
- {
- temp= P2;
- temp = temp&0xf0;
- }}
- P2=0xfd; //456數(shù)字設(shè)定
- delay(1);
- temp = P2&0xf0;
- while(temp!=0xf0)
- {
- switch(temp)
- {
- case 0xe0:ch='4';break;
- case 0xd0:ch='5';break;
- case 0xb0:ch='6';break;
- default:ch=p;break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }}
- P2 = 0xfb; //123數(shù)字設(shè)定
- delay(1);
- temp=P2&0xf0;
- while(temp!=0xf0)
- {
- switch(temp)
- {
- case 0xe0:ch='1';break;
- case 0xd0:ch='2';break;
- case 0xb0:ch='3';break;
- default:ch=p;break;
- }
- while( temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }}
- P2=0xf7; //A0B設(shè)定
- delay(1);
- temp=P2&0xf0;
- while(temp!=0xf0)
- {
- switch(temp)
- {
- case 0xe0:ch='A';break;
- case 0xd0:ch='0';break;
- case 0xb0:ch='B';break;
- default:ch=p;break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }}
- return ch; //返回鍵入的值
- }
- void wcom(uchar com) //LCD寫命令
- {
- RS=0; //選擇指令寄存器
- P3=com;
- delay(1);
- EN=1; //使能
- delay(1);
- EN=0;
- }
- void wdat(uchar dat) //寫函數(shù)
- {
- RS=1; //選擇數(shù)據(jù)寄存器
- P3 = dat;
- delay(1);
- EN=1;
- delay(4);
- EN=0;
- }
- void init( ) //LCD初始化
- {
- EN=0;
- wcom(0x38);
- wcom(0x0c);
- wcom(0x06);
- wcom(0x01);
- }
- void error( ) //顯示密碼error
- {
- char m2;
- wcom(0xc6);
- for(m2=0;m2<5;m2++)
- {
- wdat(table0[m2]);
- }}
- void open( ) //密碼open
- {
- char m2;
- wcom(0xc6);
- for(m2=0;m2<4;m2++ )
- {
- wdat(table1[m2]);
- }}
- void pass() //密碼顯示
- {
- char m2;
- wcom(0x80);
- for(m2=0;m2<9;m2++ )
- {
- wdat(table2[m2]);
- }}
- change(int m) //顯示“ * ”
- {
- delay(500);
- wcom(m);
- wdat('*');
- }
- main( ) //主程序
- {
- RW=0;
- ledg=0;
- ledr=0;
- buzz=1;
- init();
- delay(5);
- pass();
- wcom(0x89);
- while(keyscan()==p)
- { //第一位密碼
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n0=keyscan();
- change(0x89);
- delay(10);
- ch=p;
- while(keyscan()==p) //第二位密碼
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n1=keyscan();
- change(0x8a);
- ch=p;
- while(keyscan()==p) //第三位密碼
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n2=keyscan();
- change(0x8b);
- ch=p;
- while(keyscan()==p) //第四位密碼
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n3=keyscan();
- change(0x8c);
- ch=p;
- while(keyscan()==p) //第五位密碼
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n4=keyscan();
- change(0x8d);
- ch=p;
- while(keyscan()==p) //第六位密碼
- {
- delay(3);
- keyscan();
- }
- wdat(keyscan());
- n5=keyscan();
- change(0x8e);
- if(n0=='1'&&n1=='6'&&n2=='3'&&n3=='0'&&n4=='1'&&n5=='8')
- //密碼設(shè)定
- {
- int m3=1;
- open();
- while(m3)
- {
- int m4,m5;
- ledg=0; //亮綠燈
- for(m4=200;m4>0;m4--)
- {
- keyscan( );
- if(keyscan()=='A')
- {
- m4=0;
- m3=0;
- }}
- ledg=1;
- if(m3!=0)
- {
- for(m5=200;m5>0;m5--)
- {
- keyscan();
- if(keyscan()=='A')
- {
- m3=0;
- }}}}
- }
- else //紅燈亮,錯(cuò)誤顯示
- {
- ledr=1;
- error();
- buzz=1;
- Tdelay(5000);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
電子鎖.rar
(25.46 KB, 下載次數(shù): 56)
2019-11-19 08:48 上傳
點(diǎn)擊文件名下載附件
|