找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 32162|回复: 18
打印 上一主题 下一主题
收起左侧

基于51单片机的人体红外模块的自动门设计原理图+程序

  [复制链接]
跳转到指定楼层
楼主

资料包含:论文 + 程序源代码 + PCB原理图 + 芯片资料手册

目录

摘 要
一. 方案的选择与论证
1.驱动电机
2. 电动机驱动模块
3. 微处理器模块
4. 人体检测模块
5. 故障检测模块
二. 系统硬件的具体设计与实现
1. 系统原理和框图
2. 功能模块的设计
2.1 单片机介绍
2.1.1 AT89C51管脚说明
2.1.2 AT89C51主要特性
2.1.3芯片擦除
2.2  热释电红外传感器介绍
2.3  BISS0001芯片介绍和典型电路
2.3.1 BISS0001的内部结构及特点
2.3.2 BISS001管脚图及管脚说明:
2.3.3 BISS0001工作原理
2.4  步进电机
2.4.1 28BYJ48步进电机参数
2.4.2 28BYJ48步进电机驱动方式
2.4.3 步进电机驱动电路
三. 系统软件设计
1. 程序描述与设计思路
(1)程序描述
(2)程序设计思路
2. 程序流程图
(1)自动门控制主程序
(2)LED灯开关门控制编码
(3)步进电机正反转编码
3. 程序
四. 总结
五. 致谢
六. 参考文献
七.附录
1.原理图
2.主程序

摘 要
本系统以单片机AT89C51为核心,使用人体红外线传感器作为感应器,检测到人体辐射的红外线能量变化,将其转化为电信号,触发单片机中断。再由单片机通过ULN2003驱动步进电机动作,电机的正反转分别表示自动门的开启和闭合,通过15个LED灯的逐次亮灭来模拟开关门状态。

一. 方案的选择与论证
根据设计要求目的,本系统可以划分为若干个基本模块。为了搭建性能稳定的外部电路及实现较高的性价比,使自动门达到真正的智能控制,针对各个模块的功能要求,分别有以下一些不同的设计方案:
1.驱动电机
方案A:选择步进电机作为自动门的引擎。步进电机最大的优点就是在距离上能够得到较精确控制,在没有行程开关作为电机停止的信号时,步进电机是最有选择。
方案B:采用普通直流电机。该电机转速快,针对本设计的情况,电机过快运转会造成失去控制甚至出现夹人的缺陷,故此排除。
方案C:利用直流减速电机,该方案虽然能够限制电机的速度在一定的方位内,但是由于没有行程开关,而且电源带载能力不稳定的情况下,电机很难在相同时间内走过相同的距离,这将无法达到准确开关门的目的。
因此采用第一种方案的步进电机电机来作为自动门的引擎。
2. 电动机驱动模块
方案A:采用继电器对电机的开或关进行开关的切换经行调整。这个方案简单但是相应时间慢,机械结构容易损坏并且寿命不长。
方案B:利用电阻分压原理,采用数字电位器调整电机的分压,从而达到调速的目的。缺点是无法用大电流驱动,降低工作效率而且不易实现。
方案C:使用ULN2003驱动芯片。ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,最大输出电流可达500mA,用来驱动本设计中用到的四相步进电机非常适合。
因而拟用第三种方案。
3. 微处理器模块
方案一:采用可编程逻辑器件CPLD。CPLD可以实现各种复杂的逻辑功能、规模大、密度高、IO资源丰富,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是很高,且从使用及经济的角度考虑,我们放弃了此方案。
方案二:采用51系列单片机。系统的要求不高,程序的编写也比较简单,需要用到的I/O口的数量用该系列的单片机来操作完全能够实现,无需再扩展,充分的利用了单片机资源。另外,经典的51系列单片机的处理速度也能够满足系统要求,性价比相对CPLD器件更高。
综合以上两种方案,本系统选择方案二,以AT89C51作为系统的微控制器。
4. 人体检测模块
方案一:微波感应器,又称微波雷达,能对物体的移动进行反应,因而反应迅速比较快,适合用于行走速度正常的人员通过场所,它的缺点是一旦有人不想出门而静止不动,雷达便不再反应,这时如果系统给出关门信号,那么自动门就会关闭,出现夹人现象。
方案二:人体红外传感器,能对物体的存在进行反应,不管人员是否移动,只要处于感应器的扫描范围,它都会有反应,就能阻止自动门关闭,但是红外感应器的反应比微波感应器略微慢一点。
综上,出于安全问题的考虑,为了防止自动门出现夹人情况,第二种红外传感器比第一种微波传感器更适合自动门的设计与使用。
5. 故障检测模块
方案一:采用霍尔电流传感器来检测流经电机的电流,再将采到的电流值转换成电压,经过AD转换,送入单片机。该方案虽然性抗干扰能力强,但是相对于本系统来说,价格太贵,而且步进电机的电流范围也比较小。
方案二:采用电阻采样的方式。在电机电源输入串入一个阻值为1欧姆的合金电阻,由于阻值足够小,对电机的影响可以忽略不计,再由欧姆定律可知,电阻两端的电压为流过该电阻的电流乘以一,最后将该电压送入电压比较器的反向输入端,与预设阀值作比较,当电流过大时,比较器输出会产生一个边沿跳变,此时触发中断,停止自动门动作。
综合分析,方案二简单可靠,比较适合应用在本系统设计中。

