班级:______________________ 姓名:_______________学号_____________
智能门禁控制器设计
一、设计任务:
智能门禁控制器设计
二、设计要求:
1.以89C5X系列单片机为核心器件,设计一个智能门禁控制器。
2. 门控器密码由键盘输入,用四个数码管显示提示信息。
3. 密码输入错误提示(可用发光二极管指示),密码错误超过3次则通过蜂鸣器发出报警声,
4. 密码输入正确,则通过发光二极管指示开锁信号,并驱动步进电机正转10圈开门,10秒后步进电机反转10圈关门。
5.其它创新设计。
三、评分标准:
智能门禁控制器设计
目录
1.系统方案选择和论证;
1.1设计要求;
1.2系统总体方案;
1.2.1系统各模块方案选择和论证;
1.2.2系统各模块的最终方案;
2. 系统硬件电路设计;
3.软件系统程序设计流程图;
4. 源程序代码;
5.调试结果分析及使用操作说明;
6. 总结;
智能门禁控制器设计
1.
系统方案选择和论证
按照系统的设计功能要求,本项目是智能门禁控制器设计
采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来用键盘输入数码管显示实现密码锁控制电机的工作
确定设计系统由单片机主控模块、蜂鸣器报警模块、电子密码锁模块、数码管显示模块、步进电机驱动控制模块、键盘控制模块共5个部分组成,电路系统框图如图1所示。
1)方案选择
智能门禁功能的实现有三种方案:
(1)方案一 此方案是传统的一位式模拟控制方案,选用模拟电路,用软件实现,直接用单片机的蜂鸣器实现报警控制,用独立键盘设置密码控制,反馈密码输入情况进行比较后进行判断秘密正确与否,从通过驱动电路控制步进电机工作。系统受环境影响大,不能实现复杂的控制算法,不能用数码显示,不能用键盘设定。
(2)方案二 此方案是以89C52为控制核心的单片机控制系统控制方案,其基本思想与方案一相同,但本方案使用的是矩阵键盘设置密码控制,用数码管显示密码输入和比较结果情况,用发光二极管的闪烁配合蜂鸣器报警所以密码控制方便,密码输入和比较结果显而易见便于操作。
1)比较两种方法:方案一而模拟控制系统难以实现复杂控制规律,控制方案的修改也较麻烦。而且虽然用软件可以实现门禁控制,但密码设置是用独立式键盘设置的密码个数过少安全系数少,键数少设置和操作控制都不便而且没有数码管显示看不到密码输入和比较情况。而方案二是采用以89C52为控制核心的单
片机控制系统,尤其对密码锁控制,它可达到模拟控制所达不到的控制效果,并且可实现显示、矩阵键盘设定、报警等多种功能,又易于扩展,大大提高了系统的智能化,也使得系统所测结果精度大大提高。故选择方案二。
2)显示方案选择:
密码输入和比较情况的显示可以用数码管,虽然数码管的只能显示的数字,电路较复杂,占用的资源多等缺点,但考虑到液晶显示成本较高,而且本次设计的数字显示有限显示要求不是高,所以还是选用数码管。
1.1设计要求
1.以89C5X系列单片机为核心器件,设计一个智能门禁控制器。
2. 门控器密码由键盘输入,用四个数码管显示提示信息。
3. 密码输入错误提示(可用发光二极管指示),密码错误超过3次则通过蜂鸣器发出报警声,
4. 密码输入正确,则通过发光二极管指示开锁信号,并驱动步进电机正转10圈开门,10秒后步进电机反转10圈关门。
5.其它创新设计。
1.2系统总体方案
1.2.1系统各模块方案选择和论证
(1)主控制器模块
使用89C51单片机控制。
(2)报警模块
方案一:只用蜂鸣器报警
方案二:用89C52RC单片机控制耦合电容来控制发光二极管的亮灭来配合蜂鸣器报警。
用89C52RC单片机控制耦合电容来控制发光二极管的亮灭来配合蜂鸣器报警,比只用蜂鸣器报警显而易见且更美观,所以选方案二。
(3)显示模块
方案一:液晶显示器显示
方案二:数码管显示
由于密码输入和比较情况的显示可以用数码管,虽然数码管的只能显示的数字,电路较复杂,占用的资源多等缺点,但考虑到液晶显示成本较高,而且本次设计的数字显示有限显示要求不是高,所以还是选用数码管。
(4)键盘输入模块
方案一:独立键盘
方案二:矩阵键盘
由于使用矩阵键盘才能有足够的键来设置密码,且密码较安全,操作起来方便,所以选用矩阵键盘。
(5)密码锁模块
本次设计电子密码锁模块必须用到。
(6)步进电机驱动电路模块:
方案一:直流电机
方案二:步进电机
直流电机不能像步进电机那样精确到控制其转动的每个角度,且本次设计对电机的转速要求不高,所以选用步进电机来实现门禁。
1.2.2系统各模块的最终方案
(1)控制器模块
(2)报警模块
(3)显示模块
(4)键盘输入模块
(5)密码锁模块
(6)步进电机驱动控制模块
2. 系统硬件电路设计
根据方案的选择系统由89C52单片机、蜂鸣器和发光二极管报警电路、数码管显示电路、键盘设置密码电路和步进电机驱动控制电路组成。其电路图如下所示:
主控制电路(1)矩阵键盘控制模块
(2步进电机驱动电路模块
3软件系统程序设计流程图;
下面为程序的主要流程图
电子密码锁程序步进电机驱动程序
4. 程序源代码:
#include
#define uchar unsigned char
#define uint unsigned int
uchar mima[4];//密码设定初值
uchar shuru[4];//密码输入存储区
uchar count;//数码管位数计数标志
uchar ss,miao,yy,fen;
uchar queren=0;//确认健标志
uchar step_count=0 ;
uchar quan=0;
sbit baojing=P1^0;
bit xianshi;//数码管显示标志
sbit flag=P1^1;//密码显示正确标志
void delayms(uint j); //声明延时函数
uchar getkey(void); //声明扫描函数
void keydisp(uchar k); //声明显示函数
void disp(); //声明显示子程序
void pwcmp();//密码比较程序
void bujin();
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xbf};
//共阳数码管显示代码
uchar code zheng[4]={0x9f,0x6f,0x5f,0xaf};//正转
uchar code fan[4]={0xaf,0x6f,0x5f,0x9f};//反转
//********************************************************************* void main(void) //主程序
{ uchar key;
P2 = 0xff; // 关闭数码管显示
TMOD=0x11; // T0,T1工作方式1
TH0 =0x3c;/* 50ms 定时设置 **************/
TL0 =0xb0;
TH1 =0x3c;/* 50ms 定时设置 */
TL1 =0xb0;
/* 启动计数器0,关闭计数器1 */
TR0 = 0; //关闭定时器
ET0 = 1; //定时器0计数允许
TR1 = 0; //关定时器1
ET1 = 1;
EA = 1; //开所有中断
baojing=1;
mima[0]=1; //初始密码设定
mima[1]=2;
mima[2]=3;
mima[3]=4;
P0=0XBF; //数码管显示初始值----
P2=0X00; //四位数码管全亮;
while(1) //主程序循环
{ key=getkey();
delayms(2);
keydisp(key);
disp();
}
//****************************************************
void delayms(uint j) //延时子程序
{uint n,m;
for(n=0;n {for(m=0;m<125;m++) //延时时间为1ms {;} } } //************************************************************************ uchar getkey(void) //扫描取键值程序 {uchar rcode,ccode; P3=0xf0; if((P3&0xf0)!=0xf0) { delayms(20); //为消除抖动,延时20ms if((P3&0xf0)!=0xf0) {P1_0=0; //按键音 rcode=0xfe; //开始发行扫描信号 while((rcode&0x10)!=0) {P3=rcode; if((P3&0xf0)!=0xf0) {ccode=(P3&0xf0)|0x0f; do{;}while((P3&0xf0)!=0xf0); //当松键后显示 P1_0=1; return((~rcode)+(~ccode)); //返回扫描代 } else rcode=(rcode<<1)|0x01; //此行无键按下,变化行扫描信号 } } } return 0; //无键按下,返回0 } // *******************按键处理与显示程序***********************************/ void keydisp(uchar k) { switch(k) { case 0x11: //第一行第一列显示0 if(count<4) {shuru[count]=0; count++; disp(); } break; case 0x21://第二列第一行显示1; if(count<4) { shuru[count]=1; count++; disp(); } break; case 0x41://第三列第一行显示2 if(count<4) { shuru[count]=2; count++ ; disp(); } break; case 0x81: //第四列第一行显示3 if(count<4) { shuru[count]=3; count++; disp(); } break; case 0x12: //第一列第二行显示4 if(count<4) { shuru[count]=4; count++; disp(); } break; case 0x22://第二列第二行显示5 if(count<4) { shuru[count]=5; count++; disp(); } break; case 0x42: //第三列第二行显示6 if(count<4) {shuru[count]=6; count++; disp(); } break; case 0x82: //第四列第二行显示7 if(count<4) { shuru[count]=7; disp(); count++; } break; case 0x14: //第一列第三行显示8 if(count<4) { shuru[count]=8; count++; disp(); } break; case 0x24: //第二列第三行显示9 if(count<4) { shuru[count]=9; disp(); count++; } break; case 0x44: //确认键 P1_2=0; queren++; if(count==4) pwcmp(); else queren=0; break; case 0x84: //清除键 P1_2=1; count--; shuru[count]=10; disp(); break; default:break; } } void disp(void) //显示子程序 { if(count==1) { P0=table[shuru[0]]; P2=0xef; //共阳极数码管的位选码 } else if(count==2)// 依次显示第二位,第一位 {P0=table[shuru[0]]; //之前按下的密码移动到第二位数码管显示 P2=0xdf; delayms(2); P2=0XFF; P0=table[shuru[1]] ;//新密码显示在数码管第一位 P2=0xef; delayms(2); P2=0XFF; } else if(count==3) {P0=table[shuru[0]] ;// 依次显示第三位,第二位,第一位 P2=0xbf; delayms(2); P2=0XFF; P0=table[shuru[1]] ; P2=0xdf; delayms(2); P2=0XFF; P0=table[shuru[2]]; P2=0xef; delayms(2); P2=0XFF; } else if(count==4) // 依次显示数码管第四位,第三位,第二位,第一位 {P0=table[shuru[0]] ; P2=0x7f; delayms(2); P2=0XFF; P0=table[shuru[1]] ; P2=0xbf; delayms(2); P2=0XFF; P0=table[shuru[2]]; P2=0xdf; delayms(2); P2=0XFF; P0=table[shuru[3]] ; P2=0xef; delayms(2); P2=0XFF; } } //**********************************定时中断*********************************** void time0_int(void) interrupt 1 //定时器0 { /* 重置50ms定时 */ TH0 = 0x3c; TL0 = 0xb0; yy++; if(yy==20) {yy=0; fen++; flag=0; bujin(); TR0=0; if(fen==10) { fen=0; flag=1; TR0=0; } } } void time1_int(void) interrupt 3 //定时器1 { //uchar k; /* 重置50ms定时 */ TH1 = 0x3c; TL1 = 0xb0; ss++; if(ss==20) { ss=0; // 计时到1s// baojing=~baojing;// 报警标志 miao++; if(miao==4) {miao=0; //秒归零 TR1=0; //关闭定时器1 queren=0;//确认次数归零 } } } /* **************************密码比较函数 ************************************/ void pwcmp(void) {if (mima[0]==shuru[0]&&mima[1]==shuru[1]&&mima[2]==shuru[2]&&mima[3]==shuru[3]) {//flag=0; TR0=1; //打开定时器0 // bujin(); //密码正确调用步进电机控制程序 } else { if(queren>=3)//密码错误超过三次 TR1=1;//打开定时器1 } } //***************************步进电机控制程序**********************************/ void bujin() {uchar i,j,c; for(c=0;c<10;c++) //10圈 { for(i=0;i<200;i++) //两百步1圈 {for(j=0;j<4;j++) //一步需要通电4次 { P1=zheng[j]; //圈数显示 P1_3=0; delayms(5); P0=table[c]; P2=0XEF; } } } delayms(10000); //延时10S for(c=9;c>0;c--) //反转10圈 { for(i=0;i<200;i++) {for(j=0;j<4;j++) { P1=fan[j];//圈数显示 P1_3=1; delayms(5); P0=table[c]; P2=0xef; } } } } 5.调试中遇到的问题及解决的办法(三号黑体) (你在调试的过程中遇到了什么实际的问题,比如程序代码由于格式不正确或者不理解指令的含义使用错误,或者调试过程中出现了问题,把问题写上,然后最后是怎样解决问题的,把详细过程写上。。。。。5号) 6.总结(三号黑体) 本课题设计使我学会了。。。。。。。(5号) (进行课题设计以后的感想,包括同学间相互协作的体会,遇到问题后解决的感想,所学到了什么样的知识或能力等等。)(5号)