标题:
密码锁程序精华版89c52单片机
[打印本页]
作者:
猎鹰
时间:
2016-5-12 15:45
标题:
密码锁程序精华版89c52单片机
0.png
(93.79 KB, 下载次数: 129)
下载附件
2016-5-16 03:35 上传
89C52单片机的密码锁:
密码锁主程序精华版89c52.rar
(89.5 KB, 下载次数: 51)
2016-5-12 15:42 上传
点击文件名下载附件
下载积分: 黑币 -5
部分程序预览:
/****************************************************************/
/****通过借鉴别人作品自己加以修改才完成了此作品*****************/
/****如果大家有啥建议欢迎联系我,我们共同改进*******************/
/*************************************************/
/********这个程序舍去了外部eeprom简化了外围电路****************/
#include<reg52.h>
#include<intrins.h>
#include<1602yj.h>
#include<key.h>
#include<bujing.h>
#include<eeprom.h>
#include<buzzer.h>
#include<time.h>
#include<mima.h>
#define address 0x2000
uchar idata mima_5[6] = {1,2,3,4,5,6}; //初始密码
uchar idata mima_6[6]={1,1,1,1,1,1}; //管理员密码
uchar flag_change,flag;
uchar aa;//存放密码错误的次数,够三次报警
uint num;//计数
uchar flag_bg,flag_h,m;
uchar flag_key=1;
uchar i;
void init()
{
init_lcd();//液晶初始化
fen=1; //关闭蜂鸣器
beiguang=0;//打开液晶背光
TMOD |= 0x11; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
ET1=0; //定时器中断关闭 警报用
TR1=0; //定时器开关关闭 警报用
EA = 1;//打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 0;//关闭定时器
TH0 = 0x4c;//50ms装初值
TL0 = 0x00;
EX1=1;
IT1=1; //外部中断0为下降沿触发
}
void mima()
{
uchar key;
uchar idata mima_1[6]={' ',' ',' ',' ',' ',' '};//存放密码缓冲区
uchar idata mima_2[6]={' ',' ',' ',' ',' ',' '};
uchar idata mima_3[6]={' ',' ',' ',' ',' ',' '};
key=step_choose();
beiguang=0;
TR0=0;
switch (key) //switch语句比if语句效率高 在这里选择这种语句
{
case E: //恢复出厂设置
{
lcdpos(0,0);
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
write_com(0x0f);//显示光标
display_n(" Admin Password ");
lcdpos(1,0);
if(input_mima(mima_2)) //处理输入密码
{
if(mimaduibi(mima_2,mima_6)) //密码正确
{
lcdpos(0,0);
write_com(0x0c);
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n(" PassWord Right ");
ERASE(address);
for(i=0;i<6;i++)
{ Write_ISP (address+i, mima_5[i]);}
delayx(1500);
aa = 0; //清除密码错误次数
fen = 0; //响一下
delayx(1000);
fen = 1;
}
else //密码 不正确
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
}
}
else //密码没有输入正确或完成
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
}
}
break;
case A: //A被按下,接收输入密码,
{
for(i=0;i<6;i++)
{
mima_1[i]= Read_ISP(address+i);
}
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
write_com(0x0f);//显示光标
lcdpos(0,0);
display_n(" Input PassWord");
if(input_mima(mima_2)) //处理输入密码
{
if(mimaduibi(mima_2,mima_1)) //密码正确
{
lcdpos(0,0);
write_com(0x0c);
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n(" PassWord Right ");
aa = 0; //清除密码错误次数
kai(); //开锁
fen = 0; //响一下
delayx(1000);
fen = 1;
TR0 = 1;
flag_h=1;
flag=0;
while(key != C&&flag_h!=0) //C没按下一直开 如果忘记关门定时器10s到了会自动关门
{
key = scan();
}
if(flag_h==1||m==0)//检测是不关过门 flag_h==1表示没关门 m检测进入外部中断后执行关门指令 也除去一个警告
{ guan();
flag=1;
TR0 = 0;
}
}
else //密码 不正确
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
}
}
else //密码没有输入正确或完成
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
}
}
break;
case F: //F被按下,修改密
{
for(i=0;i<6;i++)
{
mima_1[i]= Read_ISP(address+i);
}
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
write_com(0x0f);//显示光标
lcdpos(0,0);
display_n(" Input PassWord");
write_com(0x0f);//显示光标
if(input_mima(mima_2)) //处理输入密码
{
if(mimaduibi(mima_2,mima_1)) //密码正确
{
lcdpos(0,0);
write_com(0x0c);
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n(" PassWord Right ");
aa = 0; //清除密码错误次数
delayx(1000);
flag_change = 1;
if(flag_change) //下面开始修改密码
{ lcdpos(0,0);
write_com(0x0c); //关闭光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("In New PassWord");
delayx(1000);
lcdpos(1,0);
write_com(0x0f);//显示光标
if(input_mima(mima_2)) //处理输入密码
{
lcdpos(0,0);
write_com(0x0c);
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("Input New Pass"); //确定新密码
lcdpos(1,0);
display_n("PassWord again");
delayx(2000);
lcdpos(0,0);
write_com(0x0f);//显示光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("In New PassWord");
if(input_mima(mima_3)) //处理输入密码
{
if(mimaduibi(mima_2,mima_3)) //密码正确
{
lcdpos(0,0);
write_com(0x0c);
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("Change PassWord");
lcdpos(1,0);
display_n(" SUCCESSFULLY ");
ERASE(address);
for(i=0;i<6;i++)
{ Write_ISP (address+i, mima_3[i]);}//把修改的密码存进内部rom
delayx(2000);
flag_change = 0;
}
else //密码 不正确
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
flag_change = 0;
}
}
else //密码没有输入正确或完成
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
}
}
else //密码没有输入正确或完成
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
flag_change = 0;
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
}
}
}
else //密码 不正确
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
}
}
else //密码没有输入正确或完成
{
lcdpos(0,0);
write_com(0x0c); //关光标
write_com(0x06);//写一个字符后地址指针加 1
write_com(0x01);//显示清零,数据指针清零
display_n("PassWord Error");
delayx(1000);
aa++;
if(aa == 4)
{
aa = 0;
warn(); //密码不正确报警
}
}
}
break;
case C: if(flag==0)
{
guan();
flag=1;
}
break;
default:
break;
}
}
void main()
{
init();
while(1)
{
mima();
/* lcdpos(0,1);
display1(scan());// *///测试矩阵键盘程序 键盘必须改成‘1’字符形式
}
}
void timer0() interrupt 1 //定时器0中断, 背光// 自锁
{
TH0 = 0x4c;//50ms定时
TL0 = 0x00;
num++;
if(num ==600)//30s时间到
{
num = 0;
flag_bg=1;
}
}
void counter(void) interrupt 2
{
if(flag==0)
{
flag=1;
TR0 = 0;
flag_h=0;
m=0;
//guan(); 有1个警告 所以不在此调用关锁函数
}
}
/***************因两个定时器工作要考虑优先级********/
/*************定时不准*****************************/
/*********所以用了一个定时器**********************/
复制代码
作者:
谭雅Ayom
时间:
2016-5-15 22:06
这个是用到单片机的什么?
作者:
379673480
时间:
2016-10-12 15:01
请问这个有没有原理图
作者:
1115475664
时间:
2016-12-7 22:06
没有原理图呀
作者:
a6873125
时间:
2016-12-25 06:17
没图说个毛
作者:
samyu
时间:
2016-12-25 14:24
好东西,学习下
作者:
小丑,
时间:
2018-1-10 13:16
我想知道怎么看啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1