基于51单片机的密码锁设计—数码管显示

基于51单片机的密码锁设计—数码管显示

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

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

1.本设计为了防止密码被窃取,在输入密码时在数码管上显示“-”符号;

2.开锁密码位四位密码的电子密码锁;

3.在密码正确时显示YESS,密码错误时显示NO;

4.输入密码错误超过限定的三次,电子密码锁定报警;

5.4×4的矩阵键盘其中包括0-9的数字键和功能按键;

6.密码可以由用户自己修改设定(只支持4位密码);

​演示视频:

基于51单片机的密码锁设计—数码管显示

添加图片注释,不超过 140 字(可选)

程序

#include<reg51.h> /***微信公众号:木子单片机****/ #define uchar unsigned char #define uint unsigned int sbit led1=P1^0; sbit led2=P1^1; sbit led3=P1^2; sbit led4=P1^3; sbit smg1=P2^0; sbit smg2=P2^1; sbit smg3=P2^2; sbit smg4=P2^3; sbit sda=P2^5; sbit scl=P2^4; sbit SOUNDER=P1^7; uchar a; uint n=0,m=0,js,error=0; uchar key; uchar mima[]={0x00,0x00,0x00,0x00}; uchar e_mima[]={0x01,0x02,0x03,0x04}; uchar new_mima[]={0x01,0x02,0x03,0x04}; uchar code dis[]= //0~9,A~F的共阴显示代码 {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; uchar code tab[]= //矩阵键盘按键位置码 { 0x77,0xb7,0xd7,0xe7, 0x7b,0xbb,0xdb,0xeb, 0x7d,0xbd,0xdd,0xed, 0x7e,0xbe,0xde,0xee }; void init(); void change_mima(); void delay02() { ;; } void start() //开始信号 { sda=1; delay02(); scl=1; delay02(); sda=0; delay02(); } void stop() //停止 { sda=0; delay02(); scl=1; delay02(); sda=1; delay02(); } void respons() //应答 { uchar i; scl=1; delay02(); while((sda==1)&&(i<250))i++; scl=0; delay02(); } void at2402init() { sda=1; delay02(); scl=1; delay02(); } void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay02(); sda=CY; delay02(); scl=1; delay02(); // scl=0; // delay(); } scl=0; delay02(); sda=1; delay02(); } uchar read_byte() { uchar i,k; scl=0; delay02(); sda=1; delay02(); for(i=0;i<8;i++) { scl=1; delay02(); k=(k<<1)|sda; scl=0; delay02(); } return k; } void delay11(uchar x) { uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } void write_add(uchar address,uchar date) { start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop(); } uchar read_add(uchar address) { uchar date; start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date; } //void main() //{ // init(); // write_add(23,0xaa); // delay1(100); // P1=read_add(23); // while(1); //} void delayms(uint x) { uchar i; while(x--) { for(i=150;i>0;i--); } } void code_smg() { if(n==0) { P0=0x39; smg1=0; delayms(3); smg1=1; P0=0x3f; smg2=0; delayms(3); smg2=1; P0=0x5e; smg3=0; delayms(3); smg3=1; P0=0x79; smg4=0; delayms(3); smg4=1; } if(n==1) { led1=0; P0=0x40; smg1=0; delayms(3); smg1=1; P0=0x00; smg2=0; delayms(3); smg2=1; P0=0x00; smg3=0; delayms(3); smg3=1; P0=0x00; smg4=0; delayms(3); smg4=1; } if(n==2) { led2=0; P0=0x40; smg1=0; delayms(3); smg1=1; P0=0x40; smg2=0; delayms(3); smg2=1; P0=0x00; smg3=0; delayms(3); smg3=1; P0=0x00; smg4=0; delayms(3); smg4=1; } if(n==3) { led3=0; P0=0x40; smg1=0; delayms(3); smg1=1; P0=0x40; smg2=0; delayms(3); smg2=1; P0=0x40; smg3=0; delayms(3); smg3=1; P0=0x00; smg4=0; delayms(3); smg4=1; } if(n==4) { led4=0; P0=0x40; smg1=0; delayms(3); smg1=1; P0=0x40; smg2=0; delayms(3); smg2=1; P0=0x40; smg3=0; delayms(3); smg3=1; P0=0x40; smg4=0; delayms(3); smg4=1; } } void delay(uint x) //延时函数 { while(x--) code_smg(); } uchar scan() //矩阵键盘扫描函数,得到按键号,采用线反转法 {uchar a,b,c,i; P3=0XF0; //P3口输出11110000 a=P3; //读取列码 delay(5); //防抖延时10ms P3=0X0F; //P3口输出00001111 b=P3; //读取行码 c=a+b; //得到位置码 for(i=0;i<16;i++) if(c==tab[i])return i; //查表得到按键序号并返回 return -1; //无按键,则返回-1 } void xsyes() { P0=0x6e; smg1=0; delayms(3); smg1=1; P0=0x79; smg2=0; delayms(3); smg2=1; P0=0x6D; smg3=0; delayms(3); smg3=1; P0=0x6D; smg4=0; delayms(3); smg4=1; } void delay2(uint x) //延时函数 { while(x--) xsyes(); } uchar scan2() //矩阵键盘扫描函数,得到按键号,采用线反转法 {uchar a,b,c,i; P3=0XF0; //P3口输出11110000 a=P3; //读取列码 delay2(5); //防抖延时10ms P3=0X0F; //P3口输出00001111 b=P3; //读取行码 c=a+b; //得到位置码 for(i=0;i<16;i++) if(c==tab[i])return i; //查表得到按键序号并返回 return -1; //无按键,则返回-1 } void xsno() { P0=0x00; smg1=0; delayms(3); smg1=1; P0=0x00; smg2=0; delayms(3); smg2=1; P0=0x37; smg3=0; delayms(3); smg3=1; P0=0x3f; smg4=0; delayms(3); smg4=1; } void delay1(uint x) //延时函数 { while(x--) xsno(); } uchar scan1() //矩阵键盘扫描函数,得到按键号,采用线反转法 {uchar a,b,c,i; P3=0XF0; //P3口输出11110000 a=P3; //读取列码 delay1(5); //防抖延时10ms P3=0X0F; //P3口输出00001111 b=P3; //读取行码 c=a+b; //得到位置码 for(i=0;i<16;i++) if(c==tab[i])return i; //查表得到按键序号并返回 return -1; //无按键,则返回-1 } void xschangemima() { if(m==0) { P0=0x08; smg1=0; delayms(3); smg1=1; P0=0x08; smg2=0; delayms(3); smg2=1; P0=0x08; smg3=0; delayms(3); smg3=1; P0=0x08; smg4=0; delayms(3); smg4=1; } if(m==1) { P0=dis[new_mima[0]]; smg1=0; delayms(3); smg1=1; P0=0x08; smg2=0; delayms(3); smg2=1; P0=0x08; smg3=0; delayms(3); smg3=1; P0=0x08; smg4=0; delayms(3); smg4=1; } if(m==2) { P0=dis[new_mima[0]]; smg1=0; delayms(3); smg1=1; P0=dis[new_mima[1]]; smg2=0; delayms(3); smg2=1; P0=0x08; smg3=0; delayms(3); smg3=1; P0=0x08; smg4=0; delayms(3); smg4=1; } if(m==3) { P0=dis[new_mima[0]]; smg1=0; delayms(3); smg1=1; P0=dis[new_mima[1]]; smg2=0; delayms(3); smg2=1; P0=dis[new_mima[2]]; smg3=0; delayms(3); smg3=1; P0=0x08; smg4=0; delayms(3); smg4=1; } if(m==4) { P0=dis[new_mima[0]]; smg1=0; delayms(3); smg1=1; P0=dis[new_mima[1]]; smg2=0; delayms(3); smg2=1; P0=dis[new_mima[2]]; smg3=0; delayms(3); smg3=1; P0=dis[new_mima[3]]; smg4=0; delayms(3); smg4=1; } } void delay3(uint x) //延时函数 { while(x--) xschangemima(); } uchar scan3() //矩阵键盘扫描函数,得到按键号,采用线反转法 {uchar a,b,c,i; P3=0XF0; //P3口输出11110000 a=P3; //读取列码 delay3(5); //防抖延时10ms P3=0X0F; //P3口输出00001111 b=P3; //读取行码 c=a+b; //得到位置码 for(i=0;i<16;i++) if(c==tab[i])return i; //查表得到按键序号并返回 return -1; //无按键,则返回-1 } void dead() { SOUNDER=0; while(1) { P0=0x5e; smg1=0; delayms(3); smg1=1; P0=0x79; smg2=0; delayms(3); smg2=1; P0=0x77; smg3=0; delayms(3); smg3=1; P0=0x5e; smg4=0; delayms(3); smg4=1; } } void init() { e_mima[0]=read_add(20); delay11(100); e_mima[1]=read_add(21); delay11(100); e_mima[2]=read_add(22); delay11(100); e_mima[3]=read_add(23); delay11(100); n=0; while(1) { code_smg(); key=scan(); if(key!=-1) { if(n<4) { n++; if(key==15) mima[n-1]=7; if(key==14) mima[n-1]=8; if(key==13) mima[n-1]=9; if(key==11) mima[n-1]=4; if(key==10) mima[n-1]=5; if(key==9) mima[n-1]=6; if(key==7) mima[n-1]=1; if(key==6) mima[n-1]=2; if(key==5) mima[n-1]=3; if(key==2) mima[n-1]=0; if(key==12) n--; if(key==8) n--; if(key==0) n--; if(key==4) n--; if(key==3) {n=0;init();} if(key==1) n--; } if(n>=4) { if(key==3) {n=0;init();} if(key==1) { if((mima[0]==e_mima[0])&&(mima[1]==e_mima[1])&&(mima[2]==e_mima[2])&&(mima[3]==e_mima[3])) { SOUNDER=0; delay(5); SOUNDER=1; delay(5); SOUNDER=0; delay(5); SOUNDER=1; while(1) { key=scan2(); if(key==0) change_mima(); xsyes(); } } else { SOUNDER=0; delay(30); SOUNDER=1; if(error<2) error++; else dead(); while(1) { key=scan1(); if(key==3) {n=0;init();} xsno(); } /***完整资料获取********/ /***微信公众号:木子单片机********/ } } } delay(20); code_smg(); } } }

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

IC座:DIP40;万能板:9*15;

数码管:Lg3641AH;排阻:1K*8;

蜂鸣器:有源 5V;三极管:9012;

晶振:11.0592;电容:22pF;

电容:10uF/16V;电阻:1K;

电阻:3.6K;按键:6*6*5;

存储芯片:AT24c02;

接线端子:5.08*2P;

自锁开关:8*8;

导线:若干;

添加图片注释,不超过 140 字(可选)

流程图:

设计资料

01仿真图

本设计使用proteus7.8和proteus8.7两个版本设计,向下兼容,无需担心!具体如图!

添加图片注释,不超过 140 字(可选)

02原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用软件keil4和keil5两个版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计报告

八千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

05设计资料

资料获取请看前面演示视频,全部资料包括仿真源文件 、程序(含注释)、AD原理图、PCB、设计报告、流程图、实物图、元件清单、实物演示视频等。具体内容如下,全网最全! !

操作演示请观看前面演示视频!

点赞分享一起学习成长。