基于单片机的教室人数统计

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

沈阳航空航天大学
课程设计
(论文)
题目教室人数统计系统的设计
班级
学号
学生姓名
指导教师
沈阳航空航天大学
课程设计任务书
课程名称专业综合课程设计
院(系)自动化学院专业测控技术与仪器
班级04070101 学号姓名
课程设计题目教室人数统计系统的设计
课程设计时间: 2013 年12 月30 日至2014 年 1 月10日课程设计的内容及要求:
1.设计一个教室人数统计系统,系统功能如下:
①采用单片机作为控制核心电路;
②由安装于门口的两个光电传感器用于识别进出教室的人数;
③采用二位数码管显示教室里的人数。

2.设计硬件电路原理图。

3.焊接硬件电路并进行调试。

4.软硬件结合调试,系统能脱离开发系统单独运行。

指导教师年月日
负责教师年月日
学生签字年月日
沈阳航空航天大学
课程设计成绩评定单
课程名称专业基础课程设计
院(系)自动化学院专业测控技术与仪器
课程设计题目教室人数统计系统的设计
学号姓名答辩日期年月日指导教师(答辩组)评语:
课程设计成绩
指导教师(答辩组)签字
年月日
目录
0 前言 (2)
1 总体方案设计 (2)
2 硬件电路设计 (3)
2.1 单片机系统 (3)
2.1.1 AT89C51性能 (3)
2.1.2 AT89C51各引脚功能 (3)
2.1.3复位电路设计 (5)
2.1.4 时钟电路设计 (5)
2.3 LED显示系统设计 (7)
2.3.1LED基本结构 (7)
2.3.2 LED译码方式 (7)
3 软件设计 (8)
3.1工作原理 (8)
3.2程序流程图: (9)
3.3显示子程序 (9)
4 调试分析 (9)
参考文献 (11)
课设体会 (12)
附录1 电路原理图 (13)
附录2 程序清单 (14)
教室人数统计系统的设计
沈阳航空航天大学自动化学院
摘要
本方案为教室人数技术器系统设计,通过模拟教室人员的出入,当有同学进入时进行加计数,当有同学外出时进行减计数,并把现在教室人数通过LED显示出来。

通过这个程序,教室可以很好的了解教室内的学生人数,既方便了学生的人数统计,同时也方便了老师的教学进展。

本系统可以与智能教室系统结合到一体,根据教室人数多少只能调节光线等,达到节能环保的目的。

关键词单片机;数码管;光电传感器;
0 前言
本方案基于单片机80C51我们设计了一个教室人数自动统计系统。

通过本次课设计加深了对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。

掌握外部中断和LED显示的设置以及相应的传感器原理。

通过此次课程设计能够将单片机软件结合起来,对程序进行编辑,校验。

1 总体方案设计
教室前门不开,只通后门。

测量系统硬件框图所示。

利用两个光敏二极管传感器,当有人从后门进出的时候,将产生电压脉冲,再利用单片机的外部中断功能进加减计数,最终显示出教室中的实际人数。

图1 系统原理框图
2 硬件电路设计
2.1单片机系统
2.1.1 AT89C51性能
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4KB的可反复擦写的只读程序存储器和128字节的随机存储器。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51功能性能:与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;寿命:1000次写/擦循环;数据保留时间:10年;全静态工作:0-24MHz;三级程序存储器锁定;128*8B内部RAM;32个可编程I/O口线;2个16位定时/计数器;5个中断源;可编程串行UART通道;片内震荡器和掉电模式。

2.1.2 AT89C51各引脚功能
AT89C51提供以下标准功能:4KB的Flash闪速存储器,128B内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路,同时,AT89C51可降至0Hz静态逻辑操作,并支持两种软件可选的节电工作模式。

空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作,掉电方式保存RAM中的内容,但震荡器停止工作并禁止其他所有工作直到下一个硬件复位。

AT89C51采用PDIP 封装形式,引脚配置如图2所示。

图2 AT89C51的引脚图
AT89C51芯片的各引脚功能为:
P0口:这组引脚共有8条,P0.0为最低位。

