目录1.题目与主要功能要求及设计思路2.方案选择、总体方案组成和说明3.各硬件单元电路的设计、参数分析及原理说明4.软件流程图及流程说明5.Protues 仿真6.总结设计及调试的体会附录1.实物图2.元器件清单列表3.部分程序源码1.题目与主要功能要求及设计思路题目:智能门禁系统1.课程设计的目的和意义课程设计的目的与意义在于让我们将理论与实践相结合。
培养我们综合运用课程中的理论知识解决实际问题的能力,让我们对电子电路,元器件,印制电路板方面的知识进一步加深,同时在软件编程、排错调试、焊接技术、相关仪器的使用说明技能方面得到全面的发展与提高,为今后独立完成单片机应用系统的开发和设计奠定良好的基础。
2.题目的理解门禁系统采用89C52单片机作为控制核心,外加键盘输入,LED灯显示开关门,1602液晶屏显示,以及DS1302时钟芯片等来实现密码开锁及自定义开关门等功能。
关键词:52单片机门禁系统液晶显示实时时钟3.预期功能的实现:1、密码开锁功能可设置修改密码2、实现万年历功能3、自定义开关(23:00 ~6:00 Ps:周六24:00 ~5:00)4、分别统计出入人数5、密码实现掉电储存功能6、具有三次输错闭锁及错键消除功能4.设计思路先确定设计目标,进行总体设计思路的设计,1、硬件设计,确定实现功能,然后确定所需元件,最后布线,画出电路图2、软件设计确定总体思路然后模块化设计,分别实现密码开关锁和万年历的功能,最后实现自定义开关及其他综合性功能3、protues仿真根据电路图画出protues图,然后进行仿真模拟,调试软件4焊电路板7.方案选择、总体方案组成和说明方案选择方案一:门禁系统采用89C52单片机作为控制核心,外加键盘输入,LED 灯显示开关门,1602液晶屏显示等,门禁系统主要由CPU,工作指示电路,振荡电路,门控锁电路,时钟电路,键盘输入电路,显示电路等构成。
其工作原理为:选择时间显示或进出;当选择时间显示时,显示时间,当选择进出时,提示输入密码,密码输入后按确定键,显示密码密码正确开门或者密码错误不开门,密码正确后选择确定退回输入密码界面,选择设置更改密码,新密码需要输入两遍,按确定提示密码成功返回输入密码界面,或者提示修改密码不成功,返回输入密码界面。
当输入密码三次错误时,密码锁关闭。
方案二:门禁系统采用89C52单片机作为控制核心,外加键盘输入,LED 灯显示开关门,1602液晶屏显示蜂鸣器电路,读卡模块等。
其工作原理为:当刷卡时,蜂鸣器响,如卡权限获得允许,显示模块显示卡号同时继电器将门锁打开,指示灯点亮,延时一会,继电器再次将门锁关闭,指示灯灭。
因为继电器的熟悉程度不够,对门卡的工作原理也不太清楚,所以最终选择了方案一。
总体方案的组成和说明方案包括:1、键盘模块2、1602显示模块13、DS1302时钟控制模块4、24C02密码储存模块5、LED显示开关门模块6、蜂鸣器报警模块3.各硬件单元电路的设计、参数分析及原理说明1、门控锁电路2、蜂鸣器电路3、时钟电路4、LED开关门电路4.软件流程图及流程说明1.总体设计2.进出程序流程图3.时间程序结构图5.Protues 仿真及结果protues仿真仿真结果6.总结设计及调试的体会在这次的单片机设计中,在我们团队的默契配合,和老师同学的帮助下,顺利的完成了预期目标。
在设计工程中,从仿真图的设计,到源程序的书写与修改以及实物图的焊接中,我们都遇到了很多问题,但在我们的共同努力下解决了,并且从中学到了不少知识。
我们在设计过程中不断提出自己的疑点以及新的想法,联系实际应用,将课本上的知识运用到了实际中,使我们受益匪浅。
设计需要很大的耐心,尤其是遇到困难的时候,这也是对我们的考验。
在设计中,我们遇到问题不是急躁,而是冷静下来思考,耐心寻找解决的办法,与同学讨论,争取找到最优的解决方法。
附录:1.实物图2.2.元器件清单列表DS1302,LCD1602,16个按键,蜂鸣器,1K欧电位器,电容,LED灯(红绿各两个),3V电池3.程序源码(程序可以使用但存在问题)#include<reg52.h>#include"include.h"sbit dula=P2^6;sbit wela=P2^7;uchar i=0,j=0;uchar chr;uchar bj,bjc;//报警uchar t;//中断uchar k,g; //uchar jin,chu;//进出标志位uchar enter=0,out=0;//进出统计uchar str0[6]={0};uchar str2[6]={0};uchar str1[6]={1,2,3,4,5,6}; //初始密码unsigned char TempData1[8];unsigned char TempData2[8];unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9'};//转换成液晶显示的字符bit ReadTimeFlag;//定义读时间标志bit SetFlag; //更新时间标志位unsigned char time_buf2[16];void Init_Timer0(void);//定时器初始化void UART_Init(void);void time();void mima();void spand();void zhuan(){TempData1[0]=dofly_code[time_buf1[7]%10]; // 周TempData1[1]=' ';TempData1[2]=' ';TempData1[3]=' ';TempData1[4]=dofly_code[time_buf1[1]/10];//年TempData1[5]=dofly_code[time_buf1[1]%10]; TempData1[6]='-'; //加入"-"TempData1[7]=dofly_code[time_buf1[2]/10];//月TempData1[8]=dofly_code[time_buf1[2]%10]; TempData1[9]='-';TempData1[10]=dofly_code[time_buf1[3]/10];//日TempData1[11]=dofly_code[time_buf1[3]%10];}void zhuan2(){TempData2[0]=dofly_code[time_buf1[4]/10];//时//数据的转换,TempData2[1]=dofly_code[time_buf1[4]%10];//因我们采用数码管0~9的显示,将数据分开TempData2[2]=':'; //加入"-"TempData2[3]=dofly_code[time_buf1[5]/10];//分TempData2[4]=dofly_code[time_buf1[5]%10]; TempData2[5]=':';TempData2[6]=dofly_code[time_buf1[6]/10];//秒TempData2[7]=dofly_code[time_buf1[6]%10];}void write_smf(uchar add, uchar date){uchar shi,ge;shi=date/10;ge=date%10;LCD_Write_Com(0x80+add);LCD_Write_Data(0x30+shi);LCD_Write_Data(0x30+ge);}void disply(){zhuan2();LCD_Write_Com(0x80+0x40+3);for(j=0;j<8;j++){LCD_Write_Data(TempData2[j]);}zhuan();LCD_Write_Com(0x80+2);for(j=0;j<12;j++){LCD_Write_Data(TempData1[j]);}}void gaimi(){ uchar k,g;LCD_Clear();//清屏LCD_Write_Com(0x0f); //开光标LCD_Write_String(0,0,"new word!");loop3: while(1){chr=keypor();if((chr!=0xff)&&(chr<=9)){if(i<6){ if(k==0)str2[i]=chr;elsestr0[i]=chr;i++;}if(i==6){LCD_Write_Com(0x0c);if(k==0)ISendStr(0xae,10,str2,6);}}if((chr!=0xff)&&(chr==10)&&(i>=1)){LCD_Write_Com(0x10);i=i-1;}if((chr!=0xff)&&(chr<=9)){ if(i<=6)LCD_Write_Char(i-1,1,dofly_code[chr]);if(i==6)LCD_Write_Com(0x0c);}if((chr!=0xff)&&(chr==11)){ if(g==0){if(i<6){LCD_Clear();//清屏LCD_Write_String(0,0,"erro!");LCD_Write_Com(0x0c);break;}if(i==6){ i=0;LCD_Clear();//清屏LCD_Write_Com(0x0f); //开光标LCD_Write_String(0,0,"again!");k=1;g=1;goto loop3;}}if(g==1){if(i<6){bj=1;}if(bj==1)break;str2[6]=IRcvStr(0xae,10,str2,6);for(j=0;j<6;j++){if(str0[j]!=str2[j]){bj=1;break;}elsebj=0;}if(bj==0){i=0;for(j=0;j<6;j++){str1[j]=str2[j];}// str1[6]=IRcvStr(0xae,10,str2,6);ISendStr(0xae,0,str1,6);LCD_Clear();//清屏LCD_Write_String(0,0,"ok!!!");LCD_Write_Com(0x0c);for(j=0;j<10;j++){DelayMs(225);}goto loop2;}if(bj!=0){bj=0;i=0;LCD_Clear();//清屏LCD_Write_String(0,0," err!");LCD_Write_Com(0x0c);for(j=0;j<10;j++){DelayMs(225);}goto loop2;}}}}loop2: i=0;k=0;g=0;}void gshi(uchar chr){//chr=keypor();switch(chr){case0:time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4 ]=0;Ds1302_Write_Time();break; //正常时间小时加1case1:time_buf1[4]--;if(time_buf1[4]==255)time_buf1[4 ]=23;Ds1302_Write_Time();break; //正常时间小时减1case2:time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5 ]=0;Ds1302_Write_Time();break;//分加1case3:time_buf1[5]--;if(time_buf1[5]==255)time_buf1[5 ]=59;Ds1302_Write_Time();break; //分减1case4:time_buf1[7]++;if(time_buf1[7]==8)time_buf1[7] =1;Ds1302_Write_Time();break;//周加1case5:time_buf1[7]--;if(time_buf1[7]==0)time_buf1[7]= 7;Ds1302_Write_Time();break; //周减1default:break;}}void xuanze(){loop1: LCD_Clear();//清屏LCD_Write_String(0,0,"chose enter, out");LCD_Write_String(0,1," or time !!!");while(1){ jin=0;chu=0;chr=keypor();if(chr!=0xff){if(chr==12){ jin=1;if(t==0){mima();}else{LCD_Clear();//清屏LCD_Write_String(0,0,"late!");}}if(chr==13){ chu=1;if(t==0)mima();else{LCD_Clear();//清屏LCD_Write_String(0,0,"late!");}}if(chr==15){time();}if(chr==11){LCD_Clear();//清屏LCD_Write_String(0,0,"enter number:");write_smf(14,enter);LCD_Write_String(0,1,"out number:");write_smf(0x40+12,out);}if(chr==14)goto loop1;}}}void main(){dula=0;wela=0;Init_Timer0();Ds1302_Init();LCD_Init();xuanze();}void mima(){BEEP=0;LCD_Init(); //1602初始化// ISendStr(0xae,0,str1,6); // 写入初始密码str1[6]=IRcvStr(0xae,0,str1,6);loop: LCD_Clear();//清屏LCD_Write_Com(0x0f); //开光标LCD_Write_String(0,0,"enter password!!");while(1){chr=keypor();if((chr!=0xff)&&(chr<=9)){ if(i<6){str0[i]=chr;i++;}if(i==6){LCD_Write_Com(0x0c);ISendStr(0xae,6,str0,6);}}if((chr!=0xff)&&(chr==10)&&(i>=1)){LCD_Write_Com(0x10);i=i-1;}if((chr!=0xff)&&(chr<=9)){ if(i<=6)LCD_Write_Char(i-1,1,dofly_code[chr]);if(i==6)LCD_Write_Com(0x0c);}if((chr!=0xff)&&(chr==11)) {if(i<6){bj=1;}if(bj==1)break;str0[6]=IRcvStr(0xae,6,str0,6);str1[6]=IRcvStr(0xae,0,str1,6);for(j=0;j<6;j++){if(str0[j]!=str1[j]){bj=1;break;}elsebj=0;}if(bj==0){i=0;bjc=0;LCD_Clear();//清屏LCD_Write_String(0,0,"open!");LCD_Write_Com(0x0c);if(jin==1)enter++;else if(chu==1)out++;L1=0;L2=0;for(j=0;j<1000;j++){chr=keypor();if(chr!=0xff){if(chr==15){gaimi();L1=1;L2=1;goto loop;}else{if(chr==11){L1=1;L2=1;goto loop;}}}}}if(bj!=0){bjc++;if(bjc!=3){bj=0;i=0;LCD_Clear();//清屏LCD_Write_String(0,0,"password err!");LCD_Write_Com(0x0c);bjdisplay();goto loop;}else if(bjc==3)i=0;LCD_Clear();//清屏LCD_Write_String(0,0,"Keypad locked!");LCD_Write_Com(0x0c);baojing();baojingyin();for(j=0;j<100;j++){DelayMs(225);}}}}if((chr!=0xff)&&(chr==14))break;}LCD_Write_Com(0x0c);}void time(){uchar c=0xFF;LCD_Clear();//清屏LCD_Write_Com(0x0c);//Ds1302_Read_Time(); //首次读取时间// if((time_buf1[2]+time_buf1[7])==0) //如果所有参数都为0,写入一个初始值// Ds1302_Write_Time();while(1){c=0xFF;if(ReadTimeFlag==1){ReadTimeFlag=0;Ds1302_Read_Time();disply();spand();for(j=0;j<10;j++){c=keypor();if((c!=0xff)&&(c==14))g=1;if(g==1)break;if(c!=0xFF)break;}gshi(c);if(g==1)break;}}}void spand(){if((time_buf1[7]==6)&&(time_buf1[4]==24))t=1;if((time_buf1[7]==7)&&(time_buf1[4]==5))t=0;if((time_buf1[7]!=6)&&(time_buf1[4]==23))t=1;if((time_buf1[7]!=6)&&(time_buf1[4]==6))t=0;}void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 1{static unsigned int num;TH0=(65536-2000)/256; //重新赋值2ms TL0=(65536-2000)%256;num++;if(num==50) //大致100ms{num=0;g=0;ReadTimeFlag=1; //读标志位置1}}。