智能门禁控制器设计.docx
《智能门禁控制器设计.docx》由会员分享,可在线阅读,更多相关《智能门禁控制器设计.docx(15页珍藏版)》请在冰豆网上搜索。
智能门禁控制器设计
智能门禁控制器设计报告
——课程项目
系部:
电子电气工程系
班级:
09电子信息工程技术
指导老师:
何乃味2011年3月18日
姓名学号:
黄健昌20090206036张德民20090206016
简日军20090206015林宗明20090206031
一、设计任务:
智能门禁控制器设计
二、设计要求:
1.以89C5X系列单片机为核心器件,设计一个智能门禁控制器。
2.门控器密码由键盘输入,用四个数码管显示提示信息。
3.密码输入错误提示(可用发光二极管指示),密码错误超过3次则通过蜂鸣器发出报警声。
4.密码输入正确,则通过发光二极管指示开锁信号,并驱动步进电机正转10圈开门,10秒后步进电机反转10圈关门。
智能门禁控制器设计电路设计方案
三、硬件电路
1、步进电机电路
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。
使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
2、按键电路(矩阵式键盘)
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
但矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些。
列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
3、按键与控制电路
4、数码显示电路
能在低电压、小电流条件下驱动发光,能与CMOS、ITL电路兼容;发光响应时间极短(<0.1µs),高频特性好,单色性好,亮度高;体积小,重量轻,抗冲击性能好;寿命长,使用寿命在10万小时以上,甚至可达100万小时。
成本低。
而且还易于检测。
5、声光报警电路用
利用单片机控制耦合电容来控制发光二极管的亮灭来配合蜂鸣器报警。
密码输入错误提示(配合发光二极管指示),密码错误超过3次则通过蜂鸣器发出报警声和光。
四、软件系统程序设计流程图
五、程序源代码:
//程序清单
//矩阵键盘扫描管理程序
//假设key_port口的高四位输出4个行选择信号,低四位用来获取4列按键状态。
#include
#defineucharunsignedchar
#defineuintunsignedint
#definekey_portP3
unsignedcharkeycode[16]={0,1,2,3,
4,5,6,7,
8,9,14,15,
10,11,12,13
};
UnsignedcharLED_code[15]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc60,0x8e,0x89};
unsignedcharcodezheng[4]=(0x09,0x05,0x06,0x0a);
unsignedcharcodefan[4]=(0x0a,0x06,0x05,0x09);
ucharcodeinit_password[4]={5,2,0,8};//内部初始密码
ucharpassword_buf[4]={0xff,0xff,0xff,0xff};//密码输入存放区
uchardisp_buf[4]={0xbf,0xbf,0xbf,0xbf};//显示缓冲区,初始显示“-”
ucharcodeerro[4]={0x86,0x8f,0x8f,0xc0};//错误提示ERRO
ucharcoderigh[4]={0x92,0xa4,0xc0,0x80};//正确提示RIGH
ucharcount=0;//密码输入位计数
ucharflag=0xff;//密码输入正确标志,为1正确,为0错误
ucharerror_count=0;//密码输入错误计数
//////////函数声明///////////
voiddisplay(uchar*p);
voidbeep_on_off(biton_off);
voidsubDelay(uintx);
voidpassword_compare();
voiddianzizhuanxiang();
/////////////蜂鸣器函数/////////////////////
voidbeep_on_off(biton_off)
{uchari;
if(on_off==1)
{P1_0=0;
for(i=0;i<2;i++)
{display(disp_buf);}//延时
//subDelay(1000);
P1_0=1;
}
else
P1_0=1;
}
/////////////////////延时函数//////////////////////////////
voidsubDelay(uintx)
{//延时函数
while(x--);
}
//////////////按键扫描函数//////////////////////
charsubMatrixScan()
{
unsignedcharlcKeyTemp,i;
unsignedcharlcRowSel=0xf7;//4个输出行分别输出0的选择码
key_port=0xF0;
lcKeyTemp=key_port;
//subDelay(200);//延时,消除抖动
for(i=0;i<8;i++)
{display(disp_buf);}//延时,消除抖动
if((key_port==0xF0)||(key_port!
=lcKeyTemp))
{
return(16);//无按键或未稳定,返回空键码,随后再来
}
beep_on_off
(1);//按键声音
for(i=0;i<4;++i)
{
key_port=lcRowSel|0xF0;//检查各行有无按键
switch(key_port&0xF0)
{//获取4列按键状态
case0xE0:
lcKeyTemp=0;break;//仅第1列有按键
case0xD0:
lcKeyTemp=1;break;//仅第2列有按键
case0xB0:
lcKeyTemp=2;break;//仅第3列有按键
case0x70:
lcKeyTemp=3;break;//仅第4列有按键
default:
lcKeyTemp=16;break;//无按键或多按键
}
if(lcKeyTemp!
=16)
{
lcKeyTemp+=i<<2;
break;
}
lcRowSel>>=1;//右移1位,选择下一行
}
for(i=0;i<8;i++)
{display(disp_buf);}//延时,消除抖动
return(lcKeyTemp);//返回按键状态
}
///////////显示函数///////////////////
voiddisplay(uchar*p)
{uchari,temp=0x7f;//0xef,0xdf,0xbf,0x7f
for(i=0;i<4;i++)
{P0=p[i];
P2=temp;
subDelay(250);
temp=temp>>1|temp<<7;
}
}
/////////更新显示缓冲区函数//////////
voiddisp_input(uchars)
{uchari;
for(i=0;i<4;i++)
disp_buf[i]=s;
}
//////////////输入密码函数//////////////////
voidenter_password()
{unsignedcharkey_val=0xff;uchari;
key_val=subMatrixScan();
key_val=keycode[key_val];
if(key_val<10)//数字键0-9按下
{if(count<4)
{password_buf[count]=key_val;
disp_buf[count]=0x92;//输出显示"A"
count++;
}
}
elseif(key_val==10)//确认键按下
{password_compare();}
elseif(key_val==11)//重新开始输入
{count=0;
for(i=0;i<4;i++)
password_buf[i]=0xff;
disp_input(0xbf);//输出显示“-”
}
elseif(key_val==12)//删除键按下
{if(count>0)
{count--;
password_buf[count]=0xff;
disp_buf[count]=0xbf;//输出显示“-”
}
}
}
/////////清除密码函数//////////////
voidclear_password()
{uchari;
for(i=0;i<4;i++)
password_buf[i]=0xff;
}
///////////////密码比较函数/////////////////////////
voidpassword_compare()
{
if(password_buf[0]==init_password[0]&&password_buf[1]==init_password[1]&&password_buf[2]==init_password[2]&&password_buf[3]==init_password[3])
flag=1;//密码正确
else
{flag=0;//密码错误
error_count++;
}
count=0;
clear_password();
}
////////////开门/关门函数//////////////////
voidopen_or_close()
{uinti;
if(flag==1)
{flag=0xff;
P1_1=0;
for(i=0;i<500;i++)
display(righ);//显示正确提示
P1_1=1;
disp_input(0xbf);//向显示缓冲区装入“-"
display(disp_buf);//输出显示“-"
}
elseif(flag==0)
{flag=0xff;
if(error_count==3)
{error_count=0;
P1_0=0;
for(i=0;i<500;i++)
display(erro);//显示错误提示
P1_0=1;
}
else
{for(i=0;i<300;i++)
display(erro);//显示错误提示
}
disp_input(0xbf);//向显示缓冲区装入“-"
display(disp_buf);//输出显示“-"
}
}
voiddianzizhuanxiang()
{uinti;
for(i=0;i<4;i++)
{P1=zheng[i];
subDelay(2000);
}
{for(i=0;i<4;i++)
{P1=fan[i];
subDelay(2000);}
}
}
voidmain()
{key_port=0xff;
while
(1)
{enter_password();
display(disp_buf);
open_or_close();
dianzizhuanxiang();
}
}
六、产品操作说明
按键0-9为密码输放
16号键为确认键,15号键为删除键
密码为:
2244
七、调试中遇到的问题及解决的办法
(1)键盘扫描错误,后发现是按键做板不对,重做板改正就行了。
(2)步进机无法转动,经过调试,发现是频率过快。
八、总结
通过做本项目,增加了组员们对C语言的理解与运用,并掌握了按键的运用,灵活的运用了LED来显示我们要达到的效果。
通过讨论交流,也大大的提高了组员们的相互合作水平。
5.调试中遇到的问题及解决的办法(三号黑体)
(你在调试的过程中遇到了什么实际的问题,比如程序代码由于格式不正确或者不理解指令的含义使用错误,或者调试过程中出现了问题,把问题写上,然后最后是怎样解决问题的,把详细过程写上。
。
。
。
。
5号)
6.总结(三号黑体)
本课题设计使我学会了。
。
。
。
。
。
。
(5号)
(进行课题设计以后的感想,包括同学间相互协作的体会,遇到问题后解决的感想,所学到了什么样的知识或能力等等。
)(5号)
三、评分标准:
评分项目
评分指标
满分
评分
项目设计态度
积极查找资料,上课专心听讲,不抄袭、复制他人的程序及报告,按时完成老师布置的任务
10
设计与总结报告
正确画出项目设计硬件电路图
10
正确画出软件系统程序设计流程图
10
调试结果分析及使用操作说明
10
具体功能实现
能完成矩阵式键盘和数码管显示程序设计
10
能完成步进电机驱动电路和驱动程序设计
10
能完成密码比较程序设计
10
完成整个项目程序联调。
10
答辩评分
自述部分
10
回答部分
10