这8个引脚有两种不同的功能,分别适用于不同的情况,第一种情况是89C51不带外存储器,P0口可以为通用I/O口使用,P0.0-P0.7用于传送CPU的输入/输出数据,这时输出数据可以得到锁存,不需要外接专用锁存器,输入数据可以得到缓冲,增加了数据输入的可靠性;第二种情况是89C51带片外存储器,P0.0-P0.7在CPU访问片外存储器时先传送片外存储器的低8位地址,然后传送CPU对片外存储器的读/写数据。

P0口为开漏输出,在作为通用I/O使用时,需要在外部用电阻上拉。

P1口:这8个引脚和P0口的8个引脚类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。

P2口:这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。

P3口:这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表1所示:
Vcc为+5V电源线,Vss接地。

ALE:地址锁存允许线,配合P0口的第二功能使用,在访问外部存储器时,89C51的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。

在不访问片外存储器时,89C51自动在ALE线上输出频率为1/6震荡器频率的脉冲序列。

该脉冲序列可以作为外部时钟源或定时脉冲使用。

/EA:片外存储器访问选择线,可以控制89C51使用片内ROM或使用片外ROM, 若/EA=1,则允许使用片内ROM, 若/EA=0,则只使用片外ROM。

/PSEN:片外ROM的选通线,在访问片外ROM时,89C51自动在/PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。

RST:复位线,可以使89C51处于复位(即初始化)工作状态。

通常89C51复位有自动上电复位和人工按键复位两种。

XTAL1和XTAL2:片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(震荡器)的定时反馈回路。

2.1.3晶振电路设计
我们采用晶振电路来产生单片机工作所需的时钟信号,使用晶体震荡器时,C1、C2取值20~40pF,使用陶瓷振荡器时C1、C2取值30~50pF。

在设计电路板时,晶振和电容应尽量靠近芯片,以减小分布电容,保证振荡器的稳定性。

图2 晶振电路图
2.1.4 复位电路设计
单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。

CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。

MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。

本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和 2个电容即可,如图4所示。

图4 复位电路
电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路的参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了33pF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。

2.3 LED显示电路设计
2.3.1LED基本结构
LED是发光二极管显示器的缩写。

LED由于结构简单、价格便宜、与单片机接口方便等优点而得到广泛应用。

LED显示器是由若干个发光二极管组成显示字段的显示器件。

在单片机中使用最多的是七段数码显示器。

LED七段数码显示器由8个发光二极管组成显示字段,其中7个长条形的发光二极管排列成“日”字形,另一个圆点形的发光二极管在显示器的右下角作为显示小数点用,其通过不同的组合可用来显示各种数字。

LED引脚排列如下图7所示:
图5 LED引脚排列
2.3.2 LED译码方式
译码方式是指由显示字符转换得到对应的字段码的方式,对于LED数码管显示器,通常的译码方式有硬件译码和软件译码方式两种。

硬件译码是指利用专门的硬件电路来实现显示字符码的转换。

软件译码就是编写软件译码程序,通过译码程序来得到要显示的字符的字段码,译码程序通常为查表程序。

本设计系统中为了简化硬件线路设计,LED译码采用软件编程来实现。

由于本设计采用的是共阴极LED,其对应的字符和字段码如下表2所示。

表2 共阴极字段码表
3 软件设计
3.1工作原理
8051单片机可以响应外部中断中断请求,外部中断源的中断请求信号可以从P3.2和P3.3(即/INT0和/INT1)引脚上输入,有电平或负边沿两种引起中断的触发方式。

本系统中利用负边沿触发方式。

光敏二极管1电路中RL电压信号接/INTO,光敏二极管2电路中RL电压信号接/INT1。

工作过程:进入一一当有人员进入教室时,光敏二极管l光线首先被隔断,/INT0端首先产生负脉冲信号,引发单片机中断,在相应的中断程序中对计算人数的存储器R2进行加l计算,同时在程序中关闭/INTl的中断使能,这样就不会引起/INT1触发中断,并开始定时,在隔一定时间后利用定时中断打开/INT1中断使能·出去一一当有人员离开教室时,光敏二极管2光线首先被隔断,/INTl端首先产生负脉冲信号,引发单片机中断,在
相应的中断程序中对计算人数的存储器R2进行减l计算,同时在程序中关闭/INT0的中断使能,这样就不会引起/INT0触发中断,并开始定时,在隔一定时间后利用定时中断打开/INT0中断使能。

