基于80C51的简易人数统计器
教学楼进出人数统计
UART_Init();
}
/*********************************
外部中断0申明
**********************************/
void exter0() interrupt 0
{
counter++;
}
/*********************************
考虑到时间问题以及成本问题,本设计用软件模拟的方式实现。设计过程中采用keil做为编译器,pruteus做为仿真软件,VSPD虚拟串口,串口调试软件模拟PC机的终端。同时用两个接在外部中断0和外部中断1的开关模拟红外传感器。
下面是实际的电路图:
二.器件选择
1.考虑到51单片机P0口没有接上拉电阻以及52的弱驱动问题,P0口做为输出时,需接上拉电阻;
{
TI=0;
SBUF=counter;
delay(20);
while(TI==0);
TI=0;
}
/*********************************
数据显示
**********************************/
void display()
{
counter_apart();
2.参考51的数据手册我们知道,单个引脚输出低电平时允许外部电路向引脚灌入的最大电流为10mA,P0口8个端口允许的总的管电流为26mA。我们选取P0口的上拉电阻的阻值为300欧到1k欧。在本设计中我们选取1k欧;
3.考虑到发光二级管发光时大概压降为2v以及3mA—10mA的电流,选取R8,R9为1k欧。
80C51单片机的定时计数器
80C51单片机的定时计数器定时计数器的控制寄存器<>定时器/计数器的工作方式1.定时器/计数器的工作方式0<1)电路逻辑结构当图6-7中的计数器=13位<TH的8位与TL低5位)即得方式0的逻辑电路图。
<2)工作方式0的特点①两个定时器/计数器T0、T1均可在方式0下工作;②是13位的计数结构,其计数器由TH全部8位和TL的低5位构成<高3位不用);③当产生计数溢出时,由硬件自动给计数溢出标志位TF0<TF1)置1,由软件给TH,TL重新置计数初值。
应说明的是,方式0采用13位计数器是为了与早期的产品兼容,计数初值的高8位和低5位的确定比较麻烦,所以在实际应用中常由16位的方式1取代。
2.定时器/计数器的工作方式1<1)电路逻辑结构方式1是16位计数结构的工作方式,计数器由TH全部8位和TL全部8位构成。
其逻辑电路如图6-11所示。
<2)工作方式1的特点①两个定时器/计数器均可在方式1下工作;②是16位的计数结构,其计数器由TH的全部8位和TL的全部8位构成;③当产生计数溢出时,由硬件自动给计数溢出标志位TF0<TF1)置1,由软件给TH,TL重新置计数初值。
<3)计数/定时的范围在方式1下,当为计数工作方式时,由于是16位的计数结构,所以计数范围是:1~65536。
当为定时工作时,其定时时间=<216-计数初值)×机器周期,例如:设单片机的晶振频率f=12MHz,则机器周期为1μs,从而定时范围:1μs~65536μs。
因为80C51单片机的定时计数器是可编程的。
因此,在利用定时/计数器进行定时计数之前,先要通过软件对他进行初始化,初始化一般应进行如下工作:①设置工作方式,即设置TMOD中的各位GATE、C/T、M1M0。
②计算加1计数器的计数初值COUNT,并将计数初值COUNT 送入TH、TL中。
计数方式:计数值 = 2n – COUNT ,计数初值:COUNT= 2n –计数值。
单片机 第七章 80C51的定时器计数器.
根据题目要求方式控制字TMOD是: 计数时:(TMOD) = 0000 0110B = 06H 定时时:(TMOD) = 0000 0020B = 02H (2) 计算初值 机器周期T = 12/fosc = 12/6MHZ =2μs 计数时:计数个数 X = 1 计数初值 x0= (256﹣X) = (256﹣1) =255=0FFH,
工作方式寄存器TMOD (89H) (3) GATE:门控位 GATE=0时,只要用软件使TR0(或TRl)置1就可以启动定时器,而不管INT 0 或INT1 的电平是高还是低。GATE=1时,只有 INT0 (或 INT1 )引脚为高电平且由软件使 TR0(或TRl)置1时,才能启动定时器工作。
7.2.1 工作方式0 方式0为13位的计数器,由TL0的低5位和TH0的8位组 成,TL0的高3位未用。TL0低5位计数溢出时向TH0进位, TH0计数溢出时,向中断标志位TF0进位(硬件置位 TF0),并申请中断。T0是否溢出可查询TF0是否被置位, 以产生T0中断。
(T振0(荡P3周.4)期或的T11(2P倍定3.)5时进)端器行的计1外数部。脉C冲/ 进T行=计1,数设。置为计数定方式时,器计0数器对来自
(3) GATE:门控位
GATE=0时,只要用软件使TR0(或TRl)置1就可以启动定时器,而不管
INT0 ( INT0 控制T0的运行)或 INT1 ( INT1 控制T1的运行)的电平是高还
•
MOV TMOD,#00H :设置T0为方式0,定时
•
MOV TL0 , #18H
;送定时初值
•
MOV TH0,#0E0H
•
SETB EA
;CPU开中断
•
第十三讲 80C51单片机的定时器计数器(二) 091001
应用举例
【例5.1】设单片机晶振频率为6MHZ,使用定时器 1以方式0产生周期为500us的等宽正方波,并 由P1.0输出. 分析: 定时初值计算:(213-X)x 2us=250us X=8067=1F83H=11111100, 00011 TH0 TL0 TH0=0FCH;TL0=03H 控制器设置: TMOD: 00H 00H TCON: TR1=1 TR1=1 IE: EA=0 ET1=0 EA=1 ET1=1 查询方式 中断方式
80C51的两个定时器 计数器除可选择定时或计数 的两个定时器/计数器除可选择定时或计数 的两个定时器 工作方式外, 每个定时器/计数器都有 计数器都有4种工作方 工作方式外 , 每个定时器 计数器都有 种工作方 工作方式0~3; 式:工作方式 ; 工作方式0, 和 下 在工作方式 ,1和2下:T0和T1两个定时器的设 和 两个定时器的设 置和使用是完全相同的; 置和使用是完全相同的; 工作方式3下 T0和T1两个定时器的设置和使 在工作方式3下, T0和T1两个定时器的设置和使 用是不同的. 用是不同的.
风狂雨骤时立得定,才是脚跟;
1. 定时器工作方式 定时器工作方式0
的低5位和 位构成13位计数器 由TL1的低 位和 的低 位和TH1的8位构成 位计数器.定时器 的 位构成 位计数器. 启动后,定时或计数脉冲加到TL1,从预先设置的初 启动后,定时或计数脉冲加到 , 时间常数)开始不断增1. 计满后向TH1进位, 进位, 值(时间常数)开始不断增 .TL1计满后向 计满后向 进位 直至13位寄存器计满溢出.溢出时,13位寄存器清 . 直至 位寄存器计满溢出.溢出时, 位寄存器清0. 位寄存器计满溢出 位寄存器清 TF1置位并申请中断.如需进一步定时 计数,需用指 置位并申请中断. 计数, 置位并申请中断 如需进一步定时/计数 令重置时间常数.模式0的结构上图 令重置时间常数.模式 的结构上图 .
基于单片机的图书馆人流量统计器的设计
基于单片机的图书馆人流量统计器的设计作者:朱利强吕珊珊曹秀珍来源:《硅谷》2012年第19期摘要:人流量也被称为客流量,是图书馆、商场、道路、车站等公共场所管理不可缺少的数据,通过它可以获得这些场所完整的运行状况,有效地组织运营工作。
这就要求有一个合适的客流量统计器快速、准确地来完成这些工作。
关键词:超声波传感器;图书馆人流量;单片机中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2012)1010043-02文设计了一种基于单片机的图书馆人流量统计器,利用红外传感器对进入和离开图书馆的人流量进行计数,采用热释电传感器进行人员与货物的区分,然后把计数值送入单片机进行分析,计算出特定时段图书馆内人流量、人流方向、数量规律等,之后将数据存储到存储器中,并将相关数据送到显示器显示。
同时系统能够统计某天进入图书馆的总人数,并可以将每天的人流量保存起来,供需要时查询,从而得到比较理想的测量效果。
2 总体设计思路该设计须包含如下结构:主机电路、热释电红外传感探头电路、信号调理电路、红外发射电路、红外接收电路、数据处理电路、显示电路、存贮电路及相关的控制管理软件组成。
系统设计框图如图1所示。
3 系统硬件设计3.1 主控单片机电路设计AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位。
CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
3.2 红外发射电路的设计为了提高红外传感器电路效率,红外信号发射采用载波调制。
由555芯片产生38kHz的调制信号经过三极管放大后,利用串联的两路发光二极管输出调制信号,如图2所示。
3.3 红外接收电路的设计红外接收处理部分采用红外接收一体头IR3638,其对38 kHz信号进行解调还原和放大处理。
AXIS P8815-2 3D 人数计设备用户手册说明书
AXIS P8815-23D People Counter 用户手册解决方案概述解决方案概述•AXIS P8815-23D People Counter计算计数区域内的深度以测量物体的高度和尺寸。
AXIS P8815-23D People Counter适用于拥挤的场景和光照条件不佳的场景,例如强烈的阳光、眩光及阴影。
开始开始开始使用AXIS P8815-23D People Counter:1.连接、查找和访问设备:将设备连接到网络4,在网络上查找设备4,2.升级固件63.安装设备64.配置计数器9将设备连接到网络您可以将设备连接到网络,而无需将其从盒中取出:1.打开此盒。
开始在网络上查找设备若要在网络中查找Axis设备并为它们分配Windows®中的IP地址,请使用AXIS IP Utility或AXIS设备管理器。
这两种应用程序都是免费的,可以从/support上下载。
有关如何查找和分配IP地址的更多信息,请转到如何分配一个IP地址和访问您的设备。
浏览器支持您可以在以下浏览器中使用该设备:Chrome TM Firefox®Edge®Windows®推荐x xmacOS®推荐其他操作系统x x打开设备的网页界面1.打开一个浏览器,键入Axis设备的IP地址或主机名。
如果您不知道IP地址,请使用AXIS IP Utility或AXIS Device Manager在网络上查找设备。
2.键入用户名和密码。
如果是首次访问设备,则必须创建管理员账户。
请参见创建管理员账户5。
验证没有人篡改过固件要确保设备具有其原始的Axis固件,或在安全攻击之后控制设备,请执行以下操作:1.重置为出厂默认设置。
请参见重置为出厂默认设置22。
重置后,安全启动可保证设备的状态。
2.配置并安装设备。
创建管理员账户首次登录设备时,您必须创建管理员账户。
1.请输入用户名。
2.输入密码。
自习室出入人数统计仪
自习室出入人数统计仪目录一、设计课题二、设计任务与要求三、设计方案四、工作原理分析五、验证方案及结果检验六、参考资料七、设计总结与体会一、设计课题:自习室出入人数统计仪设计一个统计并记录出入自习室人数的电路。
二、设计任务与要求1.设计任务设计一个统计并记录出入自习室人数的电路。
即自习室出入人数统计仪。
2.设计要求要求可以实现以下基本功能:1.设计简单可靠的传感器来实现感应来人的进出。
2.可以判断来人是进入还是离开。
3.可以显示最大的数字为99。
4.可以显示进入自习室总人数和出自习室的总人数。
三.设计方案1.自习室出入人数统计仪概述人次统计器就是人流计数器,它也称为客流计数器,或者客流分析系统等,是安装在商场、超市、医院、公园景区、体育场馆、娱乐场所、机场车站等公共场所,检测客流数量的计算机软件系统,也可制作成电路系统。
通过该系统检测到的客流数量,用专门的软件研究客流数据进行挖掘,帮助管理员发现客流的规律、趋势等,避免烦琐的人工计算。
通过客流统计,使用者可以总体了解场所的人数和变化趋势等信息,然后通过这些信息出相应的决策。
以商场为例,客流统计可以发挥以下作用:1)预测功能:通过历史数据的对比和分析,预测未来的一段时间客流数据。
※通过历史数据分析,预测未来一段时间的人流量和销售量。
※通过历史数据分析,预测促销活动的效果为企业决策提供依据。
2)决策功能:通过历史数据的分析,掌握客流的规律,制定经营决策。
※客观决定租金价位水平;※根据客流变化,更有效分配物业管理、维护人员;※通过客流人群购买率,提高营销和促销的效率;※通过客流人群转化率,提高商场服务质量;※通过出入口客流量统计,确定重要广告的摆放位置和价格;※根据人流的规律,制定有针对性的促销政策;※统计主要楼层人流状态,从而进行铺位合理分布;※当前客流状态和变化趋势,管理人员可以对流量比较大的区域采取预防突发事件的措施,并可实时观察商场当前的实际人数等;3)评估功能:通过对客流数据的统计分析,评估经营效果。
基于单片机的教室人数统计
沈阳航空航天大学课程设计(论文)题目教室人数统计系统的设计班级学号学生姓名指导教师沈阳航空航天大学课程设计任务书课程名称专业综合课程设计院(系)自动化学院专业测控技术与仪器班级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显示出来。
通过这个程序,教室可以很好的了解教室内的学生人数,既方便了学生的人数统计,同时也方便了老师的教学进展。
第6章80C51的定时计数器
C/T:模式选择位。 清0为定时模式,置1为计数方式。 M1M0:工作方式设置位。可设置四种工作方式(见下页)。
2013-7-9
4
M数器
明
01
10 11
方式1
方式2 方式3
16位定时/计数器
8位自动重装定时/计数器 T0分成两个独立的8位定时/计数器; T1此方式停止计数
TR0=1预备
2013-7-9
23
ORG AJMP ORG MAIN:MOV MOV MOV MOV L1:JB SETB L2:JNB L3:JB CLR MOV DEC MOV SJMP END
2013-7-9
0000H MAIN 0200H TMOD,#09H TH0,#00H TL0,#00H R0,#31H P3.2,L1 TR0 P3.2,L2 P3.2,L3 TR0 @R0,TL0 R0 @R0,TH0 $
2013-7-9
7
初值计算:
公式法 C/T=1时,则为计数模式,有: 13 X=2 -N=8192-N C/T=0时,则为定时模式,有: X=213-N=8192-N,N=t/Tcy 求补法 :X=对N求补
【例5-3】若计数个数N为2,求计数初值。 公式法计算:X=8192-2=8190=1FFEH 求补法计算:对0 0000 0000 0010B取反加1为: 1 1111 1111 1110B(1FFEH)
2013-7-9 8
门控位作用
当GATE=0时 仅由TR0控制与门的开启。与门输出1时,控制开关 接通,计数开始; 当GATE=1时 与门的开启由INT0和TR0共同控制。这种方式可以用 来测量INT0引脚上正脉冲的宽度。 注意:方式0的计数初值高8位和低5位确定麻烦 ,实际 应用中常由16位的方式1取代。
基于单片机的教室人数实时监控模块的设计毕业设计
关键词:单片机,AT89S51,串行通信,RS-232
Abstract
Because science and technology fly soon a development of today, each realm all demand have higher layer request, but the request of higher layer again come from life, used for life.In the dissimilarity work all the demand have already recorded on duty number, this is to measure one personal workload of a kind of performance.But at school for have a class the request of on duty number is more familiar phenomenon, this is also to the student is at the study condition and study degree of school of a kind of affirmation.For let teacher more easy of understanding the student's on duty circumstance, better exaltation study atmosphere, so usage science and technology means, develop a kind of function well-found, usage convenience of classroom number solid hour supervision is very necessity.
基于80C51的电子计时器的设计与实现
目录1.系统设计 (1)1.1方案设计 (1)2.硬件设计 (2)2.1系统电路设计 (2)3. 软件设计 (3)3.1软件设计概述 (3)4. 测试数据及设计结果 (4)参考文献 (5)附录 (6)基于80C51的电子计时器的设计与实现XXX(塔里木大学信息工程学院,阿拉尔市 843300)摘要: 本设计利用STC89C52单片机的定时器/计数器定时和计数的原理,结合硬件电路设计计时器,将软、硬件有机地结合起来,使其能精确计时。
关键词:计时器,单片机1.系统设计1.1方案设计本设计利用STC89C52单片机的定时器/计数器定时和计数的原理,使其能精确计时。
利用中断系统使其能实现开始暂停的功能。
根据要求知道秒表设计主要实现的功能是计时和显示。
因此设置了两个按键和LCD显示时间,两个按键分别是开始、停止和复位按键。
利用这两个建来实现秒表的全部功能,而LCD则能显示最多4.59.99秒的计时。
电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。
硬件电路图按照图1.1进行设计。
图1.1 数字秒表硬件电路基本原理图本设计中,数码管显示的数据存放在内存单元31H-33H中。
其中31H存放分钟变量,32H存放秒钟变量,33H存放10ms计数值,即存放毫秒位数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出31H-33H某一地址中的数据,然后查得对应的显示位,并从P1口输出,就能显示该地址单元的数据值。
计时通过中断完成,定时溢出中断周期为1ms,当一处中断后向CPU发出溢出中断请求,每发出一次中断请求就对毫秒计数单元进行加一,达到10次就对十毫秒位进行加一,依次类推,直到4.59.99秒重新复位。
再看按键的处理。
这两个键可以采用中断的方法,也可以采用扫描的方法来识别。
复位键主要功能在于数值复位,对于时间的要求不是很严格。
基于8051单片机的教室人数检测查询系统的设计与实现
基于8051单片机的教室人数检测查询系统的设计与实现作者:刘华刘凯刘兆峰王艳芳石舫欣来源:《中国新通信》2015年第19期【摘要】设计主要用于教室人数的动态检测与实时显示。
系统采用STC89C52单片机作为基本控制单元,NRF24L01模块作为无线传输模块将采集到的数据信息进行编码处理后传送至单片机接收模块,并通过串口将数据传送到服务器,最终WEB服务器将教室人数网页呈现,同学们可手机或电脑登陆访问。
【关键词】激光对管 STC89C52单片机 NRF24L01射频通信一、背景及意义随着高校自习室的使用变得越来越紧张,周六周日等一些课外时间,经常看到同学们为了找个自习室在教学楼的各楼层之间穿梭,浪费宝贵的的学习时间,因此设计这样一款能够帮助同学们查询、了解自习室人员实时数量的系统。
二、系统原理描述及架构2.1系统总体设计方案系统主要由设计五大模块组成,激光对管检测模块专门用于教室门口人员进出的检测,NRF24L01射频通讯模块主要承担数据的传输任务,将采集到的人数信息按协议编码后无线发送到单片机的数据处理模块,单片机处理数据模块将数据接收并解码处理后通过串口通讯PL2303模块将人员信息传送到PC机,PC机WEB服务器模块将数据存放到Mysql数据库中,为学生的访问提供服务。
2.2人员进出检测的实现人员进出检测是系统最关键的部分。
有三种方案::教室的门口安装刷卡机,同学在进出时进行刷卡;在座位下安装压力传感器,当有人坐下时,传感器记录并传递信息;还有就是同时在门框的里边和围边放置一个激光对管,通过单片机检测里外探头次信号变化的顺序,来判别是进还是出,从而统计出教室内的人数。
经过讨论与分析,第一种方法,很容易出现漏刷或替刷的现象,不容易监管;第二种方法安装、使用复杂且成本较高,因为会经常坐、压,很容易损坏;第三种方法系统结构简单,只需在教室门口安装探头,就可以统计出教室内的总人数。
1、激光对管的检测原理。
80c51单片机简易计算器源程序
80c51单片机简易计算器源程序#include#include#include#define uint unsigned int#define unch unsigned char#define D8279 XBYTE[0x7EFF]#define CTRL8279 XBYTE[0x7FFF]unchZXM[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unch n;unch result_flag;unch p;//浮点型数字的精确度unch Q;//小数点前一位数的字形码unch m;//存放键码unch key;//记录按下键盘后所代表的数字或运算符unch temp;//中间变量unch num;//实时记录数字和运算符在内的所有ASC码字符的个数unch num1;//实时记录数字的个数uint a[10]={0};//用于存放运算符两侧数的各个位unch i;//上面数组的循环控制变量unch aa;//小数运算时,记录小数点前面的个数unch bb;//记录小数点后面的变量long total_1,total_2;//total_1表示运算符左边的数,total_2表示运算符右边的数unch operator_flag;//要进行何种运算的标志变量float total_operation,total;//total_operation除法运算时用于存放结果的变量,total表示经过运算后的数float total1_point; //小数运算时用于记录运算符左边的小数float total2_point; //小数运算时用于记录运算符右边的小数unch point_flag;//小数运算的标志变量void Operation();void clear_array()//数组清除函数,用于清除运算符左边或右边的运算数的各个位{for(i=0;i<10;i++)a[i]=0;i=0;}void newset() //8279初始化//{CTRL8279=0x90; //写显示RAM,地址自动加一//CTRL8279=0x34; //定标//CTRL8279=0x10; //8个字符显示右边输入,编码扫描,键盘锁定//}void clear_ram()//总清除命令//{CTRL8279=0xd1;i=CTRL8279;i&=0x80; //读出8279的状态寄存器中显示的状态,重点读DU 位//while(i==0x80) //等待清除完成,直到DU位变成0,说明清除完毕,才可在写显示里写入字形码//{i=CTRL8279;i&=0x80;}}void key_scan() //独立键盘函数归零函数{clear_ram();newset();num=0; //记录数字个数的变量清0num1=0; //记录数字和符号个数的变量清0total_1=0; //运算符左边数暂存变量清0total_2=0;total1_point=0;total2_point=0;//运算符右边数暂存变量清0total=0; //运算结果暂存变量清0clear_array(); //数组清0D8279=0xbf;}void calculate_1() //求得运算符左边的那个数{unch j;long middle;for(j=0,middle=1;j<="">//这里多乘了10倍因为后面会先除以10在作乘法运算for(j=0;j<num1;j++)< bdsfid="137" p=""></num1;j++)<> {middle=middle/10; //每次乘数都要缩小10倍total_1=total_1+a[j]*middle; //将运算符左边的每个数字乘以相应的倍数再累加得到运算符左边的数并存放到total_1中}if(point_flag==1)//出现小数时,则计算得到其值{for(j=0,middle=1;j<bb;j++)< bdsfid="145"p=""></bb;j++)<>middle=middle*10;total1_point=1.0*total_1/middle;//totall_point为整数部分}num1=0; //确定完运算符左边的数后将统计数字个数的变量清0 }void calculate_2() //求得运算符右边的那个数{unch j;long middle;for(j=0,middle=1;j<="" p="">middle=middle*10; //确定最一开始每个数字要乘以的倍数//这里多乘了10倍因为后面会先除以10在作乘法运算for(j=0;j<num1;j++)< bdsfid="159" p=""></num1;j++)<> {middle=middle/10;//每次乘数都要缩小10倍total_2+=a[j]*middle;//将运算符左边的每个数字乘以相应的倍数//再累加得到运算符左边的那个数//并存放到total_2中}if(point_flag==1)//出现小数时则计算得到其值{for(j=0,middle=1;j<bb;j++)< bdsfid="169" p=""></bb;j++)<>middle=middle*10;total2_point=1.0*total_2/middle;}num1=0;//确定完运算符右边的数后将统计数字个数的变量清0 }////////******************用于显示经过运算后得到的整形结果的函数*******************************////////void display(long total_temp){unch j;long middle,temp;n=(long)(log10(total_temp))+1;//确定是几位数for(j=0,middle=1;j<="">middle=middle*10;//middle运算后为100000for(j=0;j<n-1;j++)< bdsfid="185" p=""></n-1;j++)<>{middle=middle/10;//middle每次缩小10倍,例如此处为10000temp=(long)(total_temp/middle);//将结果12345除以10000得到商1D8279=ZXM[temp];total_temp=total_temp-temp*middle; //12345-10000=2345,继续类似确定出每1位,}D8279=ZXM[total_temp]|0x80;}//////*************************用于显示经过运算后得到的浮点型结果的函数***********************/////////void display_decimals(float temp1,unch r){unch j,z[]={0};for(j=0;j<="">{z[j]=(long)(temp1*10);temp1=temp1*10-((long)(temp1*10));// 3.42-3=0.42}while(z[r-1]==0)r--; //如果最后一位是0,继续检测前面一位,直到检测非零值;for(j=0;j<r;j++)< bdsfid="208" p=""></r;j++)<>D8279=ZXM[z[j]];}int1( ) interrupt 2 //计算器矩阵键盘扫描中断函数,从左到右,从上到下{if(num==0) //若输入为第一个数字时,将显示器'0.'{newset();}CTRL8279=0x40; //发送读FIFO/RAM命令//m=D8279;switch(m){case 0x1d: key=7;a[i++]=7; //每按下一个数字就把该数字存入数组中,同时数组控制变量+1num++;num1++; //每按下一个数字,统计数字个数变量+1,统计数字和运算符个数变量+1D8279=0x07;break;case 0x1c: key=8;a[i++]=8;num++;num1++;D8279=0x7f;break;case 0x1b: key=9;a[i++]=9;num++;num1++;D8279=0x6f;break;case 0x1a: key='+';operator_flag=4;//运算符标志变量赋予不同值表示不同的运算方式bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();break;case 0x19: key='%';operator_flag=9;bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();bb=num1-aa; //确定小数点后有几位数clear_ram();Operation();result_flag=1;break;case 0x18: key='c';key_scan();break;case 0x15: key=4;a[i++]=4;//每按下一个数字就把该数字存入数组中,同时数组控制变量+1num++;num1++; //每按下一个数字,统计数字个数变量+1,统计数字和运算符个数变量+1D8279=0x66;break;case 0x14: key=5;a[i++]=5;num++;num1++;D8279=0x6d;break;case 0x13: key=6;a[i++]=6;num++;num1++;D8279=0x7d;break;case 0x12: key='-';operator_flag=3;//运算符标志变量赋予不同值表示不同的运算方式bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();break;case 0x11: key='z';operator_flag=8;//运算符标志变量赋予不同值表示不同的运算方式bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();break;case 0x10: key='^';operator_flag=5;bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();bb=num1-aa; //确定小数点后有几位数clear_ram();Operation();result_flag=1;break;case 0x0d: key=1;a[i++]=1;//每按下一个数字就把该数字存入数组中,同时数组控制变量+1num++;num1++;//每按下一个数字,统计数字个数变量+1,统计数字和运算符个数变量+1D8279=0x06;break;case 0x0c: key=2;a[i++]=2;num++;num1++;D8279=0x5b;break;case 0x0b: key=3;a[i++]=3;num++;num1++;D8279=0x4f;break;case 0x0a: key='*';operator_flag=2;//运算符标志变量赋予不同值表示不同的运算方式bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();break;case 0x09: key='!';operator_flag=10;bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();bb=num1-aa; //确定小数点后有几位数clear_ram();Operation();result_flag=1;break;case 0x08: key='k';operator_flag=6;bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();break;case 0x05: key=0;a[i++]=0;//每按下一个数字就把该数字存入数组中,同时数组控制变量+1num++;num1++;//每按下一个数字,统计数字个数变量+1,统计数字和运算符个数变量+1D8279=0x3f;break;case 0x04 :key=',';//相当于输入为0的程序重复执行a[i++]=0;num++;num1++;D8279=0x3f;a[i++]=0;num++;num1++;D8279=0x3f;break;case 0x03: key='.';num++;aa=num1;//确定小数点前有几位数CTRL8279=0x60+aa-1;Q=D8279;CTRL8279=0x80+aa-1;D8279=Q|0x80;point_flag=1;CTRL8279=0x90+aa;break;case 0x02: key='/';operator_flag=1; //运算符标志变量赋予不同值表示不同的运算方式bb=num1-aa; //确定小数点后有几位数calculate_1(); //按下一个运算符后就把其左侧的运算数计算出来clear_array(); //确定一个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();break;case 0x01: key='x';operator_flag=7;bb=num1-aa; //确定小数点后有几位数calculate_1();//按下一个运算符后就把其左侧的运算数计算出来clear_array();//确定1个运算数后数组清0aa=0;bb=0;point_flag=0;num++; //统计数字和运算符个数变量+1clear_ram();newset();bb=num1-aa; //确定小数点后有几位数clear_ram();Operation();result_flag=1;break;case 0x00: key='=';bb=num1-aa; //确定小数点后有几位数clear_ram();Operation();result_flag=1;break;}}float en(float y,unch c){unch i;float sum=y;if(c==0)return 1;for(i=0;i<c-1;i++)< bdsfid="432" p=""></c-1;i++)<> sum*=y;return sum;}long jiecheng(unsigned int c){unsigned long sum;sum=1;while(c!=0){sum=sum*c;c--;}return sum;}void jieguo(float total_operation){unch v,w;if((total_operation-(long)total_operation)==0.0){if((long)total_operation!=0)display(total_operation);elseD8279=0xbf;}else{if((long)total_operation!=0){display((long)total_operation);v=(long)log10((long)total_operation)+1;w=8-v;display_decimals(1.0*(total_operation-(long)total_operation),w);}else{D8279=0Xbf;w=7;display_decimals(total_operation,w);}}}//////////**********************显示结果函数*************************////////// void Operation(){ newset();calculate_2();if(total1_point==0)total1_point=1.0*total_1;if(total2_point==0)total2_point=1.0*total_2;if(operator_flag==1)//*************如果输入/运算符**************// {operator_flag=0;//按了=键后计算得到运算符右边的数total=total1_point/total2_point;//转为浮点型数据jieguo(total);}if(operator_flag==2)//*******如果输入*运算符*********//{operator_flag=0;total=total1_point*total2_point;//转为浮点型数据jieguo(total);}if(operator_flag==3)//*******如果输入-运算符***********//{operator_flag=0;total=total1_point-total2_point; //进行减法运算if(total<0) //如果为负数{D8279=0x40;total=total2_point-total1_point;}jieguo(total);}if(operator_flag==4)//********如果输入+运算符*********// { operator_flag=0;total=(total1_point+total2_point);//转为浮点型数据jieguo(total);}if(operator_flag==5)//********如果输入^运算符*********// { operator_flag=0;total=(total1_point*total1_point);//转为浮点型数据jieguo(total);}if(operator_flag==6)//********如果输入√运算符*********// { operator_flag=0;total=log10((long)(total2_point));//转为浮点型数据jieguo(total);}if(operator_flag==7)//********如果输入1/x运算符*********// { operator_flag=0;total=1/(total1_point);//转为浮点型数据jieguo(total);}if(operator_flag==8)//********如果输入ncf运算符*********// { operator_flag=0;total=en(total1_point,(int)total2_point);//转为浮点型数据jieguo(total);}if(operator_flag==9)//**********如果输入%*********//{operator_flag=0;total=(total1_point)/100;//转为浮点型数据jieguo(total);}if(operator_flag==10)//**********如果输入阶乘!*********// { operator_flag=0;total=jiecheng((int)total1_point);jieguo(total);}}void main(){clear_ram(); //总清除newset(); //8279初始化key_scan();IT1=0; //设置INT1中断方式为低电平EX1=1; //允许INT1中断EA=1; //CPU允许中断while(1); //等待中断//}。
80C51的定时、计数器
工作方式3将 分成为两个独立的 位计数器TL0和TH0 。 分成为两个独立的8位计数器 工作方式 将T0分成为两个独立的 位计数器 和
5.3.4 定时 计数器用于外部中断扩展 定时/计数器用于外部中断扩展
扩展方法是,将定时 计数器设置为计数器方式 计数器设置为计数器方式, 扩展方法是,将定时/计数器设置为计数器方式,计数初值 设定为满程,将待扩展的外部中断源接到定时/计数器的外部 设定为满程,将待扩展的外部中断源接到定时 计数器的外部 计数引脚。从该引脚输入一个下降沿信号,计数器加1后便产 计数引脚。从该引脚输入一个下降沿信号,计数器加 后便产 生定时/计数器溢出中断 计数器溢出中断。 生定时 计数器溢出中断。 例如,利用 扩展一个外部中断源 扩展一个外部中断源。 例如,利用T0扩展一个外部中断源。将T0设置为计数器方 设置为计数器方 按方式2工作 工作, 的初值均为0FFH,T0允许中 式,按方式 工作,TH0、TL0的初值均为 、 的初值均为 , 允许中 开放中断。 断,CPU开放中断。其初始化程序如下: 开放中断 其初始化程序如下: MOV TMOD,#06H 为计数器方式2 , ;置T0为计数器方式 为计数器方式 MOV TL0,#0FFH , ;置计数初值 MOV TH0,#0FFH , SETB TR0 启动T0工作 ;启动 工作 SETB EA ;CPU开中断 开中断 SETB ET0 允许T0中断 ;允许 中断
GATE:门控位。GATE=0时,只要用软件使 :门控位。 = 时 只要用软件使TCON中的 中的 TR0或TR1为1,就可以启动定时 计数器工作;GATA=1时, 计数器工作; 或 为 ,就可以启动定时/计数器工作 = 时 要用软件使TR0或TR1为1,同时外部中断引脚或也为高电 要用软件使 或 为 , 平时,才能启动定时/计数器工作 计数器工作。 平时,才能启动定时 计数器工作。即此时定时器的启动条 加上了或引脚为高电平这一条件。 件,加上了或引脚为高电平这一条件。 :定时 计数模式选择位。 定时/计数模式选择位 为定时模式; 定时 计数模式选择位。 =0为定时模式; =1 为定时模式 C/T C /T C /T 为计数模式。 为计数模式。 M1M0:工作方式设置位。定时 计数器有四种工作方式, 计数器有四种工作方式, :工作方式设置位。定时/计数器有四种工作方式 进行设置。 由M1M0进行设置。 进行设置
教室人数统计系统仿真
基于80C51教室人数统计系统仿真组长:目录1.实验摘要1.1内容摘要1.2关键词2.目的和意义2.1设计目的及意义2.2系统实现的功能3.硬件电路设计3.1设计思路3.2单片机电路(proteus模拟电路)4.软件电路设计4.1工作原理4.2程序流程图4.3汇编程序5.电路调试6.结题感受7.参考文献1.实验摘要1.1内容摘要教室人数技术器系统设计,通过Proteus软件模拟教室人员的出入,当有同学进入时进行加计数,当有同学外出时进行减计数,并把现在教室人数通过LED 显示出来。
通过这个程序,教室可以很好的了解教室内的学生人数,既方便了学生的人数统计,同时也方便了老师的教学进展。
1.2关键词单片机 89C51 8155 人数统计 LED显示2.目的和意义2.1设计目的及意义教室人数统计对于一些人数比较大的课堂一直是个比较困难的问题。
于是,基于单片机80C51我们设计了一个教室人数自动统计系统。
通过本次课程设计加深了对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
掌握外部中断和LED显示的设置以及相应的传感器原理。
通过此次课程设计能够将单片机软件结合起来,对程序进行编辑,校验。
2.2系统实现的功能(1)检测教室里百位以内的人数,并在8*8点阵LED显示器上显示出来;(2)设置按键复位清零;(3)用发光二级管模拟点灯,当教室有人时,发光二极管发光;当教室无人时,发光二极管不发光。
3.硬件电路设计3.1设计思路教室门上安置两个光电对管GK102,当有人进入时,INT0先产生中断并置1 INT1响应标志位,INT1后发生中断,在响应标志位为1情况进行加法计数,外出时与之相反,最终显示出教室的实际人数。
注:使用proteus仿真时,将光电对管用开关按键代替。
测试系统硬件框图如下图所示:光电对管GK10280C51单片机LED显示光电对管GK1023.2单片机电路(proteus模拟电路)4.软件电路设计4.1工作原理8051单片机可以响应外部中断中断请求,外部中断源的中断请求信号可以从P3.2和P3.3(即INT0和INT1)引脚上输入,有电平或负边沿两种引起中断的触发方式。
基于80C51的智能报警系统设计
基于80C51的智能报警系统设计李昊然;陈晓钰;刘玉玲;王晓萍【摘要】家居安全是人身财产安全的重要一环.随着各种入室盗窃甚至抢劫案件不断升级,人们对成本低廉、使用简单、对日常生活干扰小的家庭报警系统的需求不断提高.文中介绍了以80C51单片机为核心的智能报警系统的系统组成及软硬件设计.该系统具有预设时钟、密码、报警电话,现场报警,拨打报警电话,记录报警时间和所拨报警电话等功能.该系统以较低的成本实现了警情识别、语音警告、现场警报及远程报警一体化,并具有良好的人机环境,为访客和户主提供了必要的操作提示.所设计的这一系统模型,将是未来实用报警系统开发的基础.%The safety of househood is the key part of personal and property safety. As the increased case of housebreaking and robbery, the demand of acheap,simple house alarm system with small disturbance is rising day by day. It introduces an alarm system based on the 80C51 microcontroller, describing its composition and software/hardware design This system integrates situation identification, voice warning ,on-site and remote alarming with relatively low cost, guaranteeing a friendly man-machine-environment by providing both guests and the house owner with necessary instructions. It supports operations including system activation/deactivation, time setting ,password setting,alarming phone numbers setting,alarming time and phone number recording and checking. When activated,it would simultaneously ring the alarm and dial the stored numbers to inform the owner or the police of the potential housebreaking.The system designed here will be base of the practicle alarm system in the future.【期刊名称】《计算机技术与发展》【年(卷),期】2012(022)005【总页数】4页(P226-228,232)【关键词】80C51单片机;语音报警系统;室内外双人机交互;LED与LCD显示【作者】李昊然;陈晓钰;刘玉玲;王晓萍【作者单位】浙江大学光电信息工程学系,浙江杭州310027;浙江大学光电信息工程学系,浙江杭州310027;浙江大学光电信息工程学系,浙江杭州310027;浙江大学光电信息工程学系,浙江杭州310027【正文语种】中文【中图分类】TP3090 引言家居安全是人身财产安全的重要一环,也是当今相应措施相对薄弱的一环。
基于单片机的教室人数统计设计
华北理工大学轻工学院Qing Gong College North China University of Science and Technology课程设计报告项目名称:基于单片机的教室人数统计设计专业班级:学号:姓名:成绩:一、项目说明通过本次课设计加深了对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
这个设计的想法一是运用老师教导的学科知识运用在实际生活中,二是完成老师布置的学科任务,所以选做这个教室人数统计设计,并了解和加深一下其原理和构造。
这个简单的计数器件是利用AT89S51单片机的两个16位定时和计数器功能,来完成计数,计数的结果通过8位动态数码管显示出来。
掌握外部中断和数码管显示的设置以及相应的传感器原理。
通过此次课程设计能够将单片机软件结合起来,对程序进行编辑,校验。
二、项目原理图1、原理图图1 项目原理图2、各部分说明(1)电源部分DC002插座是带有插入断开开关,中心脚为1脚,下面为2脚,侧面为3脚,插入时3脚断开。
的一款给单片机提供5v电压的电源。
图2 电源(2)STC89C52芯片STC89C52是一个低功耗,高性能CMOS8位单片机,片内含具有如下特点:40个引脚,4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDTC)电路,片内时钟振荡器。
此外,STC89C52设计和配置了振荡频率可为0HZ并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
图3 STC89C52(3)单片机复位部分复位功能:单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。
教室人数计数器系统
教室人数计数器系统内容摘要:教室人数计数器系统设计,通过计算教室人员的出入,当有同学进入时进行加计数,当有同学外出时进行减计数,并把现在教室人数通过LED显示出来。
通过这个程序,教师可以很好的了解教室内的学生人数,学生在找自习室时也快捷方便。
这样既方便了学生的人数统计、老师的教学进展同时也省去了学生在找自习室时浪费的时间。
系统硬件电路简单,程序简单易懂,照此思想,通过利用红外光敏开关作为外部脉冲,可实际设计出应用系统。
关键词:单片机8051 89C51 8155 人数统计 LED显示光敏二极管传感器目的和意义:我校学风良好,学生有很高的学习积极性,经常在自习室自习,这使得我校学生在找自习室时很不方便,很多人都盲目的在偌大的教学楼徘徊,而找不到有空位的教室,这带来了极大的不便,也大大浪费了学生的时间。
为此,我们设计了这个教室人数计数器系统,通过在教学楼入口处显示出每间教室的人数,为学生提供教室信息,以便于以最快的速度找到合适的教室,节省了学生的时间。
同时,白天老师上课时也起到了点名的效果。
设计内容设计教室人数统计系统,人员进入时系统进行加计数,人员离开时系统进行减计数并能够通过LED实时显示教室内的人数。
设计要求统计出教室内上课人数并能够通过LED显示出来。
设计思路教室前门不开,只通后门。
测量系统硬件框图如图1所示。
利用两个光敏二极管传感器,当有人从后门进出的时候,将产生电压脉冲,再利用单片机的外部中断功能进加减计数,最终显示出教室中的实际人数。
我们小组在设计电路上利用89C51通过8155及74LS138扩展4只共阴极LED数码管的接口电路,并结合了所查的资料进行了光敏二极管的理论研究(开关中以开关替代)。
图中8155的B扣和所有LED的a~h引线相连,故B口为字形扣;各LED的位选线和8155的C口相连,故C口为字位口。
8155的端口地址如下:2100H _命令/状态口2101H_A口2102H_B口2103H_ C口单片机电路如图:图 1.3 Proteus模拟电路图光敏二极管传感器(程序中利用开关了进行仿真)结构原理:光敏二极管的结构与一般二极管相似。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于8051的教室人数统计系统仿真研究报告组员:王煜阳于宏建周勋雨指导教师:赵建东日期: 2011.6.10内容摘要:教室人数技术器系统设计,通过Proteus软件模拟教室人员的出入,当有同学进入时进行加计数,当有同学外出时进行减计数,并把现在教室人数通过LED 显示出来。
通过这个程序,教室可以很好的了解教室内的学生人数,既方便了学生的人数统计,同时也方便了老师的教学进展。
次系统硬件电路简单,程序简单易懂,照此思想,通过利用红外光敏开关作为外部脉冲,可实际设计出应用系统。
关键词:单片机8051 89C51 8155 人数统计 LED显示光敏二极管传感器目录1.目的和意义 (4)1.1设计目的及意义 (4)1.2设计内容 (4)1.3设计要求 (4)2.硬件电路设计 (4)2.1设计思路 (4)2.2单片机电路如图: (5)2.3光敏二极管传感器(程序中利用开关了进行仿真) (6)3.软件电路设计 (7)3.1工作原理 (7)3.2程序流程图: (7)3.2.1程序主流程图: (7)3.2.2 加法流程图: (8)3.3汇编程序 (9)4.电路调试 (12)5.参考文献: (13)6.结题感想 (13)4|1.目的和意义1.1设计目的及意义教室人数统计对于一些人数比较大的课堂一直是个比较困难的问题。
于是,基于单片机80C51我们设计了一个教室人数自动统计系统。
通过本次课程设计加深了对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
掌握外部中断和LED 显示的设置以及相应的传感器原理。
通过此次课程设计能够将单片机软件结合起来,对程序进行编辑,校验。
1.2设计内容设计教室人数统计系统,人员进入时系统进行加计数,人员离开时系统进行减计数并能够通过LED 实时显示教室内的人数。
1.3设计要求统计出教室内上课人数并能够通过LED 显示出来。
2.硬件电路设计2.1设计思路教室前门不开,只通后门。
测量系统硬件框图如图1所示。
利用两个光敏二极管传感器,当有人从后门进出的时候,将产生电压脉冲,再利用单片机的外部中断功能进加减计数,最终显示出教室中的实际人数。
我们小组在设计电路上参考了所学教材上P195页的知识内容,设计了利用89C51通过8155及74LS138扩展4只共阴极LED 数码管的接口电路,并结合了所查的资料进行了光敏二极管的理论研究(开关中以开关替代)。
图中8155的B 扣和所有LED 的a~h 引线相连,故B 口为字形扣;各LED 的位选线和8155的C 口相连,故C 口为字位口。
8155的端口地址如下:2100H _命令/状态口 2101H_A 口 2102H_B 口 2103H_ C 口2.2单片机电路如图:图 1.3 Proteus模拟电路图2.3光敏二极管传感器(程序中利用开关了进行仿真)结构原理:光敏二极管的结构与一般二极管相似。
它装在透明玻璃外壳中,其PN结装在管的顶部,可以直接受到光照射。
工作原理:光敏二极管在电路中一般是处于反向工作状态,在没有光照射时,反向电阻很大,反向电流很小,反向电流称为暗电流,当光照射在PN结上,光子打在PN结附近,使PN结附近产生光生电子和光生空穴对,它们在PN结处的内电场作用下作定向运动,形成光电流。
光的照度越大,光电流越大因此光敏二极管在不受适当波长光照射时处于截止状态,受适当波长光照射时处于导通状态。
图2装置结构:将两个光敏二极管安装于同学们进出的过道一侧,并间隔一定的距离L,在相对的一侧安装两个激光发射器。
如图3。
工作过程:当过道中无人员经过时,激光照射光敏二极管,使二极管导通,则图2中的电路导通,电阻RL两端高电压。
当过道中有人员通过时,二极管截止,RL两端低电压。
将两个传感器电路中RL电压变化产生的电压脉冲信号分别接入单片机的外部中断输入端/INT0与/INT1,触发中断程序,在中断程序中进行相应的操作,即可实现人数的加减计数。
注:为满足单片机工作电平要求,图2电路中,电源E取5V,R取适当值。
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程序流程图:3.2.1程序主流程图:图 1.43.2.2 加法流程图:图 1.53.2.3减法流程图:图 1.63.3汇编程序ORG 0000HLJMP MAINORG 0003HLJMP CT1ORG 000BHLJMP YSORG 0013HAJMP CT2GW EQU 20hSW EQU 21HBW EQU 22HQW EQU 23HMOV 20H,#00HMOV 21H,#00HMOV 22H,#00HMOV 23H,#00HMOV R2,#00HMAIN:SETB EX0 ;开INT0SETB EX1 ;开INT1SETB EAJIA: MOV R4,#00H ;加法运算MOV SP,#60HMOV DPTR,#2100HMOV A,#0EHMOVX @DPTR,AACALL FBLOOP1: ACALL DIRMOV A,R2CJNE A,52H,BACK1SJMP LOOP1JIAN: MOV R4,#00H ;减法运算MOV SP,#60HMOV DPTR,#2100HMOV A,#0EHMOVX @DPTR,AACALL FB2LOOP2: ACALL DIRMOV A,R2CJNE A,52H,BACKSJMP LOOP2CT1: CLR EX1MOV 52H,R2 ;关INT1INC R2MOV TMOD,#01H ;T0选择定时器方式1工作MOV TH0,#0BH ;装入初值MOV TL0,#0DCHSETB ET0 ;开T0中断SETB TR0 ;启动中断BACK2: MOV A,P3CJNE A,#0FFH,BACK2 ;判断按键是否弹开,避免1人多次计数LJMP JIABACK: R ETICT2: CLR EX0 ;关INT0MOV 52H,R2DEC R2MOV TMOD,#01HMOV TH0,#0BHMOV TL0,#0DCHSETB ET0SETB TR0BACK3: MOV A,P3CJNE A,#0FFH,BACK3LJMP JIANBACK1: RETIYS: SETB EX0SETB EX1RETIFB: MOV R1,#79HMOV R3,#02HLP2: CJNE R2,#10,JIN ;加法进位程序MOV R2,#00HINC S WMOV A,SWCJNE A,#10,JINMOV SW,#00HINC BWJIN: MOV A,R2 ;加法显示程序ANL A,#0FHMOV @R1,AINC R1MOV A,SWMOV @R1,AINC R1MOV A,BWMOV @R1,AINC R1MOV A,QWANL A,#0FHMOV @R1,ARETFB2: MOV R1,#79HMOV R3,#02HLP22: CJNE R2,#0FFH,TUI ;减法借位程序MOV R2,#09HDEC SWMOV A,SWCJNE A,#0FFH,TUIMOV SW,#09HDEC BWMOV A,BWCJNE A,#0FFH,TUIDEC QWTUI: MOV A,R2 ;减法显示程序ANL A,#0FHMOV @R1,AINC R1MOV A,SWMOV @R1,AINC R1MOV A,GWMOV @R1,AINC R1MOV A,QWMOV @R1,ARETDIR: MOV R0,#79H ;LED显示控制程序MOV R5,#20HMOV A,R5LD0: MOV DPTR, #2103HMOV A,#00HMOVX @DPTR,AMOV DPTR,#2102HMOV A,@R0ADD A,#14HMOVC A,@A+PCDIR1: MOVX @DPTR,AMOV A,R5MOV DPTR,#2103HMOVX @DPTR,AMOV R7,#02HACALL DLINC R0MOV A,R5JB ACC.0,LD1RR AMOV R5,AAJMP LD0LD1: RETDSEG0: DB 3FH,06H,5BH,4FH,66H,6DHDSEG1: DB 7DH,07H,7FH,6FHDL: MOV R6,#0FFHDL6: DJNZ R6,DL6DJNZ R7,DLRET4.电路调试1.接通电源,观察LED初值是否显示“0000”。
2.把INT0开关置低电平,进行人员进入教室模拟统计,观察LED显示是否能进行加一计数并稳定显示。
3.把INT1开关置低高平,进行人员外出教室模拟统计,观察LED显示是否进行减一计数。
4.进行多人数统计的模拟,即多次点击INT0开关,来检验十位、百位乃至千位的进位、退位程序是否正确。
5.参考文献:[1]李广弟.单片机基础[M].北京:北京航空航天大学出版社,2004[2]蒋万君.再论循环时序电路的接口技术[J].机电一体化,2005第5期[3]赵嘉尉,张家栋,霍凯肖燕彩.单片机原理与接口技术[M].北京:清华大学出版社,2010[4]胡汉才.单片机原理及接口技术(第二版)[M].北京:清华大学出版社,20046.结题感想经过了几个下午的合作讨论以及个人N个晚上的独自研究,这个十分简单的人数统计仿真系统终于是做出来了。
我对于这个题目的感受就是“难——容易——难难!”。
开始阶段的第一项工作就是相关资料的查阅以及仿真软件的下载调试(proteus的自动退出BUG还挺多),并大致决定了电路的相关设计。
第二项工作是自学proteus进行电路仿真。
第三项工作是比较艰难的程序汇编阶段,看似简单的显示程序与中断的结合,一旦和自己所做的电路相配合时就会出现各种各样的问题(比较让我郁闷的就是当只按下一次按键时,计数器会增加20左右,后来我们先是在程序中加入延时程序来避免多次的错误中断,但是效果不好,最后还是求助了同学,才想起来应该加入电平判断语句切实做到按一次键+1或者-1),而这时候就需要我们去反复看程序,真正动脑子去思考如何解决这些难题,而这也是与平时做作业、听课完全不同的学习方式,能够真正让人受益。