图书馆出入人员计数器设计技术报告.docx
《图书馆出入人员计数器设计技术报告.docx》由会员分享,可在线阅读,更多相关《图书馆出入人员计数器设计技术报告.docx(15页珍藏版)》请在冰豆网上搜索。
图书馆出入人员计数器设计技术报告
图书馆出入人员计数器设计技术报告
院系名称:
电子通信与物理学院
专业名称:
电子与通信工程
队员姓名:
队员1:
卢兴
队员2:
队员3:
完成日期2016年05月16日
图书馆出入人员计数器设计技术报告
1设计目的
图书馆出入人员数是图书馆管理不可缺少的数据,通过它可以获得图书馆的运行状况。
红外传输技术是广范应用的短距离传输技术,利用它的反射原理便可以对图书馆的出入人员进行统计。
因此为了精确的统计图书馆的出入人员,我们设计了一个基于红外传输技术的图书馆出入人员计数器
2设计要求
1)任何一红外对管能够检测到有人走过,并将计数显示出来;
2)当障碍物依次从红外发射管1到2走过的时候,人员数加1;
3)当障碍物依次从红外发射管2到1走过的时候,人员数减1;
4)要求分别统计和显示进去的人员人次、出来的人员人次、里面逗留的人员人数;
5)当逗留人员超限时报警(如100人)。
6)充分发挥两对红外对管的功能,实现当人员走到一半再返回,则计数不变功能;
7)为保证系统稳定性,连续两次及以上只经过红外对管1或2时,不计数。
待再次从第1、2对红外管经过时,正常计数。
3设计内容
本文设计一种基于stc89c52单片机的红外线图书馆出入人员计数器,利用2组红外发射接收对管对进入图书馆的出入人员进行计数,然后把计数值送入单片机进行分析,计算出进入、出去以及逗留人数信息,并将相关数据送到显示器显示。
以达到实时统计进入图书馆的总人数的作用。
并且能够在图书馆逗留人数超过一定数目时进行报警。
4设计方案
该人流量统计器包含以下结构:
单片机数据处理系统,红外线传感模块,LCD1602显示器和报警装置组成。
4.1系统框图
4.2硬件设计
系统硬件电路图:
4.3红外线发射和接收原理
红外线传输是以红外光作为传输媒体来传输信号的,使用的红外发光二极管和红外接受管是只有一个PN结的半导体器件,它与普通发光二极管(如:
红、绿、黄发光二极管)结构原理与制作工艺基本相同,只是所用的材料不同。
制造红外线发光二极管材料有砷化镓、砷铝化镓等,其中应用最多的是砷化镓。
红外对管中,发射管用于发射一定波长的红外线,肉眼不可见。
接收管是一个光敏二极管,无光照时饱和反向漏电流很小,当有光照时,饱和反向漏电流增加,在一定的范围内它随入射光强度的变化而变化,当发射管和接收管平行安放时,当有障碍物放置在两管前面时,发射管发射的红外线经障碍物反射后就能够被接收管所接收,进而可以判断出有障碍物。
4.4单片机系统
单片机最小系统是此设计的核心部件,红外传感器所产生的外部脉冲经单片机外部中断进行计数,并且通过对单片机的内部编译,使计数通过LCD显示出来,。
一个典型的单片机最小系统一般由时钟电路、复位电路、片外RAM、片外ROM、等组成。
对于这次设计的单片机最小系统基本电路见系统硬件电路图。
4.5显示电路的设计
在本文设计的显示单元中使用了1602液晶,也叫1602字符型液晶。
它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5×7或者5×11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
因为其微功耗、体积小、显示内容丰富、超薄轻巧的特点,常用在袖珍式仪表和低功耗应用系统中。
一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。
如图1所示LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。
图1LCD1602正面图
它的背面如图2所示:
图2LCD1602背面图
它的16条引脚定义如下:
表1LCD1602引脚定义
引脚号
符号
引脚说明
引脚号
符号
引脚说明
1
VSS
电源地
9
D2
数据端口
2
VDD
电源正极
10
D3
数据端口
3
VO
偏压信号
11
D4
数据端口
4
RS
命令/数据
12
D5
数据端口
5
RW
读/写
13
D6
数据端口
6
E
使能
14
D7
数据端口
7
D0
数据端口
15
A
背光正极
8
D1
数据端口
16
K
背光负极
对这个表的说明:
1. VSS接电源地。
2. VDD接+5V。
3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。
或同样阻值的RM065/RM063蓝白可调电阻。
见图3。
图3液晶显示的偏压信号
4. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。
5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。
如果不需要进行读取操作,可以直接将其接VSS。
6. E,执行命令的使能引脚,接单片机的一个I/O。
7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。
如果接P0口,P0口应该接4.7K—10K的上拉电阻。
如果是4线并行驱动,只须接4个I/O口。
8. A背光正极,可接一个10—47欧的限流电阻到VDD。
9. K背光负极,接VSS。
见图4所示。
图4LCD1602接线图
4.6报警装置
报警装置我们采用红灯亮作为图书馆逗留人数过多的报警。
5程序设计
程序设计流程如下:
1)启动系统
2)判断红外对管是否有人经过
3)红外对管1有人经过奇数次则进行标记
4)红外对管2有人经过奇数次则进行标记
5)两个红外对管都有标记,则判断标记的先后
6)红外对管1先标记则进入和逗留人数加一
7)否则出去人数加一,逗留人数减一
8)显示进入、出去和逗留人数
9)判断逗留人数是否超限,启动报警装置否则停止报警
10)清除标记继续监测
程序见附录。
6总结:
我们设计的图书馆出入人员计数器实现了基本要求和发挥部分具体功能如下:
1)当人员依次从红外发射管1到2走过的时候,人员数加1;
2)当人员依次从红外发射管2到1走过的时候,人员数减1;
3)用LCD1602作为显示器,in表示进入人数,out表示出来人数;stay表示逗留人数;
4)当逗留人员超限时报警(10人),红灯亮。
5)当人员走到一半再返回,则计数不变功能;
6)连续两次及以上只经过红外对管1或2时,不计数。
待再次从第1、2对红外管经过时,正常计数。
7附录
程序如下:
/*---------------------------------------------------------------*/
/*---图书馆出入人员计数器程序------------------------------------*/
/*---功能:
LCD1602显示进出以及停留人数-----------------------------*/
/*------------------------------------------------------------------*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodedisp1[]="In:
0Out:
0";
ucharcodedisp2[]="Stay:
0";
ucharcodedisp3[]="Welcometo";
ucharcodedisp4[]="thelibrary";
intLedNumVal_1=0;//中断1计数
intLedNumVal_2=0;//中断2计数
sbitRS=P2^6;
sbitRW=P2^5;
sbitCS=P2^7;
#defineLCDDATAP0//数据传输端口
#definelightP1//报警控制端口低电平有效
//功能:
延时1毫秒
voidDelay_xms(uintx)
{
uinti,j;
for(i=0;ifor(j=0;j<122;j++);
}
//功能:
12us延时
voidDelay_xus(uintt)
{
for(;t>0;t--)
{
_nop_();
}
}
//控制LCD写时序
voidLCD_en_write(void)
{
CS=1;//EN端产生一个高电平脉冲,控制LCD写时序
Delay_xus(20);
CS=0;
Delay_xus(20);
}
//写指令函数
voidWrite_Instruction(ucharcommand)
{
RS=0;
RW=0;
CS=1;
LCDDATA=command;
LCD_en_write();//写入指令数据
}
//写数据函数
voidWrite_Data(ucharWdata)
{
RS=1;
RW=0;
CS=1;
LCDDATA=Wdata;
LCD_en_write();//写入数据
}
//字符显示初始地址设置
voidLCD_SET_XY(ucharX,ucharY)
{
ucharaddress;
if(Y==0)
address=0x80+X;//Y=0,表示在第一行显示,地址基数为0x80
else
address=0xc0+X;//Y非0时,表时在第二行显示,地址基数为0xC0
Write_Instruction(address);//写指令,设置显示初始地址
}
//在第X行Y列开始显示,指针*S所指向的字符串
voidLCD_write_str(ucharX,ucharY,uchar*s)
{
LCD_SET_XY(X,Y);//设置初始字符显示地址
while(*s)//逐次写入显示字符,直到最后一个字符"/0"
{
Write_Data(*s);//写入当前字符并显示
s++;//地址指针加1,指向下一个待写字符
}
}
//在第X行Y列开始显示Wdata所对应的单个字符
voidLCD_write_char(ucharX,ucharY,ucharWdata)
{
LCD_SET_XY(X,Y);//写地址
Write_Data(Wdata);//写入当前字符并显示
}
//清屏函数
voidLCD_clear(void)
{
Write_Instruction(0x01);
Delay_xms(5);
}
//显示屏初始化函数
voidLCD_init(void)
{
Write_Instruction(0x38);//8bitinterface,2line,5*7dots
Delay_xms(5);
Write_Instruction(0x38);
Delay_xms(5);
Write_Instruction(0x38);
Write_Instruction(0x08);//关显示,不显光标,光标不闪烁
Write_Instruction(0x01);//清屏
Delay_xms(5);
Write_Instruction(0x04);//写一字符,整屏显示不移动
Delay_xms(5);
Write_Instruction(0x0C);//开显示,光标、闪烁都关闭
}
/********************************************************
*INT0中断函数*
********************************************************/
voidcounter0(void)interrupt0using1
{
EX0=0;
if(LedNumVal_1==1)
LedNumVal_1=0;
else
LedNumVal_1=1;
}
/********************************************************
*INT1中断函数*
********************************************************/
voidcounter1(void)interrupt2using2
{
EX1=0;
if(LedNumVal_2==1)
LedNumVal_2=0;
else
LedNumVal_2=1;
}
/********************************************************/
voidmain(void)
{
uchari;
intaa;
intin=0;
intout=0;
intstay=0;
intstep;//计数
IT0=1;//下降沿触发
EX0=1;
IT1=1;//下降沿触发
EX1=1;
EA=1;
Delay_xms(50);//等待系统稳定
LCD_init();//LCD初始化
LCD_clear();//清屏
LCD_write_str(0,0,disp3);//显示开机信息
LCD_write_str(0,1,disp4);
Delay_xms(2000);//保持显示2秒钟
LCD_clear();//清屏
LCD_write_str(0,0,disp1);//显示预设信息
LCD_write_str(0,1,disp2);
light=0xff;//关灯
while
(1)
{
if(LedNumVal_1==0&&LedNumVal_2==0)
step=0;
if(LedNumVal_1==1&&LedNumVal_2==0)
step=1;
if(LedNumVal_1==0&&LedNumVal_2==1)
step=-1;
if(LedNumVal_1==1&&LedNumVal_2==1)
{
LedNumVal_1=0;//中断1计数
LedNumVal_2=0;//中断2计数
if(stay==0&&step==-1)
step=0;
else
{
stay=stay+step;//两个中断变化则计数加一次
if(step>0)
in=in+1;
if(step<0)
out=out+1;
}
}
//在z在对应位置写入数字
aa=in;
i=2;
if(aa>=10000)
LCD_write_char(i,0,0x30+aa%100000/10000);
i++;
if(aa>=1000)
LCD_write_char(i,0,0x30+aa%10000/1000);
i++;
if(aa>=100)
LCD_write_char(i,0,0x30+aa%1000/100);
i++;
if(aa>=10)
LCD_write_char(i,0,0x30+aa%100/10);
i++;
if(aa>=0)
LCD_write_char(i,0,0x30+aa%10);
aa=out;
i=11;
if(aa>=10000)
LCD_write_char(i,0,0x30+aa%100000/10000);
i++;
if(aa>=1000)
LCD_write_char(i,0,0x30+aa%10000/1000);
i++;
if(aa>=100)
LCD_write_char(i,0,0x30+aa%1000/100);
i++;
if(aa>=10)
LCD_write_char(i,0,0x30+aa%100/10);
i++;
if(aa>=0)
LCD_write_char(i,0,0x30+aa%10);
aa=stay;
i=5;
if(aa>=10000)
LCD_write_char(i,1,0x30+aa%100000/10000);
else
LCD_write_char(i,1,32);//写入空格
i++;
if(aa>=1000)
LCD_write_char(i,1,0x30+aa%10000/1000);
else
LCD_write_char(i,1,32);
i++;
if(aa>=100)
LCD_write_char(i,1,0x30+aa%1000/100);
else
LCD_write_char(i,1,32);
i++;
if(aa>=10)
LCD_write_char(i,1,0x30+aa%100/10);
else
LCD_write_char(i,1,32);
i++;
if(aa>=0)
LCD_write_char(i,1,0x30+aa%10);
if(stay>10)//报警控制
light=0;
else
light=0xff;
Delay_xms(30);//延时
EX0=1;
EX1=1;
}
}