此程序是基于清翔电子开发板编写的,已测试通过,此程序并目前只完成了密码锁功能,还没有完成用户房间号码比对,发这个帖子初衷是为了给正在学习密码锁的同学们一个思路,代码有详细注释,适合初学者借鉴,大神勿喷
疯狂提示:用户房间号的匹配使用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仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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)
|