单片机入门汇编程序 程序13-8:网络密码锁的单片机程序

合集下载

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 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。

单片机密码锁设计(汇编语言-)带原理图电路图-

单片机密码锁设计(汇编语言-)带原理图电路图-

单片机密码锁设计(汇编语言)带原理图电路图什么是密码锁电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

硬件设计基于AT89C51为核心的单片机控制的电子密码锁设计。

本设计能完成开锁,修改密码,密码错误报警,LCD显示密码等基本的密码锁功能。

设计的电路框如图1。

《,图一&电路的功能单元设计1.单片机AT89C51组成基本框图单片机引脚介绍P0:P0口是一个漏极开路的8位双向I/O口。

在访问片外存储器时P0分时提供低8位地址线和8位双向数据线。

当不接片外存储器或不扩展I/O口时,P0可作为一个通用输入/输出口。

P0口作输入口使用时,应先向口锁存器写“1”,P0口作输出口时,需接上拉电阻。

P1:P1口是一个内部提供上拉电阻的8位双向I/O口,因此它作为输出口使用时,无需再外接上拉电阻,当作为输入口使用时,同样也需先向其锁存器写“1”。

&P2:P2口也是一个内部提供上拉电阻的8位双向I/O口,在访问片外存储器时,输出高8位地址。

P3:P3口除了一般的准双向通用I/O口外,还有第二功能。

VCC:+5V电源VSS:接地ALE:地址锁存器控制信号。

在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存起来,以实现低位地址和数据的隔离。

此外,由于ALE是以晶振1/6的固定频率输出的正脉冲,因此,可作为外部时钟或外部定时脉冲使用。

/PSEN:外部程序存储器读选通信号。

在读外部ROM时,/PSEN有效(低电平),以实现外部ROM单元的读操作。

/EA:访问程序存储控制信号。

当/EA信号为低电平时,对ROM的读操作限定在外部程序存储器;当/EA信号为高电平时,对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。

RST:复位信号。

当输入的复位信号延续两个机器周期以上的高电平时即为有效,用完成单片机的复位初始化操作。

XTAL1和XTAL2:外接晶体引线端。

单片机密码锁汇编程序

单片机密码锁汇编程序

电路图如下
其中晶振和复位电路没画。

左边是矩阵键盘,右边是共阳四位数码管,要求四位密码,输入密码后按ENTER然后与原密码比较相同则带动继电器工作灯亮,不相同则回复初始状态。

求你们帮帮我啊。

要汇编语言啊。

可以将设定的密码放在40H-43H,输入密码放在31H-34H。

;根据题目要求,本设计操作如下:
;
;1.初始状态数码管全显示0,然后按键盘输入4个数字,输入完成后按键盘的
;“F”键,将输入的4为密码与原始密码1234比较,如果正确相同则P0.0口接的继电器;工作灯亮。

如果错误不相同,则恢复初始状态全显示0.
;2.输入过程中,led会逐位‘-’,直到密码输入完成
;3.密码正确以后,led显示open
;4.若要重新输入密码,按单片机复位键或者按键盘的“D”键即可重新输入
原理图和代码详见附件。

原理图用proteus绘制,并仿真成功。

代码用汇编编写,keil u4下编译成功。

单片机密码锁C程序完整代码

单片机密码锁C程序完整代码

