感谢楼主 |
好用 谢谢 |
楼主好人 |
楼主好人 |
非常有用 |
感谢大佬的分享 |
请问为什么运行以后,液晶屏上一直是闪烁的,全暗或者全亮。 |
zyq2367503734 发表于 2019-6-16 06:09 软件里面你自己看懂了就会设置了,超级简单 |
感谢大佬 |
学习一下,谢谢LZ!!! |
感谢大佬![]() |
好用· |
可以使用 |
为什么锁定倒计时只能30秒,后边就无限循环了 |
为什么程序烧到普中的51单片机上数码管不能完全显示出来 |
好资料,51黑有你更精彩!!! |
感谢分享 正愁着没有思路 |
感谢大佬 |
附录一 程序源代码 #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; #define GPIO_DIG P0 //数码管送数据 #define GPIO_KEY P1 //矩形按键 sbit LSA=P2^0; //数码管位选 sbit LSB=P2^1; sbit LSC=P2^2; sbit k1=P2^3; //独立按键 sbit k2=P2^4; sbit beep=P3^0; //蜂鸣器 sbit led=P3^1; //LED开锁 char srmm[8]= //输入密码 {0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08}; char ysmm[8]= //原始密码1111 1111 {0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06}; u8 code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,}; u16 b,n,x,y,i,mm,ss,m1,m2,s1,s2,z=0,j=1,s=0,m=0,t=0; u8 Mima; // 存放密码 u8 KeyValue; // 按键值定义 void delay(u16 i) //延时函数 {while(i--);} void shuoding() //锁定 { mm=1;ss=30; m2=mm/10;m1=mm%10; s2=ss/10;s1=ss%10; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;ET0=1;TR0=1; } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t++; if(t==20) { t=0;ss--; if(ss==0) {j=1;} } m2=mm/10;m1=mm%10; s2=ss/10;s1=ss%10; } void bep() //蜂鸣器函数 { for(b=0;b<100;b++) { beep=~beep; delay(50); } b=0; } void xgmm() //修改密码显示函数 { for(n=0;n<=7;n++) {srmm[n]=0x01;} } void dsmm() //待输入密码显示函数 _ _ _ _ _ _ _ _ { for(n=0;n<=7;n++) {srmm[n]=0x08;} } void mmzq() //密码正确显示函数 - - - - - - - - { for(n=0;n<=7;n++) {srmm[n]=0x40;} } void DigDisplaysr() //输入显示函数 {for(i=0;i<8;i++) {switch(i) { case(0):LSA=0;LSB=0;LSC=0;P0=srmm[0];break;//显示第0位 case(1):LSA=1;LSB=0;LSC=0;P0=srmm[1];break;//显示第1位 case(2):LSA=0;LSB=1;LSC=0;P0=srmm[2];break;//显示第2位 case(3):LSA=1;LSB=1;LSC=0;P0=srmm[3];break;//显示第3位 case(4):LSA=0;LSB=0;LSC=1;P0=srmm[4];break;//显示第4位 case(5):LSA=1;LSB=0;LSC=1;P0=srmm[5];break;//显示第5位 case(6):LSA=0;LSB=1;LSC=1;P0=srmm[6];break;//显示第6位 case(7):LSA=1;LSB=1;LSC=1;P0=srmm[7];break;//显示第7位 }delay(100);P0=0x00; } } void daojishi() //锁定后倒计时显示 { for(i=0;i<8;i++) { switch(i) { case(0): LSA=0;LSB=0;LSC=0;P0=0x00;break; case(1): LSA=1;LSB=0;LSC=0;P0=0x00;break; case(2): LSA=0;LSB=1;LSC=0;P0=table[m2];break; case(3): LSA=1;LSB=1;LSC=0;P0=table[m1];break; case(4): LSA=0;LSB=0;LSC=1;P0=0x40;break; case(5): LSA=1;LSB=0;LSC=1;P0=table[s2];break; case(6): LSA=0;LSB=1;LSC=1;P0=table[s1];break; case(7): LSA=1;LSB=1;LSC=1;P0=0x00;break; }delay(100);P0=0x00; } } void key() //独立按键扫描 { if(k1==0) { delay(100); if(k1==0) {j=1;dsmm();led=0;} while(!k1); } if(k2==0) { delay(2); if(k2==0) {j=2;xgmm();led=0;} while(!k2); } } void KeyDownsr(void) //矩形按键扫描 { char a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f) //读取按键是否按下 { delay(1000); //延时10ms进行消抖 if(GPIO_KEY!=0x0f) //再次检测键盘是否按下 { GPIO_KEY=0X0F; //测试列 switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d): KeyValue=2;break; case(0X0e): KeyValue=3;break; } GPIO_KEY=0XF0; //测试行 switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测 {delay(1000);a++;} switch(KeyValue) //给相应的按键赋值 { case(0):Mima=0x06; break; case(1):Mima=0x5b; break; case(2):Mima=0x4f; break; case(3):break; case(4):Mima=0x66; break; case(5):Mima=0x6d; break; case(6):Mima=0x7d; break; case(7):break; case(8):Mima=0x07; break; case(9):Mima=0x7f; break; case(10):Mima=0x6f; break; case(11):Mima=0x3f; break; case(12):break; case(13):break; case(14):break; case(15):break; case(16):break; }srmm[s]=Mima;s++;bep(); } } } void main() { led=0; while(1) { key(); if(j==1) { do { KeyDownsr();DigDisplaysr(); if(s==8) { s=0;m=0; if(ysmm[0]==srmm[0]&&ysmm[1]==srmm[1]&&ysmm[2]==srmm[2]&&ysmm[3]==srmm[3]&&ysmm[4]==srmm[4]&&ysmm[5]==srmm[5]&&ysmm[6]==srmm[6]&&ysmm[7]==srmm[7]) {mmzq();led=1;z=0;} else { z++;dsmm(); if(z==3) {led=0;z=0;shuoding(); while(mm!=0||ss!=0) {daojishi();} } } } }while(m==8);if(m==8){m=0;} } if(j==2) { while(m<8) {KeyDownsr();DigDisplaysr(); if(s==8) { s=0;m=0; if(ysmm[0]==srmm[0]&&ysmm[1]==srmm[1]&&ysmm[2]==srmm[2]&&ysmm[3]==srmm[3]&&ysmm[4]==srmm[4]&&ysmm[5]==srmm[5]&&ysmm[6]==srmm[6]&&ysmm[7]==srmm[7]) {mmzq();z=0;led=1; while(m<8) { KeyDownsr();DigDisplaysr(); if(s==8) { for(x=0;x<=7;x++) {ysmm[x]=srmm[x];} s=0;led=0; } }j=1;dsmm(); } else {z++;xgmm(); if(z==3) {z=0;shuoding(); while(mm!=0||ss!=60) {daojishi();} } }s=0; } } if(m==8)m=0; } } } |
电气信息学院 设计任务书 名称 电子密码锁设计 时间 一、任务及要求 设计任务: 本课题要求以MCS-51系列单片机为核心,设计一个简易电子密码锁。 (1)具备密码输入、密码修改功能; (2)*其它功能 设计要求: (1)确定系统设计方案; (2)进行系统的硬件设计; (3)完成应用程序设计; (4)应用系统的硬件和软件的调试。 二、进度安排 第一周: 周一:集中布置设计任务和相关事宜,查资料确定系统总体方案。 周二~周三:完成硬件设计和电路连接 周四~周日:完成软件设计 第二周: 周一~周三:程序调试 周四~周五:设计文档撰写。周五进行和设计结果检查。 三、参考资料 1、王迎旭等.单片机原理及及应用[M]. 2版.机械工业出版社,2011 2、胡汉才.单片机原理及其接口技术[M].3版.清华大学出版社,2010 目 录 第一章 设计任务及要求 1 1.1 设计任务 1 1.2 设计要求 1 第二章 系统方案设计 1 2.1 设计框图 1 2.2 框图简介 1 第三章 系统硬件电路设计 2 3.1 单片机最小系统 2 3.2 按键电路 2 3.3 显示电路 3 3.4 LED指示开锁灯、蜂鸣器 4 第四章 系统软件设计 4 4.1 程序流程图 4 4.2 程序简介 5 第五章 系统仿真及调试 5 5.1 软件仿真及调试 5 5.2 实物调试 6 第六章 总结与设计调试体会 8 附录一 程序源代码 9 附录二 硬件电路图 14 第七章 电气信息学院设计评分标准 15 |