二. 系统硬件的具体设计与实现
1. 系统原理和框图
人体红外自动门控制系统的硬件组成如图2-1所示。本系统主要由AT89C51单片机及其外围电路、人体红外检测电路,步进电机控制电路、故障检测电路、开关门状态显示电路等五部分组成。单片机循环检测人体红外检测电路和故障检测电路,据此产生步进电机控制信号,同时LED等作对应流动。当检测到有人靠近时,步进电机正转一圈,LED灯由中间向左右两边逐渐点亮;完全开门后等待三秒钟,如果没有人靠近,此时开始关门,步进电机反转一圈,LED灯由两边向中间逐渐熄灭。自动门的开启可以分为3个阶段,首先是单片机在接受到传感器的信号后给马达一个快速开启的信号,使马达以比较快的速率工作,门迅速打开,然后再慢速工作,缓慢打开,最后保持禁止不动,相反,当自动门关闭时,是先加速后减速,再到停止的过程。

图2-1 系统设计框图


人体红外模块探测到有人靠近时,将脉冲信号传给主控器,主控器判断后通知步进电机运行,同时监控步进电机转动角度,以便通知其在一定时候加力和进入慢行运行。步进电机在ULN2003芯片的下进行开关门,一个开门完整周期是电机顺时针转过360°,反之,关门则逆时针转360°。若在关门过程中突然又有人靠近,此时单片机马上相应中断,停止电机关门,并在电机停止的位置又重新开门,经过3秒后,自动门才开始关闭,并启动中断。

2. 功能模块的设计
2.1 单片机介绍
单片机是把微型计算机主要部分都集成在一个芯片上的单芯片微型计算机,即将运算器,控制器,输入输出接口,部分存储器以及其他一些逻辑部件集成在一个芯片上,故可以把单片机看成是一个不带外部设备的微型计算机,相当于一个没有显示器,没有键盘,不带监控程序的单板机。
由于单片计算机具有体积小,重量轻,耗电少,功能强和价格低等特点,又由于数据大多是在芯片内传送处理,所以运行速度快,抗干扰能力强。单片机从七十年代问世以来,在二十多年的时间里,发展异常迅速,并已广泛应用于各种领域。单片机具有通讯接口,用单片机进行接口的控制与管理,单片机与主机可并行工作,大大地提高了系统的运行速度,所以在网络通讯领域也得到了越来越多的应用。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51外形及引脚排列如图2-1所示。


图2-1 AT89C51外形及引脚图