单片机密码锁C程序完整代码2009-08-18 14:39#include<AT89x51.h>#include"intrins.h"#include"key.h"#include"xsh.h"#include"24c02.h"#define ulong unsigned longbit BJCB=0;//报警标志XG=0,//修改密码标志位BJ=0,//报警标志位SJ=0;//锁键盘标志位// xg=0;//修改密码标志位uchar PSWD0_0[16]={0};//密码输入缓存存储单元//uchar code PSWD0_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//用户初始密码存储单元//uchar PSWD1_0[16]={0};//读出密码缓存存储单元uchar PSWD1_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//管理员初始密码存储单元sbit OUT=P3^5;//输出端口sbit L1=P0^2;//上电指示sbit L2=P0^1;//开锁指示sbit L3=P0^0;//报警指示uint mg=0,//密码个数KSC=0,//开锁次数BJC=0,//报警次数TCNTY=0,//用户按键定时次数累加TCNTG=0,//管理员输入密码定时次数yhsh,//用户输入标志位glsh,//管理员输标志位shw;//密码输完标志位void yhmimaxig();//密码修改程序void glmimaxig();//管理员修改程序void bjyin(ulong t){ulong c;uint n;for(c=0;c<t;c++){for(n=0;n<50;n++); //延时BEEP=~BEEP; //取反输出到喇叭的信号}}void delay_10ms(void){uint i = 1000;while(i--);}//////////////定时中断服务函数////////////////////////////////////// void timer0() interrupt 1{uint i;TH0=(65536-50000)/256; //对TH0 TL0赋值50MS定时TL0=(65536-50000)%256; //重装计数初值if(yhsh==1){TCNTY++;//用户定时计数if(shw==1){TR0=0;TCNTY=0;}if(TCNTY==200){TR0=0;//关闭T0定时器TCNTY=0;mg=0;//密码个数清零L1=1;for(i=0;i<2;i++)//声光报警电路{L3=0;bjyin(1000);L3=1;delay(1000);}L1=0;}}else if(glsh==1){TCNTG++;//管理员定时计数if(shw==1){TR0=0;TCNTG=0;}if(TCNTG==160){TR0=0;//关闭T0定时器TCNTG=0;mg=0;//密码个数清零L1=1;for(i=0;i<2;i++)//声光报警电路{L3=0;bjyin(1000);L3=1;delay(1000);}L1=0;}}}void main(){uint i;TMOD=0x01; //定时器工作在方式1ET0=1;EA=1;TH0=(65536-50000)/256; //对TH0 TL0赋值TL0=(65536-50000)%256; //使定时器0.05秒中断一次//Read_page24c02(0x00,PSWD1_1,16);//向24c02里读用户初始密码 //i2cWrite24LC16B(0,0X20);/////////////第一次向24c02里写入初始管理员密码、用户密码、开锁次数/////////////////////KSC=i2cRead24LC16B(0X20);loop: L1=0;//上电红灯亮L2=1;//开锁成功后绿灯亮L3=1;//输错时黄灯亮报警OUT=0;//开信号关闭display_0(KSC);//开锁前显示///////////密码输入/////////////////if(SJ==0)//锁键盘标志位为0{do{flag=0;//键盘标志位key();if(flag==1&&num==12) //判断是否为管理员功能键按下{goto gl;}if(flag==1&&num<=9){PSWD0_0[mg]=num;mg++;//密码个数}if(flag==1&&num==14&&mg>=1)//输入错误删除{mg=mg-1;}if(mg==1) //有密码键按下开定时器限时{TR0=1;yhsh=1;}}while(num!=15);if(mg!=16){for(i=mg;i<16;i++){PSWD0_0[i]=0;}}/////////////////密码比较电路//////////////////////////// if(flag==1&&num==15){ flag=0;yhsh=0;shw=1;num=0;for(i=0;i<16;i++) //从24c02里读出16个密码{PSWD1_1[i]=i2cRead24LC16B(i);delay_10ms;}for(i=0;i<16;i++){if(PSWD1_1[i]!=PSWD0_0[i]){BJCB=1;break;}else}}if(BJCB!=0){BJC++;if(BJC!=3){BJCB=0; //第一次和第二次报警delay(500);mg=0;//密码个数清零L1=1;for(i=0;i<3;i++)//声光报警电路{L3=0;display_3();bjyin(1000);L3=1;delay(1000);}goto loop;}else if(BJC==3){BJC=0;BJCB=0;display_5();//三次输入密码失败,自锁SJ=1;//锁键盘标志位mg=0;//密码个数清零L1=1;for(i=0;i<2;i++)//声光报警电路{L3=0;bjyin(1000);L3=1;delay(1000);}goto loop;}}elseif(BJCB==0){display_1(KSC);i2cWrite24LC16B(KSC,0X20);if(KSC==100){SJ=1;}L2=0;L1=1;OUT=1;mg=0;//密码个数清零loop1:do //键盘扫描等待功能键按下{flag=0;key();if(flag){flag=0;switch(num){case 13:{display_2();do{flag=0;//键盘标志位key();if(flag==1&&num<=9){PSWD0_0[mg]=num;mg++;//密码个数}if(flag==1&&num==14&&mg>=1)//输入错误删除{mg=mg-1;}if(mg==16){do //键盘扫描等待功能键按下{flag=0;key();}while(num!=15);}}while(num!=15);if(mg!=16&&num==15){for(i=mg;i<16;i++){PSWD0_0[i]=0;}}if(flag==1&&num==15){flag=0;mg=0;for(i=0;i<16;i++) //用一次写一个向24c02里写{i2cWrite24LC16B(PSWD0_0[i],i);delay_10ms;}display_1(KSC);do //键盘扫描等待功能键按下{flag=0;key();}while(num!=11); //按下返回键,锁锁返回{goto loop;}}};break;case 11: {goto loop;//break;}}}}while(flag!=0);//如果设置密码键按下goto loop1;// i2cWrite24c02_page(0x00,PSWD1_1,mg);}}else{do{flag=0;key();}while(num!=12);//判断是否为管理员功能键按下gl:do//管理员输入密码{flag=0;key();if(flag==1&&num<=9){PSWD0_0[mg]=num;mg++;//密码个数}if(flag==1&&num==14&&mg>=1)//删除键按下{mg=mg-1;}if(mg==1){TR0=1;}//开定时器TO限5秒开锁}while(num!=15);if(mg!=16&&num==15){for(i=mg;i<16;i++){PSWD0_0[i]=0;}}//////////管理员密码比较/////////////////////// //Read_page24c02(0x10,PSWD0_1,16)for(i=0;i<16;i++) //从24c02里读出16个密码{PSWD1_1[i]=i2cRead24LC16B((0x10+i));delay_10ms;}if(flag==1&&num==15){ flag=0;shw=1;num=0;for(i=0;i<mg;i++){if(PSWD1_1[i]!=PSWD0_0[i]){ BJCB=1;break;}elseBJCB=0;}}if(BJCB!=0){BJC++;if(BJC!=3){BJCB=0; //第一次和第二次报警mg=0;//密码个数清零L1=1;for(i=0;i<2;i++)//声光报警电路{L3=0;display_3();bjyin(1000);L3=1;delay(1000);}display_1(KSC);goto loop;}else{BJCB=0;display_5();//三次输入密码失败,自锁mg=0;//密码个数清零delay(10000);display_1(KSC);goto loop;}}else{SJ=0;display_4();//管理员开锁显示mg=0;L2=0;L1=1;L3=0;//密码个数清零do //键盘扫描等待功能键按下{flag=0;key();}while(flag==0); //如果设置密码键按下if(flag==1&&num==13){flag=0;display_2();do{flag=0;//键盘标志位key();if(flag==1&&num<=9){PSWD0_0[mg]=num;mg++;//密码个数}if(flag==1&&num==14&&mg>=1)//输入错误删除 {mg=mg-1;}if(mg==16){do //键盘扫描等待功能键按下{flag=0;key();}while(num!=15);}}while(num!=15);if(mg!=16&&num==15){for(i=mg;i<16;i++){PSWD0_0[i]=0;}}if(flag==1&&num==15){flag=0;mg=0;for(i=0;i<16;i++) //用一次写一个向24c02里写{i2cWrite24LC16B(PSWD0_0[i],(0x10+i));delay_10ms;}display_4();do //键盘扫描等待功能键按下{flag=0;key();}while(num!=11); //按下返回键,锁锁返回{goto loop;}}}if(flag==1&&num==10){KSC=0;i2cWrite24LC16B(KSC,0X20);display_1(KSC);do //键盘扫描等待功能键按下{flag=0;key();}while(num!=11);//按下返回键,锁锁返回goto loop;}if(flag==1&&num==11)//按下返回键,锁锁返回{goto loop;}}}}#ifndef _key_h#define _key_h#include<AT89x51.h>#define uchar unsigned char#define uint unsigned intbit flag=0;//按键按下标志位sbit BEEP=P3^7;//蜂鸣器端口delay(int z)//延时1ms{ int x,y;for (x=z;x>0;x--)for (y=140;y>0;y--);}uchar num;//按键返回值////////按键音程序////////////////// void yin(){int c,n;if(flag==1){for(c=0;c<80;c++){for(n=0;n<50;n++); //延时BEEP=~BEEP; //取反输出到喇叭的信号}}}////////////键盘程序/////////////////// int key(){ uchar temp;P2=0X7f;temp=P2&0x0f;if(temp!=0x0f){delay(5);if(temp!=0x0f){temp=P2;switch(temp){ case 0x77:num=0;break;case 0x7b:num=1;break;case 0x7d:num=2;break;case 0x7e:num=3;}do{ //等待按键抬起 temp=P2;temp=temp&0x0f;}while(temp!=0x0f);flag=1;yin();}}P2=0Xbf;temp=P2&0x0f;if(temp!=0x0f){delay(5);if(temp!=0x0f){temp=P2;switch(temp){ case 0xb7:num=4;break;case 0xbb:num=5;break;case 0xbd:num=6;break;case 0xbe:num=7;break;}do{temp=P2;temp=temp&0x0f;}while(temp!=0x0f);flag=1;yin();}}P2=0Xdf;temp=P2&0x0f;if(temp!=0x0f){delay(5);if(temp!=0x0f){temp=P2;switch(temp){ case 0xd7:num=8;case 0xdb:num=9;break;case 0xdd:num=10;break;case 0xde:num=11;break;}do{temp=P2;temp=temp&0x0f;}while(temp!=0x0f);flag=1;yin();}}P2=0Xef;temp=P2&0x0f;if(temp!=0x0f){delay(5);if(temp!=0x0f){temp=P2;switch(temp){ case 0xe7:num=12;break;case 0xeb:num=13;break;case 0xed:num=14;break;case 0xee:num=15;break;}do{temp=P2;temp=temp&0x0f;}while(temp!=0x0f);flag=1;yin();}}return(num);}#endif#ifndef _xsh_h#define _xsh_h#include<AT89x51.h>#define uchar unsigned char#define uint unsigned intsbit shj=P1^0;//串口数据口sbit sck=P1^1;//串口时钟uchar code tab[20]={ 0x88,/*0*/0xBE,/*1*/0xC4,/*2*/0x94,/*3*/0xB2,/*4*/0x91,/*5*/0x81,/*6*/0xBC,/*7*/0x80,/*8*/0x90,/*9*/0xA0,/*A*/0x83,/*b*/0xC9,/*C*/0x86,/*d*/0xC1,/*E*/0xE1,/*F*/0xA8,/*N*/0xF7,/*-*/0x94,/*反E*/0xE0/*P*/ }; //共阳数码管uchar code sb0[3]={8,8,8},/*开锁后显示*/code sb1[3]={0,15,15},/*开锁前显示*/code sb2[6]={17,17,17,17,17,17},/*修改显示*/code sb3[6]={16,0,16,0,16,0},/*第一二次报警显示*/ code sb4[6]={8,8,8,8,8,8},/*管理员进入显示*/code sb5[6]={18,18,18,18,18,18};/*第三次报警显示*///////////////////////////*显示电路*///////////////////////// void writedata(uchar num)//传送一个字节{uchar temp;int i;temp=tab[num];for(i=0;i<8;i++){ temp=temp<<1;shj=CY;sck=0;sck=1;}}void display_0(uchar temp)//开锁前状态{ int i,g,s,q;uchar m;q=temp/100;s=temp%100/10;g=temp%10;for(i=0;i<3;i++){m=sb1[i];writedata(m);}writedata(q);writedata(s);writedata(g);}void display_1(uchar temp)//开锁后状态{int i,g,s,q;uchar m;q=temp/100;s=temp%100/10;g=temp%10;for(i=0;i<3;i++){m=sb0[i];writedata(m);}writedata(q);writedata(s);writedata(g);}void display_2()//修改密码显示{int i;uchar m;for(i=0;i<6;i++){m=sb2[i];writedata(m);}}void display_3()//报警显示{int i;uchar m;for(i=0;i<6;i++){m=sb3[i];writedata(m);}}void display_4()//管理员模式显示{int i;uchar m;for(i=0;i<6;i++){m=sb4[i];writedata(m);}}void display_5()//管理员模式显示{int i;uchar m;for(i=0;i<6;i++){m=sb5[i];writedata(m);}}#endif#ifndef _24c02_h#define _24c02_h#include<AT89x51.h>#define WriteDeviceAddress 0xa0#define ReadDeviceAddress 0xa1sbit SDA=P1^5;//I2C数据端sbit SCL=P1^6;//I2C时钟端///////////////////////24C0224C08读写驱动程序///////////////////////void DelayMs(unsigned int number) {unsigned char temp;for(;number>=1;number--){for(temp=112;temp>=1;temp--) ;}}void i2cStart(void){SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;}void i2cStop(void){SDA=0;SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();}void i2cAck(void){SDA=0;SCL=1;_nop_();_nop_();_nop_();_nop_();SDA=1;SCL=0;}void i2cNoAck(void){SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();SDA=0;SCL=0;}void i2cWrite8Bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=0;input=input<<1;}DelayMs(20);}unsigned char i2cRead8Bit(void){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){SCL=1;_nop_();_nop_();_nop_();rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA));SCL=0;}return(rbyte);}void i2cWrite24LC16B(unsigned char wdata,unsigned char RomAddress) {i2cStart();i2cWrite8Bit(WriteDeviceAddress);i2cAck();i2cWrite8Bit(RomAddress);i2cAck();i2cWrite8Bit(wdata);i2cAck();i2cStop();DelayMs(20);}//写入多个字节到24c02中//传入参数:地址、待写入的数据的首地址、数据长度bit i2cWrite24c02_page(uchar RomAddress,uchar *WRdata,uchar length) {uint i;i2cStart();i2cWrite8Bit(WriteDeviceAddress);i2cAck();i2cWrite8Bit(RomAddress);i2cAck();for(i=0;i<length;i++){i2cWrite8Bit(*WRdata);i2cAck();WRdata++;}i2cStop();DelayMs(20);return(1);}unsigned char i2cRead24LC16B(unsigned char RomAddress){unsigned char x;i2cStart();i2cWrite8Bit(WriteDeviceAddress);i2cAck();i2cWrite8Bit(RomAddress);i2cAck();i2cStart();i2cWrite8Bit(ReadDeviceAddress);i2cAck();_nop_();_nop_();_nop_();x=0;x=i2cRead8Bit();i2cNoAck();i2cStop();return(x);}//从24c02中读出多个字节bit Read_page24c02(uchar RomAddress,uchar p[],uint n) { uint i;i2cStart();i2cWrite8Bit(WriteDeviceAddress);i2cAck();i2cWrite8Bit(RomAddress);i2cAck();i2cStart();i2cWrite8Bit(ReadDeviceAddress);i2cAck();_nop_();_nop_();_nop_();for(i=0;i<n-1;i++){p[i]=i2cRead8Bit();i2cAck();}p[n-1]=i2cRead8Bit();i2cNoAck();i2cStop();return(1);}。