最终通过相应的LED显示程序显示的人数即当前教室里的人数了。

3.2程序流程图:
图5 程序流程图
3.3 显示子程序
显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一位LED的显示时间为1ms。

在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11μs定时,通过软件延时程序来实现5ms的延时。

4 调试分析
图6 系统调试图
参考文献
[1] 胡健.单片机原理及接口技术.北京:机械工业出版社,2004
[2] 谢维成、杨加国.单片机原理与应用及C51程序设计实例.电子工业出版社,2006
[3] 李广弟.单片机基础.北京航空航天大学出版社,2007
[4] 姜志海,黄玉清等著.单片机原理及应用[M] .北京:电子工业出版社.2005
[5] 魏立峰.单片机原理及应用技术.北京大学出版社,2005
[6] 周润景.Protues在MCS-51&ARM7系统中的应用百例.第一版.北京:电子工业出版社,2006
[7] 边春远等著.MCS-51单片机应用开发实用子程序[M] .北京:人民邮电出版社.2005
[8] 宋凤娟.基于89C51单片机的数字电压表设计[J].制造业自动化报刊,2007,29(03).
课设体会
经过两周的课设,我的体会是,我感觉我学习到很多东西,也成长很多。

以前只是在书本的东西,通过课设,我可以真正看到实际的运用。

这次课程设计是我第一次设计电路,并用Proteus实现了仿真。

在这整个过程中,我对电路设计,单片机的使用等都有了更进一步的认识。

通过这次设计,我学会了Proteus和Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,学到了很多东西。

我第一次做单片机课设,知识及经验的匮乏使我遇到很多困难,如果没有老师的督促指导以及同学们的支持,很难顺利的完成此次课程设计。

从课程设计开始到论文和答辩的顺利完成,都离不开老师、同学、朋友给予的帮助,在这里致以衷心的感谢,谢谢王艳辉老师!
[2014年1月8日完成]
附录1 电路原理图
附录2 程序清单
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k = P3^4;
sbit k1=P3^0;
sbit k2=P3^1;
uint a=0;
uint b=0;
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar code Scan_BITs[]={0x20,0x10,0x08};
uchar data Buffer_Counts[]={0,0,0};
uint Count_A=0;
void DelayMS(uint x)
{
uchar t;
while(x--)
{
for(t=0;t<120;t++);
}
}
void Show_Counts()
{
uint i;
Buffer_Counts[2] = Count_A / 100;
Buffer_Counts[1] = Count_A % 100 /10;
Buffer_Counts[0] = Count_A % 10;
if(Buffer_Counts[2]==0)
{
Buffer_Counts[2] = 0x0a;
if(Buffer_Counts[1]==0)
{
Buffer_Counts[1]=0x0a;
}
}
for(i=0;i<3;i++)
{
P2 = Scan_BITs[i];
P0 = DSY_CODE[Buffer_Counts[i]];
DelayMS(1);
}
}
void main()
{
IT0 = 1;
IT1 = 1;
PX0 = 1;
IE = 0x85;
while(1)
{
Show_Counts();
if(k == 0){ Count_A = 0; }
else if(k1==0)
{
DelayMS(5);
if(k1==0)
{
a++;
if(b!=0)
{
Count_A++;
a=0;
b=0;
}
while(!k1);
}
}
else if(k2==0)
{
DelayMS(5);
if(k2==0)
{
b++;
if(a!=0)
{
Count_A--;
a=0;
b=0;
}
while(!k2);
}
}
}
}
/*
void EX_INT0() interrupt 0 {
a++;
if(b!=0)
{
Count_A++;
a=0;
b=0;
}
while(k1!=0);
}
void EX_INT1() interrupt 2 {
b++;
if(a!=0)
{
Count_A--;
a=0;
b=0;
}
while(k2!=0);
} */。

相关文档
最新文档