基于单片机的电梯仿真程序课程设计
单片机模拟电梯系统设计

计算机接口技术实习报告◆姓名:王雪鑫◆学号:10◆班级:计081◆指导教师:***◆专业:计算机科学与技术长春建筑学院电子系计算机教研室2011年10月28日课程设计任务书(单片机原理及应用)单片机模拟电梯系统设计摘要:本设计以51系列单片机设计硬件平台,选用AT89S52单片机,通过单片机C语言编程,实现利用数码管显示电梯所在楼层,跑马灯模拟电梯开门和关门操作,4×4矩阵键盘控制到达楼层的选择,蜂鸣器做电梯到达提示音,步进电机模拟电梯的驱动。
关键字:AT89S52 移位寄存多相时序控制正文:一、模拟电梯运行效果概述假设人已经进入电梯,数码管此时显示电梯所在层数,触发按键启动电梯,流水灯依次由两边向中间点亮提示电梯门关闭,并一直保持全亮,接下来步进电机启动,电梯开始上升(步进电机正转)或下降(步进电机反转),同时数码管同步显示电梯所在的层数,当到达目标楼层后,步进电梯停止转动,此时蜂鸣器连续响三次提示乘客已到目标楼层,之后流水灯由中间依次向两边熄灭指示电梯门打开,到此一次完整的电梯乘坐过程演示完毕。
二、硬件电路设计1、芯片及器件介绍①AT89S52 :一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
②74LS164 : 高速硅门 CMOS 器件,与低功耗肖特基型 TTL (LSTTL) 器件的引脚兼容。
74HC164、74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。
数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。
基于单片机的电梯控制系统设计

随着城市建设的不断发展,多层建筑已经出现,升降机在经济和国民生活中有着不同的应用。
高层建筑的垂直直立与人们的日常生活密不可分。
事实上,电梯基于呼叫线索运行自治法。
它的外部实际上是一个人机交互控制系统,顺序控制或逻辑控制不符合控制要求,电梯控制系统由随机逻辑控制。
目前,电梯运行通常采用两种方法。
一种是利用微机信号作为信号控制单元完成采集,操作操作信号和操作条件允许自动调度和提升和操作接管功能,并通过完成的组织器进行拖动控制。
第二种控制方法取代了程序控制器(PLC)自调节器的控制器,这两种方法在控制方式和性能方面存在很多差异,国内大多数厂家选择第二种方法是因为生产规模小,设备制造微电脑控制装置成本高。
.PLC具有可靠性高的特点,程序设计简单灵活,抗干扰能力强,运行稳定可靠。
目前,宽升力控制系统由可编程控制器实现。
不仅如此,PLC还推动了节能和革命性电梯革命的发展。
随着社区的需求,电梯行业的前景和趋势也在悄然发生变化,对新一代绿色电梯,节能电梯和智能电梯的需求不断发展,内外电梯公司满足市场需求,增加研发投入和发展,准备引领未来新概念电梯行业的发展。
1.1 研究意义及目的不仅如此,PLC还推动了节能和革命性电梯革命的发展。
随着社区的需求,电梯行业的前景和趋势也在悄然发生变化,对新一代绿色电梯,节能电梯和智能电梯的需求不断发展,内外电梯公司满足市场需求,增加研发投入和发展,准备引领未来新概念电梯行业的发展。
从20世纪80年代初到90年代初在中国使用的电梯中,大多使用继电器继电器结构。
它结构大,布线复杂,噪音高,易于接触,故障率高,维护工作量大,足以满足现代社会的需要。
自20世纪80年代以来,微机操作系统得到了很大的发展,它源于中国工业和农业生产的各个方面。
随着电子技术和微电子技术的发展,以微机为核心的控制系统得到了广泛的应用。
特别是单片机的开发和使用,越来越大的深度和广度。
微电脑用于电梯控制系统,与传统的传统逻辑控制系统相比具有明显的优势。
基于单片机的电梯控制模型设计

基于单片机的电梯控制模型设计一、前言单片机技术是现代电子工程领域一门迅速发展的技术,它的应用已经渗透到各种嵌入式系统中。
可以毫不夸张地说:掌握单片机技术是电子信息类专业学生就业的一个重要条件。
同时单片机技术又是一门实践性很强的学科,课程设计教学环节的设计和实施,在很大程度上决定了学生对单片机技术的掌握程度。
为了更好地完成课程设计这一重要教学环节,我们采用Proteus软件与Keil软件整合构建单片机虚拟实验平台。
学生首先在PC上利用Proteus软件自己搭建硬件电路,并利用系统提供的功能完成电路分析、系统调试和输出显示的硬件设计部分;同时在Keil软件中编制程序,进行相应的编译和仿真,完成系统的软件设计部分。
当系统的设计工作完成后,学生可以在PC上看到最终的运行效果。
最后再通过proteus设计PCB,再完成真正硬件的调试。
采用Proteus软件与Keil软件整合构建单片机虚拟实验平台,有利于促进课程和教学改革,更有利于人才的培养;从经济性、可移植性、可推广性角度讲,建立这样的课程设计平台是非常有意义的;利用仿真系统,可以节约开发时间和开发成本;利用仿真系统,具有很大的灵活性和可扩展性。
二、设计简介1、设计方案介绍在工业上,多采用可编程控制器或微型计算机实现电梯逻辑控制,可编程控制器抗干扰性强,但针对性强、价格较贵,为实现电梯控制的模拟,本设计采用单片机为控制中心,针对所在的不同楼层分别进行合理的调度。
设计中按键用于给用户发出服务请求,LED 电路用于显示请求状态及电梯运行状态、数码管显示电路来显示实时楼层,而电梯上升或下降的过程则通过定时来模拟。
2、设计任务及要求三层电梯控制模型的设计。
2.1 设计要求● 利用51单片机设计三层电梯的控制模型● 利用按键和数码管实现对电梯的控制和运行模拟● 可实时显示电梯所在楼层;● 按键按下后,相应的LED 灯亮;● 可对发出的服务请求进行合理的分析调度并作出正确的响应;● 用户请求得到服务后,可更新状态。
单片机课程设计 智能电梯控制

