AT89C51单片机制作简易密码锁

article/2025/9/18 1:45:01

51单片机课程设计—制作密码锁

文章目录

  • 51单片机课程设计---制作密码锁
    • 1.设计要求
    • 2.设计流程图
    • 3.重要代码解释
    • 4.仿真电路设计
    • 5.完整代码设计
    • 6.仿真结果图
    • 7.工程源码及protues仿真下载

1.设计要求

1.1能设定一组4位的数字开启密码(设定密码功能)
1.2用LED小灯代替锁开启显示,输入密码正确,则小灯亮起(开锁功能)
1.3如果3次密码错误,则进行鸣叫报警,并在1分钟之内不能再次输入(报警)
1.4.密码输入显示在数码管上,输入正确显示on,输入错误显示err(显示功能)
可在以上功能上扩展。

2.设计流程图

在这里插入图片描述

3.重要代码解释

3.1 本次开发为使用按键中断,只进行了矩阵按键的使用,在第一次按键与第二次按键的过程间,均进行了按键的等待释放,以及等待按键按下的判断,提高程序的正确性
在这里插入图片描述3.2 合理的设置按键扫描函数,达到按键的准确判断
在这里插入图片描述3.3 输入密码时严格控制密码设置的位数,代码精简
在这里插入图片描述

4.仿真电路设计

在这里插入图片描述

5.完整代码设计

