基于51单片机的密码锁设计—数码管显示
基于51单片机的密码锁设计仿真程序原理图PCB设计报告功能介绍具体功能1.本设计为了防止密码被窃取在输入密码时在数码管上显示“-”符号2.开锁密码位四位密码的电子密码锁3.在密码正确时显示YESS密码错误时显示NO4.输入密码错误超过限定的三次电子密码锁定报警5.4×4的矩阵键盘其中包括0-9的数字键和功能按键6.密码可以由用户自己修改设定只支持4位密码演示视频基于51单片机的密码锁设计—数码管显示添加图片注释不超过 140 字可选程序#includereg51.h /***微信公众号木子单片机****/ #define uchar unsigned char #define uint unsigned int sbit led1P1^0; sbit led2P1^1; sbit led3P1^2; sbit led4P1^3; sbit smg1P2^0; sbit smg2P2^1; sbit smg3P2^2; sbit smg4P2^3; sbit sdaP2^5; sbit sclP2^4; sbit SOUNDERP1^7; uchar a; uint n0,m0,js,error0; 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~9A~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() //开始信号 { sda1; delay02(); scl1; delay02(); sda0; delay02(); } void stop() //停止 { sda0; delay02(); scl1; delay02(); sda1; delay02(); } void respons() //应答 { uchar i; scl1; delay02(); while((sda1)(i250))i; scl0; delay02(); } void at2402init() { sda1; delay02(); scl1; delay02(); } void write_byte(uchar date) { uchar i,temp; tempdate; for(i0;i8;i) { temptemp1; scl0; delay02(); sdaCY; delay02(); scl1; delay02(); // scl0; // delay(); } scl0; delay02(); sda1; delay02(); } uchar read_byte() { uchar i,k; scl0; delay02(); sda1; delay02(); for(i0;i8;i) { scl1; delay02(); k(k1)|sda; scl0; delay02(); } return k; } void delay11(uchar x) { uchar a,b; for(ax;a0;a--) for(b100;b0;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(); dateread_byte(); stop(); return date; } //void main() //{ // init(); // write_add(23,0xaa); // delay1(100); // P1read_add(23); // while(1); //} void delayms(uint x) { uchar i; while(x--) { for(i150;i0;i--); } } void code_smg() { if(n0) { P00x39; smg10; delayms(3); smg11; P00x3f; smg20; delayms(3); smg21; P00x5e; smg30; delayms(3); smg31; P00x79; smg40; delayms(3); smg41; } if(n1) { led10; P00x40; smg10; delayms(3); smg11; P00x00; smg20; delayms(3); smg21; P00x00; smg30; delayms(3); smg31; P00x00; smg40; delayms(3); smg41; } if(n2) { led20; P00x40; smg10; delayms(3); smg11; P00x40; smg20; delayms(3); smg21; P00x00; smg30; delayms(3); smg31; P00x00; smg40; delayms(3); smg41; } if(n3) { led30; P00x40; smg10; delayms(3); smg11; P00x40; smg20; delayms(3); smg21; P00x40; smg30; delayms(3); smg31; P00x00; smg40; delayms(3); smg41; } if(n4) { led40; P00x40; smg10; delayms(3); smg11; P00x40; smg20; delayms(3); smg21; P00x40; smg30; delayms(3); smg31; P00x40; smg40; delayms(3); smg41; } } void delay(uint x) //延时函数 { while(x--) code_smg(); } uchar scan() //矩阵键盘扫描函数得到按键号采用线反转法 {uchar a,b,c,i; P30XF0; //P3口输出11110000 aP3; //读取列码 delay(5); //防抖延时10ms P30X0F; //P3口输出00001111 bP3; //读取行码 cab; //得到位置码 for(i0;i16;i) if(ctab[i])return i; //查表得到按键序号并返回 return -1; //无按键则返回-1 } void xsyes() { P00x6e; smg10; delayms(3); smg11; P00x79; smg20; delayms(3); smg21; P00x6D; smg30; delayms(3); smg31; P00x6D; smg40; delayms(3); smg41; } void delay2(uint x) //延时函数 { while(x--) xsyes(); } uchar scan2() //矩阵键盘扫描函数得到按键号采用线反转法 {uchar a,b,c,i; P30XF0; //P3口输出11110000 aP3; //读取列码 delay2(5); //防抖延时10ms P30X0F; //P3口输出00001111 bP3; //读取行码 cab; //得到位置码 for(i0;i16;i) if(ctab[i])return i; //查表得到按键序号并返回 return -1; //无按键则返回-1 } void xsno() { P00x00; smg10; delayms(3); smg11; P00x00; smg20; delayms(3); smg21; P00x37; smg30; delayms(3); smg31; P00x3f; smg40; delayms(3); smg41; } void delay1(uint x) //延时函数 { while(x--) xsno(); } uchar scan1() //矩阵键盘扫描函数得到按键号采用线反转法 {uchar a,b,c,i; P30XF0; //P3口输出11110000 aP3; //读取列码 delay1(5); //防抖延时10ms P30X0F; //P3口输出00001111 bP3; //读取行码 cab; //得到位置码 for(i0;i16;i) if(ctab[i])return i; //查表得到按键序号并返回 return -1; //无按键则返回-1 } void xschangemima() { if(m0) { P00x08; smg10; delayms(3); smg11; P00x08; smg20; delayms(3); smg21; P00x08; smg30; delayms(3); smg31; P00x08; smg40; delayms(3); smg41; } if(m1) { P0dis[new_mima[0]]; smg10; delayms(3); smg11; P00x08; smg20; delayms(3); smg21; P00x08; smg30; delayms(3); smg31; P00x08; smg40; delayms(3); smg41; } if(m2) { P0dis[new_mima[0]]; smg10; delayms(3); smg11; P0dis[new_mima[1]]; smg20; delayms(3); smg21; P00x08; smg30; delayms(3); smg31; P00x08; smg40; delayms(3); smg41; } if(m3) { P0dis[new_mima[0]]; smg10; delayms(3); smg11; P0dis[new_mima[1]]; smg20; delayms(3); smg21; P0dis[new_mima[2]]; smg30; delayms(3); smg31; P00x08; smg40; delayms(3); smg41; } if(m4) { P0dis[new_mima[0]]; smg10; delayms(3); smg11; P0dis[new_mima[1]]; smg20; delayms(3); smg21; P0dis[new_mima[2]]; smg30; delayms(3); smg31; P0dis[new_mima[3]]; smg40; delayms(3); smg41; } } void delay3(uint x) //延时函数 { while(x--) xschangemima(); } uchar scan3() //矩阵键盘扫描函数得到按键号采用线反转法 {uchar a,b,c,i; P30XF0; //P3口输出11110000 aP3; //读取列码 delay3(5); //防抖延时10ms P30X0F; //P3口输出00001111 bP3; //读取行码 cab; //得到位置码 for(i0;i16;i) if(ctab[i])return i; //查表得到按键序号并返回 return -1; //无按键则返回-1 } void dead() { SOUNDER0; while(1) { P00x5e; smg10; delayms(3); smg11; P00x79; smg20; delayms(3); smg21; P00x77; smg30; delayms(3); smg31; P00x5e; smg40; delayms(3); smg41; } } 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); n0; while(1) { code_smg(); keyscan(); if(key!-1) { if(n4) { n; if(key15) mima[n-1]7; if(key14) mima[n-1]8; if(key13) mima[n-1]9; if(key11) mima[n-1]4; if(key10) mima[n-1]5; if(key9) mima[n-1]6; if(key7) mima[n-1]1; if(key6) mima[n-1]2; if(key5) mima[n-1]3; if(key2) mima[n-1]0; if(key12) n--; if(key8) n--; if(key0) n--; if(key4) n--; if(key3) {n0;init();} if(key1) n--; } if(n4) { if(key3) {n0;init();} if(key1) { if((mima[0]e_mima[0])(mima[1]e_mima[1])(mima[2]e_mima[2])(mima[3]e_mima[3])) { SOUNDER0; delay(5); SOUNDER1; delay(5); SOUNDER0; delay(5); SOUNDER1; while(1) { keyscan2(); if(key0) change_mima(); xsyes(); } } else { SOUNDER0; delay(30); SOUNDER1; if(error2) error; else dead(); while(1) { keyscan1(); if(key3) {n0;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、设计报告、流程图、实物图、元件清单、实物演示视频等。具体内容如下全网最全! 操作演示请观看前面演示视频点赞分享一起学习成长。