摘要随着楼房建筑的兴起,电梯成为越来越重要的交通方式,它是一种安全可靠,垂直上下的运载工具,对减轻劳动强度起到重要作用,同时对方便人们的生活起到重大作用。
基于单片机的电梯智能控制系统的设计分别从系统要求、硬件设计、软件设计等几个部分设计,介绍了以A T89C51系列单片机为核心,并结合74LS245和LED等芯片以及与之相配套的C语言软件等进行电梯模拟的具体实现方法,该提高了电梯的有效利用率。
本文设计了基于单片机的电梯控制系统,该系统采用单片机(AT89C51)作为控制核心,内外使用按键按下与否引起的电平改变,作为用户请求信息,单片根据楼层检测结果控制电机停在目标楼层。
软件部分采用C语言,利用查询方式来检测用户的请求信息,根据电梯运行到相应楼层时,引起的电平变化,送到单片机计数来确定楼层,并送到8*8LED显示屏进行显示,硬件设计简单可靠,结合软件,基本实现了五层电梯运行的模拟。
关键词:单片机电梯系统控制第一章绪论1.1研究背景及意义电梯进入人们的生活已经150年了,生活在继续,科技在发展,电梯也在进步。
150年来,电梯的材质由黑白到彩色,样式由直式到斜式,在操纵控制方面更是步步出新——手柄开关操纵、按钮控制、信号控制、集选控制、人机对话等等,多台电梯还出现了并联控制,智能群控;双层轿厢电梯展示出节省井道空间,提升运输能力的优势;变速式自动人行道扶梯的出现大大节省了行人的时间;在我国任何一个城市,电梯都在被广泛应用着。
电梯给人们的生活带来了便利,也为我国现代化建设的加速发展提供了强大的保障。
电梯是高层建筑中安全、可靠、垂直上下的运载工具,对改善劳动条件、减轻劳动强度起到很大的作用。
电梯的应用范围很广,可用于宾馆、饭店、办公大楼、娱乐场所、仓库以及居民住宅大楼等。
在现代社会中,电梯已成为人类必不可少的垂直运输交通工具.2研究内容1.本课题研究的主要内容是完成一个电梯系统的智能控制模块,即根据每个楼层不同顾客的按键要求,让电梯做出合理的判断,正确高效的指导电梯完成各项载客任务。
基于单片机的模拟电梯系统毕业设计

学院毕业设计(论文)题目基于单片机的模拟电梯系统设计院别工学院班级自动化 09二〇一三年四月二日基于单片机的模拟电梯系统设计专业:自动化班级:自动化09 :吴惠彬指导老师:凌忠兴摘要单片机即单片微型计算机(Single-Chip Microcomputer ),是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。
其中51单片机是各种单片机中最为典型和最有代表性的一种,广泛应用于各个领域。
电梯是集机械原理应用、电气控制技术、微处理器技术、系统工程学等多学科和技术分支于一体的机电设备,它是建筑中的永久垂直交通工具。
本文使用单片机C语言进行编程,实现运送乘客到任意楼层,并且显示电梯的楼层和上下行。
利用单片机控制电梯有成本低,通用性强,灵活性大及易于实现复杂控制等优点。
关键词单片机电梯 C语言Elevator simulation system based on single chip design Major: automatic class: automation 09 name: Wu Huibin Instructor:Ling Zhongxing Abstract scm is the Single Chip Microcomputer (Single Chip Microcomputer),is a set of cpu, ram rom timing, count and various interface, which integrates the micro controller. Including 51 single chip microcomputer as the most typical and most representative of all kinds of single chip microcomputer, a widely used in various fields. The elevator is set machinery principle application, electrical control technology and microprocessor technology, systems engineering and other multi-disciplinary branch in the integration of mechanical and electrical equipment and technology, it is the construction of permanent vertical transport. Using single chip microcomputer C language programming, realize the ferry passengers to any floor, TDD and display the elevator floor and has. Using single-chip microcomputer control elevator has low cost, versatility and flexibility big and easy to realize complex control, etc. Keyword Single chip microcomputer the elevator The C language目录引言 (5)第一章电梯系统的方案设计 (6)1.1系统设计阐述 (6)1.2系统设计任务 (6)1.3系统功能设计 (6)1.4系统方案论证 (6)第二章电梯系统控制电路设计 (8)2.1单片机STC89C52的介绍 (8)2.1.1单片机STC89C52的特点 (8)2.1.2单片机I/O口的配置 (11)2.2按键电路的设计 (12)2.3数码管显示电路的设计 (12)2.4电梯模拟指示灯的设计 (13)2.5蜂鸣器电路的设计 (13)2.6电源电路的设计 (14)2.6.1稳压电路的介绍 (14)2.6.2稳压芯片的介绍 (15)2.7H桥驱动电路的设计 (16)2.7.1光耦的介绍 (16)2.7.2 H桥驱动电路的介绍 (17)第三章电梯系统的控制程序设计 (19)3.7程序流程图 (19)3.7.1 主程序流程图 (19)3.7.2 中断程序流程图 (19)3.7.3 电梯运行流程图 (20)第四章系统的调试 (21)4.1系统调试过程 (21)4.1.1软件调试 (21)4.1.2系统仿真 (21)4.1.3硬件调试 (21)4.2系统调试成果 (22)结束语 (25)参考文献 (26)致 (27)附录一:系统电路总图 (28)附录二:PCB图 (29)附录三:源程序 (30)引言现代人们的生活水平显著提高,科学技术的发展越来越快。
基于单片机的电梯控制系统的设计

基于单片机的电梯控制系统的设计电梯控制系统被广泛应用于现代化城市、商业综合体、大型住宅等地方,它的安全性和便捷性受到广泛关注。
基于单片机电梯控制系统的出现,完美地解决了一系列问题,如传统微型电梯控制系统存在的布线麻烦、易受电磁干扰、系统资源不足等问题。
下面,本文将详细介绍基于单片机的电梯控制系统。
一、设计思想本控制系统采用AT89S51单片机作为控制器,其使用了数字电路和模拟电路相结合的设计方法,从而实现了对电梯的自动控制。
该系统集成了多种保护措施,具有高度的可靠性、抗干扰能力和波动能力,是一种非常实用的电梯控制系统。
二、硬件设计(1)AT89S51单片机该单片机采用8位CMOS微控制器,程序存储器容量为32KB,数据存储器容量为2KB,支持定时器/计数器、串行通信接口等外设。
(2)电梯电机电梯电机是电梯运行的关键部件之一,常见的电梯电机有交流电机和直流电机两种。
设计时需根据实际需要选择合适的电机,以实现电梯的起升和运行。
(3)门禁控制器门禁控制器是门禁装置的核心部件之一,用于控制电梯门的开启和关闭,保证电梯的安全性。
(4)电源模块电源模块提供电梯系统所需的稳定可靠的电源。
(5)其他模块还需要设计开关模块、指示灯模块、蜂鸣器模块等其他模块,以实现电梯的正常控制和提示。
三、软件设计该系统总共包含三个模块,即控制模块、运算模块和存储模块。
(1)控制模块第一步:启动电梯,检查电路可靠性,门状态、里程表、楼层显示等各项需要监测的装置是否正常工作。
第二步:选择电梯的运行方向和终点楼层。
第三步:通过监测电梯门开关的状态来控制电梯门的开关以及上下行电梯。
(2)运算模块运算模块负责楼层选取、电梯运转等计算工作。
具体方法:1.通过扫描各楼层的按钮输入,分析电梯所选楼层的方向。
2.确定电梯到达的楼层。
3.开关电梯门。
4.根据现场需求继续运行或停止。
(3)存储模块存储模块主要用于存储电梯的相关参数和状态信息,如电梯所在楼层、电梯的运行方向、上升/下降时间、停留时间等。
基于-51单片机的电梯设计

