51单片机密码锁程序

合集下载

51单片机密码锁制作的程序和流程图

51单片机密码锁制作的程序和流程图

51单片机密码锁制作的程序和流程图(很详细) 一、基本组成:单片机小系统+4*4矩阵键盘+1602显示+DC电机基本电路:键盘和和显示键盘接P1口,液晶的电源的开、关通过P2.7口控制电机(控制口P2.4)二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。

2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。

但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。

3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。

因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。

b)同时将LCD背光灯关闭4.DC电机模拟开锁动作。

a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。

DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。

三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。

超过10位时系统将自动截取前10位、但不作密码长度溢出提示。

2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。

3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。

4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。

5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。

6.0 修改密码键和恢复初始密码键最好置于室内。

这是Proteus仿真结果:输入密码123456:显示结果:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接INT0引脚接的一个独立按键,用于唤醒CPU工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效当然你可以随时放弃修改密码改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。

基于51单片机的电子密码锁—1

基于51单片机的电子密码锁—1

基于51单⽚机的电⼦密码锁—1这个程序是为了实现基于51单⽚机的电⼦密码锁,⽬前,程序解决了最重要之⼀的输⼊的密码和保存的正确密码相⽐较的问题。

通过定义了两个数组:uchar table2[6]; //临时密码保存uchar password[6]="123456"; //进门密码将输⼊的密码写⼊到table2[]中有⼀点需要特别注意:因为我写到table2[]数组内的是ASCII值的0-9,⽽ASCII值的0-9对应的符号却是NUT,SOH... (省略)所以在刚开始调试时,LCD1602屏幕输出的总是奇怪的字符,⽽不是我想要的0-9,通过查询ASCLL码表可以知道字符(0-9)对应的数值是48-57,所以我通过定义了⼀个新的数组,uchar smgduan[10]={48,49,50,51,52,53,54,55,56,57};以及lcd_write_data(smgduan[table2[i]]);的⽅式,实现了在LCD上输出字符0-9的功能。

在最后做两个数组⽐较时,开始同样出现了这个情况,因为数字1和字符1对应的ASCII值不同,所以password[i]不等于table2[i],需要进⾏转换,我的⽅式的是password[i]==smgduan[table2[i]];罗⾥吧嗦这个多,主要还是给未来的⾃⼰看看,当初犯得错误多么低级。

---------------------------------------------------分割线-----------------------------------------------------------------------------------下⼀版改进考虑把重复按键选择数字改成矩阵按键,加进些其他的功能。

---------------------------------------------------分割线-----------------------------------------------------------------------------------程序部分:/*这个⽅案是我写基于51单⽚机的电⼦密码锁过程中,未完成全部功能的程序。

基于51单片机的密码锁程序

基于51单片机的密码锁程序
*输入:row cloum dat
*************************************************/
void lcd_char(uchar row ,uchar cloum,uchar dat)
{
if(row==1)
{
lcd_writecom(0x80+cloum);
lcd_writedata(dat);
}
else
{
lcd_writecom(0x80+0x40+cloum);
lcd_writedata(dat);
}
}
/*********************************************
名称:lcd_string(uchar row,uchar cloum,uchar *p)
}
/********************************************************************
* 名称 : Delay_xMs()
* 功能 : 延时子程序,经过软件调试,测得延时程序大概为55us.
* 输入 : x
* 输出 : 无
***********************************************************************/
uchar init_password[6]="123456";
uchar a[5]="RIGHT";
uchar b[16]="The new password";
unsigned char code pu[282]={

基于51单片机的密码锁设计程序_

基于51单片机的密码锁设计程序_
uchar key。
uchar temp,count,aa,bb,cc。/*一般将这些变量定义在C文件中
当主函数需要时用extern引用*/
bit shu_flag,modify_flag,rst。
bit fun_flag。//功能键Байду номын сангаас志位没使用
bit down_flag,up_flag,open_flag。
write_ds1302_byte(dat)。
T_CLK=1。
T_EN=0。
}
uchar read_ds1302_data(uchar addr)
{
uchar date。
T_EN=0。
T_CLK=0。
T_EN=1。
write_ds1302_byte(addr)。
date=read_ds1302_byte()。
sda=1。
delay1()。
}
void i2c_ack()
{
uchar i。
scl=1。
delay1()。
while((sda==1)&&(i<250)) i++。
scl=0。
delay1()。
}
void i2c_nack()
{
scl=1。
delay1()。
sda=1。
scl=0。
delay1()。
lcd_rs_port=1。
lcd_rw_port =0。
lcd_en_port=0。
P0=dat。
lcd_en_port=1。
lcd_en_port=0。
}
void wtite_lcd_1602_dat(uchar x_pos,uchar y_pos,uchar dat)

基于51单片机的示波器和密码锁程序(部分)

基于51单片机的示波器和密码锁程序(部分)
GUI_Write14CnCharmin(60,180,"输入错误",RED,GREEN); //输入错误提示
for(i=0;i<2;i++)
{
FMQCX();
}
GUI_Box(50,180,130,200,BLACK); //清除输入错误提示
GUI_Line(0,100,36,100,GREEN);
GUI_Line(0,125,36,125,GREEN);
GUI_Line(0,150,36,150,GREEN);
GUI_Line(0,175,36,175,GREEN);
GUI_Line(0,200,175,200,GREEN);
SRZ[7]=SRZ[6];
SRZ[6]=SRZ[5];
SRZ[5]=SRZ[4];
SRZ[4]=SRZ[3];
SRZ[3]=SRZ[2];
SRZ[2]=SRZ[1];
SRZ[1]=SRZ[0];
SRZ[0]=KeyValue;
}
else if(KeyValue==10) //确认键
GUI_ClearScreen(BLACK); //TFT刷屏,以黑色为底色
for(i=0;i<8;i++) //按键数值赋初值,显示xxxxxxxx
{
SRZ[i]=10;
}
GUI_Box(48,30,133,50,GREEN); //四个上部显示方框
GUI_Box(48,60,133,80,GREEN);
GUI_WriteASCIImin(73,67,"S11",RED,GREEN);

AT89C51单片机电子密码锁

AT89C51单片机电子密码锁