#include<reg51.h>
//定义IO口
sbit Beep=P3^6;
sbit LED1=P3^7;
//定义全局变量
int count=-1;
int count1=0;//用于记录输入密码错误的次数
int counter;//用于计数是定时器能够定时1分钟
int counter1=0;
int temp=99,signal=0;
//初始化密码
int key_word[4]={99,99,99,99};
//用于接收按键接收的值
int get_word[4]={0,0,0,0};
char key_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//键模
//LED字模
char led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
//函数声明
void set_key();
void show1(int);
void open_key();
void input_key();
void show2(int);
void show3();
void show4();
int get_key();
//延时函数
void delay(int x)
{int j=0;for(;x>0;x--)for(j=0;j<125;j++);
}//设定密码功能
void set_key()
{int i;for(i=0;i<4;i++){	while(get_key()==-1)//等待按键按下{if(count!=0&&count!=-1){show1(count);//显示设置的密码}}if(signal==1)//将按键的值保存{key_word[i]=get_key();count++;show1(count);signal=0;temp=99;}while(temp==get_key())//一旦长时间按按键,就一直显示密码{	show1(count);}}
}//输入密码
void input_key()
{int i;for(i=0;i<4;i++){	while(get_key()==-1)//等待按键按下{if(count!=0&&count!=-1){show2(count);//显示设置的密码}}if(signal==1)//将按键的值保存{get_word[i]=get_key();count++;show2(count);signal=0;//temp=99;}while(temp==get_key())//一旦长时间按按键,就一直显示密码{	show2(count);}}
}
//显示输入的密码
void show2(int count)
{if(count==0)//显示1位数据{P1=0x0e;P0=led[get_word[0]];}if(count==1)//显示2位数据{P1=0x0e;P0=led[get_word[0]];delay(10);P1=0x0d;P0=led[get_word[1]];delay(10);}if(count==2)//显示3位数据{P1=0x0e;P0=led[get_word[0]];delay(10);P1=0x0d;P0=led[get_word[1]];delay(10);P1=0x0b;P0=led[get_word[2]];delay(10);}if(count==3)//显示4位数据{P1=0x0e;P0=led[get_word[0]];delay(10);P1=0x0d;P0=led[get_word[1]];delay(10);P1=0x0b;P0=led[get_word[2]];delay(10);P1=0x07;P0=led[get_word[3]];delay(10);P0=0;//count=-1;signal=0;} 
}
//显示设置的密码
void show1(int count)
{int i;if(count==0)//显示一位数据{P1=0x0e;i=key_word[0];P0=led[i];}if(count==1)//显示两位数据{P1=0x0e;P0=led[key_word[0]];delay(10);P1=0x0d;P0=led[key_word[1]];delay(10);}if(count==2)//显示三位数据{P1=0x0e;P0=led[key_word[0]];delay(10);P1=0x0d;P0=led[key_word[1]];delay(10);P1=0x0b;P0=led[key_word[2]];delay(10);}if(count==3)//显示四位数据{P1=0x0e;P0=led[key_word[0]];delay(10);P1=0x0d;P0=led[key_word[1]];delay(10);P1=0x0b;P0=led[key_word[2]];delay(10);P1=0x07;P0=led[key_word[3]];delay(10);P0=0;count=-1;signal=0;}
}//主函数
void main()
{int op;LED1=0;Beep=1;while(1){op=get_key();switch(op){case 13:while(temp==get_key());//等待选择功能按键释放后再进行设置密码count=-1;//在使用标志位时将标志位进行初始化signal=1;set_key();break;case 14:while(temp==get_key());count=-1;//初始化标志位signal=1;input_key();while(get_key()!=15)//当按下登陆键,输入的密码不再显示{show2(count);}if(compare()==-1){count1++;while(get_key()!=14&&count1!=3){show3();//密码错误,显示ERR}P0=0;//按下输入密码键后,清屏if(count1==3){//开启定时器中断TMOD=0x01;TH0=0x9E;//装载初值25msTL0=0x58;EA=1; //开总中断ET0=1;//开定时器0TR0=1;  //开启定时器0while(counter1<60);//只有当蜂鸣器响完一分钟之后,才能退出循环TR0=0;//关闭定时器}}else{	LED1=1;//当输入密码正确时,开启LED灯while(get_key()!=12)//直到按下退出键,屏幕一直显示on{show4();}LED1=0;//退出后关闭LED灯P0=0;//清屏}break;default:break;		}}}//获取键值
int get_key()
{char key_scan[]={0xef,0xdf,0xbf,0x7f};int i=0;int j=0;for(i=0;i<4;i++)//判断{P2=key_scan[i];if((P2&0x0f)!=0x0f){for(j=0;j<16;j++){if(key_buf[j]==P2){if(temp!=key_buf[j])//一旦长时间按键,将只会读取一次按键的值{signal=1;temp=j;return j;}else signal=0;}}}}return -1;
}//输入的密码和设定的密码比较
int compare()
{int i;for(i=0;i<4;i++){if(get_word[i]!=key_word[i])return -1;//输入密码不等于设定的密码返回-1}return 1;//输入的密码等于设定密码返回1
}void show3()//显示ERR
{P1=0x0e;P0=0x79;delay(10);P1=0x0d;P0=0x77;delay(10);P1=0x0b;delay(10);
}
void show4()//显示on
{P1=0x0e;P0=0x5c;delay(10);P1=0x0d;P0=0x54;delay(10);
}//定时器中断函数,定时1分钟
call_police() interrupt 1
{counter++;if(counter==39){	counter=0;Beep=~Beep;counter1++;if(counter1==60)//定时一分钟{count1=0;Beep=1;//关闭定时器}}else{TH0=0x9E;TL0=0x58;}
}

6.仿真结果图

在这里插入图片描述

7.工程源码及protues仿真下载

点击下载工程源码
点击下载protues仿真程序


http://chatgpt.dhexx.cn/article/jNGsAlBy.shtml

相关文章

AT89C51单片机万年历仿真图+代码

首先申明&#xff0c;这篇博客是用作记录本人实训内容的&#xff0c;代码我个人一字一字码的&#xff0c;就上网查了下数字温度传感器DS18B20的处理方法&#xff0c;基本都是个人完成的。 在这里吐槽下&#xff0c;本人辛辛苦苦码的代码&#xff0c;最后实训分数还没那些抄的人…

基于AT89C51单片机的电子万年历系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87708258 源码获取 主要内容&#xff1a; 电子万年历系统以实时时钟芯片DS1302和AT89C52单片机为主要研究对象&#xff0c;着重进行51单片机控制系统的设计研究和如…

c51单片机时钟c语言程序设计,AT89C51单片机为核心的时钟电路的程序设计

当前位置:电工之家 > 电工知识 > 单片机 > 正文 AT89C51单片机为核心的时钟电路的程序设计 时间:2018-06-05 08:38 来源:电工之家 AT89C51单片机为核心的时钟电路的程序设计 1.主程序设计及系统主流程图 设计中采用定时器T0中断完成,其余状态循环调用显示子程序。系…

AT89C51单片机

目录 一、AT89S51单片机的I/O端口二、AT89S51单片机的中断系统  1、中断处理过程  2、AT89S51单片机的中断源&#xff08;2&#xff09;AT89S51单片机的中断控制&#xff08;3&#xff09;AT89S51单片机的中断优先级&#xff08;4&#xff09;AT89S51单片机中断系统的结构&…

89c51c语言程序,AT89C51单片机流水灯c语言程序及详解

许多朋友不知道怎么用C语言编程实现AT89C51单片机流水灯&#xff0c;这里给大家讲解一下。 首先将单片机的头函数导入。 #include"reg51.h" 定义单片机P1口的8个管脚&#xff0c;使其分别代表流水灯的8个led。 sbit p0P1^0; sbit p1P1^1; sbit p2P1^2; sbit p3P1^3; …

keil ISIS AT89C51单片机

突然想起大学时候学习的知识&#xff0c;最近空余时间较多&#xff0c;想回顾一下&#xff0c;然后发现连最简单的编辑器的名字都快忘记了&#xff0c;于是赶紧抓紧时间复习一遍&#xff0c;在此记录一下这个过程遇到的问题。 首先是对于keil的安装&#xff0c;我是直接从网上…

AT89C51单片机性能介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器&#xff08;FPEROM—Falsh Programmable and Erasable Read Only Memory&#xff09;的低电压&#xff0c;高性能CMOS8位微处理器&#xff0c;俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造&#xff0c;与工业标…

微机基础与89C51单片机部分知识

1&#xff0c;微机基础知识 微机: 具有完整运算及控制能力的计算机。包括微处理器&#xff0c;储存器&#xff0c;接口适配器&#xff0c;输入输出设备。 微处理器&#xff1a; 控制器&#xff1a;由程序计数器&#xff0c;指令寄存器&#xff0c;指令译码器&#xff0c;时序发…

基于AT89C51单片机的计算器设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87772564 源码获取 主要内容: 本设计是基于51系列的单片机进行的设计,可以完成计算器的键盘输入,进行加、减、3位无符号数字的简单运算,并在LED上相应的显示结果。设计过…

基于 AT89C51 单片机的数字时钟设计

目录 1.设计目的、作用 2.设计要求 3.设计的具体实现 3.1 设计原理 3.2 硬件系统设计 3.2.1 AT89C51 单片机原理 3.2.2 晶振电路设计 3.2.3 复位电路设计 3.2.4 LED 数码管显示 3.3 系统实现 3.3.1 系统仿真与调试 3.3.2 演示结果 4.总结 附录 附录 1 附录 2 1.…

89C51单片机之寄存器

文章目录 片内RAM中的寄存器内容介绍 低128字节片内RAM4组工作寄存器 高128字节片内RAM&#xff08;SFR区&#xff09;部分特殊功能寄存器累加器 ACC寄存器 B程序状态寄存器 PSW栈指针 SP数据指针 DPTRI/O端口 P0~P3 中断系统中的特殊寄存器定时器控制寄存器 TCON 之中断定时器…

【89c51汇编语言】51单片机结构及其原理

单片机结构及其原理 51单片机的内部结构单片机CPU控制器控制器&#xff1a;程序计数器&#xff1a;PC 控制器&#xff1a;数据指针寄存器&#xff1a;DPTR运算器累加器APSW程序状态字CY&#xff08;PSW.7&#xff09;进位标志AC&#xff08;PSW.6&#xff09;辅助进位标志RS1和…

89c51单片机

89c51是一款很大众化的入门级单片机&#xff0c;ATMEL、NXP、STC、和SST等公司生产的与80c51兼容低功耗、高性能8位89c51/s51单片机具有比80c31更丰富的外设资源。 89c51/s51单片机芯片内包括&#xff1a; ①一个8位的80c51微处理器&#xff08;CPU&#xff09; ②片内256字…

关于会话(session),你应该了解这些

一、什么是会话 会话Session代表的是客户端与服务器的一次交互过程&#xff0c;这个过程可以是连续也可以是时断时续的。在Servlet中&#xff08;jsp&#xff09;&#xff0c;一旦用户与服务端交互&#xff0c;服务器tomcat就会为用户创建一个session&#xff0c;同时前端会有…

ZooKeeper客户端源码(一)——向服务端建立连接+会话建立+心跳保持长连接

首发CSDN&#xff1a;徐同学呀&#xff0c;原创不易&#xff0c;转载请注明源链接。我是徐同学&#xff0c;用心输出高质量文章&#xff0c;希望对你有所帮助。 一、从ZooKeeper实例初始化开始 ZooKeeper 提供了原生的客户端库&#xff0c;虽然不好用&#xff0c;但是能够更好…

会话劫持安全攻击

什么是会话劫持&#xff1f; TCP 会话劫持是对受保护网络上的用户会话的安全攻击。会话劫持最常见的方法称为 IP 欺骗&#xff0c;攻击者使用源路由 IP 数据包将命令插入网络上两个节点之间的活动通信中&#xff0c;并将自己伪装成经过身份验证的用户之一。这种类型的攻击是可能…

HTML sessionStorage会话存储

sessionStorage会话存储 sessionStorage 是HTML5新增的一个会话存储对象&#xff0c;用于临时保存同一窗口(或标签页)的数据&#xff0c;在关闭窗口或标签页之后将会删除这些数据。本篇主要介绍 sessionStorage(会话存储)的使用方式。包括添加、修改、删除等操作。 目录 1. 介…

【windows】会话(Session)、窗口站(WindowsStation)、桌面、窗口

序 一个系统可以同时登录多个用户(包括远程用户登录)&#xff08;多用户系统&#xff09;。 一个用户拥有一个会话&#xff08;远程用户被称为远程会话&#xff09;。 一个会话拥有多个工作站和窗口。只能拥有一个交互式工作站(Winsta0)。&#xff08;Window Station 0…

WindTerm导出会话

WindTerm的session配置并无法被适用于其他软件中&#xff0c;所有的session保存在WindTerm安装路径下的profiles文件夹内&#xff0c;如果需要更新版本或回退&#xff0c;将所安装的版本覆盖即可&#xff0c;或是将profiles复制于新路径下。 图标闪烁设置、会话保存-导入导出 …

Spring Security中的会话【Session】管理与防御以及会话的并发控制

众所周知&#xff0c;HTTP本身是没有任何关于当前用户状态的内容&#xff0c;也就是两个HTTP请求之间是没有任何的关联可言&#xff0c;用户在和服务器交互的过程中&#xff0c;站点无法确定是哪个用户访问&#xff0c;也因此不能对其提供相应的个性化服务。Session的诞生就是为…