单片机课程设计密码锁程序和仿真图

单片机课程设计密码锁程序和仿真图

#include<at89x51.h>#define uchar unsigned char#define uint unsigned intuint num=10; //开始让数码管什么都不显示bit set=0; //定义设置密码的位char count=-1; //开始让COUNT=-1,方便后面显示数码管sbit Beep=P1^2; //蜂鸣器uchar temp;uchar pws[6]={3,6,2,3,3,0}; //原始密码uchar pwx[6]; //按下的数字存储区bit rightflag; //密码正确标志位uchar workbuf[6];uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40 }; //段选码,共阴极uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位选码uint keyscan();void delay(uchar z) //延时,ms级{uchar y;for(;z>0;z--)for(y=120;y>0;y--);}void setpw() //设置密码函数{keyscan();}uint keyscan() //键盘扫描函数{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5); //键盘去抖,最好ms以上,这里用了mstemp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;//按键计数加temp=P3;switch(temp){case 0xee:{num=7;if(count<6) //六位密码,所以COUNT<6{if(set==0) //设置密码键没有按下时pwx[count]=num; //存储按下的数字elsepws[count]=num; //设置密码键按下时,设置新密码workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的}}break;case 0xde:{num=8;if(count<6) //以下扫描键盘的原理差不多同上{if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbe:{num=9;{if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}}break;case 0x7e: //设置密码键按下{set=1; //设置密码标志位置P1_3=0; //设置密码指示灯亮workbuf[0]=0x00;//数码管第一位不显示workbuf[1]=0x00;//......workbuf[2]=0x00;//......workbuf[3]=0x00;workbuf[4]=0x00;workbuf[5]=0x00;//......count=-1; //按键计数复位为-1if(count<6) //密码没有设置完,继续设置密码{setpw(); //设置密码}}break;}while(temp!=0xf0) //按键抬起检测{temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xed:{num=4;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdd:{num=5;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbd:{num=6;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xeb:{num=1;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdb:{num=2;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbb:{num=3;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xd7:{num=0;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xe7: num=20;break; //确定键按下检测case 0x77: //复位键或者输入密码全部一次删除{P1_1=0; //锁关P1_3=1; //密码设置指示灯灭set=0; //不设置密码num=10; //num复位count=-1; //COUNT复位workbuf[0]=tabledu[10]; //第一位数码管不显示workbuf[1]=tabledu[10]; //第二位数码管不显示workbuf[2]=tabledu[10];workbuf[3]=tabledu[10];workbuf[4]=tabledu[10];workbuf[5]=tabledu[10]; //......P1_0=1; //锁关}break;case 0xb7: //输入密码删除键(一位一位删除){count--;workbuf[count]=0x00; //因确定键按下时,COUNT也会加,而确定键不是密码,所以这里是COUNT,而不是COUNT+1count--; //因确定键按下时,确定键不是密码,COUNT也会加,这里COUNT再自减if(count<=-1)count=-1;}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return(num);}void init() //利用定时显示数码管{TMOD=0x01;TH0=(65536-500)/200;TL0=(65536-500)%200;ET0=1;EA=1;TR0=1;}bit compare() //密码比较函数{if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pw x[5]==pws[5]))rightflag=1;elserightflag=0;return(rightflag);}void main(){uint i,j;init();P0=0;P1_1=0; //锁关while(1){keyscan();if(num==20) //如果确定键按下(修改密码和输入密码共用的确定键){if(count==6){if(set==1) //修改密码确定{P1_3=1;workbuf[0]=0;workbuf[1]=0;workbuf[2]=0;workbuf[3]=0;workbuf[4]=0;workbuf[5]=0;}else//输入密码确定{set=0;compare();if(rightflag==1) //如果密码正确{P1_0=0; //锁开P1_1=1;workbuf[0]=tabledu[8]; //数码管第一位显示"8"workbuf[1]=tabledu[8]; //数码管第二位显示"8"workbuf[2]=tabledu[8];workbuf[3]=tabledu[8];workbuf[4]=tabledu[8];workbuf[5]=tabledu[8]; //......}else{P1_1=0; //锁仍然是关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71; //......for(i=0;i<1000;i++) //密码错误报警{for(j=0;j<80;j++);Beep=~Beep;}break;}}}else//若输入的密码位数不为位时{P1_1=0; //锁仍然关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71;for(i=0;i<1000;i++){for(j=0;j<80;j++);Beep=~Beep;}break;}}}}void timer0() interrupt 1 //显示数码管{uchar i;TH0=(65536-500)/200; TL0=(65536-500)%200; for (i=0;i<6;i++) { P0=workbuf[i]; P2=tablewe[i]; delay(5); P0=0;}}XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51234567891RP1RESPACK-812365489=7+CONABCD1243D2LED-RED锁开锁关LS1SOUNDERD3LED-BLUE设置密码指示灯R11kR21kR310KR410K+12VQ3TIP127Q4TIP127Q18050Q28050Q5TIP122Q6TIP122+88.8Amps+88.8Amps+88.8Volts。