2.1.1 AT89C51管脚说明
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。在实际应用中,大多数情况下都使用P3口的第二功能。
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:外部数据存储器
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
2.1.2 AT89C51主要特性
* 与MCS-51 兼容
* 4K字节可编程闪烁存储器
* 寿命:1000写/擦循环
* 数据保留时间:10年
* 全静态工作:0Hz-24Hz
* 三级程序存储器锁定
* 128*8位内部RAM
* 32可编程I/O线
* 两个16位定时器/计数器
* 5个中断源
* 可编程串行通道
* 低功耗的闲置和掉电模式
* 片内振荡器和时钟电路
2.1.3芯片擦除
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦除操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
2.2 热释电红外传感器介绍
热释电红外传感器是一种能检测人或动物发射的红外线而输出电信号的传感器。早在1938年,有人提出过利用热释电效应探测红外辐射,但并未受到重视,直到六十年代,随着激光、红外技术的迅速发展,才又推动了对热释电效应的研究和对热释电晶体的应用。热释电晶体已广泛用于红外光谱仪、红外遥感以及热辐射探测器,它可以作为红外激光的一种较理想的探测器。它目标正在被广泛的应用到各种自动化控制装置中。除了在我们熟知的楼道自动开关、防盗报警上得到应用外,在更多的领域应用前景看好。比如:在房间无人时会自动停机的空调机、饮水机。电视机能判断无人观看或观众已经睡觉后自动关机的机构。开启监视器或自动门铃上的应用。结合摄影机或数码照相机自动记录动物或人的活动等等。
热释电效应同压电效应类似,是指由于温度的变化而引起晶体表面荷电的现象。热释电传感器是对温度敏感的传感器。它由陶瓷氧化物或压电晶体元件组成,在元件两个表面做成电极,在传感器监测范围内温度有ΔT的变化时,热释电效应会在两个电极上会产生电荷ΔQ,即在两电极之间产生一微弱的电压ΔV。由于它的输出阻抗极高,在传感器中有一个场效应管进行阻抗变换。热释电效应所产生的电荷ΔQ会被空气中的离子所结合而消失,即当环境温度稳定不变时,ΔT=0,则传感器无输出。当人体进入检测区,因人体温度与环境温度有差别,产生ΔT,则有ΔT输出;若人体进入检测区后不动,则温度没有变化,传感器也没有输出了。所以这种传感器检测人体或者动物的活动传感。 由实验证明,传感器不加光学透镜(也称菲涅尔透镜),其检测距离小于2m,而加上光学透镜后,其检测距离可大于7m。
2.3 BISS0001芯片介绍和典型电路
BISS0001是一款具有较高性能的传感信号处理集成电路,它配以热释电红外传感器和少量外接元器件构成被动式的热释电红外开关。它能自动快速开启各类白炽灯、荧光灯、蜂鸣器、自动门、电风扇、烘干机和自动洗手池等装置,特别适用于企业、宾馆、商场、库房及家庭的过道、走廊等敏感区域,或用于安全区域的自动灯光、照明和报警系统。它不仅能和热释电红外传感器的输出良好地匹配,而且也能和其他多种传感器进行匹配。它的内部是由运算放大器、电压比较器、与门电路、状态控制器、定时控制器、锁定时间控制器和禁止电路等组成。
BISS0001采用16脚标准型塑料封装结构。
1脚(A)为触发方式控制端,当A=1时,电路可重复触发;当A=0时,电路不可重复触发。
2脚(V0)为控制信号输出端,当有传感信号输人时,V0输出高电平。
3脚(RX)和4脚(CX)为输出定时控制器T,的外接元件端,定时时间为:TX=50×103RXCX。
5脚(Ri)和6脚Ci)为锁定时间控制器Υi的外接元件,锁定时间Ti=24RiCi。
7脚(VSS)为电源正端。
8脚(VRF)为参考电压及复位端,使用时一般接VDD,若按ⅤSS,可使定时器复位。
9脚(Vc)为触发禁止端,当VC<VR时禁止触发;当VC>VR时,允许触发,VR=0.2VDD.
10脚(IB)为偏置电流设置端,由外接电阻RB接ⅤSS端,RB一般取1MΩ的电阻。
11脚(VDD)为电源正、负端。
12脚(OUT2)为第二级运放的输出端
13脚(IN2-)为第二级运放的反相输人端。
14脚(IN1+)第一运放的同相输入端。
15净(IN1-)第一运放的反相输入端。
16脚(OUT1)为第一运放的输出端。
2.3.1 BISS0001的内部结构及特点
如图2-3-1中,运算放大器OPl将热释电红外传感器的输出信号作第一级放大,然后由C3耦合给运算放大器01:'2进行第二级放大,再经由电压比较器COPl和ODP2构成的双向鉴幅器处理后,检出有效触发信号VS去启动延迟时间定时器,输出信号VO经晶体管T1放大驱动继电器去接通负载。

