初C 宋泽威.docx
- 文档编号:17872882
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:23
- 大小:373.73KB
初C 宋泽威.docx
《初C 宋泽威.docx》由会员分享,可在线阅读,更多相关《初C 宋泽威.docx(23页珍藏版)》请在冰点文库上搜索。
初C宋泽威
自动化科学与工程学院自动化专业08(4)班宋泽威江伟森
密码门禁系统
第1章系统设计
1.1设计任务与要求
1.1.1设计任务
设计一个密码门禁系统。
对人流量进行统计,并用密码形式限制使用人员
1.1.2设计要求
1.基本要求:
1)要求使用者在入口处通过键盘输入密码,当密码正确时,允许通过;
2)当密码正确允许人员通过时,开始计时;当超过设定时间,门禁自动再次关闭,禁止通行,需要重新输入密码;
3)能对一天内通过门禁的人数及时间进行统计并显示。
2.扩展要求:
1)使用非实体按键(如触摸屏和光感按键)进行输入;
2)当输入密码错误次数超过3次时,声光报警;
3)门禁自动关闭时间可修改;
4)其他创新。
1.2方案的选择与论证
1.2.1总体设计
AT89S52
语音模块
液晶显示模块
红外遥控模块
红外对管模块
触摸模块
电磁铁模块
1.2.2方案的比较与论证
1.2.2.1控制芯片的部分
方案一:
使用AT89C51,可以实现中断,自带RAM,但是处理速度慢,不稳定,随机存储器只有4K,可能不够用
方案二:
使用AT89S52,包含了方案一的芯片的所有功能,而且处理速度快,工作稳定,随即存储器有8K
综合上述分析,选用芯片AT89S52(方案二)
VCC:
AT89S51电源正端输入,接+5V。
VSS:
电源地端。
XTAL1:
单芯片系统时钟的反相放大器输入端。
XTAL2:
系统时钟的反相放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一20PF的小电容,可以使系统更稳定,避免噪声干扰而死机。
RESET:
AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
EA/Vpp:
"EA"为英文"ExternalAccess"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。
因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。
如果是使用8751内部程序空间时,此引脚要接成高电平。
此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。
ALE/PROG:
ALE是英文"AddressLatchEnable"的缩写,表示地址锁存器启用信号。
AT89S51可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为AT89S51是以多工的方式送出地址及数据。
平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。
此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。
PSEN:
此为"ProgramStoreEnable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。
AT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。
PORT0(P0.0~P0.7):
端口0是一个8位宽的开路汲极(OpenDrain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。
其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。
如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。
设计者必须外加一锁存器将端口0送出的地址栓锁住成为A0~A7,再配合端口2所送出的A8~A15合成一完整的16位地址总线,而定址到64K的外部存储器空间。
PORT2(P2.0~P2.7):
端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。
P2除了当做一般I/O端口使用外,若是在AT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。
PORT1(P1.0~P1.7):
端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LSTTL负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。
如果是使用8052或是8032的话,P1.0又当做定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发脚位。
PORT3(P3.0~P3.7):
端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。
其引脚分配如下:
P3.0:
RXD,串行通信输入。
P3.1:
TXD,串行通信输出。
P3.2:
INT0,外部中断0输入。
P3.3:
INT1,外部中断1输入。
P3.4:
T0,计时计数器0输入。
P3.5:
T1,计时计数器1输入。
P3.6:
WR:
外部数据存储器的写入信号。
P3.7:
RD,外部数据存储器的读取信号。
1.2.2.1语音模块
方案一:
使用单通道的直接对讲模式,可以实现外部与内部的通话,但不能实时通话
方案二:
使用双通道的对讲模式,实现外部与内部的实时通话
综合上述分析:
选用方案二
1.2.2.3液晶显示部分
采用12864LCD,由单片机的总线模式连接。
为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;在其它我们需要看显示的内容的时候LCD背光亮。
1.2.2.4红外对管模块
采用1602LCD,由单片机的总线模式连接。
为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;在其它我们需要看显示的内容的时候LCD背光亮。
1.2.2.5触摸模块
ADS7843是一个内置12位模数转换、低导通电阻模拟开关的串行接口芯片。
供电电压2.7~5V,参考电压VREF为1V~+VCC,转换电压的输入范围为0~VREF,最高转换速率为125kHz。
1.2.2.6电磁铁模块
自制电磁铁,通电则有磁力,把门锁打开,断电则没磁力,把门锁锁上.
1.2.2.7红外遥控
家中许多的电器产品都有遥控的功能,例如电视机、录像机、VCD、空调等家电产品,它们都是以红外遥控的方式进行遥控。
(一)、红外遥控系统
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
(二)、遥控发射器及其编码
遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射。
遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。
UPD6121G最多额128种不同组合的编码,如图3所示。
遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。
一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,图4为发射波形图。
(三)、红外接收模块
左图为一常用的红外接收模块。
其内部含有高频的滤波电路,专门用来滤除红外线合成信号的载波信号(38KH),并送出接收到的信号。
当红外线合成信号进入红外接收模块,在其输出端便可以得到原先发射器发出的数字编码,只要经过单片机解码程序进行解码,便可以得知按下了哪一个按键,而做出相应的控制处理,完成红外遥控的动作。
红外接收模块
(四)、红外解码程序设计
红外解码程序主要工作为等待红外线信号出现,并跳过引导信号,开始收集连续32位的表面数据,存入内存的连续空间。
位信号解码的原则是:
以判断各个位的波宽信号来决定高低信号。
位解码原理如下:
●解码为0:
低电平的宽度0.56ms+高电平的宽度0.56ms。
●解码为1:
低电平的宽度1.68ms+高电平的宽度0.56ms。
程序中必须设计一精确的0.1ms延时时间作为基础时间,以计数实际的波形宽度,若读值为5表示波形宽度为0.5ms,若读值为16表示波形宽度为1.6ms,以此类推。
高电平的宽度1.12ms为固定,因此可以直接判断低电平的宽度的计数值5或时16,来确定编码为0或是1。
程序中可以减法指令SUBB来完成判断,指令“SUBBA,R2”中若R2为计数值,A寄存器设为8,就可如下:
●当“8-R2”有产生借位,借位标志C=1,表示编码为1。
●当“8-R2”无产生借位,借位标志C=0,表示编码为0。
将借位标志C经过右移指令“RRCA”转入A寄存器中,再经由R0寄存器间接寻址存入内存中。
详细解码程序请参看“红外遥控爬虫机器人ASM程序”中的“红外解码子程序”。
第2章系统的硬件电路设计
2.1系统模块
2.2红外对管电路
2.3语音模块电路图
2.4语音芯片电路图
2.5
第三章系统的软件设计
3.1程序方块图:
3.1.1密码输入
3,1,2修改密码
3.2部分程序代码
3.2.1ROM24c08芯片程序
#defineuintunsignedint
#defineucharunsignedchar
sbitscl=P2^5;//24c08SCL
sbitsda=P2^6;//24c08SDA
externucharpass[6];
externucharpeo[6];
voiddelay(ucharx)
{
for(;x>0;x--);
}
voidflash()
{;;}
voidx24c08_init()//24c08初始化子程序
{
scl=1;
flash();
sda=1;
flash();
}
voidstart()//启动(I2C)总线
{
sda=1;
flash();
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
voidstop()//启动(I2C)总线
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
voidwritex(ucharj)//写一个字节程序
{
uchari,temp;
temp=j;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
flash();
sda=CY;
flash();
scl=1;
flash();
}
scl=0;
flash();
sda=1;
flash();
}
ucharreadx()//读一个字节程序
{
uchari,j,k=0;
scl=0;
flash();
sda=1;
for(i=0;i<8;i++)
{
flash();
scl=1;
flash();
if(sda==1)j=1;
elsej=0;
k=(k<<1)|j;
scl=0;
}
flash();
return(k);
}
voidclock()//(I2C)线时钟
{
uchari=0;
scl=1;
flash();
while((sda==1)&&(i<255))i++;
scl=0;
flash();
}
ucharx24c08_read(ucharaddress)//从24c02的地址address中读取一个字节数据
{
uchari;
start();
writex(0xa0);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i=readx();
stop();
delay(10);
return(i);
}
voidx24c08_write(ucharaddress,ucharinfo)//向24c02的address地址中写入一字节数据info
{
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
delay(50);
}
voidwrite_6bit(ucharaddress,uchar*a)//向24c02的address与其后5个地址写入6位数组a[6]
{
uchari;
for(i=0;i<6;i++)
{
x24c08_write(address,*(a+i));
address++;
delay(100);
}
}
voidread_peo()//读出人数
{
uinti;
for(i=0;i<6;i++)
{
peo[i]=x24c08_read(i+7);
}
}
voidread_pass()
{
uchari;
for(i=1;i<7;i++)
{
pass[i-1]=x24c08_read(i);
delay(100);
}
}
/*
voidmain()
{
函数使用范例:
uchar*pass;//储存密码
uchar*peo;//储存人数(数组)
write_6bit(1,peo);//向24c02写入密码
write_6bit(7,peo);//向24c02写入人数
pass=read_6bit
(1);//读出密码
}*/
3.2.2液晶12864模块
#include"24c08.h"
#defineuintunsignedint
#defineucharunsignedchar
#definecomm0
#definedat1
sbitLCM_CS=P0^2;//片选
sbitLCM_SID=P0^1;//数据
sbitLCM_SCK=P0^0;//时钟
externucharpeo[6];
ucharcodetab1[]={"Welcome!
"};
ucharcodetab2[]={"123G"};
ucharcodetab3[]={"456A"};
ucharcodetab4[]={"789M"};
ucharcodetab5[]={"S0CB"};
voidSend_Byte(ucharlcd_byte)
{
uchari;
LCM_SCK=0;
for(i=0;i<8;i++)
{
lcd_byte<<=1;//左移一位
LCM_SID=CY;//移出的位给SID
LCM_SCK=1;
LCM_SCK=0;
}
}
voidwr_lcd(bitcmd_data,ucharlcd_data)
{
uchartemp;
EA=0;//禁用所有中断
LCM_CS=0;
LCM_SID=0;
LCM_SCK=0;
LCM_CS=1;
//11111RWRS0
//RW为0,选择写;RS为1,选择数据;RS为0,选择指令
if(cmd_data==1)
Send_Byte(0xfa);//发送数据
else
Send_Byte(0xf8);//发送指令
temp=lcd_data&0xf0;
Send_Byte(temp);//传输高四位
temp=(lcd_data<<4)&0xf0;
Send_Byte(temp);//传输低四位
LCM_CS=0;
LCM_SID=0;
LCM_SCK=0;
EA=1;//恢复中断
}
voidlcd_position(ucharx,uchary)
{
ucharpos;
switch(y)
{
case0:
y=0x80;break;
case1:
y=0x90;break;
case2:
y=0x88;break;
case3:
y=0x98;break;
default:
break;
}
pos=y+x;
wr_lcd(comm,pos);
}
voidlcd_write_1(ucharx,uchary,uchar*a)
{
lcd_position(x,y);
while(*a!
='\0')
{
wr_lcd(dat,*a);
a++;
}
}
voidlcd_write_num()
{
uchari,lab=0;
lcd_position(1,3);
for(i=0;i<6;i++)
{
if(peo[i]!
=0)
{lab=1;wr_lcd(dat,peo[i]+0x30);}
if(lab&&(peo[i]==0))
wr_lcd(dat,peo[i]+0x30);
}
}
voidlcd_write_pass(uchar*a)
{
uchari;
lcd_position(0,1);
for(i=0;i<6;i++)
wr_lcd(dat,*(a++)+0x30);
}
voidlcd_write_key()//显示键盘
{
lcd_write_1(4,0,tab2);
lcd_write_1(4,1,tab3);
lcd_write_1(4,2,tab4);
lcd_write_1(4,3,tab5);
}
voidinit_lcd()//初始化液晶,入口为储存人数的数组
{
wr_lcd(comm,0x30);/*30---基本指令动作*/
wr_lcd(comm,0x01);/*清屏,地址指针指向00H*/
wr_lcd(comm,0x06);/*光标的移动方向*/
wr_lcd(comm,0x0c);/*开显示,关游标*/
lcd_write_1(0,0,tab1);//欢迎
lcd_write_key();//显示键盘
lcd_position(0,3);//定位写人数的位置
wr_lcd(dat,0x4e);//写N
wr_lcd(dat,0x3a);//写:
//peo[5]=1;//此两行用于初始化人数至1
//write_6bit(7,peo);//向24c02写入人数,此两行用于初始化人数至1
read_peo();
lcd_write_num();//写人数
wr_lcd(comm,0x90);//定位密码输入位置
wr_lcd(comm,0x0f);//显游标
}
/*程序示例
init_lcd();//初始化液晶屏,并写入人数
lcd_write_num();//用于刷新人数
lcd_write_pass(temp_pass);//刷新所输入的密码
*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 初C 宋泽威