AT89C51单片机电子密码锁#include"main.h"/******************** LCD PART START *******************************///5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//读状态unsigned char ReadStatusLCM(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;Delay5Ms();while (LCM_Data & Busy); //检测忙信号return(LCM_Data);}//写数据void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高能够在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}//写指令void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}//读数据unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}void LCMInit(void) //LCM初始化{LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置}//按指定位置显示一个字符,x表示列,Y表示行void LCD_write_char(unsigned char X,unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y)X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码WriteDataLCM(DData);}//按指定位置显示一串字符void LCD_write_string(unsigned char X,unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (*DData) //若到达字串尾则退出'\0'就是0{if (X <= 0xF) //X坐标应小于0xF{LCD_write_char(X,Y, *DData); //显示单个字符DData++;X++;}}}/************/#include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned int/******************** LCD PART START *******************************/void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=124;y>0;y--);}sbit e=P2^5;sbit rw=P2^6;sbit sr=P2^7;uchar code name[]="zxs";uchar code name1[]="zcf";uchar code name2[]="zx";void write_com(uchar com){int rs;rs=0;P0=com;delay(5);e=1;delay(5);e=0;}void write_data(uchar date){int rs;rs=1;P0=date;delay(5);e=1;delay(5);e=0;}void init(){e=0;rw=0;write_com(0x38);write_com(0x0c); write_com(0x06);write_com(0x01);write_com(0x80);}void display(){uchar i;for(i=0;i<3;i++){write_data(name[i]);}write_com(0x80+0x40);for(i=0;i<3;i++){write_data(name1[i]);}}void main(){init();display();}#include <AT89X51.h>#define uchar unsigned charuchar starbuf[10];uchar wordbuf[8];uchar pw[8]={1,2,3,4,5,6,7,8};uchar pwbuf[8];uchar count=0;// 初始没有输入密码,计数器设为0 uchar inputflag=0;// 先处于密码输入状态,非密码修改状态bit enterflag=0; // 没有按下确认键bit pwflag=0;// 密码标志先置为0sbit warn=P3^6;#define lcd_data P0sbit rs=P2^7;sbit rw=P2^6;sbit e=P2^5;///////////////////////LCD1602驱动程序///////////////////////void delay_1602(unsigned int i){while(i--);}void enrw(){rs=0;rw=0;e=0;delay_1602(250);e=1;}write_data(uchar c){lcd_data=c;rs=1;rw=0;e=0;delay_1602(250);e=1;}init_lcd(void)//初始化{lcd_data=0x01;//清屏幕enrw();lcd_data=0x38;//数据长度为8位,双行显示,5*7字符。

基于51单片机的8位电子密码锁

基于51单片机的8位电子密码锁

课程设计基于51单片机的8位电子密码锁/****************************************************8位电子密码锁程序****************************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit fmq=P3^0;sbit led1=P3^1;sbit led2=P3^2;sbit scl=P3^4;sbit sda=P3^5;uchar code wela[]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f};uchar code dula[]={0x24,0xbd,0xe0,0xa8,0x39,0x2a,0x22,0xbc,0x20,0x28,0x24,0xfb,0xee,0x31,0Xef};uchar temp;uchar *play;uchar screa_ok=0;uchar at24c02[8]={0,0,0,0,0,0,0,0}; //存储源密码uchar atdata[8]={11,11,11,11,11,11,11,11}; //存储开锁密码uchar atdata1[8]={12,12,12,12,12,12,12,12}; //存储HHHHHHHH uchar atdata2[8]={11,11,11,11,11,11,11,11}; //存储修改密码uchar atdata3[8]={14,14,14,14,14,14,14,14}; //存储换密码时输入的密码void at24c02_init();void start();void stop();void respons0(); //应答void respons1() ;void write_add(uchar address,uchar date);uchar read_add(uchar address);void read_data(void);void write_data(void);uchar keyscan();void display();void keyprocess();void delay(){ ;;;;;;}void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){// at24c02_init();play=atdata2;read_data();//write_data();while(1){display();keyprocess();}}void display(){uchar j;for(j=0;j<=7;j++){P1=0Xff;P0=dula[play[j]];P1=wela[j];P1=0Xff;}}uchar keyscan(){uchar num=0xff;P2=0xfe;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delayms(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delayms(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delayms(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case 0xeb:num=9;break;case 0xdb:num=0;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){delayms(5);temp=P2;temp=temp&0xf0;while(temp!=0xf0){temp=P2;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}}return num;}void keyprocess(){uchar keydata=0;uchar i,error=0;static unsigned char flag=0;static unsigned char num=0;keydata=keyscan();if(keydata==0xff)return;switch(keydata){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 0:if(flag==1){if(num<8){atdata3[num]=13;atdata[num]=keydata;num++;}}elseif(flag==2){if(num<8){atdata1[num]=keydata;num++;}}else{if(num<8){atdata2[num]=13;atdata[num]=keydata;num++;}}break;case 11:if(flag==0&&num==8){num=0;for(i=0;i<8;i++){if(atdata[i]==at24c02[i]){;}elseerror=1;}}if(error==0){led1=0;delayms(1000);led1=1;}else{led2=0;fmq=0;delayms(500);led2=1;fmq=1;delayms(500);led2=0;fmq=0;delayms(500);led2=1;fmq=1;delayms(500);led2=0;fmq=0;delayms(500);led2=1;fmq=1;}error=0;for(i=0;i<8;i++){atdata[i]=11;atdata2[i]=11;}}elseif(flag==1&&num==8) { num=0;for(i=0;i<8;i++) {if(atdata[i]==at24c02[i]) ;else{error=1;}}if(error==0){flag=2;play=atdata1;}else{led2=0;fmq=0;delayms(500);led2=1;fmq=1;delayms(500);led2=0;fmq=0;delayms(500);led2=1;fmq=1;delayms(500);led2=0;fmq=0;delayms(500);led2=1;fmq=1;}error=0;for(i=0;i<8;i++){atdata[i]=11;atdata3[i]=14;}}break;case 12:if(num>0){num--;if(flag==1){atdata3[num]=14;}if(flag==2){atdata1[num]=12;}else{ atdata[num]=11;atdata2[num]=11;}}break;case 13:if(flag==0){play=atdata3;flag=1;}break;case 14:if(flag==2&&num==8){write_data();for(i=0;i<8;i++){at24c02[i]=atdata1[i];}led1=0;delayms(300);led1=1;delayms(300);led1=0;delayms(300);led1=1;delayms(300);led1=0;delayms(300);led1=1;for(i=0;i<8;i++){atdata2[i]=11;}play=atdata2;for(i=0;i<8;i++){atdata1[i]=12;}flag=0;num=0;}break;case 15:flag=0;play=atdata2;break;case 16:/* on=0;flag=0;num=0;play=atdata2;for(i=0;i<8;i++){atdata2[i]=11;}*/break;}}void start() //开始信号{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons0() //应答{sda=0;delay();scl=1;delay();scl=0;delay();}void respons1() //应答{sda=1;delay();scl=1;delay();scl=0;delay();}void init(){sda=1;delay();scl=1;delay();}void write_byte(uchar date) {uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY;delay();scl=1;delay();// scl=0;// delay();}scl=0;delay();sda=1;delay();}uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}void write_add(uchar address,uchar date) {start();write_byte(0xa0);respons0();write_byte(address);respons0();write_byte(date);respons0();stop();}uchar read_add(uchar address) {uchar date;start();write_byte(0xa0);respons0();write_byte(address);respons0();start();write_byte(0xa1);respons0();date=read_byte();respons1();stop();return date;}void read_data(){uchar i;for(i=0;i<8;i++){delayms(5);at24c02[i]=read_add(i);delayms(5);}}void write_data(){uchar i;for(i=0;i<8;i++){delayms(5);write_add(i,atdata1[i]);delayms(5);}}。