摘要随着社会的不断发展,楼房越来越高,而电梯则成了高层楼房的必须设备。
电梯从手柄开关操纵电梯、按钮控制电梯发展到了现在的群控电梯,为高层运输做出了不可磨灭的贡献。
单片机在电梯升降控制上的应用主要体现在它的逻辑开关控制功能。
由于单片机具有逻辑运算,计数和定时以及数据输入输出的功能,在电梯升降过程中,各种逻辑开关控制与单片机很好的结合,很好的实现了对升降的控制。
本文主要讨论研究利用Atmel 公司的51系列单片机AT89C51和四相步进电机对电梯的升降进行控制,形成电梯控制系统。
关键词:电梯 AT89C51 电梯升降控制四相步进电机 C语言程序设计第一章绪论1.1单片机简介近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用。
本系统采用Atmel 公司的51系列单片机AT89C51作为主控芯片。
其特征如下:单片机 AT89C518位微控制器 8K字节在系统可编程 Flash主要性能与MCS-51单片机产品兼容8K字节在系统可编程Flash存储器1000次擦写周期全静态操作:0Hz~33Hz三级加密程序存储器32个可编程I/O口线三个16位定时器/计数器八个中断源全双工UART串行通道低功耗空闲和掉电模式掉电后中断可唤醒看门狗定时器双数据指针掉电标识符功能特性描述AT89C51是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
单片机实验报告-模拟电梯设计

