单片机原理与应用技术课程设计报告(论文)基于单片机控制的电子密码锁专业班级:应用电子技术教育151班(1)状态显示功能:锁定状态时系统用3位数码管显示OFF,用3位数码管显示成功开锁次数;成功开锁时用3位数码管显示888,用3位数码管显示成功开锁次数。
(2)密码设定功能:通过一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),同时系统掉电后能自动记忆和存储密码在系统中。
(3)报警和加锁功能:密码的输入时间超过12秒或者连续3次输入失败,声音报警同时锁定系(5)硬件及程序综合调试;3.编写设计报告写出设计的全过程,附上有关资料和图纸,有心得体会4.答辩在规定时间内,完成叙述并回答问题。
目录3.2 显示电路的设计3.3 矩阵按键的设计......................................................3.3.1矩阵按键电路图.....................................................3.3.2矩阵按键说明.......................................................3.3.3矩阵按键原理.......................................................3.4 I2C电路的设计.......................................................4 结束语................................................................ 参考文献................................................................基于单片机控制的电子密码锁应教151班黄永进摘要:设计是采用STC89C52芯片控制一个三位一体的数码管,通过4x4矩阵按键来控制密码输入以及不同的系统指令来完成密码锁的密码输入和修改等,同时使用C语该2.1.1 方案确立(1)方案内容该设计方案采用STC89C52芯片作为核心,配合数码管、矩阵按键、蜂鸣器等外围电路进行组合,组成电子密码锁系统。
其中矩阵按键用来设置系统的密码和输入密码,数码管用于显示开锁状态和成功开锁的次数,最后用C语言程序控制其逻辑功能。
2.2 设计方框图(1)设计框图如图1.1时间由电路的RC值来决定。
典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以适当组合RC的取值就可以保证可靠的复位。
3.1.2 晶振电路每个单片机系统里都有晶振(如图1.2中器件Y1),全称是叫晶体震荡器,在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。
本设计中晶振取12MHz,因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合,12MHz产生精确的uS级时歇,方便定时操作。
DG1、数据。
图6 I2C电路图3.5 报警电路的设计图7 报警电路设计中报警电路如图1.7所示,蜂鸣器使用三极管驱动,通过一个限流电阻之后与单片机P3.0连接。
因此,我们可以通过程序控制P3.0脚的电平来使蜂鸣器发出声音和关闭,从而实现系统报警。
4 结束语在这次实习的过程中,从选题到定稿,从理论到实践,可以说得是苦多于甜,但附录4程序代码#include <REG52.H>#define uint unsigned int #define uchar unsigned char #define KeyPort P1uchar DD_F=0,DM_F=0;uchar R[16]; //用户密码uchar M[16]; //芯片密码uchar G[6]={6,6,6,6,6,6};uchar codeDIS_SEG7[]={0xc0,0xf9,0xa4,0xb0,0x 99,0x92,0x82,0xf8,0x80,0x90,0x88,0sbit LED=P3^7;char dis[3]={0};unsigned char num=1,num1=0,num2=0;char Time_temp=0; char DIG_C1=0;char DIG_C2=0;char DIG_C3=0;{unsigned char a, b; for (;c>0;c--){for (b=15;b>0;b--){for (a=130;a>0;a--);unsigned char KeyScan(void) {unsigned char cord_h,cord_l; KeyPort=0x0f;cord_h=KeyPort&0x0f;if(cord_h!=0x0f){Delay10ms(1);}unsigned char KeyPro(void) {switch(KeyScan()){case 0x7e:return 0;break;//0 case 0x7d:return 1;break;//1 case 0x7b:return 2;break;//2case 0xee:return 12;break;//c case 0xed:return 13;break;//d case 0xeb:return 14;break;//e case 0xe7:return 15;break;//f default:return 0xff;break;}}void Tim_Iint(void)void Close_DIG(char i,char k,char j) {if(i==1){DIG_C1=1; }if(i==0) {}if(j==1) {DIG_C3=1;}if(j==0){DIG_C3=0;1Tim_temp1++;if(Tim_temp1>1000){Tim_temp1=0;Tim_CNT++;}}if(Time_temp==0){wei1=1;wei3=1;wei2=1;}Time_temp=1; goto end;}if(DIG_C2==0) {wei1=1;wei3=1;wei2=1;}Time_temp=2; goto end;}if(DIG_C3==0) {wei1=1;wei2=1;wei3=1;}Time_temp=0;delay();sda=0;delay();}void stop() //停止信号{sda=0;delay();delay();while((sda==1)&&(i<250))i++; scl=0;delay();}void init_24c08() //初始化24C02 {sda=1;{temp=temp<<1;scl=0;delay();sda=CY; delay(); scl=1; delay();{uchar i,k; scl=0; delay();sda=1;delay();for(i=0;i<8;i++){address,uchar shuju) //给指定地址中写入数据{start();write_byte(0xa0); // 最低位为0写,1读respons();write_byte(address);start();write_byte(0xa0);respons();write_byte(address); respons();start();write_byte(0xa1);char i=0,j=0,k=0,m=0;char dis_temp=0;uchar cnt1=0,cnt2=0,cnt3=0; // char a,b,c;init_24c08();Tim_Iint();Close_DIG(1,1,1);for(m=1;m<=16;m++)//判断管理员标志位adm if(adm==0){if(adm1==0){if(num==14){Close_DIG(0,0,0);temp1++;cnt1++;if(temp1==4) temp1=1;}if(num==13){cnt1--;}if(temp1==2){display(16,M[cnt1-1],16);}if(temp1==3){display(16,16,M[cnt1-1]);adm1=1;break;}Delay10ms(1);}}}if(num==12)Close_DIG(1,1,1);R[cnt2]=num;while(num==KeyPro()); temp2++;cnt2++;if(temp2==4)temp2=1;}if(temp2==1){display(R[cnt2-1],16,16); }if(temp2==2){display(16,R[cnt2-1],16); }{for(j=0;j<cnt1;j++){//判断密码是否正确flag=flag&&(M[j]==R[j]); }if(flag){else{ecs++;Close_DIG(0,0,0);cnt2=0;temp2=0;flag=1;Tim_flog=0;Tim_CNT=0;}}Delay10ms(1);if(Tim_CNT==12) {adm=1;fmq=0;flagb=1;Tim_flog=0;Tim_CNT=0; break;}}}}num=KeyPro();if(num<10){ Close_DIG(1,1,1); R[cnt3]=num;while(num==KeyPro()); temp3++;cnt3++;if(temp3==4)temp3=3;}if(temp3==1){display(R[cnt3-1],16,16); }if(temp3==2){Tim_flog=0;if(cnt3==6){for(j=0;j<6;j++){flagg=flagg&&(G[j]==R[j]); }if(flagg&&flagb==0)else if(flagg&&flagb==1) { Tim_flog=0;Tim_CNT=0;ecs=0;fmq=1;adm=0;adm1=1;flagb=0;}Delay10ms(1); }}Delay10ms(1); }。