单片机电子密码锁的操作流程

单片机电子密码锁的操作流程

单片机电子密码锁的操作流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 系统初始化:单片机上电后,进行系统初始化,包括设置输入输出端口、初始化密码存储区、初始化显示模块等。

51单片机电子密码锁汇编程序

51单片机电子密码锁汇编程序

AJMP START;ORG 0030HSTART:ACALL BPMOV R0,#31HMOV R2,#8SETt:MOV P1,#0FFHMOV A,P1CJNE A,#0FFH,L8 ;当A≠0FFH时,转移(判断有无按键按下)AJMP SETtL8: ACALL DELAY ;调用延时CJNE A,#0FFH,SAVEAJMP SETt ;设置8位密码SAVE: ACALL BPMOV @R0,A ;把A送给R0中内容所指向地址INC R0DJNZ R2,SETt ;R2-1≠0,转移(判断输入密码够8位否)MOV R5,#16D2S: ACALL BP ;延时DJNZ R5,D2SMOV R0,#31HMOV R3,#3AA1: MOV R2,#8AA2: MOV P1,#0FFHMOV A,P1CJNe A,#0FFH,L9AJMP AA2L9:ACALL DELAYCJNE A,#0FFH,AA3AJMP AA2 ;判断输入密码有错误否AA3: ACALL BPCLR C ;对进位清零SUBB A, @R0 ;A-@R0-CY(判断输入密码与设置密码相等否) INC R0CJNE A,#00H,AA4 ;A≠00H,转移AJMP AA5AA4: SETB 00H ;记错误一次,00H单元内容置"1"AA5: DJNZ R2,AA2 ;R2-1≠0,转移到AA2(判断输入密码够8位否) JB 00H,AA6 ;00H单元=1,转移CLR P3.2 ;标志=1否L3: MOV R5,#8ACALL BP ;延时DJNZ R4,L3MOV R3,#3AJMP AA1AA6:DjNZ R3,AA7 ;判断3次错误到否MOV R5,#24L5: MOV R4,#200L4: ACALL BP ;错误3次,警告1分钟DJNZ R4,L4DJNZ R5,L5MOV R3,#3AA7: MOV R5,#40ACALL BP ;延时DJNZ R5,AA7AA8: CLR 00H ;错误标志清零AJMP AA1BP:CLR P3.7 ;错误次数清零MOV R7,#250L2:MOV R6,#124L1:DJNZ R6,L1 ;R6-1≠0,转移CPL P3.7 ;P3.7口取反DJNZ R7,L2SETB P3.7 ;P3.7口置"1"RETDELAY:MOV R7,#20L7: MOV R6,#125 ;延时(短音提示)L6: DJNZ R6,L6DJNZ R7,L7RETEND。