图2-3-1 热释红外传感器处理芯片


BISS0001的特点:
*CMOS工艺,公耗低
*数模混合
*具有独立的高输入阻抗运算放大器
*内部的双向鉴幅器可有效抑制干扰
*内设延迟时间定时器和封锁时间定时器
*采用16脚DIP封装
* 内置参考电源
    *工作电压范围宽(3V~5V)
2.3.2 BISS001管脚图及管脚说明:

图2-3-2 BISS001管脚图

BISS001管脚说明:

表2-3-2  BISS0001管脚说明
引脚
名称
I/O
功能说明
1
A
I
可重复触发和不可重复触发选择端。当A为“1”时,允许重复触发;反之,不可重复触。
2

VO

O

控制信号输出端。由VS的上跳变沿触发,使Vo输出从低电平跳变到高电平时视为有效触发。在输出延迟时间Tx之外和无VS的上跳变时,Vo保持低电平状态。
3
RR1
--
输出延迟时间Tx的调节端
4
RC1
--
输出延迟时间Tx的调节端
5
RC2
--
触发封锁时间Ti的调节端
6
RR2
--
触发封锁时间Ti的调节端
7
VSS
--
工作电源负端
8
VRF
I
参考电压及复位输入端。通常接VDD,当接“0”时可使定时器复位
9
VC
I
触发禁止端。当Vc<VR时禁止触发;当Vc>VR时允许触发
10
IB
--
运算放大器偏置电流设置端
11
VDD
--
工作电源正端
12
2OUT
O
第二级运算放大器的输出端
13
2IN-
I
第二级运算放大器的反相输入端
14
1IN+
I
第一级运算放大器的同相输入端
15
1IN-
I
第一级运算放大器的反相输入端
16
1OUT
O
第一级运算放大器的输出端

2.3.3 BISS0001工作原理
BISS0001是由运算放大器、电压比较器、状态控制器、延迟时间定时器以及封锁时间定时器等构成的数模混合专用集成电路。当热释电红外传感器接收到人体红外辐射后输出检测信号,然后由14脚输入BISS0001,经地内部电路处理,由2脚输出探测信号(正向脉冲信号)。输出脉冲信号的宽度由外接电阻R9和电容C6来决定。当 2脚输出控制脉冲后,电子开关被接通,数字编码电路和无线电发射电路由于得到电源而开始工作。电源变压器为5W/15V,E为12V免维护蓄电池,供停电使用。S1为锁控电源开关,可根据需要安装在适当处所,用来接通工作电源,无必要时可取消设置。SCR采用1A的单向可控硅。HFC9301为软封装发声电路,发声为“嘀、嘀”声。电路的调试主要是主机与各分机之间的统调。将发射电路和接收电路组装好后,先将发射机中C10的调至适当位置后固定不动,接着调整接收机中的C1,使接收机能收到发射机发出的信号。若为“一对多”或“多对一”报警系统,应先将主机“一”(可以是发射机,也可以是接收机 )调好固定,然后调整各分机,使其与主机统调。BISS0001 应用线路图如图2-3-3-1所示。
图2-3-3-1 BISS0001的热释电红外开关应用电路图

