此程序是基于清翔電子開發板編寫的,已測試通過,此程序并目前只完成了密碼鎖功能,還沒有完成用戶房間號碼比對,發這個帖子初衷是為了給正在學習密碼鎖的同學們一個思路,代碼有詳細注釋,適合初學者借鑒,大神勿噴
瘋狂提示:用戶房間號的匹配使用138譯碼器
--------------------------------------------
| 第1列 第2列 第3列 第4列 |
|第1行 0 1 2 3 |
|第2行 4 5 6 7 | 初始密碼:123456
|第3行 8 9 10 11 |
|第4行 12 13 14 15 |
------------------------------------------
1.密碼只有6位 123456
2.按鍵10: 開鎖按鍵:
輸入6位密碼后按下開鎖按鍵,開始比對存儲的密碼,正確則打開電磁鎖
否則提示錯誤次數,輸錯3次鎖定鍵盤10S,并且報警,10S后才能重新輸入
3.按鍵11: 上鎖按鍵:
無論處于任何狀態,按下上鎖按鍵后,關閉電磁鎖,清除輸入的數值
4.按鍵12: 更改密碼:
合法用戶按下修改密碼按鍵顯示New Password提示用戶輸入新密碼
否則顯示No Rights !提示操作錯誤
5.按鍵13: 保存密碼:
合法用戶輸入新密碼后按下保存密碼,顯示 Saving...... 提示保存密碼中.....
然后顯示 save successful 提示保存成功
顯示 ^_^ ^_^ ^_^ 提示更改密碼成功
非法用戶則顯示No Rights ! 提示操作錯誤
6.按鍵14: 重新輸入:
清除之前輸入的密碼或門牌號
7.按鍵15: 呼叫按鍵:
直接輸入門牌號(3位)后按下呼叫按鈕,蜂鳴器發出叮咚門鈴聲提示用戶有訪客
此時訪客直接按下開鎖鍵,開鎖3S,3s后關閉
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真.jpg (175.21 KB, 下載次數: 96)
下載附件
2019-6-28 10:53 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<string.h>
- #include<intrins.h>
- #include"key.c"
- #include"24c04.c"
- #include"1602.c"
- #include"beep.c"
- #define uchar unsigned char
- #define uint unsigned int
- #define LCDIO P0 //液晶數據端口 P0
- uchar buffer[6]={0}; //密碼顯示緩存
- uchar DSY_BUFFER[16]=" "; //開機顯示緩存
- uchar Userpassword[6]={0}; //輸入顯示緩存
- uchar code table2[]="123456"; //初始密碼
- bit flag=0,aa,hujiao; //用戶蹲淵義定時溢出標志位
- //hujiao:呼叫標志位
- sbit led=P2^2; //電磁鎖控制端
- //-----------------------------------------------------------------
- // 蜂鳴器子程序
- //-----------------------------------------------------------------
- void Beep()
- {
- uchar i;for (i = 0; i < 100; i++)
- { delayms(1); BEEP = ~BEEP; }
- BEEP = 0;
- }
- //-----------------------------------------------------------------
- //密碼清除子程序
- //-----------------------------------------------------------------
- void clear_password( )
- { uchar i;
- for(i=0;i<6;i++)
- {
- Userpassword[i]=' ';
- }
- for(i=0;i<16;i++)
- {
- DSY_BUFFER[i]=' ';
- }
- }
- void init_all()
- {
- init();
- init_lcd(); //1602初始化
- Canshu_Init(); //報警初始化
- Interrupt_Init(); //中斷初始化
- }
- //-----------------------------------------------------------------
- // 主函數
- //-----------------------------------------------------------------
- void main()
- {
- uchar temp,i=0,j=0,k=0;
- uchar IS_valid_user; //合法用戶
- init_all();
- delayms(5);
- // aa=Sendstring(0xa0,1,table2,6); //往24c04寫密碼((第一次下載必須打開下載初始密碼)
- delayms(5);
- aa=Recstring(0xa0,1,buffer,6); //從24c04讀取密碼
- delayms(10);
- P1=0x0f;
- while(1)
- {
- if(P1!=0x0f)
- {
- temp=Keys_Scan(); //獲取按鍵值
- switch(temp)
- {
- case 0: case 1: case 2: case 3: case 4:
- case 5: case 6: case 7: case 8: case 9:
- if (i<=5) //密碼限制在6位以內
- {
-
- Userpassword[i]=temp;
- DSY_BUFFER[i]=temp+0x30; // 顯示輸入的密碼
- Display_String(DSY_BUFFER,0xc0);
- delayms(100);
- DSY_BUFFER[i]='*'; // 顯示 * 替換剛剛顯示的數字
- Display_String(DSY_BUFFER,0xc0);
- i++;
- } hujiao=0;
- break;
- //按A鍵開鎖
- case 10:
- if(hujiao==1) //如果有客人來訪按下開鎖鍵則直接開門
- {
- flag=1;i=0;led=0; //點亮LED(開門)
- clear_password(); //清除輸入的門牌號
- Display_String("OPEN OK! ",0xc0);//顯示門已打開
- IS_valid_user = 1;; //合法用戶標志位置1
- delayms(2500);i=0;led=1; //開門時間為3S,3S后關閉
- hujiao=0;flag=0;j=0; //關閉訪客標志位
- clear_password();IS_valid_user=0; //清密碼顯示位
- }hujiao=0;
-
- for(k=0;k<6;k++)
- {
- if(buffer[k]==(Userpassword[k]+48)) //如果顯示緩存的數據與存儲密碼相同則開門
- flag=1;
- else
- flag=0;
- }
- if (flag==1)
- { flag=0;i=0;led=0; //點亮LED(開門)
- clear_password();
- Display_String("OPEN OK! ",0xc0); //密碼正確,顯示打開
- IS_valid_user = 1; j=0;
- }
- else
- {
-
- j++;led=1; //關閉LED
- clear_password();
- Display_String("error! Have try ",0xc0); //顯示密碼錯誤,請重新輸入
- write_com(0xcf);
- write_date(0x30+j);
- delayms(1000); //錯誤次數加1
- if(j!=3)Display_String(DSY_BUFFER,0xc0); //清屏
- IS_valid_user=0;
- if(j==3) //只有三次輸入機會
- {
- Display_String(" illegal user ",0xc0); //非法用戶,開始報警
- write_com(0xcf);
- write_date(0x30+j);error=0; //報警7S
- delayms(5000);j=0;error=1;
- Display_String(DSY_BUFFER,0xc0); //輸錯3次關閉鍵盤7S
- }
- } i=0;
- break;
-
-
-
- case 11: led=1; //按B鍵上鎖
- clear_password();
- Display_String(table,0x80); //顯示Your Password
- Display_String(DSY_BUFFER,0xc0); //清屏
- i=0; hujiao=0; //訪客標志位清零
- IS_valid_user=0; //合法用戶標志位清零
- break;
-
- case 12: //按C鍵設置新密碼
- if ( !IS_valid_user) //如果是合法用戶則提示輸入新密碼
- {
- i=0;
- Display_String("No rights ! ",0xc0); //非法用戶按下則提示
- delayms(1000); //操作錯誤
- Display_String("Your Password...",0x80);
- Display_String(" ",0xc0);
- }
-
- else
- {
- i=0;revise=1; //如果是合法用戶則提示輸入新密碼
- Display_String("New Password: ",0x80);
- Display_String(" ",0xc0);
- }hujiao=0; break;
-
- case 13: if ( !IS_valid_user) //按D鍵保存新密碼
- { i=0;
- Display_String("No rights ! ",0xc0); //非法用戶按下則提示操作錯誤
- delayms(1000);
- Display_String("Your Password...",0x80);
- Display_String("Lock OK! ",0xc0); //提示關鎖成功
- }
- else
- {
- i = 0; revise=0;
- init();
- delayms(5);
- for(k=0;k<6;k++){ Userpassword[k]=Userpassword[k]+48;}
- aa=Sendstring(0xa0,1,Userpassword,6); //存入新密碼
- delayms(5);
- aa=Recstring(0xa0,1,buffer,6); //讀出新密碼
- delayms(5);
- clear_password(); //清除密碼
- Display_String(table,0x00);
- Display_String(" Saving...... ",0xc0); //提示保存密碼中......
- delayms(2000);
- Display_String("save successful ",0xc0); //第一行 顯示保存成功
- delayms(2000);
- Display_String(" ^_^ ^_^ ^_^ ",0xc0); //提示用戶更改密碼成功
- delayms(1000);
- led=1; //等待8秒時間到關閉
- clear_password(); //清密碼
- Display_String(table,0x80); //第0行 顯示Your Password
- Display_String(DSY_BUFFER,0xc0); //第一行 顯示空
- i=0;
- IS_valid_user=0;
- }hujiao=0; break;
-
-
- case 14:i=0;hujiao=0; //按E鍵消除所有輸入
- clear_password();
- Display_String(" ",0xc0);
- break;
- case 15: if(i==3) //呼叫,門牌號3位
- {
- hujiao=1;i=0;TR0 = 1;temp=0;
- clear_password();
- // Display_String(DSY_BUFFER,0xc0);
- delayms(100);
- }
-
- else
- {
- j++;led=1; //關閉LED
- clear_password();
- Display_String("error! Have try ",0xc0); //顯示密碼錯誤,請重新輸入
- write_com(0xcf);
- write_date(0x30+j);
- delayms(1000);
- IS_valid_user=0;
- if(j!=3)Display_String(DSY_BUFFER,0xc0); //清屏
- IS_valid_user=0;
- if(j==3) //只有三次輸入機會
- {
- Display_String(" illegal user ",0xc0); //非法用戶,開始報警
- write_com(0xcf);
- write_date(0x30+j);error=0; //報警7S
- delayms(5000);j=0;error=1;
- Display_String(DSY_BUFFER,0xc0); //輸錯3次關閉鍵盤7S
- }
- }
-
- break;
- }
- if(revise!=1)Display_String("Your Password...",0x80);
- if(hujiao==0)Beep();delayms(100); P1=0xf0;
- while(P1!=0xf0);
- while(P1==0xf0);
-
- }
- }
- }
復制代碼
所有資料51hei提供下載:
門禁V1.0.7z
(44.41 KB, 下載次數: 180)
2019-6-28 11:01 上傳
點擊文件名下載附件
仿真+ C、bin文件 下載積分: 黑幣 -5
|