单片机密码锁程序

单片机密码锁程序

#include <reg51.h>#include"display.h"#include"delay.h"#define uchar unsigned char#define uint unsigned int#include"Globaldefine.h"#include"keyboard.h"uchar count; // 密码位计数uchar pw[4]; // 初始密码存储区uchar pwbuf[4]; // 输入密码存储区uchar selfdefinebuf[4]; //自定义密码存储区uchar error_cnt; //错误次数计数器bit enterflag; // 确认键按下与否标志bit pwflag; // 密码正确与否标志bit last_pwflag; //前一次密码输入正确与否标志sbit open=P2^5; //锁开指示灯,绿灯。

低电平亮sbit beep=P2^0; //蜂鸣器,低电平叫sbit red=P2^1; //红灯,低电平亮sbit close=P2^7; //锁合指示灯,黄色。

低电平亮sbit youxiao=P2^3; //蓝灯,按键有效指示。

低电平亮void flashred_L(void); //闪红灯,表示可输入自定义密码void flashred_S(void); //快闪红灯,重新输入自定义密码void flashall(void); //三盏灯全亮,不能继续输入uchar code dis_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//显示段码表0-F,最后一个位全灭段码sbit dig=P1^1; //数码管位选sbit seg=P1^0; //数码管段选/********************************************************************函数名称:void display(uint m,bit n)函数功能:显示函数入口参数:m-送入的显示值,为4位显示 n-显示模式选择 0显示错误信息 1正常显示送入的值出口参数:无说明:出错信息显示为EOF***********************************************************************/ void display(uint m,bit n){uchar i;uchar temp[4]; //显示的临时数组变量if(n) //如果为模式1{temp[3]=m/1000; //得到送入显示的值的每个位的值temp[2]=m%1000/100;temp[1]=m%100/10;temp[0]=m%10;}else{temp[3]=16; //显示出错信息EOFtemp[2]=14;temp[1]=0;temp[0]=15;}P0=0x00; //清楚上次显示残影seg = 1;seg = 0;i = 0; //for(i=0;i<4;i++){P0 = ~(0x01<<i); //共阴数码管位选低电平选中,故取反移位,数码管显示从右往左dig = 1; //开位选dig = 0; //关位选P0 = dis_tab[temp[i]];//送入显示数据seg = 1; //开段选seg = 0; //关段选delay_ms(1); //延时一定时间}}/* 键消抖延时函数 */void delay(void){uint i;for (i=8000;i>0;i--);}//蓝灯亮一下,再灭,用来表示按键按下有效void youxiaoled(){youxiao=0;delay();youxiao=1;}// 蜂鸣器短叫报警void baojing(){beep=0;delay();beep=1;delay();beep=0;delay();beep=1;}/* 密码比较函数 */bit pwcmp(void){bit flag;uchar i;for (i=0;i<4;i++){if (pw[i]==pwbuf[i])flag = 1;elseflag = 0;i = 4;error_cnt++; //错误次数加1 }}return(flag);}//初始化设置函数。

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