上图中,R3为光敏电阻,用来检测环境照度。当作为照明控制时,若环境较明亮,R3的电阻值会降低,使9脚的输入保持为低电平,从而封锁触发信号Vs。SW1是工作方式选择开关,当SW1与1端连通时,芯片处于可重复触发工作方式;当SW1与2端连通时,芯片则处于不可重复触发工作方式。图中R6可以调节放大器增益的大小,原厂图纸选10K,实际使用时可以用3K,可以提高电路增益改善电路性能。输出延迟时间TX由外部的R9和C7的大小调整,触发封锁时间Ti由外部的R10和C6的大小调整,R9/R10可以用470欧姆,C6/C7可以选0.1U。在BISS0001的内电路中,运放A是一个独立的放大器,由它放大后输出的信号电压通过.
    值得一提的是:本设计采用已封装好的人体红外检测模块,其基本原理与以上相同。模块上有三个引脚,VCC接5V电源,GND接地,OUT接信号输出,把信号引脚直接接到单片机INT0管脚,这可能会引起单片机的误判断,因为无人靠近时,信号输出低电平,当有人靠近时,输出跳变为高,而单片机外部中断边沿触发的模式只能为下降沿,因此需要加入一个反向电路,即接入一个NPN型三极管,电路图如2-3-3-2所示。

图2-3-3-2 信号反向电路

   人体红外模块信号为低时,NPN三极管截止,输出为高,当有人靠近时,人体红外模块的信号为高,此时三极管导通,输出被拉低,即输出低电平。这能保证单片机中断的及时响应,保证系统的顺畅。
2.4 步进电机2.4.1 28BYJ48步进电机参数
步进电动机是纯粹的数字控制电动机:它将电脉冲信号转变成角位移。即给一个脉冲信号,步进电动机就转动一个角度.因此作常适合于单片机控制。设计中所用到的28BYJ48步进电机,电气性能如下所示:
* 额定电压:12VDC(另有电压:5V、6V、24V)
* 相数:4
* 减速比:1/64(另有减速比:1/16、1/32)
* 步距角:5.625°/64
* 驱动方式:4相8拍
* 直流电阻:200Ω±7%(25℃)(按客户要求而定:80、130欧姆)
* 空载牵入频率:≥600Hz
* 空载牵出频率:≥1000Hz
* 牵入转矩:≥34.3mN.m(120Hz)
* 自定位转矩:≥34.3mN.m
* 绝缘电阻:>10MΩ(500V)
* 绝缘介电强度:600VAC/1mA/1S
* 绝缘等级:A
* 温升:<50K(120Hz)
* 噪音:<40dB(120Hz)
2.4.2 28BYJ48步进电机驱动方式
              该步进电机有两种驱动方式,一种为一相励磁,步进顺序为:A-B-C-D-A,步距角为最小步距角的两倍,即5.625°/64*2;另外一种称为1-2相励磁,步进顺序为:A-AB-B-BC-C-CD-D-DA-A,步距角为5.625°/64。本设计用到第二种驱动方式,其分配顺序如表2-4-2所示:

表2-4-2 步进电机驱动方式相序分配情况

只要按照分配顺序,依次给该相高电平,电机就可以按照预定的方式旋转。

2.4.3 步进电机驱动电路
ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,最大输出电流可达500mA,其内部结构如图2-4-3-1所示:
图2-4-3-1 ULN2003内部电路

其中第八脚接地,第九脚接VCC,只要将单片机IO口接入第一至七脚,就可以对应从第十至十六脚输出较大电流的信号。由于本设计正用到的是四相电机,故只需要用到其中的四对接口即可,对应的电路图如图2-4-3-2所示:

图2-4-3-2 步进电机驱动电路接线方式


三. 系统软件设计
1. 程序描述与设计思路
(1)程序描述
程序中主要用到的知识点有:单片机外部中断、定时器、步进电机的驱动方式和角度计算、LED灯的点亮熄灭等。其中,外部中断尤为重要,如果单纯把人体红外模块的检测信号通过普通IO口检测,这将会产生有人接近自动门反应迟钝或夹人的严重后果。另外,计算步进电机走过的距离也是一个要点,需要精确计算才能确保电机在一个完成的开门或关门动作中刚好走过360°。  
(2)程序设计思路
人体红外模块一旦检测到有人靠近,此时中断触发,程序进入外部中断0,执行完整地一次开门信号,等待3秒后,程序跳出中断服务程序,开始执行关门函数。若在关门过程中,又有人靠近的中断信号出现,则关门程序被清除,再次执行中断服务程序,并从关门的位置重新开启,如此循环。
2. 程序流程图
(1)自动门控制主程序