单片机实验报告-------------------------模拟电梯设计目录一、基本摘要-------------------------------------------------------二、实验要求-------------------------------------------------------三、实验方案-------------------------------------------------------四、实验流程图----------------------------------------------------五、实验代码-------------------------------------------------------六、实验总结-------------------------------------------------------------基本摘要:该实验在ADEK5196实验箱上实现电路设计。
采用8255控制键盘查询,8279控制的8段数码管(HL6,HL7)显示来表示当前电梯所在层,LED控制楼层亮灯情况,串行口扩展并行输出接口的8段数码管(HL5)显示电梯运行状态“U”或“P”。
通过编写的汇编程序来控制实现电梯的模拟。
实验要求:用键盘、按钮、八段码和LED模拟电梯工作过程。
楼层设为8层,键盘数字键1-8用来键入希望停的楼层,8个LED显示希望停的楼层,八段码指示电梯当前所在楼层,按扭用来启、停电梯。
电梯正常运行时以每2秒1层的速度上升或下降。
要求“电梯”能按以下方式运行:(1)设当前电梯停在某层(八段码显示相应楼层,8个LED全灭)。
键入1-8数字键,如键入的数字与当前电梯停层同,则不发生任何动作;若不同则相应楼层的LED亮。
如再按运行键,则电梯自动判别上升或下降(在运行过程中八段码显示楼层变化)一直到达希望停的楼层(八段码显示该楼层,相应LED灭);(2)设当前电梯正在上升或下降运行(此时八段码显示楼层变化,LED指示希望抵达的楼层),若键入新的希望停的楼层数字(相应的LED亮),则对同方向(上升或下降)未到的楼层能停,对其他情况则先停原希望停的楼层,然后按运行键后继续进行)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录(一)前言 (1)(二)现代电梯概述 (3)(三)硬件部分设计 (6)(四)软件部分设计 (12)(五)电梯运行界面 (52)(六)设计总结与感悟 (56)(七)参考文献 (57)电梯仿真程序一、前言:本电梯仿真程序采用的是一个基于单片机及其相关外设,编程语言采用汇编与C语言结合的方式,通过矩阵键盘线反选法输入楼层,上、下行等控制信号,经I\O口读入,进行相关实时控制,软硬件结合的仿真系统,输出设备包括由CD4511驱动显示楼层的7段数码管,显示实时信息的显示屏LCD12864,由PWM控制显示电梯门开关的舵机,以及由I\O口间接控制的驱动电机正反转双桥驱动电路等几个部分组成。
可以实现真实电梯中,任意层呼叫,目的层到达按要求顺序到达,开关门,无输入自动回1层等一系列功能,并实时显示当前电梯运行状态,关于真实电梯门控光幕装置,电机自动抱闸平层等部分,由于知识不足,没有足一实现,但会在接下来的专业知识学习过程中不断完善,同时也希望得到程老师的指导。
二、现代电梯概述:电梯是一种以电动机为动力的垂直升降机,装有箱状吊舱,用于多层建筑乘人或载运货物。
也有台阶式,踏步板装在履带上连续运行,俗称自动电梯。
服务于规定楼层的固定式升降设备。
它具有一个轿厢,运行在至少两列垂直的或倾斜角小于15°的刚性导轨之间。
轿厢尺寸与结构形式便于乘客出入或装卸货物,本次微机课程设计电梯仿真选用的是垂直升降梯。
2.1、电梯功能现代电梯主要由曳引机(绞车)、导轨、对重装置、安全装置(如限速器、安全钳和缓冲器等)、信号操纵系统、轿厢与厅门等组成。
这些部分分别安装在建筑物的井道和机房中。
通常采用钢丝绳摩擦传动,钢丝绳绕过曳引轮,两端分别连接轿厢和平衡重,电动机驱动曳引轮使轿厢升降。
电梯要求安全可靠、输送效率高、平层准确和乘坐舒适等。
电梯的基本参数主要有额定载重量、可乘人数、额定速度、轿厢外廓尺寸和井道型式等。
简单使用方法(紧急情况下面有解决方法)载人电梯都是微机控制的智能化、自动化设备,不需要专门的人员来操作电梯电梯结构图电梯内部结构图驾驶,普通乘客只要按下列程序乘坐和操作电梯即可。
2.2、运行过程:1、在乘梯楼层电梯入口处,根据自己上行或下行的需要,按上方向或下方向箭头按钮,只要按钮上的灯亮,就说明你的呼叫已被记录,只要等待电梯到来即可。
2、电梯到达开门后,先让轿厢内人员走出电梯,然后呼梯者再进入电梯轿厢。
进入轿厢后,根据你需要到达的楼层,按下轿厢内操纵盘上相应的数字按钮。
同样,只要该按钮灯亮,则说明你的选层已被记录;此时不用进行其他任何操作,只要等电梯到达你的目的层停靠即可。
3、电梯行驶到你的目的层后会自动开门,此时按顺序走出电梯即结束了一个乘梯过程。
三、硬件部分设计3.1、总电路图:3.2、单片机最小系统:单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路.下面给出一个51单片机的最小系统电路图.3.3、矩阵键盘:在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,1.键盘的工作原理:按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。
行线通过上拉电阻接到+5V 电源上。
无按键按下时,行线处于高电平的状态,而当有按键按下时,行线电平与此行线相连的列线电平决定。
2.行列扫描法原理:第一步,使行线为编程的输入线,列线是输出线,拉低所有的列线,判断行线的变化,如果有按键按下,按键按下的对应行线被拉低,否则所有的行线都为高电平。
第二步,在第一步判断有键按下后,延时10ms 消除机械抖动,再次读取行值,如果此行线还处于低电平状态则进入下一步,否则返回第一步重新判断。
第三步,开始扫描按键位置,采用逐行扫描,每间隔1ms 的时间,分别拉低第一列,第二列,第三列,第四列,无论拉低哪一列其他三列都为高电平,读取行值找到按键的位置,分别把行值和列值储存在寄存器里。
3.4、CD4511当前楼层显示CD4511 是一片CMOS BCD-锁存/7 段译码/驱动器,用于驱动共阴极LED (数码管)显示器的BCD 码-七段码译码器。
它具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。
可直接驱动共阴LED数码管。
以下是CD4511数码管驱动原理电路图。
是CD4511实现LED与单片机的并行接口方法。
3.5、LCD12864不带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个16*16 点汉字,和128 个16*8 点ASCII 字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4 行16×16 点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
3.6、电机双桥驱动系统一、H桥驱动电路图4.12中所示为一个典型的直流电机控制电路。
电路得名于“H桥驱动电路”是因为它的形状酷似字母H。
4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图4.12及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。
如图所示,H桥式电机驱动电路包括4个三极管和一个电机。
要使电机运转,必须导通对角线上的一对三极管。
根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。
图4.12 H桥驱动电路要使电机运转,必须使对角线上的一对三极管导通。
例如,如图4.13所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经Q4回到电源负极。
按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。
当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周围的箭头指示为顺时针方向)。
图4.13 H桥电路驱动电机顺时针转动图4.14所示为另一对三极管Q2和Q3导通的情况,电流将从右至左流过电机。
当三极管Q2和Q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。
图4.14 H桥驱动电机逆时针转动二、使能控制和方向逻辑驱动电机时,保证H桥上两个同侧的三极管不会同时导通非常重要。
如果三极管Q1和Q2同时导通,那么电流就会从正极穿过两个三极管直接回到负极。
此时,电路中除了三极管外没有其他任何负载,因此电路上的电流就可能达到最大值(该电流仅受电源性能限制),甚至烧坏三极管。
基于上述原因,在实际驱动电路中通常要用硬件电路方便地控制三极管的开关。
图4.155 所示就是基于这种考虑的改进电路,它在基本H桥电路的基础上增加了4个与门和2个非门。
4个与门同一个“使能”导通信号相接,这样,用这一个信号就能控制整个电路的开关。
而2个非门通过提供一种方向输人,可以保证任何时候在H桥的同侧腿上都只有一个三极管能导通。
(与本节前面的示意图一样,图4.15所示也不是一个完整的电路图,特别是图中与门和三极管直接连接是不能正常工作的。
)图4.15 具有使能控制和方向逻辑的H桥电路采用以上方法,电机的运转就只需要用三个信号控制:两个方向信号和一个使能信号。
如果DIR-L信号为0,DIR-R信号为1,并且使能信号是1,那么三极管Q1和Q4导通,电流从左至右流经电机(如图4.16所示);如果DIR-L信号变为1,而DIR-R信号变为0,那么Q2和Q3将导通,电流则反向流过电机。
四、软件部分设计:4.1、程序框图否是否否是是硬件上电待命 显示提示,开发者、版本信息键盘输入目的楼层结束键是否按下 记录并该楼层标志位 程序开始运行While(1){...} 电机运行,到达下一层 当前楼层标志位加一并与存储楼层对比 若相等 电机停转,电梯门开,延时lcd 显示,7段数码管显示 电梯门,电机运行,延时lcd 显示,7段数码管显示 运行至最后目 的楼层 键盘扫描 继续否 结束待命4.2、C51单片机汇编、C语言混编程序:; 电梯。
SRC generated from: 电梯.c; COMPILER INVOKED BY:; C:\Keil\C51\BIN\C51.EXE 电梯.c BROWSE DEBUG OBJECTEXTEND $NOMOD51NAME 电梯P0 DATA 080HP1 DATA 090HP2 DATA 0A0HP3 DATA 0B0HT0 BIT 0B0H.4AC BIT 0D0H.6T1 BIT 0B0H.5T2 BIT 090H.0EA BIT 0A8H.7IE DATA 0A8Hclock BIT 0B0H.0EXF2 BIT 0C8H.6RD BIT 0B0H.7ES BIT 0A8H.4IP DATA 0B8HRI BIT 098H.0INT0 BIT 0B0H.2CY BIT 0D0H.7TI BIT 098H.1INT1 BIT 0B0H.3 RCAP2H DATA 0CBH PS BIT 0B8H.4SP DATA 081HT2EX BIT 090H.1OV BIT 0D0H.2RCAP2L D ATA 0CAHC_T2 BIT 0C8H.1WR BIT 0B0H.6RCLK BIT 0C8H.5TCLK BIT 0C8H.4 SBUF DATA 099H PCON DATA 087H SCON DATA 098H TMOD DATA 089H TCON DATA 088HIE0 BIT 088H.1IE1 BIT 088H.3B DATA 0F0HCP_RL2 BIT 0C8H.0ACC DATA 0E0H servo_door BIT 0B0H.7 ET0 BIT 0A8H.1ET1 BIT 0A8H.3TF0 BIT 088H.5ET2 BIT 0A8H.5TF1 BIT 088H.7TF2 BIT 0C8H.7RB8 B IT 098H.2TH0 D ATA 08CHEX0 B IT 0A8H.0IT0 BIT 088H.0TH1 D ATA 08DHTB8 BIT 098H.3EX1 B IT 0A8H.2IT1 BIT 088H.2TH2 D ATA 0CDHP BIT 0D0H.0SM0 BIT 098H.7 TL0 DATA 08AH SM1 BIT 098H.6 TL1 DATA 08BH SM2 BIT 098H.5 TL2 DATA 0CCHPT0 BIT 0B8H.1PT1 BIT 0B8H.3RS0 BIT 0D0H.3PT2 BIT 0B8H.5TR0 BIT 088H.4RS1 BIT 0D0H.4TR1 BIT 088H.6TR2 BIT 0C8H.2PX0 BIT 0B8H.0PX1 BIT 0B8H.2DPH DATA 083H DPL D ATA 082H EXEN2 BIT 0C8H.3 REN BIT 098H.4T2CON DATA 0C8H RXD BIT 0B0H.0TXD BIT 0B0H.1F0 BIT 0D0H.5PSW DATA 0D0H?PR?_delay?SMARTCAR SEGMENT CODE?PR?_ABS?SMARTCAR SEGMENT CODE?PR?keysort?SMARTCAR SEGMENT CODE?PR?keycheck?SMARTCAR SEGMENT CODE?PR?sys_init?SMARTCAR SEGMENT CODE?PR?_BCD?SMARTCAR SEGMENT CODE?PR?main?SMARTCAR SEGMENT CODE?PR?TIME_BASE?SMARTCAR SEGMENT CODE ?C_INITSEG SEGMENT CODE?BI?SMARTCAR SEGMENT BIT?DT?SMARTCAR SEGMENT DA TAEXTRN CODE (?C_STARTUP)PUBLIC floor_up_2PUBLIC floor_up_1PUBLIC rankkeyPUBLIC opendoorPUBLIC iPUBLIC up_flagPUBLIC rowPUBLIC floor_down_5PUBLIC floor_down_4PUBLIC floor_down_3PUBLIC floor_down_2PUBLIC pressflagPUBLIC keyPUBLIC key_flagPUBLIC stop_flagPUBLIC tempPUBLIC down_flag PUBLIC floor_flag_5 PUBLIC floor_flag_4 PUBLIC floor_flag_3 PUBLIC floor_flag_2 PUBLIC floor_flag_1 PUBLIC startPUBLIC close_door PUBLIC rankPUBLIC countPUBLIC rowkey PUBLIC floor_up_4 PUBLIC floor_up_3 PUBLIC TIME_BASE PUBLIC mainPUBLIC _BCDPUBLIC sys_init PUBLIC keycheck PUBLIC keysort PUBLIC _ABSPUBLIC _delayRSEG ?BI?SMARTCAR floor_up_3: DBIT 1 floor_up_4: DBIT 1 close_door: DBIT 1start: DBIT 1 floor_flag_1: DBIT 1 floor_flag_2: DBIT 1floor_flag_3: DBIT 1 floor_flag_4: DBIT 1 floor_flag_5: DBIT 1 down_flag: DBIT 1stop_flag: DBIT 1pressflag: DBIT 1 floor_down_2: DBIT 1 floor_down_3: DBIT 1 floor_down_4: DBIT 1 floor_down_5: DBIT 1 up_flag: DBIT 1opendoor: DBIT 1 floor_up_1: DBIT 1 floor_up_2: DBIT 1RSEG ?DT?SMARTCARrowkey: DS 1count: DS 2rank: DS 1temp: DS 1 key_flag: DS 16key: DS 1row: DS 1i: DS 1rankkey: DS 1RSEG ?C_INITSEGDB 002HDB countDW 00000HDB 010HDB key_flagDB 000HDB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H DB 000H,000H,000H,000H,000HDB 001HDB keyDB 000HDB 001HDB iDB 000HDB 0C1H, pressflag + 000H ; bit-initDB 0C1H, up_flag + 000H ; bit-initDB 0C1H, down_flag + 000H ; bit-initDB 0C1H, stop_flag + 000H ; bit-initDB 001HDB rowkeyDB 000HDB 001HDB rankkeyDB 000HDB 001HDB tempDB 000HDB 001HDB rowDB 000HDB 001HDB rankDB 000HDB 0C1H, floor_flag_1 + 000H ; bit-initDB 0C1H, floor_flag_2 + 000H ; bit-initDB 0C1H, floor_flag_3 + 000H ; bit-initDB 0C1H, floor_flag_4 + 000H ; bit-initDB 0C1H, floor_flag_5 + 000H ; bit-initDB 0C1H, floor_down_5 + 000H ; bit-init DB 0C1H, floor_up_4 + 000H ; bit-initDB 0C1H, floor_down_4 + 000H ; bit-init DB 0C1H, floor_up_3 + 000H ; bit-initDB 0C1H, floor_down_3 + 000H ; bit-init DB 0C1H, floor_up_2 + 000H ; bit-initDB 0C1H, floor_down_2 + 000H ; bit-init DB 0C1H, floor_up_1 + 000H ; bit-initDB 0C1H, opendoor + 000H ; bit-initDB 0C1H, close_door + 000H ; bit-initDB 0C1H, start + 000H ; bit-init; //晶振12MHz 6T模式,总线频率2MHz 指令0.5us; #pragma src; #include <REG52.H> //89C52的头文件;; #define T0_HIGH 0xff //T0计时器寄存器初值; #define T0_LOW 0x9b //溢出计数80个,定时周期80*0.25us=20us; //为了保证主程序正常运行,定时器计数最好不要小于80个;; #define keynumber 16 16个按键标志; #define KEYIO P2 4*4键盘输入; #define output P1 lcd12864数据D0~D7; #define nobcd P0 BCD端口输出;; sbit clock=P3^0; lcd12864时钟输出端; sbit servo_door=P3^7; 舵机控制门输出端口; int count=0;;; char key_flag[keynumber]={0}; 按键标志位;; char key=0;; char i=0;;; bit pressflag=0;; bit up_flag=0;; bit down_flag=0; 控制信号标志位; bit stop_flag=0;;;;;;; char rowkey=0; 键盘反选变量设置; char rankkey=0;; char temp=0;; char row=0;; char rank=0;;; bit floor_flag_1=0;、、各楼层标志位; bit floor_flag_2=0;; bit floor_flag_3=0;; bit floor_flag_4=0;; bit floor_flag_5=0;; bit floor_down_5=0;; bit floor_up_4=0;; bit floor_down_4=0;; bit floor_up_3=0;; bit floor_down_3=0;; bit floor_up_2=0;; bit floor_down_2=0;; bit floor_up_1=0;; bit opendoor=0;; bit close_door=0;; bit start=0;;; //----------------------------------------------------------------------- ; void delay(unsigned int i)//延时函数_delay:USING 0; SOURCE LINE # 56;---- Variable 'i?040' assigned to Register 'R6/R7' ----; {; SOURCE LINE # 57; unsigned char j;; for(;i>0;i--); SOURCE LINE # 59?C0001:SETB CMOV A,R7SUBB A,#00HMOV A,R6SUBB A,#00HJC ?C0007; for(j=0;j<250;j++);; SOURCE LINE # 60;---- Variable 'j?041' assigned to Register 'R5' ----CLR AMOV R5,A?C0004:INC R5CJNE R5,#0FAH,?C0004?C0003:MOV A,R7DEC R7JNZ ?C0001DEC R6?C0113:SJMP ?C0001; }; SOURCE LINE # 61?C0007:RET; END OF _delay; //-----------------------------------------------------------------------; int ABS(int i) //绝对值函数RSEG ?PR?_ABS?SMARTCAR_ABS:USING 0; SOURCE LINE # 63;---- Variable 'i?142' assigned to Register 'R6/R7' ---- 键盘线反选函数; {; SOURCE LINE # 64; if (i>=0) return i;; SOURCE LINE # 65CLR CMOV A,R6XRL A,#080HSUBB A,#080HJC ?C0008RET?C0008:; else return -i;; SOURCE LINE # 66CLR CCLR ASUBB A,R7MOV R7,ACLR ASUBB A,R6MOV R6,A; }; SOURCE LINE # 67?C0009:RET; END OF _ABS; //----------------------------------------------------------------------- ; void keysort(void)RSEG ?PR?keysort?SMARTCARkeysort:USING 0; SOURCE LINE # 69; {; SOURCE LINE # 70; for(i=0;i<16;i++); SOURCE LINE # 71CLR AMOV i,A?C0011:; {; SOURCE LINE # 72; if(key==i) key_flag[i]=1;; SOURCE LINE # 73MOV A,keyCJNE A,i,?C0013MOV A,#LOW (key_flag) 读并且记录标志位函数ADD A,iMOV R0,AMOV @R0,#01H; }; SOURCE LINE # 74?C0013:INC iMOV A,iCJNE A,#010H,?C0011?C0012:;; for(i=0;i<16;i++); SOURCE LINE # 76CLR AMOV i,A?C0015:; {; SOURCE LINE # 77; if(key_flag[i]!=0); SOURCE LINE # 78MOV A,#LOW (key_flag)ADD A,iMOV R0,AMOV A,@R0JNZ $ + 5HLJMP ?C0017; {; SOURCE LINE # 79; if(i==0) floor_flag_1=1; else floor_flag_1=0;; SOURCE LINE # 80MOV A,iJNZ ?C0019SETB floor_flag_1SJMP ?C0020?C0019:CLR floor_flag_1?C0020:; if(i==1) floor_flag_2=1; else floor_flag_2=0;; SOURCE LINE # 81MOV A,iCJNE A,#01H,?C0021SETB floor_flag_2SJMP ?C0022?C0021:CLR floor_flag_2?C0022:; if(i==2) floor_flag_3=1; else floor_flag_3=0;; SOURCE LINE # 82MOV A,iCJNE A,#02H,?C0023SETB floor_flag_3SJMP ?C0024?C0023:CLR floor_flag_3?C0024:; if(i==3) floor_flag_4=1; else floor_flag_4=0;; SOURCE LINE # 83MOV A,iCJNE A,#03H,?C0025SETB floor_flag_4SJMP ?C0026?C0025:CLR floor_flag_4?C0026:; if(i==4) floor_flag_5=1; else floor_flag_5=0;; SOURCE LINE # 84MOV A,iCJNE A,#04H,?C0027SETB floor_flag_5SJMP ?C0028?C0027:CLR floor_flag_5?C0028:; if(i==5) floor_down_5=1; else floor_down_5=0;; SOURCE LINE # 85MOV A,iCJNE A,#05H,?C0029SETB floor_down_5SJMP ?C0030?C0029:CLR floor_down_5?C0030:; if(i==6) floor_up_4=1; else floor_up_4=0;; SOURCE LINE # 86MOV A,iCJNE A,#06H,?C0031SETB floor_up_4SJMP ?C0032?C0031:CLR floor_up_4?C0032:; if(i==7) floor_down_4=1; else floor_down_4=0;; SOURCE LINE # 87MOV A,iCJNE A,#07H,?C0033SETB floor_down_4SJMP ?C0034?C0033:CLR floor_down_4?C0034:; if(i==8) floor_up_3=1; else floor_up_3=0;; SOURCE LINE # 88MOV A,iCJNE A,#08H,?C0035SETB floor_up_3SJMP ?C0036 电梯运行函数?C0035:CLR floor_up_3?C0036:; if(i==9) floor_down_3=1; else floor_down_3=0;; SOURCE LINE # 89MOV A,iCJNE A,#09H,?C0037SETB floor_down_3SJMP ?C0038?C0037:CLR floor_down_3?C0038:; if(i==10) floor_up_2=1; else floor_up_2=0;; SOURCE LINE # 90MOV A,iCJNE A,#0AH,?C0039SETB floor_up_2SJMP ?C0040?C0039:CLR floor_up_2?C0040:; if(i==11) floor_down_2=1; else floor_down_2=0;; SOURCE LINE # 91MOV A,iCJNE A,#0BH,?C0041SETB floor_down_2SJMP ?C0042?C0041:CLR floor_down_2?C0042:; if(i==12) floor_up_1=1; else floor_up_1=0;; SOURCE LINE # 92MOV A,iCJNE A,#0CH,?C0043SETB floor_up_1SJMP ?C0044?C0043:CLR floor_up_1?C0044:; if(i==13) opendoor=1; else opendoor=0;; SOURCE LINE # 93MOV A,iCJNE A,#0DH,?C0045SETB opendoorSJMP ?C0046?C0045:CLR opendoor?C0046:; if(i==14) close_door=1; else close_door=0;; SOURCE LINE # 94MOV A,iCJNE A,#0EH,?C0047SETB close_doorSJMP ?C0048?C0047:CLR close_door?C0048:; if(i==15) start=1; else start=0;; SOURCE LINE # 95MOV A,iCJNE A,#0FH,?C0049SETB startSJMP ?C0017?C0049:CLR start; }; SOURCE LINE # 96; }; SOURCE LINE # 97?C0017:INC iMOV A,iXRL A,#010HJZ $ + 5HLJMP ?C0015;;;;;;;; }; SOURCE LINE # 105?C0051:RET; END OF keysort;;;; unsigned char keycheck() 4*4 键盘RSEG ?PR?keycheck?SMARTCARkeycheck:USING 0; SOURCE LINE # 109; {; SOURCE LINE # 110; char i=0;; SOURCE LINE # 111;---- Variable 'i?343' assigned to Register 'R4' ---- CLR AMOV R4,A; temp=0;; SOURCE LINE # 112MOV temp,A; KEYIO=0xf0;; SOURCE LINE # 113MOV P2,#0F0H; delay(5);; SOURCE LINE # 114MOV R7,#05HMOV R6,ALCALL _delay; rowkey=P2;; SOURCE LINE # 115MOV rowkey,P2; if(rowkey!=0xf0); SOURCE LINE # 116MOV R7,rowkeyMOV A,R7RLC ASUBB A,ACCMOV R6,AMOV A,R7XRL A,#0F0HORL A,R6JZ ?C0052; {; SOURCE LINE # 117; //delay(10);; if(rowkey!=0xf0); SOURCE LINE # 119MOV A,R7XRL A,#0F0HORL A,R6JZ ?C0053; {pressflag=1;rowkey=(rowkey&0x0f);}; SOURCE LINE # 120SETB pressflagANL rowkey,#0FHSJMP ?C0055?C0053:; else pressflag=0;; SOURCE LINE # 121CLR pressflag; }; SOURCE LINE # 122SJMP ?C0055?C0052:; else pressflag=0;; SOURCE LINE # 123CLR pressflag?C0055:;;; if(pressflag==1); SOURCE LINE # 126JB pressflag,$ + 6HLJMP ?C0085; {; SOURCE LINE # 127 ; KEYIO=0x0f;; SOURCE LINE # 128 MOV P2,#0FH; //delay(10);; rankkey=P2;; SOURCE LINE # 130 MOV rankkey,P2; rankkey=(rankkey&0xf0);; SOURCE LINE # 131 ANL rankkey,#0F0H; rankkey=(rankkey>>4);; SOURCE LINE # 132 MOV A,rankkeyMOV R0,#04H?C0114:MOV C,ACC.7RRC ADJNZ R0,?C0114MOV rankkey,A;; {; SOURCE LINE # 134 ; for(i=0;i<=3;i++); SOURCE LINE # 135 CLR AMOV R4,A?C0057:; {; SOURCE LINE # 136; temp=0x01;; SOURCE LINE # 137MOV temp,#01H; temp=(temp<<i);; SOURCE LINE # 138MOV A,tempMOV R0,AR4INC R0SJMP ?C0116?C0115:CLR CRLC A?C0116:DJNZ R0,?C0115MOV temp,A; if((rowkey&temp)!=0) {row=i+1;i=4;}; SOURCE LINE # 139ANL A,rowkeyJZ ?C0059MOV A,R4INC AMOV row,AMOV R4,#04H; }; SOURCE LINE # 140?C0059:INC R4SETB CMOV A,R4XRL A,#080HSUBB A,#083HJC ?C0057?C0058:;;; for(i=0;i<=3;i++); SOURCE LINE # 143 CLR AMOV R4,A?C0061:; {; SOURCE LINE # 144 ; temp=0x01;; SOURCE LINE # 145 MOV temp,#01H; temp=(temp<<i);; SOURCE LINE # 146 MOV A,tempMOV R0,AR4INC R0SJMP ?C0118?C0117:CLR CRLC A?C0118:DJNZ R0,?C0117MOV temp,A; if((rankkey&temp)!=0) {rank=i+1;i=4;}; SOURCE LINE # 147ANL A,rankkeyJZ ?C0063MOV A,R4INC AMOV rank,AMOV R4,#04H; }; SOURCE LINE # 148?C0063:INC R4SETB CMOV A,R4XRL A,#080HSUBB A,#083HJC ?C0061?C0062:;; if(row==1); SOURCE LINE # 150MOV A,rowCJNE A,#01H,?C0065; {; SOURCE LINE # 151; if(rank==1) key=0;; SOURCE LINE # 152MOV A,rankCJNE A,#01H,?C0066CLR A?C0066:; if(rank==2) key=1;; SOURCE LINE # 153 MOV A,rankCJNE A,#02H,?C0067MOV key,#01H?C0067:; if(rank==3) key=2;; SOURCE LINE # 154 MOV A,rankCJNE A,#03H,?C0068MOV key,#02H?C0068:; if(rank==4) key=3;; SOURCE LINE # 155 MOV A,rankCJNE A,#04H,?C0065MOV key,#03H; }; SOURCE LINE # 156 ?C0065:; if(row==2); SOURCE LINE # 157 MOV A,rowCJNE A,#02H,?C0070; {; SOURCE LINE # 158 ; if(rank==1) key=4;; SOURCE LINE # 159CJNE A,#01H,?C0071MOV key,#04H?C0071:; if(rank==2) key=5;; SOURCE LINE # 160 MOV A,rankCJNE A,#02H,?C0072MOV key,#05H?C0072:; if(rank==3) key=6;; SOURCE LINE # 161 MOV A,rankCJNE A,#03H,?C0073MOV key,#06H?C0073:; if(rank==4) key=7;; SOURCE LINE # 162 MOV A,rankCJNE A,#04H,?C0070MOV key,#07H; }; SOURCE LINE # 163 ?C0070:; if(row==3); SOURCE LINE # 164 MOV A,rowCJNE A,#03H,?C0075; {; SOURCE LINE # 165; if(rank==1) key=8;; SOURCE LINE # 166 MOV A,rankCJNE A,#01H,?C0076MOV key,#08H?C0076:; if(rank==2) key=9;; SOURCE LINE # 167 MOV A,rankCJNE A,#02H,?C0077MOV key,#09H?C0077:; if(rank==3) key=10;; SOURCE LINE # 168 MOV A,rankCJNE A,#03H,?C0078MOV key,#0AH?C0078:; if(rank==4) key=11;; SOURCE LINE # 169 MOV A,rankCJNE A,#04H,?C0075MOV key,#0BH; }; SOURCE LINE # 170 ?C0075:; if(row==4); SOURCE LINE # 171 MOV A,rowCJNE A,#04H,?C0080; {; SOURCE LINE # 172 ; if(rank==1) key=12;; SOURCE LINE # 173 MOV A,rankCJNE A,#01H,?C0081MOV key,#0CH?C0081:; if(rank==2) key=13;; SOURCE LINE # 174 MOV A,rankCJNE A,#02H,?C0082MOV key,#0DH?C0082:; if(rank==3) key=14;; SOURCE LINE # 175 MOV A,rankCJNE A,#03H,?C0083MOV key,#0EH?C0083:; if(rank==4) key=15;; SOURCE LINE # 176 MOV A,rankCJNE A,#04H,?C0080MOV key,#0FH; }; SOURCE LINE # 177 ?C0080:; rank=0;; SOURCE LINE # 178CLR AMOV rank,A; row=0;; SOURCE LINE # 179 MOV row,A; rowkey=0;; SOURCE LINE # 180 MOV rowkey,A; rankkey=0;; SOURCE LINE # 181 MOV rankkey,A; }; SOURCE LINE # 182 ; }; SOURCE LINE # 183 ?C0085:; while(P2!=0x0f); SOURCE LINE # 184 MOV A,P2CJNE A,#0FH,?C0085; {; SOURCE LINE # 185 ; //delay(5);; }; SOURCE LINE # 187 ?C0086:; return key;; SOURCE LINE # 188 MOV R7,key;; }; SOURCE LINE # 190?C0087:RET; END OF keycheck; void sys_init(void) 单片机IO口初始化RSEG ?PR?sys_init?SMARTCARsys_init:; SOURCE LINE # 191; {; SOURCE LINE # 192; //------IO口设置------------;;;;; //------定时器设置------------;; TMOD=0x11; //定时器0方式1; SOURCE LINE # 200MOV TMOD,#011H; TH0=T0_HIGH; //定时器赋初值; SOURCE LINE # 201MOV TH0,#0FFH; TL0=T0_LOW ;; SOURCE LINE # 202MOV TL0,#09BH;; TR0=1; //定时器运行; SOURCE LINE # 204SETB TR0; ET0=1; //开定时器中断; SOURCE LINE # 205SETB ET0; EA=1; //开总中断; SOURCE LINE # 206SETB EA; }; SOURCE LINE # 207RET; END OF sys_init;; unsigned char BCD(char keyp)RSEG ?PR?_BCD?SMARTCAR_BCD:USING 0; SOURCE LINE # 209;---- Variable 'keyp?544' assigned to Register 'R7' ---- ; {; SOURCE LINE # 210; if(keyp==0x00) keyp=0x00;; SOURCE LINE # 211MOV A,R7JNZ ?C0089MOV R7,A?C0089:; SOURCE LINE # 212 CJNE R7,#01H,?C0090MOV R7,#01H?C0090:; if(keyp==0x02) keyp=0x02;; SOURCE LINE # 213 CJNE R7,#02H,?C0091MOV R7,#02H?C0091:; if(keyp==0x03) keyp=0x03;; SOURCE LINE # 214 CJNE R7,#03H,?C0092MOV R7,#03H?C0092:; if(keyp==0x04) keyp=0x04;; SOURCE LINE # 215 CJNE R7,#04H,?C0093MOV R7,#04H?C0093:; if(keyp==0x05) keyp=0x05;; SOURCE LINE # 216 CJNE R7,#05H,?C0094MOV R7,#05H?C0094:; if(keyp==0x06) keyp=0x06;; SOURCE LINE # 217 CJNE R7,#06H,?C0095MOV R7,#06H?C0095:; SOURCE LINE # 218 CJNE R7,#07H,?C0096MOV R7,#07H?C0096:; if(keyp==0x08) keyp=0x08;; SOURCE LINE # 219 CJNE R7,#08H,?C0097MOV R7,#08H?C0097:; if(keyp==0x09) keyp=0x09;; SOURCE LINE # 220 CJNE R7,#09H,?C0098MOV R7,#09H?C0098:;; if(keyp==0x0a) keyp=0x10;; SOURCE LINE # 222 CJNE R7,#0AH,?C0099MOV R7,#010H?C0099:;; if(keyp==0x0b) keyp=0x11;; SOURCE LINE # 224 CJNE R7,#0BH,?C0100MOV R7,#011H?C0100:; if(keyp==0x0c) keyp=0x12;; SOURCE LINE # 225 CJNE R7,#0CH,?C0101MOV R7,#012H?C0101:; if(keyp==0x0d) keyp=0x13;; SOURCE LINE # 226CJNE R7,#0DH,?C0102MOV R7,#013H?C0102:; if(keyp==0x0e) keyp=0x14;; SOURCE LINE # 227CJNE R7,#0EH,?C0103MOV R7,#014H?C0103:; if(keyp==0x0f) keyp=0x15;; SOURCE LINE # 228CJNE R7,#0FH,?C0104MOV R7,#015H?C0104:;; return keyp;; SOURCE LINE # 230; }; SOURCE LINE # 231?C0105:RET; END OF _BCD;; //-----------------------------------------------------------------------; void main(void) 主函数main:USING 0; SOURCE LINE # 234; {; SOURCE LINE # 235; sys_init(); //初始化; SOURCE LINE # 236 LCALL sys_init?C0106:; while(1); SOURCE LINE # 237; {; SOURCE LINE # 238; keycheck();; SOURCE LINE # 239 LCALL keycheck; nobcd=key;; SOURCE LINE # 240 MOV P0,key; output=BCD(key);; SOURCE LINE # 241 MOV R7,keyLCALL _BCDMOV P1,R7;; }; SOURCE LINE # 243 SJMP ?C0106; END OF mainCSEG AT 0000BHLJMP TIME_BASE; }; //-----------------------------------------------------------------------; void TIME_BASE(void) interrupt 1 using 1 //定时器生成控制PWMRSEG ?PR?TIME_BASE?SMARTCARUSING 1TIME_BASE:PUSH ACCPUSH PSW; SOURCE LINE # 246; {; TH0=T0_HIGH; //赋初值; SOURCE LINE # 248MOV TH0,#0FFH; TL0=T0_LOW ;; SOURCE LINE # 249MOV TL0,#09BH; count++;; SOURCE LINE # 250INC count+01HMOV A,count+01HJNZ ?C0119INC count?C0119:; if(count<=0) servo_door=1;; SOURCE LINE # 251SETB CSUBB A,#00HMOV A,countXRL A,#080HSUBB A,#080HJNC ?C0109SETB servo_doorSJMP ?C0110?C0109:; else servo_door=0;; SOURCE LINE # 252 CLR servo_door?C0110:;; if(count>400) //PWM比较、生成; SOURCE LINE # 254 SETB CMOV A,count+01HSUBB A,#090HMOV A,countXRL A,#080HSUBB A,#081HJC ?C0112; {; SOURCE LINE # 255; count=1;; SOURCE LINE # 256 MOV count,#00HMOV count+01H,#01H; }; SOURCE LINE # 257。