标题:
51电子密码锁源码+仿真 带蜂鸣器LCD1602显示
[打印本页]
作者:
wbq52588
时间:
2016-1-13 14:21
标题:
51电子密码锁源码+仿真 带蜂鸣器LCD1602显示
0.png
(31.56 KB, 下载次数: 104)
下载附件
2016-1-13 22:48 上传
51单片机源码+protues仿真 带蜂鸣器电路LCD1602显示
1.png
(48.17 KB, 下载次数: 79)
下载附件
2016-1-13 22:49 上传
51单片机电子密码锁仿真+全部程序下载:
电子密码锁.rar
(110.47 KB, 下载次数: 99)
2016-1-13 14:21 上传
点击文件名下载附件
下载积分: 黑币 -5
以下是主程序预览:
/**************************************************************** ***************
阅读提示:1.所有的数组以 名字_功能_pad[]
例如code_intput_pad[]; 为密码输入数组
2.所有的函数以 类型_功能_名字()
例如desplay_set_code(); 为密码设置函数
desplay_input_code(); 为密码输入函数
3.调用函数大家可以多用局部变量方便,空间占用又少
(以上名字方式纯属本人自己感到合适的,大家也可以用适合自己的方式,但是
不管是什么样的命名方式都得有一套方式,这样做一个比较复杂的程序方便点)
4.由于小弟第一次用这种方式写代码,所以在写这个程序中也有些地方没注意;
给大家带来不便请谅解。
5.广告王,这里也插播下吧
单片机交流群--best单片机交流群,欢迎你的加入一起学习交流
*********************************************************************************/
#include<reg52.h>
#include"delay.h"
#include"1602.h"
#define uint unsigned int
#define uchar unsigned char
#define port_key P1 //矩阵键盘输入口
uchar key_num; //键盘扫描读回值须为全局变量
uchar keypad[]={0xfe,0xfd,0xfb,0xf7}; //键盘扫描分别将各行置0
uchar code_new_pad[6]={1,1,1,1,1,' '}; //6位的设置密码存储‘ ’用来判断是否输入第六位密码
uchar code_input_pad[6]={1,1,1,1,1,' '}; //用来存储输入的密码
sbit buzzer=P2^7; //buzzzer接口
sbit led_r=P2^3;
sbit led_l=P2^4;
bit key_pd=0; //按键标志
bit code_compare=0; //密码对比标志
uint key_time=0; //记录键盘按下的次数
uchar temp=0;
void init_T1() //定时器1初始化 利用定时器提高键盘的扫描速度
{
EA=1;
ET1=1;
TMOD=0x10; //定时器工作方式选择16位定时
TH1=(65536-1000)/256; //定时器高八位
TL1=(65536-1000)%256; //定时器低八位
TR1=1; //开启定时器1
}
void play_buzzer(uint j,uint k) //蜂鸣器
{
uchar i=0;
for(j;j>0;j--)
{
for(i=0;i<=100;i++)
{
buzzer=~buzzer;
delayms(k);
}
}
}
uint key_scan() //4*3矩阵键盘扫描
{
uint i=0;
uchar key_temp;
for(i=0;i<4;i++)
{
port_key=keypad[i];
key_temp=port_key;
key_temp=key_temp&0xf0;
if(key_temp!=0xf0) //判断是否有键盘被按下
{
delayms(15); //延迟15ms,去除键盘的抖动
key_temp=port_key; //重新读回key_port的值
key_temp=key_temp&0xf0;
if(key_temp!=0xf0) //说明确实有键被按下
{
key_temp=port_key;
key_pd=1; //键盘按下标志
key_time++; //键盘按下次数标志
switch(key_temp)
{
case 0xee: key_num=1+0x30;play_buzzer(2,50); break; //将数字转化为ASC
case 0xde: key_num=2+0x30;play_buzzer(2,50); break;
case 0xbe: key_num=3+0x30;play_buzzer(2,50); break; //以上3行代码为第一行扫描
case 0xed: key_num=4+0x30;play_buzzer(2,50); break;
case 0xdd: key_num=5+0x30;play_buzzer(2,50); break;
case 0xbd: key_num=6+0x30;play_buzzer(2,50); break; //第二行扫描
case 0xeb: key_num=7+0x30;play_buzzer(2,50); break;
case 0xdb: key_num=8+0x30;play_buzzer(2,50); break;
case 0xbb: key_num=9+0x30;play_buzzer(2,50); break; //第三行扫描
case 0xe7: key_num=10;play_buzzer(1,50); break; //...10代表确定键
case 0xd7: key_num=0+0x30;play_buzzer(2,50); break;
case 0xb7: key_num=11;play_buzzer(1,50); break; //第四行扫描..11代表删除键
}
while(key_temp!=0xf0) //松手检测
{
key_temp=port_key;
key_temp=key_temp&0xf0;
}
}
}
}
return key_num;
}
void new_save_code() //将设置密码存入code_new_pad
{
if(key_time<=6) //防止密码输入超过6位
{
code_new_pad[key_time-1]=key_num;
gotoxy(2,key_time-1);
w_dat_lcd(code_new_pad[key_time-1]);
}
}
void input_save_code() //将输入的密码存入code_input_pad
{
if(key_time<=6)
{
code_input_pad[key_time-1]=key_num; //注意key_time的控制须好好把握
gotoxy(2,key_time-1);
w_dat_lcd(code_input_pad[key_time-1]);
}
}
uint compare_code() //输入密码与设置密码对比
{
uint i=0;
for(i=0;i<6;i++)
{
if(code_input_pad[i]==code_new_pad[i])
{
if(i==5)
code_compare=1;
else continue;
}
else
{
code_compare=0;
break; //只要有一位密码不对就跳出循环
}
}
return code_compare;
}
void key_serve() //键盘服务程序
{
if(key_pd==1) //判断是否有键被按下
{
key_pd=0;
if(key_num==11) //是否按下删除键
{
gotoxy(2,key_time-2);
w_dat_lcd(' '); //删除当前数字
key_time=key_time-2;
}
else if(key_num==10&&temp==0) //是否按下设置密码时的确定键
{
if(code_new_pad[5]!=' ') //判断是否输入了第六个密码
{
key_time=0;
w_com_lcd(0x01); //清屏指令
desplay_set_succ();
delaylong(500);
desplay_input_code();
temp=1;
}
else //没有输入6位密码
{
key_time=0;
w_com_lcd(0x01);
desplay_set_error();
delaylong(500);
desplay_set_code();
}
}
else
{
if(temp==0) //利用temp的数值判断将键盘密码存入那个数组中
new_save_code();
else if(temp==1)
{
input_save_code();
if(code_input_pad[5]!=' ') //判断是否输入了6位密码
{
if(key_num==10)
{
compare_code(); //密码判断函数
if(code_compare==1)
{
w_com_lcd(0x01);
desplay_input_succ();
led_r=1;
play_buzzer(20,88);
}
else
{
w_com_lcd(0x01);
desplay_input_error();
led_l=1;
play_buzzer(20,50);
led_l=0;
desplay_input_code();
key_time=0;
}
}
}
}
}
}
}
void main() //主函数
{
led_r=0;
led_l=0;
init_lcd();
init_T1();
desplay_set_code();
for(;;)
{
key_serve();
}
}
void timer1() interrupt 3 // 定时器1中断服务
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
key_scan(); //按键扫描程序放入中断提高扫描速度
}
复制代码
作者:
utilizy
时间:
2018-6-9 13:22
哥,,没有密码啊。。
作者:
许渡XD
时间:
2019-6-16 15:51
想要拥有
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1