图3-1 自动门控制主程序流程图
(2)LED灯开关门控制编码
根据硬件接口,低电平0表示点亮LED灯,高电平1表示熄灭LED灯,15个LED灯的流动方式如表3-2-2所示:

表3-2-2  LED灯的流动方式编码表

注:灯从中间向左右逐渐点亮表示开门,灯从左右向中间逐渐熄灭表示关门。

(3)步进电机正反转编码
根据硬件电路接法,当该相高电平1时,所在线圈得电,电机转动,步进电机转动一个周期的顺序编码如表3-2-3所示:

表3-2-3 步进电机驱动顺序编码表

第一步
第二步
第三步
第四步
第五步
第六步
第七步
第八步
A相
1
1
0
0
0
0
0
1
B相
0
1
1
1
0
0
0
0
C相
0
0
0
1
1
1
0
0
D相
0
0
0
0
0
1
1
1
P0编码
0x08
0x0c
0x04
0x06
0x02
0x03
0x01
0x09
    步进电机反转则是将第八步变为第一步,第七步变为第二部,以此类推。
3. 程序
具体程序见附录。

四. 总结
在此次有关自动门的控制系统的设计,让我感觉到了单片机的复杂深度性,它很贴切我们的日常生活,无所不在,应用无处不有,它并不是想象中的那么简单,也并非是无法克服的堡垒。
设计硬件之前,要首先收集好有关的基础性资料,应备有良好的应用类参考书和专业类参考书。对于有关的科技期刊和专利文献,也要经常阅读以便了解最新的发展情况,借鉴现成的经验,避免重复劳动。在设计中,要充分了解所用芯片的使用条件及输入输出的特性,这样才能避免因使用错误而多走弯路。
电路设计部分应该有的精神就是广集资料。只凭借自己头脑中的知识是远远不够的。哪里出现了问题,就要翻书本,或上网查资料。当然也要开动自己的脑筋怎样使系统电路更完美。例如我的设计题目是基于单片机的自动门控制系统设计。有自动门,自然会用到电动机,每种电机都有不同的特性和功能,你就要进行选择了。例如对电机的选择,你就要选择你所熟悉的,所了解的。
在电路设计时,应充分发挥单片机的记忆运算、判断控制能力,避免采用复杂的、稳定性较差的模拟电路。
为了使微机控制系统各种硬件设备能够正常运行,有效地实现电机各个控制环节的实时控制和管理,除了要设计合理的硬件电路,还必须要有高质量的软件支持,两者相辅相成,共同维持系统的正常运作。
最后我非常感谢学校和老师给我们这么好的学习机会,让我亲身去体会一个项目开发的艰难性,第一次站在一个设计者的角度去看,体会到了他们的艰辛,同时我也感受到了老师对我们的付出,对我们的精心指导,让我顺利完成这次学习任务。


七.附录
1.原理图
图7-1 单片机控制自动门系统原理图