51单片机密码锁程序

51单片机密码锁程序
case 0xdd: return 5;break;
case 0xbd:return 6;break;
case 0x7d:return 12;break;//取消键12
}
while(temp!=0xf0)
{
temp=P1;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ youxiaoled(); //按键有效指示灯亮,即蓝灯亮
temp=P1;
switch(temp)
{
case 0xee: return 1;break;
uchar i;
for (i=0;i<4;i++)
{
if (pw[i]==pwbuf[i])
flag = 1;
else
{
flag = 0;
i = 4;
error_cnt++; //错误次数加1
}
}
return(flag);
uchar num,num1;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7fd delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
键盘分布 7 8 9 修改密码
4 5 6 取消
键盘接法 行 P1.2 P1.1 P1.0 P1.3
列 P.4 P1.5 P1.6 P1.7
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)

51单片机密码锁程序.

51单片机密码锁程序.

/*停止条件*/ void Stop(void) { Sda=0; Scl=1; Nop(); Sda=1; Nop(); } /*应答位*/ void Ack(void) { Sda=0;
Nop(); Scl=1; Nop(); Scl=0; } /*反向应答位*/ void NoAck(void) { Sda=1; Nop(); Scl=1; Nop(); Scl=0; } /*发送数据子程序,Data 为要求发送的数据*/ void Send(uchar Data) { uchar BitCounter=8; uchar temp; do { temp=Data; Scl=0; Nop(); if((temp&0x80)==0x80) Sda=1; else Sda=0; Scl=1; temp=Data<<1; Data=temp; BitCounter--; } while(BitCounter); Scl=0; } /*读一字节的数据,并返回该字节值*/ uchar Read(void) { uchar temp=0; uchar temp1=0; //判断是否传送完成 //将待发送数据暂存 temp
= {"===Coded Lock==="}; = {" correct "}; = {" error "}; = {" pass "}; = {" open "}; = {"SetNewWordEnable"}; = {"input: "}; = {"ResetPasswordOK "};
unsigned char code initword[] unsigned char code Er_try[] unsigned char code again[]

基于51单片机多功能电子密码锁

基于51单片机多功能电子密码锁

#include <reg52.h>#define uint unsigned int#define uchar unsigned char#define KEY P3 //键盘输入端口#define No_key 20 //无按键时的返回值#define lcddata P2 //1602的数据输入端口sbit lcden= P1^2。

sbit lcdrs= P1^0。

sbit lcdrw= P1^1。

sbit light= P1^3。

sbit light1= P1^4。

uchar j 。

//用来统计输入个数的全局变量uchar aa。

//用来在定时器中计数的全局变量uchar code table[]= " Hello!"。

uchar code table1[]=" OK! " 。

uchar code table2[]="Enter please:" 。

uchar code key_table[16] ={1,2,3,10,4,5,6,11,7,8,9,12,0,13,14,15}。

uchar password[]={2,0,1,0,9,3} 。

//设定初始密码uchar save[6]。

//保存输入的数据uchar conflag 。

//确认标志uchar lockflag。

//锁键盘标志uchar startflag。

//开始标志void delay(uint z>。

//延时子函数void wright_com(uchar com>。

//写指令函数void wright_data(uchar date> 。

//写数据函数void init(>。

//初始化void display_OK(>。

// 显示OKvoid delete(>。

//删除输入的最后一个数uchar keyscan(> 。

毕业设计基于51单片机的密码锁设计程序

毕业设计基于51单片机的密码锁设计程序
for(i=0;i<8;i++)
{
ACC=ACC>>1;
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return (ACC);
}
void write_ds1302_dat(uchar addr,uchar dat)
{
T_EN=0;
T_CLK=0;
T_EN=1;
write_ds1302_byte(addr);
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcd_rs_port=P3^5;
sbit lcd_rw_port=P3^6;
sbit lcd_en_port=P3^4;
#define lcd_data_port P0
sbit T_CLK=P2^4;
sbit T_EN=P1^0;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void write_ds1302_byte(uchar dat);
uchar read_ds1302_byte();
void write_ds1302_dat(uchar addr,uchar dat);
void lcd_busy_wait();
void write_com(uchar command);
void write_data(uchar dat);
void wtite_lcd_1602_dat(uchar x_pos,uchar y_pos,uchar dat);
T_EN=0;

51单片机密码锁制作的程序和流程图(很详细)

51单片机密码锁制作的程序和流程图(很详细)

51单片机密码锁制作的程序和流程图(很详细)展开全文一、基本组成:单片机小系统+4*4矩阵键盘+1602显示+DC电机基本电路:键盘和和显示键盘接P1口,液晶的电源的开、关通过P2.7口控制电机(控制口P2.4)小系统就不贴上来了吧。

二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。

2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。

但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。

3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。

因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。

b)同时将LCD背光灯关闭4.DC电机模拟开锁动作。

a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。

DC 电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。

三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。

超过10位时系统将自动截取前10位、但不作密码长度溢出提示。

2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。

3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。

4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。

5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。

6.0 修改密码键和恢复初始密码键最好置于室内。

这是Proteus仿真结果:输入密码123456:显示结果:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接INT0引脚接的一个独立按键,用于唤醒CPU工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效当然你可以随时放弃修改密码改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。

基于51单片机密码锁的汇编程序

基于51单片机密码锁的汇编程序

基于51单片机密码锁的汇编程序ORG 0000HENTER1 EQU 05HCHECK1 EQU 06HCHECK2 EQU 07HSJMP STARTORG 0080HSTART:ACALL INITIALBEGIN:MOV 20H,#04HMOV 21H,#50HLOOP: ACALL KEYMOV R0,21HMOV @R0,AINC 21HDEC 20HACALL DISPLAYMOV A,20HJNZ LOOPACALL KEYACALL ENTERJB ENTER1,WAY1ACALL ZEROACALL WRONGAJMP BEGINWAY1: ACALL CHECKJB CHECK1,WAY2 AJMP WAY11WAY2: ACALL ZERO CLR P3.3ACALL KEYACALL RESETSETB P3.3ACALL ZEROAJMP BEGINWAY11: ACALL CHECK11 ACALL ZEROJB CHECK2,WAY22 ACALL WRONGAJMP BEGINWAY22: CLR P3.3 ACALL KEYACALL RESET22SETB P3.3ACALL ZEROAJMP BEGINENTER:SUBB A,#0AH JNZ E1SETB ENTER1RETE1: CLR ENTER1 RETINITIAL:MOV R3,#00H MOV 40H,#00H MOV 41H,#01H MOV 42H,#02H MOV 43H,#03HMOV 50H,#00H MOV 51H,#00H MOV 52H,#00H MOV 53H,#00HMOV 60H,#03HMOV 61H,#03H MOV 62H,#03H MOV 63H,#03H RETCHECK:MOV R5,#04H MOV R0,#50HMOV R1,#40HM2: MOV 2EH,@R0 MOV A,@R1CJNE A,2EH,M1INC R0INC R1DEC R5DJNZ R5,M2SETB CHECK1RETM1: CLR CHECK1 RETRESET:SUBB A,#0BHJZ MOD1RETMOD1: MOV 24H,#04H MOV 25H,#70HMOV 26H,#50HLOOP3:ACALL KEYMOV R0,25HMOV @R0,AMOV R1,26HMOV A,#0FHMOV @R1,AINC 26HINC 25HDEC 24HMOV A,24HJNZ LOOP3ACALL KEYACALL ENTERACALL ZEROJB ENTER1,RESETAGAIN ACALL WRONG1AJMP MOD1L3: RETRESETAGAIN:MOV 24H,#04H MOV 25H,#75HMOV 26H,#50HLOOP4: ACALL KEYMOV R0,25HMOV @R0,AMOV R1,26HMOV A,#0FHMOV @R1,AINC 26HINC 25HDEC 24HMOV A,24HJNZ LOOP4ACALL KEYACALL ENTERACALL ZEROJB ENTER1,RESETCHECK ACALL WRONG1AJMP RESETAGAINRESETCHECK:MOV R5,#04H MOV R0,#70HMOV R1,#75HW2: MOV 2EH,@R0MOV A,@R1CJNE A,2EH,W1INC R0INC R1DEC R5DJNZ R5,W2AJMP FINALW1: ACALL WRONG1 AJMP MOD1FINAL: MOV 40H,70H MOV 41H,71HMOV 42H,72HMOV 43H,73HAJMP L3CHECK11:MOV R5,#04H MOV R0,#50HMOV R1,#60HM22: MOV 2EH,@R0MOV A,@R1CJNE A,2EH,M11INC R0INC R1DEC R5DJNZ R5,M22SETB CHECK2RETM11: CLR CHECK2 RETRESET22:SUBB A,#0BH JZ MOD2RETMOD2: MOV 24H,#04H MOV 25H,#70HMOV 26H,#50H LOOP33:ACALL KEY MOV R0,25HMOV @R0,AMOV R1,26HMOV A,#0FHMOV @R1,AINC 26HINC 25HDEC 24HMOV A,24HJNZ LOOP33ACALL KEYACALL ENTERACALL ZEROJB ENTER1,RESETAGAIN2 ACALL WRONG1AJMP MOD2L33: RETRESETAGAIN2:MOV 24H,#04H MOV 25H,#75HMOV 26H,#50HLOOP44: ACALL KEYMOV R0,25HMOV @R0,AMOV R1,26HMOV A,#0FHMOV @R1,AINC 26HINC 25HDEC 24HMOV A,24HJNZ LOOP44ACALL KEYACALL ENTERACALL ZEROJB ENTER1,RESETCHECK2 ACALL WRONG1AJMP RESETAGAIN2RESETCHECK2:MOV R5,#04H MOV R0,#70HMOV R1,#75HW22: MOV 2EH,@R0MOV A,@R1CJNE A,2EH,W11INC R0INC R1DEC R5DJNZ R5,W22AJMP FINAL2W11: ACALL WRONG1 AJMP MOD2FINAL2: MOV 60H,70H MOV 61H,71HMOV 62H,72HMOV 63H,73HAJMP L33KEY: ACALL KS1JNZ LK1ACALL DISPLAYAJMP KEYLK1: ACALL T12MS ACALL KS1JNZ LK2AJMP KEYLK2: MOV A,#0EFH MOV R2,AMOV R4,#00HLK4: MOV A,R2 MOV P1,AMOV A,P1JB ACC.0,LONE MOV A,#00HAJMP LKPLONE: JB ACC.1,LTWO MOV A,#01HAJMP LKP LTWO: JB ACC.2,LTHR MOV A,#02HAJMP LKPLTHR: JB ACC.3,NEXT MOV A,#03H LKP: ADD A,R4 PUSH ACCLK3: ACALL KS1JNZ LK3POP ACCRETNEXT: INC R4INC R4INC R4INC R4MOV A,R2JNB ACC.7, KNDRL AMOV R2,AAJMP LK4KND: RETKS1: MOV A,#0FH MOV P1,AMOV A,P1CPL AANL A,#0FHRETT12MS:MOV R7,#18H TM: MOV R6,#0FFH TM6: DJNZ R6,TM6 DJNZ R7,TMRETDISPLAY:MOV R2,#04H MOV R0,#50HMOV R1,#01H START2: MOV A,@R0 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,AMOV A,R1MOV P2,AACALL DL1INC R0MOV A,R1RL AMOV R1,ADJNZ R2,START2RETTAB: DB 3FH, 06H,5BH,4FH,66H,6DH,7DH,07H,4FH,6FH,77H,7CH,39H,5EH,79H ,71HDL1: MOV R7,#02HDL: MOV R6,#0FFHDL6: DJNZ R6,DL6DJNZ R7,DLRETWRONG1: CLR P3.2MOV R7,#1EHDL22: MOV R6,#0F9HDL33: DJNZ R6,DL33DJNZ R7,DL22SETB P3.2RETWRONG: CLR P3.2MOV R7,#1EHDL2: MOV R6,#0F9HDL3: DJNZ R6,DL3 DJNZ R7,DL2SETB P3.2 ALARM: INC R3 CJNE R3,#03H,A1 AJMP WARNA1: RETWARN: CLR P3.4 MOVR5,#06HDL10: MOV R7,#0FFH DL8: MOV R6,#0FFH DL9: DJNZ R6,DL9 DJNZ R7,DL8DJNZ R5,DL10 SETB P3.4ACALL ZEROA2: DEC R3DEC R3DEC R3RETZERO: MOV 50H,#00H MOV 51H,#00H MOV 52H,#00H MOV 53H,#00HRETEND。

基于51单片机的密码锁(C语言)

基于51单片机的密码锁(C语言)

电路:功能描述,开机无显示。

按下除号,开始输入密码,显示短线,初始密码为0000。

输入完后,按下on/c键,确定。

正确显示open,错误显示err。

=键为取消键,输入密码过程中,按下取消键,数码管全亮1s,然后灭掉。

恢复初始状态。

按下乘号,设置密码,此时数码管显示短线。

输入正确密码后,进入更改密码状态,显示全F。

输入更改后密码,按下on/C键,确认。

PS:1输入任意时刻,都可按等号返回初始状态。

2输入时,数字会相应的显示。

通过Protues仿真,电路图为protues输出的。

送给初学者,学习参考。

#include <reg52.h>#define uint8 unsigned char#define uint16 unsigned int//数码管编码。

uint8 code SEG7LED[26] = {0x3f,0x06,0x5b,0X4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40,0xff,0x3f,0x73,0x79,0x37, //open0x79,0x77,0x77}; //err//变量声明uint8 Ge,Shi,Bai,Qian;//数码管各个位uint8 WeiNum=1;uint8 code P1Pin[9] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};uint8 state=0;//记录密码锁状态,0为待机状态,1为输入密码,2,3为设置密码uint8 InputNum=1;//记录输入密码时,目前密码的位数。

uint8 InPassWord[4];uint8 PassWord[4]={0,0,0,0};//函数声明void initTimer0();void display(uint8 WeiNum);uint8 keyscan();void delayms(uint16 Xms);void password(uint8 key);uint8 Compare(uint8 InPassWord[4]);void main(){uint8 key;initTimer0();while(1){key = keyscan();password(key);}}void initTimer0(){EA = 1;ET0 = 1;TMOD = 0X01;TH0 = (65535-5000)/256;TL0 = (65535-5000)%256;TR0 = 1;}void Timer0() interrupt 1{TH0 = (65535-5000)/256;TL0 = (65535-5000)%256;display(WeiNum);WeiNum ++;if(WeiNum==5)WeiNum = 1;}void display(uint8 WeiNum){switch(WeiNum){case 1:{P2 = 0xff;P0 = SEG7LED[Qian];P2 = 0xfe;break;}case 2:{P2 = 0xff;P0 = SEG7LED[Bai];P2 = 0xfd;break;}case 3:{P2 = 0xff;P0 = SEG7LED[Shi];P2 = 0xfb;break;}case 4:{P2 = 0xff;P0 = SEG7LED[Ge];P2 = 0xf7;break;}default:{P2 = 0xff;P0 = 0xff;P2 = 0xff;break;}}}void delayms(uint16 Xms){uint16 i,j;for(i=Xms;i>0;i--)for(j=110;j>0;j--);}uint8 keyscan(){uint8 i=0;uint8 key8=0xff;uint8 key=0xff;uint8 Button;for(i=0;i<4;i++){P1 = P1Pin[i];Button = P1;if(Button != P1Pin[i]){delayms(5);Button = P1;if(Button != P1Pin[i]){key8 = Button;}while(Button != P1Pin[i]){ Button = P1; }}}switch(key8){//0~9数字键,12确定,14取消,10输入密码,11设置密码。

(完整版)单片机电子密码锁(可以修改设置密码)——基于51单片机毕业论文

(完整版)单片机电子密码锁(可以修改设置密码)——基于51单片机毕业论文

单片机电子密码锁 (可以修改设置密码)――基于51单片机与AT24C02与LCD1602显示其电路图连接如下:本人已经用硬件实验,程序可用。

正确~~本程序特点:装载后读者可以自改密码,然后需要再次载入程 序时:可以把主程序aa=Sendstring(0xa0,1,table2,6)这一句去掉。

然后 程序的电子锁密码就是你个人设置的密码。

LCD1Vour Password* ・・程序代码为:#include<reg51.=P0A 2; sbit led=P3A0; uchar code table2[]="123456";EE J KBBI&flEK■i A A —i n Jll 理・J31mTrr W口 t■ i* TTS -■?TWKamHP —・U1■3TF4 LSl^fc 』 _ W>M. _ _, lJ-p — ...... 』 =]初始密码:〕23456XrMJRirF7.!|一 ■«*丿 r^35 一・4|E -L 凰P?E7TEF3 ■ir^OTTuchar code table[]="Your Password...";void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);},做总线的延时用void delay() 短延时,两个机器周期{;;}void write_com(uchar com){rs=0;rd=0;lcden=0;P2=com;delayms(3);lcden=1;delayms(3);lcden=0;}void write_date(uchar date){rs=1;rd=0;lcden=0;P2=date;delayms(3);lcden=1;delayms(3);lcden=0;}void Display_String(uchar *p,uchar com){ uchar i;write_com(com);for(i=0;i<16;i++){write_date(p[i]);}}void init_lcd(){lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);Display_String(table,0x80);Display_String("Lock OK! ",0xc0);void start() {sda=1;scl=1;delay4us();sda=0;delay4us();scl=0;}void stop(){sda=0;scl=1;delay4us();sda=1;delay4us();scl=0;}void init() 初始化{ sda=1;delay();scl=1;delay();void ack(){sda=0;scl=1; delay4us();scl=0;sda=1;}void noack(){sda=1;scl=1; delay4us();scl=0;sda=0;}uchar recbyte(){uchar i,rd; rd=0x00;sda=1;for(i=0;i<8;i++) {rd<<=1;scl=1;rd|=sda; delay4us(); scl=0;delay4us();}scl=0;delay4us();return rd;}uchar sendbyte(uchar wd){uchar i;bit ack0;for(i=0;i<8;i++){sda=(bit)(wd&0x80);_nop_();_nop_();scl=1;delay4us();scl=0;wd<<=1;}delay4us();sda=1;scl=1;delay4us();ack0=!sda; scl=0;delay4us();return ack0;}uchar Recstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) { uchar i;start();if(!sendbyte(slave)) return 0;if(!sendbyte(subaddr)) return 0;start();if(!sendbyte(slave+1)) return 0;for(i=0;i<n-1;i++){buffer[i]=recbyte();ack();}buffer[n-1]=recbyte();noack();stop();return 1;uchar Sendstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) { uchar i;start();if(!sendbyte(slave)) return 0;if(!sendbyte(subaddr)) return 0; for(i=0;i<n;i++){if(!sendbyte(buffer[i])) return 0;}stop();return 1;}void clear_password(){ uchar i;for(i=0;i<6;i++){Userpassword[i]=' ';} for(i=0;i<16;i++){DSY_BUFFER[i]=' ';}} uchar Keys_Scan()uchar temp,keynum;P1=0x0F;delayms(5);temp=P1A0x0F;switch(temp){case 1:keynum=0;break;case 2:keynum=1;break;case 4:keynum=2;break;case 8:keynum=3;break; break;}P1=0xF0;delayms(5);temp=P1>>4A0x0F;switch(temp){case 1:keynum+=0;break;case 2:keynum+=4;break;case 4:keynum+=8;break;case 8:keynum+=12;break; break;}delayms(600);return keynum;void main(){ uchar temp,i=0,j=0,k=0,n;uchar IS_valid_user;beep=1;init();init_lcd();delayms(5);aa=Sendstring(0xa0,1,table2,6);delayms(5);aa=Recstring(0xa0,1,buffer,6); 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]='*';Display_String(DSY_BUFFER,0xc0); i++;}break;case 10: 按 A 键开锁for(k=0;k<6;k++) {if(buffer[k]==(Userpassword[k]+48))flag=1;elseflag=0;}if (flag==1){ flag=0;i=0;led=0; 点亮LED clear_password();Display_String("OPEN OK! IS_valid_user =1;",0xc0);j=0;else{j++;led=1; 关闭LEDclear_password();Display_String("ERROR!Have trywrite_com(0xcf);write_date(0x30+j);IS_valid_user=0;}i=0;break;case 11: 按 B 键上锁led=1;clear_password();Display_String(table,0x80);Display_String("Lock OK! i=0;IS_valid_user=0; break;case 12: 按 C 键设置新密码如果是合法用户则提示输入新密码",0xc0);",0xc0);if ( !IS_valid_user){i=0;Display_String("No rights ! ",0xc0); delayms(1000);Display_String("Your Password...",0x80);Display_String("Lock OK! ",0xc0);}else{i=0;Display_String("New Password: ",0x80);Display_String(" ",0xc0); }break;case 13: 按 D 键保存新密码if( !IS_valid_user){ i=0;Display_String("No rights !",0xc0);delayms(1000);Display_String("Your Password...",0x80);Display_String("Lock OK! ",0xc0);else{i = 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("Password Saved! ",0xc0); delayms(1000);Display_String("Do lock agian ? ",0xc0); }break;case 14: 按 E 键消除所有输入i=0;clear_password();Display_String(" ",0xc0); break;case 15: 清除一位if(i!=0)i--;for(n=0;n<i;n++){ DSY_BUFFER1[n]='*';} Display_String(DSY_BUFFER1,0xc0);}P1=0x0f;}if(j==3){ Display_String("THIEF!!!THIEF!!!",0xc0);j=0;beep=0;}。

基于51单片机简易密码锁程序设计

基于51单片机简易密码锁程序设计

基于51单片机简易密码锁程序设计//晶振11.0592MHz,T1每250微秒中断,按键P1.0-P1.7,发光二极管接P3.0-P3.3,p3.4 /*变量的定义:show_val[6]: 显示的值init_val[6]: 密码初始值key_val: 返回按键的值255-表示无按键按下key_index: 当前按键是哪一位密码T1_cnt: 定时器计数溢出数cnt_val_15s: 报警计时的数值cnt_val_5s: 待机时间计时cnt_val_4s: 输入正确,等待4秒清除开锁信号cnt_state: 计时状态error_num: 错误次数led_seg_code:数码管7段码*/#include <reg51.h>#define S1 0xEE;#define S2 0xDE;#define S3 0xBE;#define S4 0x7E;#define S5 0xED;#define S6 0xDD;#define S7 0xBD;#define S8 0x7D;#define S9 0xEB;#define S10 0xDB;#define S11 0xBB;//有源蜂鸣器sbit SPEAK=P3^5;unsigned char data cnt_val_15s,cnt_val_5s,cnt_val_4s,cnt_state;unsigned int data T1_cnt;unsigned char data key_val,key_index,key_val_old;unsigned char data state_val,error_num;unsigned char data show_val[7];char code init_val[6]={1,2,3,4,5,6};char code led_seg_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//--------延时程序----------------void delay(unsigned int i)//延时{ while(--i); }void pw_error()//密码错误信号{int i;for(i=0;i<1000;i++){SPEAK=!SPEAK;delay(1);}}void audio_out()//有源蜂鸣器{ int i;for(i=0;i<5000;i++){SPEAK=!SPEAK;delay(3);}}void init_variant(){unsigned char i;for(i=0;i<7;i++)show_val[i]=11; //led_seg_code[10]=0x00表示数码管不显示任何内容key_index=1; //没有任何输入或清除所有输入时,保存当前键的位置}//---------按键扫描---------------unsigned char scan_key(){unsigned char row,col,key;key=0;P1=0x0f;if(P1==0x0f)return(0xff);delay(10);if(P1==0x0f)return(0xff);switch(P1){case 0x0e:row=0;break;case 0x0d:row=1;break;case 0x0b:row=2;break;case 0x07:row=3;break;}P1=0xf0;switch(P1){case 0xe0:col=0;break;case 0xd0:col=1;break;case 0xb0:col=2;break;case 0x70:col=3;break;}key=row*4+col;while(P1!=0xf0);return(key);}//---------数码管显示--------------- void led_show(){P0=led_seg_code[show_val[1]]; P2=0xdf;delay(500);P0=led_seg_code[show_val[2]]; P2=0xef;delay(500);P0=led_seg_code[show_val[3]]; P2=0xf7;delay(500);P0=led_seg_code[show_val[4]]; P2=0xfb;delay(500);P0=led_seg_code[show_val[5]]; P2=0xfd;delay(500);P0=led_seg_code[show_val[6]];P2=0xfe;delay(500);}//--------定时器T1中断服务程序-----------------void timer1() interrupt 3 //T1中断{T1_cnt++;f(T1_cnt>3999) //如果计数>3999, 计时1sT1_cnt=0;switch (cnt_state){case 1://密码输入正确,需要计时4sif(cnt_val_4s<4){ cnt_val_4s++;}else{ cnt_val_4s=0;init_variant();//密码输入正确,计时到4秒时,清除输入的内容//已开锁信号清零//开锁信号清零cnt_state=0;TR1=0; //停止计时}break;case 2: //密码输入错误3次,计时15sif(cnt_val_15s<15){ cnt_val_15s++;}else{ cnt_val_15s=0;init_variant();//三次密码错误时,计时15秒,清除输入的内容// 清除所有指示和报警cnt_state=0;TR1=0; //停止计时}break;}}}//--------判断键盘输入内容与密码是否一致------unsigned char check_input_pw(){ unsigned char i,k;k=1;for(i=0;i<6;i++){ k=k && (show_val[i]==init_val[i]); }return k;}//---------主程序----------------main(){ //初始化各变量SPEAK=1;P3=0xff;cnt_val_15s=0;cnt_val_5s=0;cnt_val_4s=0;cnt_state=0;//0-待机计时5s状态;1-密码正确,计时4s状态;2-三次密码错误,处于计时15秒状态。

51单片机设置密码程序

51单片机设置密码程序

51单片机设置密码程序,通过1602显示屏来显示相应的信息。

输入密码正确时显示Welcome to use!,否则显示Password error!#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit en=P3^4;sbit rs=P3^5; //用于控制1602sbit rw=P3^6;sbit IRIN = P3^2; //红外接收器数据线IO口sbit dula=P2^6;sbit wela=P2^7; //用于控制晶体管uchar IRCOM[4]=0;//定义数组IRCOM,分别装解码后得到的数据//IRCOM[0] 低8位地址码//IRCOM[1] 高8位地址码//IRCOM[2] 8位数据码//IRCOM[3] 8位数据码的反码uchar code table[]="Input password";uchar code table1[]="Welcome to use!";uchar code table2[]="Password error!";uchar code num[]="0123456789";uchar code mima[]="06680200668";//设定密码void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。

}void delay014ms(unsigned char x) //x*0.14MS STC10F04延时约0.15MS{uchar i;while(x--){for(i=0;i<15;i++) //13;}}//////////////初始化////////////void IR_init(void){EA=1;EX0=1; //允许总中断中断,使能INT0 外部中断IT0=1; //触发方式为脉冲负边沿触发IRIN=1; //I/O口初始化}void write_com(uchar com){rs=0; //指令P0=com; //写指令函数delay(5);en=1;delay(5);en=0;}void write_data(uchar dat){rs=1; //数据P0=dat; //写指令函数delay(5);en=1;delay(5);en=0;}void init(){wela=0;dula=0; //用于关闭晶体管,因为都是用P0en=0; //初始时使能为0rw=0;write_com(0x38); //显示屏模式设置为1602方案write_com(0x0c);write_com(0x0f); //显示开关/光标设置write_com(0x01); //清屏write_com(0x80); //指针置零}void main(){uchar i;IR_init();init();for(i=0;i<14;i++)write_data(table[i]);write_com(0xc0);while(1);}////////////解码过程//////////////void IR_CODE(void) interrupt 0 //在外部中断子程序中解码{uchar j,k,N=0,n=0;uchar h,m;EX0 = 0; //防止干扰delay014ms(15); //延时2.1msif (IRIN==1) //2.1ms能够检测出各种错误信号{EX0 =1;return;} //确认IR信号出现while (!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自己做的基于单片机的密码锁设计(c语言设计)时间:2011-08-16 21:08:01 来源:作者:自己做的基于单片机的密码锁设计(c语言设计)系统说明该系统如图所示使用了80C51单片机、普通键盘、排阻、1602液晶。

该系统的功能:①该系统输入正确的密码LED灯会亮(其实就是很多操作都可以,用LED只是代表作用,主要是操作简单,效果明显。

)②系统可以修改密码;(系统断电后重启后必须用初始密码(初始密码是:000000)重新改密,当然修改的密码可以与掉电前的一样。

)具体操作:①系统开机时显示请输入密码的提示,直接输入密码#键确认②系统会自动提醒密码错误,数秒后系统会再次提醒重新输密码。

③在系统提醒输入密码的界面可以按*键修改密码,系统会提醒输入两次密码,并且会检查两次密码是否相同。

同则修改成功。

否则在数秒后可以重新按*键修改。

④在改密前(就是按了*键后系统)会提醒身份识别,请输入旧密码,系统判断旧密码正确方可更改密码。

源程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P3^0;sbit lcdrw=P3^1;sbit lcden=P3^2;sbit h1=P1^0;sbit h2=P1^1;sbit h3=P1^2;sbit sa=P1^3;sbit sb=P1^4;sbit sc=P1^5;sbit sd=P1^6;sbit kd=P3^7;uchar code table[]=" PLEASE INPUT ";uchar code table1[]="CODE: ";uchar code table2[]=" *****WIN*****";uchar code table3[]=" PLEASE AFFIRM";uchar code table4[]=" *****FAIL*****";uchar code table5[]=" MODIFICATION";uchar code table6[]=" IDENTITY LIMITS ";uchar unm,M1,M2,M3,M4,M5,M6,sex,k1,k2,k3,k4,k5,k6,flge,flge1;uchar q1,q2,q3,q4,q5,q6,w1,w2,w3,w4,w5,w6,g;void delay(int z){int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay1(int z){int x,y;for(x=z;x>0;x--)for(y=20000;y>0;y--);}void writen_(uchar ) //1602写命令{lcdrs=0;P0=;delay(1);lcden=1;delay(1);lcden=0;}void writen_dat(uchar dat) //1602写数据{lcdrs=1;P0=dat;delay(1);lcden=1;delay(1);lcden=0;}void main();void cheak_mima() //检查第二次确认密码是否与第一次相同{if(q1==w1){if(q2==w2){if(q3==w3){if(q4==w4){if(q5==w5){if(q6==w6){writen_(0x01);writen_(0x0f);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table5[unm]);delay(5);}writen_(0x80+0x40+1);for(unm=0;unm<14;unm++){writen_dat(table2[unm]);delay(5);}M1=w1;M2=w2;M3=w3;M4=w4;M5=w5;M6=w6;delay1(6);main();}/*-----------------------------------*/ //密码确认错误返回 writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}/*------------------------------------*/ //第二次确认密码void affirm_code(){P1=0x07;if(P1!=0x07)delay(1);if(P1!=0x07){P1=0x77;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=1;break;case 1:w2=1;break;case 2:w3=1;break;case 3:w4=1;break;case 4:w5=1;break;case 5:w6=1;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');{case 0:w1=2;break;case 1:w2=2;break;case 2:w3=2;break;case 3:w4=2;break;case 4:w5=2;break;case 5:w6=2;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=3;break;case 1:w2=3;break;case 2:w3=3;break;case 3:w4=3;break;case 4:w5=3;break;case 5:w6=3;break;}sex++;}}/*-------------------------------*/ P1=0x6f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');{case 0:w1=4;break;case 1:w2=4;break;case 2:w3=4;break;case 3:w4=4;break;case 4:w5=4;break;case 5:w6=4;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=5;break;case 1:w2=5;break;case 2:w3=5;break;case 3:w4=5;break;case 4:w5=5;break;case 5:w6=5;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 1:w2=6;break;case 2:w3=6;break;case 3:w4=6;break;case 4:w5=6;break;case 5:w6=6;break;}sex++;}}/*--------------------------------*/ P1=0x5f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=7;break;case 1:w2=7;break;case 2:w3=7;break;case 3:w4=7;break;case 4:w5=7;break;case 5:w6=7;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 1:w2=8;break;case 2:w3=8;break;case 3:w4=8;break;case 4:w5=8;break;case 5:w6=8;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:w1=9;break;case 1:w2=9;break;case 2:w3=9;break;case 3:w4=9;break;case 4:w5=9;break;case 5:w6=9;break;}sex++;}}/*-----------------------------------*/ P1=0x3f;if(h2==0) //0键扫描{delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 1:w2=0;break;case 2:w3=0;break;case 3:w4=0;break;case 4:w5=0;break;case 5:w6=0;break;}sex++;}}if(h3==0) //#键扫描{delay(1);if(h3==0){while(!h3);while(!flge1)cheak_mima();}}}}/*--------------------------------------*/ //修改密码自己做的基于单片机的密码锁设计(c语言设计)时间:2011-08-16 21:08:01 来源:作者:void set_mima(){P1=0x07;if(P1!=0x07)delay(1);if(P1!=0x07){P1=0x77;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=1;break;case 1:q2=1;break;case 2:q3=1;break;case 3:q4=1;break;case 4:q5=1;break;case 5:q6=1;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=2;break;case 1:q2=2;break;case 2:q3=2;break;case 3:q4=2;break;case 4:q5=2;break;case 5:q6=2;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 1:q2=3;break;case 2:q3=3;break;case 3:q4=3;break;case 4:q5=3;break;case 5:q6=3;break;}sex++;}}P1=0x6f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=4;break;case 1:q2=4;break;case 2:q3=4;break;case 3:q4=4;break;case 4:q5=4;break;case 5:q6=4;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=5;break;case 2:q3=5;break;case 3:q4=5;break;case 4:q5=5;break;case 5:q6=5;break; }sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=6;break;case 1:q2=6;break;case 2:q3=6;break;case 3:q4=6;break;case 4:q5=6;break;case 5:q6=6;break;}sex++;}}P1=0x5f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=7;break;case 1:q2=7;break;case 3:q4=7;break;case 4:q5=7;break;case 5:q6=7;break; }sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=8;break;case 1:q2=8;break;case 2:q3=8;break;case 3:q4=8;break;case 4:q5=8;break;case 5:q6=8;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=9;break;case 1:q2=9;break;case 2:q3=9;break;case 3:q4=9;break;case 5:q6=9;break;}sex++;}}P1=0x3f;if(h2==0) //0键扫描{delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:q1=0;break;case 1:q2=0;break;case 2:q3=0;break;case 3:q4=0;break;case 4:q5=0;break;case 5:q6=0;break;}sex++;}}if(h3==0) //#键扫描{delay(1);if(h3==0){while(!h3);writen_(0x01);writen_(0x0f);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table3[unm]);delay(5);}writen_(0x80+0x40);for(unm=0;unm<5;unm++){writen_dat(table1[unm]);delay(5);}sex=0;while(!flge1)affirm_code();}}}}void init();void cheak_identity2(){if(k1==M1){if(k2==M2){if(k3==M3){if(k4==M4){if(k5==M5){if(k6==M6){sex=0;init();while(!flge1)set_mima();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x01);writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}void cheak_identity() {P1=0x07;if(P1!=0x07)delay(1);if(P1!=0x07){P1=0x77;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=1;break;case 1:k2=1;break;case 2:k3=1;break;case 3:k4=1;break;case 4:k5=1;break;case 5:k6=1;break;}sex++;}}if(h2==0)delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=2;break;case 1:k2=2;break;case 2:k3=2;break;case 3:k4=2;break;case 4:k5=2;break;case 5:k6=2;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=3;break;case 1:k2=3;break;case 2:k3=3;break;case 3:k4=3;break;case 4:k5=3;break;case 5:k6=3;break;}sex++;}}/*-------------------------------*/ P1=0x6f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=4;break;case 1:k2=4;break;case 2:k3=4;break;case 3:k4=4;break;case 4:k5=4;break;case 5:k6=4;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=5;break;case 1:k2=5;break;case 2:k3=5;break;case 3:k4=5;break;case 4:k5=5;break;case 5:k6=5;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=6;break;case 1:k2=6;break;case 2:k3=6;break;case 3:k4=6;break;case 4:k5=6;break;case 5:k6=6;break;}sex++;}}/*--------------------------------*/ P1=0x5f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=7;break;case 1:k2=7;break;case 2:k3=7;break;case 3:k4=7;break;case 4:k5=7;break;case 5:k6=7;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=8;break;case 1:k2=8;break;case 2:k3=8;break;case 3:k4=8;break;case 4:k5=8;break;case 5:k6=8;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=9;break;case 1:k2=9;break;case 2:k3=9;break;case 3:k4=9;break;case 4:k5=9;break;case 5:k6=9;break;}sex++;}}/*-----------------------------------*/ P1=0x3f;if(h2==0) //0键扫描{delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=0;break;case 1:k2=0;break;case 2:k3=0;break;case 3:k4=0;break;case 4:k5=0;break;case 5:k6=0;break;}sex++;}}if(h3==0) //#键扫描{delay(1);if(h3==0){while(!h3);while(!flge1)cheak_identity2();}}}}/*---------------------------------------*/ //键盘扫描void keyscan(){P1=0x07;if(P1!=0x07)delay(1);if(P1!=0x07){P1=0x77;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=1;break;case 1:k2=1;break;case 2:k3=1;break;case 3:k4=1;break;case 4:k5=1;break;case 5:k6=1;break; }sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=2;break;case 1:k2=2;break;case 2:k3=2;break;case 3:k4=2;break;case 4:k5=2;break;case 5:k6=2;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=3;break;case 1:k2=3;break;case 2:k3=3;break;case 3:k4=3;break;case 4:k5=3;break;case 5:k6=3;break;}sex++;}}P1=0x6f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=4;break;case 1:k2=4;break;case 2:k3=4;break;case 3:k4=4;break;case 4:k5=4;break;case 5:k6=4;break;}sex++;}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=5;break;case 1:k2=5;break;case 2:k3=5;break;case 3:k4=5;break;case 4:k5=5;break;case 5:k6=5;break;}}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=6;break;case 1:k2=6;break;case 2:k3=6;break;case 3:k4=6;break;case 4:k5=6;break;case 5:k6=6;break;}sex++;}}/*--------------------------------*/ P1=0x5f;if(h1==0){delay(1);if(h1==0){while(!h1);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=7;break;case 1:k2=7;break;case 2:k3=7;break;case 3:k4=7;break;case 4:k5=7;break;case 5:k6=7;break;}}}if(h2==0){delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=8;break;case 1:k2=8;break;case 2:k3=8;break;case 3:k4=8;break;case 4:k5=8;break;case 5:k6=8;break;}sex++;}}if(h3==0){delay(1);if(h3==0){while(!h3);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=9;break;case 1:k2=9;break;case 2:k3=9;break;case 3:k4=9;break;case 4:k5=9;break;case 5:k6=9;break;}sex++;}/*-----------------------------------*/ P1=0x3f;if(h1==0) //*键扫描{delay(1);if(h1==0){while(!h1);writen_(0x0f);writen_(0x06);writen_(0x80);for(unm=0;unm<16;unm++){writen_dat(table6[unm]);delay(5);}while(!flge1)cheak_identity();}}if(h2==0) //0键扫描{delay(1);if(h2==0){while(!h2);writen_(0x80+0x45+sex);writen_dat('*');switch(sex){case 0:k1=0;break;case 1:k2=0;break;case 2:k3=0;break;case 3:k4=0;break;case 4:k5=0;break;case 5:k6=0;break;}sex++;}}if(h3==0) //#键扫描delay(1);if(h3==0){while(!h3);flge=1;}}}}/*-------------------------------------*/ //密码检查void init();void check_code(){if(k1==M1){if(k2==M2){if(k3==M3){if(k4==M4){if(k5==M5){if(k6==M6){writen_(0x01);kd=0;writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++){writen_dat(table2[unm]);delay(5);}delay1(6);kd=1;main();writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]); delay(5);}delay1(6);main();}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}}writen_(0x0c);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table4[unm]);delay(5);}delay1(6);main();}void now_mima(){M1=0;M2=0;M3=0;M4=0;M5=0;M6=0;g=0;}void init(){if(g==0)now_mima();g=1;flge1=0;flge=0;sex=0;lcdrw=0;lcden=0;writen_(0x01);writen_(0x38);writen_(0x0f);writen_(0x06);writen_(0x80);for(unm=0;unm<14;unm++) {writen_dat(table[unm]);delay(5);}writen_(0x80+0x40);for(unm=0;unm<5;unm++) {writen_dat(table1[unm]);delay(5);}}void main(){while(1){init();set_mima();while(!flge)keyscan();check_code();}}。

相关文档
最新文档