单片机源程序如下:
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. bit flag;
  5. int j;                                                //控制电机关门变量
  6. int n;                                                //控制电机开门变量
  7. unsigned code table[]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};   //1-2相励磁方式 最小步距角
  8. //unsigned code table[]={0x80,0x40,0x20,0x10};                                           //1相励磁方式         最小步距角*2
  9.                                           //红线接电源,只要其中一相为高电平,该相导通,动作两拍,转过两个步距角
  10. unsigned code OPEN_P0[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01}; //LED灯
  11. unsigned code OPEN_P2[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; //LED灯

  12. void delay(unsigned int t);
  13. void Delay_1s(uint y);
  14. void int0init(void);
  15. void Motor_GO(void);
  16. void Motor_BACK(void);

  17. void delay(unsigned int t)
  18. {
  19.         while(t--);
  20. }

  21. void Delay_1s(uint y)                                 //延时1s
  22. {
  23.         uint a;
  24.         for(a=0;a<200*y;a++)                         //200为1s
  25.         {
  26.                 TH1=(65536-50000)/256;
  27.                 TL1=(65536-50000)%256;
  28.                 TR1=1;
  29.                 while(!TF1);
  30.                 TF1=0;
  31.         }
  32. }
  33. void int0init(void)                                 //外部中断0初始化
  34. {        
  35.         EA=1;                                                   //打开总中断
  36.          EX0=1;                                                   //中断允许位
  37.         IT0=1;                                                   //外部中断0触发方式为下降沿触发
  38. }

  39. void Motor_GO(void)                                 //电机正转函数,即开门
  40. {
  41.         uchar m;
  42.         while(n)         
  43.         {
  44.                 for(m=0;m<8;m++)
  45.                 {        
  46.                         n--;                          
  47.                         P1=table[m];
  48.                         if(n>2000)                        
  49.                         delay(280);                        //快速开门半圈
  50.                         if(n<=2000)
  51.                         delay(480);                        //慢速开门半圈
  52.                 }
  53.                 if((n<=4096)&(n>3800))        //LED灯提示
  54.                 {
  55.                         P0=OPEN_P0[0];
  56.                         P2=OPEN_P2[0];
  57.                 }
  58.                 if((n<=3800)&(n>3500))
  59.                 {
  60.                         P0=OPEN_P0[1];
  61.                         P2=OPEN_P2[1];
  62.                 }
  63.                 if((n<=3500)&(n>3200))
  64.                 {
  65.                         P0=OPEN_P0[2];
  66.                         P2=OPEN_P2[2];
  67.                 }
  68.                 if((n<=3200)&(n>2900))
  69.                 {
  70.                         P0=OPEN_P0[3];
  71.                         P2=OPEN_P2[3];
  72.                 }
  73.                 if((n<=2900)&(n>1950))
  74.                 {
  75.                         P0=OPEN_P0[4];
  76.                         P2=OPEN_P2[4];
  77.                 }
  78.                 if((n<=1950)&(n>1000))
  79.                 {
  80.                         P0=OPEN_P0[5];
  81.                         P2=OPEN_P2[5];
  82.                 }
  83.                 if((n<=1000)&(n>50))
  84.                 {
  85.                         P0=OPEN_P0[6];
  86.                         P2=OPEN_P2[6];
  87.                 }
  88.                 if((n<=50)&(n>=0))
  89.                 {
  90.                         P0=OPEN_P0[7];
  91.                         P2=OPEN_P2[7];                        
  92.                 }
  93.                
  94.                 if(n<0)
  95.                 {
  96.                         n=0;                                //跳出死循环
  97.                 }               
  98.         }
  99. }
  100. void Motor_BACK(void)                        //电机反转函数,即关门
  101. {
  102.         uchar i;
  103.         while(j)         
  104.         {        
  105.                 for(i=0;i<8;i++)
  106.                 {        
  107.                         j--;                                 
  108.                         P1=table[7-i];
  109.                         if(j>2000)                        
  110.                         delay(280);                        //快速关门半圈
  111.                         if(j<=2000)
  112.                         delay(480);                        //慢速关门半圈                        
  113.                 }
  114.                 if((j<=4096)&(j>3800))        //LED灯提示
  115.                 {
  116.                         P0=OPEN_P0[7];
  117.                         P2=OPEN_P2[7];
  118.                 }
  119.                 if((j<=3800)&(j>3500))
  120.                    {
  121.                         P0=OPEN_P0[6];
  122.                         P2=OPEN_P2[6];
  123.                 }
  124.                 if((j<=3500)&(j>3200))
  125.                 {
  126.                         P0=OPEN_P0[5];
  127.                         P2=OPEN_P2[5];
  128.                 }
  129.                 if((j<=3200)&(j>2900))
  130.                 {
  131.                         P0=OPEN_P0[4];
  132.                         P2=OPEN_P2[4];
  133.                 }
  134.                 if((j<=2900)&(j>1950))
  135.                 {
  136.                         P0=OPEN_P0[3];
  137.                         P2=OPEN_P2[3];
  138.                 }
  139.                 if((j<=1950)&(j>1000))
  140.                 {
  141.                         P0=OPEN_P0[2];
  142.                         P2=OPEN_P2[2];
  143.                 }
  144.                 if((j<=1000)&(j>50))
  145.                 {
  146.                         P0=OPEN_P0[1];
  147.                         P2=OPEN_P2[1];
  148.                 }
  149.                 if((j<=50)&(j>=0))
  150.                 {
  151.                         P0=OPEN_P0[0];
  152.                         P2=OPEN_P2[0];                                 
  153.                 }               
  154.                 if(j<0)                                   //跳出死循环
  155.                 {
  156.                         j=0;
  157.                 }
  158.         }
  159. }

  160. void main()
  161. {        
  162. ……………………

  163. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
基于单片机的自动门控制系统.rar (549.71 KB, 下载次数: 542)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏26 分享淘帖 顶5 踩
回复

使用道具 举报

沙发
ID:434005 发表于 2019-5-26 19:07 | 只看该作者
请问楼主可以分享一下详细的元件清单吗?方便准备一下器件,还有可以分享一下实物图图片吗?谢谢楼主
回复

使用道具 举报

板凳
ID:644149 发表于 2019-11-18 20:24 | 只看该作者
我什么时候才能怎么牛逼
回复

使用道具 举报

地板
ID:636953 发表于 2019-11-22 19:36 来自手机 | 只看该作者
怎么没有仿真图?
回复

使用道具 举报

5#
ID:546381 发表于 2019-11-25 17:08 | 只看该作者
请问楼主可以分享一下详细的元件清单吗?方便准备器件,实物图有吗?
回复

使用道具 举报

6#
ID:658274 发表于 2019-12-11 18:33 | 只看该作者
有仿真图吗?
回复

使用道具 举报

7#
ID:722671 发表于 2020-4-14 08:55 来自手机 | 只看该作者
楼主有零件图吗?
回复

使用道具 举报

8#
ID:736231 发表于 2020-5-16 09:10 | 只看该作者
谢谢楼主
回复

使用道具 举报

9#
ID:744853 发表于 2020-6-21 20:36 | 只看该作者
正想找红外探测
回复

使用道具 举报

10#
ID:774633 发表于 2020-6-22 08:44 | 只看该作者
下载来学习,谢谢
回复

使用道具 举报

11#
ID:777587 发表于 2020-6-22 23:05 来自手机 | 只看该作者
好想找到能记录进出人数的自动门控制系统
回复

使用道具 举报

12#
ID:787536 发表于 2020-6-23 11:57 | 只看该作者
非常感谢 可以发一下仿真图码
回复

使用道具 举报

13#
ID:510700 发表于 2021-5-21 18:46 | 只看该作者
楼主有实物图吗 能发一下吗 感谢
回复

使用道具 举报

14#
ID:988052 发表于 2022-1-1 13:57 | 只看该作者
我什么时候才能这么牛
回复

使用道具 举报

15#
ID:1003871 发表于 2022-2-12 22:50 | 只看该作者
这个挺实用的
回复

使用道具 举报

16#
ID:1011702 发表于 2022-3-24 14:02 来自手机 | 只看该作者
大佬文档实在不会写了,借鉴一下你的程序去写文档
回复

使用道具 举报

17#
ID:1021925 发表于 2022-4-27 18:03 来自手机 | 只看该作者
有完整的电路图吗
回复

使用道具 举报

18#
ID:1029682 发表于 2022-5-25 18:38 | 只看该作者
amazing
回复

使用道具 举报

19#
ID:1080848 发表于 2023-5-31 09:52 | 只看该作者
请问楼主用的是keil吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表