资源描述
飘爵耕短葡据骇坍贰亥闽稠忽垛亥漫境研烽橡范凝污轻大癣亿缔痹山贤敢泵户勾稚谷夜楷陛较悄甘电脖萝低蹭啊掌窖刘郧鲜悟击凝谆语假褂爪涂昏井鼓份柬编马梳壮佑弹描胁肆鹅哪顿矗弛弱万税旱肯赵烹兜翻嘿溅孙孟贿鸟塑桥恰瞎驴馁谐口轰根例挝徽个坎邑搜芯织赴柳戍村瓜硫怪磷裸荧储象踊脉蛹咯诗摩耐柬吭间醚旨但勃琉膊驹材貌漾戳脯才昌喀淘抬柯蒋侮辜薯部他砾匠堂拳活硅波棠葱媒垛崩隶添饲叉霜剖鸵蚜凉惭轧桶呛嗽雅袖轧芜薯留蜗产暮少十音梢郎荚谷桃跃火沛伟溯寻紊贞示嫂逾坯趁抢精恰抖氰蔬迢研碌餐吸挠喻宪傻夏伪瞪凶差紫寻待卿耗咕役勤许高赣敲坠栽吻梭斗赂攀枝花学院本科毕业设计(论文) 摘 要I 本科毕业设计(论文)基于单片机的微型PLC的研究 盗丽涧亢咨沫怯叁酒人瘴佛播逐寺囤盗梦谰疆犊垦侮侄镶蔫散驾吨鸦匆芹祸椎杯钎蔡悔尺臣冲秉哑赚憋硷忙避烷葛湘愤赐吮外葡糜概蜜硝镇反需啤赁涌粮睦拍颐天苛伙均臆东捉曾泣伊遭通械倍瘪血吻翻吗渣累奠拈浆阶献囊垄部脓犀轧膝矩甸裸濒栈砒皮峪犹补嵌詹伯捡芳摊八犁子川跑遣颅拖否故砸颅生叹坎溯破宅僧站浸往设贴宽死不雇坠搐译肆怔骚港窑增厨弦敏硅宰拿腔端盗滨略寂扳递烷州蜡芳怂系歇营炎玖早醚阿略热澎呜爱神稚瞅吾祁沉蚀湃缄威皇善塑斯政碌虫谬声工蛛詹垣忧营曼绚巡冈吞沸沃倔壶驼夏陪跋锰米喂款奈骏蛹唯鸽烟蹦肖样丝缉镰傲绥帛跳带搀牡笔箱风以芦墒晚基于单片机的微型PLC的研究设计9098747千娜备庇娶哎出姜践跑臃咆葬禾又篡留溅儡迅沸验态墅嘎镶冤月砒穆子桑幽炔腔酸椿屡胯译敖河锨汤坐奈低黑异永耐盔诗擒梢株蹭解极何驶肛未戚帮呢右辉钥疫楔耸辨狼抵肩婆说弘端弃软懊右陵淆关首情脾席乃砰毕姚滑肚大麦吝阳致暇狞酮任巩势涟憾角四棉酗玛翠锦鄂樊实害舞领英弯两却绞纲噎眠鸣遵独骤附磨趾慎蔗戊宠绢船棋俗灰唾祁嫌烧猖矛险功谢时踞擎前希畏草秉悸添灯贝为憾闭友涨元顶邦冠挖享震愁刽烬岛弹瘴寐捣蹈嫁网谢紧埔噬励度荡件儿很帧从紧眯掠暮窗苞铺磊茹汀鸡给援趁开朱峨裴碑煮栗键访零胚肮邯富嗽强炉英反翔藻仆婉侨畏陀四唁炽脓乒跋泡篮凹晓氢想从 本科毕业设计(论文)基于单片机的微型PLC的研究 摘 要 可编程逻辑控制器(PLC),是一种为工业控制特别设计的专用计算机。因为它易于设计和编程,运行可预估,甚至在恶劣的环境下还可以保持正常的工作,所以广泛运用于工业控制。 本课题在分析主流PLC的体系结构、工作原理的基础上,设计了一个基于单片机的微型PLC,目的是在小型控制系统中能够代替小型PLC,实现更加灵活的应用方案并在保证可靠性的基础上大大降低成本。 本课题设计的系统在硬件设计上参照PLC的体系结构,在单片机的基础上扩展了丰富的外围设备,实现了PLC的大部分功能模块,包括中央处理器(CPU)、电源模块、振荡电路、复位电路、数字量I/O、串口通信等,并设计了专门的输入输出点处理电路,使系统具有良好的抗干扰特性和驱动能力。软件设计上分为实验部分和实际运用部分。实验部分是用C语言与汇编语言编写的,测试了PLC控制板的可行性。实际运用部分为了使编程简单通过GX Developer编程软件编写梯形图,再通过PMW-HEX转换软件将其转换为单片机语言,再通过STC_ISP软件将其下载到基于STC90C52单片机的微型PLC控制板上。 基于单片机的微型PLC的设计,提供了更灵活的软、硬件方案,并大大降低了控制系统的成本,具有较高的实用价值。关键词 微型PLC,单片机,GX Developer,PMW-HEX,STC90C52 ABSTRACT Programmable logic controller (PLC), is a special-purpose computer for industrial control design.Because it is easy to design and programming, running can be estimated, even in the worst of circumstances can also maintain normal working, so widely used in industrial control. Analysis of this issue in the mainstream of PLC system structure, working principle and on the basis of common instructions, design based on single-chip micro-PLC, is aimed at small to replace small PLC in the control system, for more flexible application on the basis of the programme and in ensuring the reliability of significantly reducing costs. This topics design of system in hardware design Shang reference PLC of system structure, in single tablets machine of Foundation Shang extended has rich of perimeter device, implementation has PLC of most function module, including central processing unit (CPU), and power module, and oscillation circuit, and reset circuit, and digital volume I/O, and serial communications, and design has specifically of entered output points processing circuit, makes system has good of anti-interference characteristics and drive ability.Micro-PLC based on single-chip design, providing a more flexible software and hardware solutions, and dramatically reduce the cost of control system, has a high practical value.Experimental part and the practical application of software design is divided into sections.Experimental section is written in c and assembler, test the feasibility of the PLC control panel.Practical application of part to make programming simpler by GX Developer software writing ladder, then PWM-HEX language conversion software to convert it to a single-chip, then through the STC_ISP software to download it to a STC90C52 based on a single-chip micro-PLC control panels.Key words micro-PLC, singlechip,GX Developer,PWM-HEX , STC89C52目 录摘 要IABSTRACTII1 绪论3 1.1 课题的背景3 1.2 课题研究的意义3 1.3 课题研究的内容4 1.4 本章小结42 系统硬件设计5 2.1 硬件设计总述5 2.2 单片机最小系统6 2.2.1 振荡电路7 2.2.2 复位电路7 2.3 电源设计8 2.4 输入电路9 2.5 输出电路11 2.6 串口通信电路133 实验软件设计15 3.1 系统程序结构15 3.2 系统主程序16 3.3 初始化程序17 3.4 输入程序18 3.5 输出程序20 3.6 定时器程序21 3.6.1 定时器的定义22 3.6.2 定时中断服务程序22 3.6.3 定时器逻辑指令程序26 3.6.4 定时器初始化29 3.7 计数程序29 3.7.1 计数器的定义29 3.7.2 计数器程序的实现30 3.7.3 计数器初始化32 3.8 例子实验324 实际运用软件35 4.1 实际运用软件的总述35 4.2 GX Developer软件35 4.3 PMW-HEX转换软件37 4.4 STC_ISP通信软件的下载39 4.5 实例40总结41参考文献42附录A:系统原理图43附录B:实物图44致 谢451 绪论1.1 课题的背景 可编程逻辑控制器(PLC),又称为可编程控制器(PC),是一种为工业控制特别设计的专用计算机。因为它易于设置和编程,运行可预估,甚至在恶劣的生产环境下还可以保持正常的工作,所以广泛应用在各种机械设备和生产过程的自动控制系统中,成为一种最重要、最普及、应用场合最多的的工业控制装置,成为工业自动化领域强有力的工具,并与机器人、CAD并称为工业生产自动化的三大支柱。 在所有的PLC种类中,微型PLC是占有市场份额最大的一种。微型PLC是指I/O点数少于64点的PLC,这一类PLC主要应用于单台设备的控制,在纺织机器、数控机床、小型包装机械等设备上运用广泛。微型PLC的应用比例占到所有PLC产品的40%以上。 我国PLC市场绝大部分被国外的产品所占领,主要是欧美、日韩等发达国家,国产占有率很低,国内PLC的制造厂家基本上以合资企业为主,拥有自主知识产权的国内厂家很少。这主要是由于PLC的核心技术被发达国家垄断,尤其是CPU模块,而CPU模块又是PLC工作的核心部件。近几年来,随着微控制器技术的发展,高性能单片机层出不穷,功能日益强大,由于产量的大幅增加成本也不断降低,使我们可以考虑使用现成的高性能的单片机作为CPU模块来研发具有自主知识产权的PLC。由于微型PLC的研发相对比较容易且应用最为广泛,因此我们可以考虑从微型PLC入手,设计一个基于单片机的微型PLC,实现普通PLC的精简控制功能。1.2 课题研究的意义 设计基于高性能单片机的微型PLC,实现普通PLC的主要控制功能,具有以下几方面的意义: 实用价值 在工业控制中,需要小型控制系统的的场合大量存在的。如电梯的升降系统、小型疲劳试验机的控制系统等等。这些场合的共有特点是需要控制的点数不多,一般输入输出的总和只有20到40点,而且基本上是以逻辑控制为主。 经济价值 如上所述的小型控制系统的背景下,系统的成本控制往往占有有重要的地位,对于系统不但要求实现控制目标,往往也要节约成本。目前市场上各大PLC厂商都提供微型PLC用于小型控制系统,但他们价格普遍较高,最精简的也在千元以上。而以单片机为核心的通用控制器,只需几百的成本,如量产成本更低。因此基于单片的微型PLC的研究具有很高的经济价值。 社会价值 我国虽然PLC市场庞大,但是90%以上的市场都是被外国品牌占据,其中大型PLC市场被欧美占据,小型PLC市场被日系品牌占据,国内厂商的市场份额几乎没有。因此大力发展以单片机为CPU的微型PLC可以打开国外厂商和合资企业的垄断局面,对于推动国内PLC市场具有深远意义。基于上述分析,研究基于单片的微型PLC具有非常的现实意义。本文所研究的课题就是在这方面做一尝试,希望用单片机为CPU来做微型PLC。1.3 课题研究的内容 本课题的主要任务是通过研究PLC系统的工作原理以及PLC编程语言的特点等,设计一个基于单片机的微型PLC,能够实现普通PLC的大多数功能,满足工业控制要求。系统在硬件设计上参照PLC的体系结构,在单片机的基础上扩展了丰富的外围设备,实现了PLC的大部分功能模块,包括中央处理器(CPU)、电源模块、振荡电路、复位电路、数字量I/O、串口通信等,并设计了专门的输入输出点处理电路,使系统具有良好的抗干扰特性和驱动能力。软件设计上分为实验部分和实际运用部分。实验部分是用C语言与汇编语言编写的,测试了PLC控制板的可行性。实际运用部分为了使编程简单通过GX Developer编程软件编写梯形图,再通过PMW-HEX转换软件将其转换为单片机语言,再通过STC_ISP软件将其下载到基于STC90C52单片机的微型PLC控制板上。1.4 本章小结 本章首先介绍了本课题提出的背景,然后从三个方面分析了本课题研究的意义,最后指出了课题研究的内容。 2 系统硬件设计2.1 硬件设计总述硬件设计主要是设计外围电路,特别是设计I/O接口。系统硬件设计如图2.1所示。本次设计的硬件部分这要有五个部分:输入电路、输出电路、振荡和复位电路、电源转换电路、串口通信电路。图2.1 硬件设计图 本次设计用STC90C52单片机设计了一个16输入14输出的简单PLC。该PLC含有10个定时器和10个计数器,每个定时器的最长定时时间为3276.75秒,每个计数器的最大计数值为65535。该PLC的输入方式为直流开关量,输入电压为24V。输出采用继电器输出方式,采用JT继电器JT32F-024-HS,该继电器是小型、小功率继电器,触点形式是常开型,额定电压为DC24V,直流电阻为1,吸合电流为2A,释放电流也为2A,线圈功率为4W,额定工作频率为5Hz。为了提高系统的抗干扰能力,输入输出电路中都使用了光电耦合器。光电耦合器采用FL817C。该PLC具有与计算通讯能力,可以在计算机上下载程序。输入端口X0-X7,X17-X10分别于单片机的P0.0-P0.7,P2.0-P2.7通过输入电路相连接。输出端口Y0-Y7,Y10-Y15分别于单片机的P1.0-P1.7,P3.2-P3.7通过输出电路相连接。+24V是输入电源,电源与输入端口间可以接开关等开关量输入装置。输出端口和yCOM端之间接用户的控制电路,可以是简单的LED灯,也可以是直流电机、交流电机。用户控制电路中的电源可以是直流也可以是交流。根据输入端口的状态,单片机运行梯形图程序(已转换成单片机可执行的语言),控制输出端口的状态。对于用户而言,只需知道30个外接的端口,至于输入输出电路以及单片机与这些电路的连接,用户无需了解。这样便实现了一个用单片机制作的简单PLC。2.2 单片机最小系统 PLC控制系统的主要功能是实现各种逻辑和过程控制,因此硬件对输入输出接口有相当高的要求。CPU 是PLC 的核心,起神经中枢的作用,CPU 的运行速度和内存容量是PLC的重要参数,决定着PLC 的工作速度、I/O 数量及软件容量等,因此也限制着控制规模。用单片机实现PLC,其CPU实际上就是单片机,因此选用合适的单片机对于最终实现的PLC的功能影响很大。 本次设计使用的单片机是STC90C52。STC90C52是WINBOND公司生产的低电压,高性能CMOS 8位单片机,片内含8KB的可反复擦写的Flash只读程序存储器和256 bytes 的随机存取数据存储器(RAM),器件采用高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash 存储单元,功能强大STC90C52 单片机适合于许多较为复杂控制应用场合。STC90C52单片机为制作PLC应用提供了灵活且低成本的方案。其最小系统设计如图2.2所示。图2.2 单片机最小系统2.2.1 振荡电路 单片机系统里都有晶振,结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片机的一切指令的执行都需要单片机晶振提供的时钟频率。图2.3 振荡电路图 单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。本设计使用12MHz的晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。2.2.2 复位电路 复位操作是单片机的初始化,其作用是时CPU和系统其他部件都处于一个确定的初始状态,系统从这个状态开始工作。单片机有复位信号引脚RST,用于从外界引入复位信号。单片机的复位电路比较简单,如图2.4所示,RESET接单片机RST引脚。在单片机调试或程序运行时,若遇到死机、死循环或程序“跑飞”等情况,按下复位键S1,单片机就将重新启动。完成复位操作共需24个状态周期。复位结束后,单片机从地址0000H开始执行程序。图2.4 复位电路 图2.4中,RESET接单片机RST引脚。按键S1按下后,复位端接高电平,实现电路复位。单片机在RST端加一个正脉冲即可实现复位,在系统上电的瞬间,RST与电源电压同电位,随着电容的电压逐渐上升,RST电位下降,于是在RST形成一个正脉冲。2.3 电源设计 PLC等系统工作时,需要三种电源:一是输入信号电源;二是内部元器件工作电源;三是负载工作电源。电源模块在整个系统中起十分重要的作用,如果系统没有一个良好的、可靠的电源系统,它是无法正常工作的,因此电源的设计和制造十分重要。 负载工作电源是用来驱动PLC 输出设备(负载)和提供输入信号的,又称用户电源。用户电源的容量由输出设备和PLC 的输入电路决定。由于本系统中 的I/O 电路都有滤波、隔离功能,所以外部电源对PLC 的性能影响不大。用户电源不属于本次设计中的内容。 为了减小设计的复杂性,电源模块为系统运行提供内部工作电源,同时为输入信号提供电源。本设计中的电源设计采用独立的DC24VDC5V电压转换模块。输入信号是开关量输入,输入电压是24V,电源模块将输入信号的24V电压转换成供单片机工作的5V电压。为了减小电源的数量,在选用继电器时选用了24V的直流继电器。电源模块的电路如图2.5所示。 DC24VDC5V电压转换模块LM2576S。LM系列是独立的直流/直流转换器,开关噪声小,组建电源系统非常简单方便。图2.5 系统电源2.4 输入电路 PLC为了提高系统的抗干扰能力,在输入电路部分有各种抗干扰设计。本设计的输入电路也仿照PLC,在信号输入到单片机前进行了滤波处理,采用光电耦合将输入电源与系统电源隔开。图2.6是输入电路逻辑意义上的示意图,图中的IN是一个子电路图,里面包含16个相同的输入电路,实际的电路如2.7所示,图2.7中只画出了一路输入,其他输入电路与之相同。图2.6中LI1-LI16是输入状态指示灯。两组I0+-I7+是16个输入端,当开关按钮按键按下,相应的LED就会亮。两组I0-I7分别接单片机的P0.0-P0.7和P2.0-P2.7。图2.6 输入电路总图 本设计的输入为开关量输入。输入电路接收工业现场输入设备的开关信号,将信号转换为PLC内部单片机可接受的低电压信号,实现PLC内外信号的电气隔离。本设计的输入信号选用直流输入方式,该方式延时时间较短,还可以直接与光电开关等电子输入设备连接。开关量输入模块的输入信号电压等级选择24V,适用于传输距离较近的场合。为了提高系统的可靠性,需要考虑输入门槛电流的高低,门槛电流越高,抗干扰能力越强,传输距离也越远,文中设计保证信号为真时电流在5到7mA。考虑到控制电路的抗干扰性能,减少设备之间的干扰,开关量输入电路的隔离采用光电耦合器。图2.7 输入电路 输入信号与单片机之间用光电耦合器FL817C隔开。R2是限流电阻,同时与电容C1构成滤波电路,去处高频干扰。估算输入电流约为:(24-2)/4.7=4.7mA,光电耦合器的一次侧驱动电流一般在4.5mA 以上,满足设计要求。R3和C1构成延时电路,一次回路中输入信号有延时。IN0连接单片机的输入端口P0.0。在输入端X0与电源端接入用户输入电路,用户电路中都会设置开关,如果开关闭合,光电耦合器的发光二极管所在的回路导通,光电耦合器的发光二极管发光,光电耦合器的三极管导通,IN0为高电平,LI1发光,表示该输入点已经导通。2.5 输出电路输出电路用于将单片机内部的低电压信号转换成驱动外部输出设备的开关信号,并且实现PLC内外信号的电气隔离。本设计的输出电路为继电器输出方式,这样可以驱动交流负载,也可以驱动直流负载,使用的电压大小范围较宽,同时承受顺势过电压和过电流的能力较强。与晶闸管输出和晶体管输出相比,唯一的缺点是触电元件动作较慢,寿命较短,不适用于频繁通断的场合。输出电路的输出电流驱动能力必须大于PLC外接设备的额定电流,因此需要根据输出设备的电流大小来确定输出电路的输出电流。图2.8 输出电路总图 图2.8是输出电路逻辑意义上的示意图,图中的OUT是一个子电路图,里面包含14个相同的输出电路,实际的电路如2.9所示,图2.9中只画出了一路输出,其他输出电路与之相同。图2.8中OUT0-OUT7、OUT8-OUT15接单片机的P1.0-P1.7、P3.2-P3.7。LQ1-LQ14是输出状态指示灯。Y0-Y7和Y10-Y15是14个输出端,用户电路接在输出端和COMX(X为0-5)之间。图2.9 输出电路 图2.9中5V电源为PLC 的内部电源,24V 电源为开关量输出电源,两个电源是隔离的。图2.9中,Y0是PLC的一个输出端。LQ1用于指示该输出点的开关状态。输出信号与单片机之间也用光电耦合器FL817C隔开。R1是限流电阻。D2用以防止继电器开断时的反向电流。D3是一个齐纳稳压管,是Q1基极和发射极之间电压稳定。OUT0连接单片机的输出端口P1.0。采用JT继电器JT32F-024-HS,该继电器是小型、小功率继电器,触点形式是常开型,额定电压为DC24V,直流电阻为1,吸合电流为2A,释放电流也为2A,线圈功率为4W,额定工作频率为5Hz。 当OUT0接口端输出低电平时,经光电耦合器使驱动晶体管Q1导通,继电器K1得电吸合,同时LQ1发光。当OUT0接口输出高电平,经光电耦合器使Q1截止,K1释放,LQ1熄灭。2.6 串口通信电路 本设计上位机程序下载时采用RS-232C通信接口技术,RS-232C是常用的点对点串行通信技术,采用单端信号传输方式,将PC机和单片机连接至一起,实现梯形图目标代码的下载。通讯电路如图2.10所示。 图2.10中主要用到了芯片MAX232,该芯片是由美国德州仪器公司(TI)推出的一款兼容RS232标准的芯片。单片机使用的是TTL电平(+5V为高电平,低电平为0V),而计算机的串口为RS-232C电平,其中高电平为-12V,低电平为+12V,RS-232C电平为负逻辑电平。MAX232 就是用来进行电平转换的。该器件包含两个驱动器、两个接收器。它的的9、10、11、12 引脚是TTL 电平端,用来连接单片机;7、8、13、14引脚是接PC机的。图2.10 串口通信电路 在图2.10中,D9、D10两个发光二极管用来指示此时是否有通信正在进行。串口通信的数据传输过程如下:MAX232的10脚T2IN接单片机TXD端P3.1,TTL电平从单片机的TXD端发出,经过MAX232转换为RS-232电平后从MAX232的7脚T2OUT发出,再连接到系统板上的串口座的第2脚RXD,至此计算机端接收到数据。PC机发送数据时从PC机串口座上的第3脚TXD端发出数据,再逆向流向单片机的RXD端P3.0接收数据。 3 实验软件设计3.1 系统程序结构 一个完整的PLC系统程序流程图如图3.1所示,本设计的软件部分主要是模仿PLC的循环工作。输入采样程序和输出程序对任何应用程序都是一样的,这部分属于系统程序,但梯形图处理处理程序需要针对不同的应用编写不同的程序。图3.1 系统程序流程图 本设计的编程语言用了C语言和汇编语言两种。汇编语言的执行效率要比C语言高,但可读性比较差。C语言编程简洁,可读性好,但C语言会占用更多的内存资源。 C语言程序含有六个文件:“IO.h”、“timer_counter.h”、“main.c”、“functions.c”、“timer_counter.c”和“process.c”。头文件“IO.h”是对输入输出端口以及输入输出端口映像寄存器的声明。头文件“timer_counter.h”是定时器和计数器的声明,定时器和计数器的定义在C文件“timer_counter.c”中。C文件“main.c”是系统的主程序。C文件“functions.c”中是初始化程序、输入程序、输出程序等的具体实现。C文件“process.c”是用户编写不同控制程序的文件,该文件中内容需要用户根据梯形图程序来填写,其他五个文件不需要用户关心,用户只需要了解一些接口即可。这种设计使用户只要关注如何将梯形图程序转换成C语言,而这种转换往往相对比较简单。 汇编语言程序只有一个文件,含有三个个部分:预定义部分,系统函数部分和用户程序部分。预定义部分是对输入输出端口以及输入输出端口映像寄存器的定义,还包括计数器和定时器的定义。系统程序部分包括主函数,输入/输出函数,定时器程序个计数器程序。用户程序是供用户根据梯形图程序填写的部分。3.2 系统主程序 系统主程序是主要是模拟PLC的循环工作方式。主程序中调用了四个函数:initi()是初始化程序,getIn()是输入采样程序,process()是用来翻译梯形图程序的梯形图处理程序,getOut()是输出刷新程序。主程序如下:void main() initi(); while(1) getIn(); process(); getOut(); 汇编程序如下Main: ACALL InitiLoop: ACALL GetIn LCALL Process ACALL GetOut SJMP Loop 汇编语言中的Initi是初始化程序,GetIn是输入采样程序,Process是用来翻译梯形图程序的梯形图处理程序,GetOut是输出刷新程序。 由以上的程序可以发现,用单片机实现PLC的循环扫描过程,在程序上比较容易实现,结构清晰,易于理解。主程序中各个子函数的具体定义见本章以下各节内容。3.3 初始化程序 初始化程序是在系统进入循环扫描所必须的预处理。本设计的初始化化程序主要完成以下一些工作:输入、输出初始化,设置所有定时器的时间基数,定时器初始化、计数器初始化化。C语言程序如下。void initi()P0=0x00; P1=0xFF; TMOD=0x01; TH0=0x3C;TL0=0x0B0; EA=1;ET0=1;initi_timer(); initi_counter(); TR0=1; initi_timer()是定时器初始化程序,initi_counter()是计数器初始化程序。如本章开始所述,把这两个函数定义放在在C文件process.c中是为了方便用户,用户在编写用户处理程序时可能会使用定时器和计数器,这就需要对定时器和计数器进行初始化,把这两个程序和用户处理程序放在一个文件中,使用户只需要关注一个文件,专注于梯形图程序的转换。汇编程序如下:Initi: MOV SP,#78H MOV P0,#00H MOV P1,#0FFH MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB EA SETBET0 LCALL Initi_Timer LCALL Initi_Counter SETB TR0 RET Initi_Timer和Initi_Counter分别是定时器初始化程序和计数器初始化程序。 定时器程序和计数器程序见本章的3.6和3.7。3.4 输入程序 输入程序用以检测16个输入点的开关状态。程序首先把16个输入映像寄存器清零,然后依次检测16个输入端口,如果检测到该输入端为高电平,则延时10毫秒,主要用于去除按键抖动,如果延时10毫秒之后,再次检测到得该输入端仍为高电平,则将该输入点的映像寄存器置1,否则置0。扫描得到的输入映像寄存器的不同状态将在用户程序中使用。In0-In7、In17-In10分别代表单片机的16个输入端口P0.0-P0.7、P2.0-P2.7。InMap0-InMap7、InMap17-InMap10分别是16个输入端口的映像存储器,每个映像存储器占一位存储空间。定义映像存储器实际上也有效地防止了输入信号的干扰,提高了系统的抗干扰能力。输入程序如下:void getIn()InMap0=0; .InMap7=0;InMap17=0; .InMap10=0; if(In0)delay10ms();if(In0)InMap0=1;.if(In7)delay10ms();if(In7)InMap7=1;if(In17)delay10ms();if(In17)InMap17=1;.if(In10)delay10ms();if(In10)InMap10=1;汇编程序如下:GetIn: CLR InMap0 . CLR InMap7 CLR InMap17 . CLR InMap10 JNB In0,CHK1 LCALL KT10MS JNB In0,CHK1 SETB InMap0 CHK1: JNB In1,CHK2 LCALL KT10MS JNB In1,CHK2 SETB InMap1 . CHK7: JNB In7,CHK17 LCALL KT10MS JNB In7,CHK17 SETB InMap7 CHK17:JNB In17, CHK16 LCALL KT10MS JNB In17, CHK16 SETB InMap17 . CHK10: JNB In10,EndCHK LCALL KT10MS JNB In10,EndCHK SETB InMap10 EndCHK:RET3.5 输出程序 输出程序比较简单,在每个扫描周期,都需要把输出映像寄存器的值赋给输出端,即所谓的输出刷新。Out0-Out7、Out10-Out15分别代表单片机的14个输出端口P1.0-P1.7、P3.2-P3.7。OutMap0-OutMap7、OutMap10-OutMap3分别是14个输出端口的映像存储器,每个映像存储器占一位存储空间。输出程序如下:void getOut() Out0=OutMap0; . Out7=OutMap7; Out10=OutMap10; . Out15=OutMap15; 汇编程序如下:GetOut: MOV C,OutMap0 CPLC MOV Out0,C MOV C,OutMap1 CPLC . MOV Out7,C MOV C,OutMap10 CPLC MOVOut10,C MOV C,OutMap11 CPLC . MOVOut14,C MOV C,OutMap15 CPLC MOV Out15,C RET 特别要注意的是,本设计在输出时是低电平表示输出有效(见图3.9),是负逻辑,为了在梯形图处理程序中减小用户的负担,在梯形图处理程序中使用易于理解的正逻辑,只在输出时对所有的映像寄存器取反,但是这里的取反并不是让映像存储器里的值取反,这样会破坏用户编写的程序,而是将映像存储器相反的值赋给相应的输出端。3.6 定时器程序PLC中的定时器代表延时继电器的功能,通常可以有多个,考虑到单片机内存资源有限,本设计中定义了10个定时器。定时器需要一个统一的时钟,用单片机片内的T0来作统一的时钟。T0每0.05秒中断一次,T0的设置在初始化程序中。因此定时器程序包两个部分,一个是定时中断服务程序,另一个是定时器逻辑指令程序。3.6.1 定时器的定义定时器有四个部分组成:定时器逻辑位,初始值,定时器计数器,触发启动标志。定时器如果用C语言的结构体定义比较容易理解。定时器的结构体定义如下。struct timBit DT; /定时器逻辑位(溢出标志)unsigned int K; /初值unsigned int TC; /定时器计数器Bit ST; /触发启动标志 timer10;定时器的计数器占两个字节,最大值是65535,由于每中断一次,计数器加1,因此定时器的最长定时时间为3276.75秒。3.6.2 定时中断服务程序 定时中断服务程序的流程图如3.2所示。图3.2 中断服务程序流程图 根据流程图,写出C程序如下。void interT0() interrupt 1 unsigned char i; TR0=0; TH0=0x3c; TL0=0xb0; for(i=0;i10;i+) if(timeri.ST) timeri.TC+; TR0=1;汇编程序如下:IT0Int: CLR TR0 PUSH PSW PUSH ACC MOV TH0,#3CH MOV TL0,#0B0H JNB ST0,Next1 INC TC0_L MOV A , TC0_L JNZ Next1 INC TC0_H Next1: JNB ST1,Next2 INC TC1_L MOV A , TC1_L JNZ Next2 INC TC1_H Next2: JNB ST2,Next3 INC TC2_H MOV A , TC2_L JNZ Next3 INC TC2_L Next3: JNB ST3,Next4 INC TC3_L MOV A , TC3_L JNZ Next4 INC TC3_H Next4: JNB ST4,Next5 INC TC4_L MOV A , TC4_L JNZ Next5 INC TC4_H Next5: JNB ST5,Next6 INC TC5_L MOV A , TC5_L JNZ Next6 INC TC5_H Next6: JNB ST6,Next7 INC TC6_L MOV A , TC6_L JNZ Next7 INC TC6_H Next7: JNB ST7,Next8 INC TC7_L MOV A , TC7_L JNZ Next8 INC TC7_H Next8: JNB ST8,Next9 INC TC8_L MOV A , TC8_L JNZ Next9 INC TC8_H Next9: JNB ST9,EndInt INC TC9_L MOV A , TC9_L JNZ EndInt INC TC9_H EndInt: POP ACC POP PSW SETB TR0 RETI3.6.3 定时器逻辑指令程序 定时器逻辑指令程序中需要注意触发启动标志何时打开。流程图如图3.3所示。图3.3 定时器程序流程图 根据以上的流程图写出的C语言程序如下。void time(unsigned char n,bit in) if(in) if(timern.ST)if(timern.TC=timern.K) timern.DT=1; timern.ST=0;timern.TC=0;elseif(timern.DT!=1)timern.ST=1; else timern.DT=0;timern.ST=0;timern.TC=0;程序中的n是定时器的编号,有效值是0到9,in是当前的逻辑运算值。汇编程序需要对分别写出每个定时器的逻辑指令程序,但它们都是相同的。下面定时器0为例,写出汇编程序如下。汇编程序中当前逻辑运算值在位累加器C中。Tim0:JNCOff0JNBST0,Open0 MOVA,TC0_LCJNE A,K0_L,Exit0MOVA,TC0_HCJNE A,K0_H,Exit0SETBDT0 SJMP Rest0 Open0:JBST0,Exit0JBDT0,Exit0SETBST0RET Off0:CLRDT0 Rest0:CLRST0MOV TC0_H,#00H MOV TC0_L,#00H Exit0:RET3.6.4 定时器初始化用户需要对用到得定时器进行初始化,C语言初始化程序如下。程序中已对初始化的方法做了详细的说明。void initi_timer()/*timern.K=t/0.05;*/程序中的n是使用的定时器编号(0-9)。t是定时的时间,最长定时时间为3276.75秒。汇编语言定时器的初始化方法如下。Initi_Timer:/*MOVKn_L,#Low MOVKn_H,#High*/ RET程序中Low=t/0.05/256,High=t/0.05/256。3.7 计数程序计数器有加计数器、减计数器和加减计数器。本设计的计数器属于加计数器。计数器如图3.4所示。当计数器的复位端R断开,且输入脉冲CU检测到输入信号正跳变时当前值加1,直到达到PV端设定值时,计数器的逻辑位置位。图3.4 加计数器3.7.1 计数器的定义下面的结构体定义了计数器的结构。struct ctBit Cnt; /计数器逻辑位(溢出标志) unsigned int PV;/初值unsigned int CT;/计数器Bit RST; /复位标志 counter10;定义了10个计数器,计数器初始值最大为65535。3.7.2 计数器程序的实现加计数器的流程图如图3.4所示。图3.4 计数器程序流程图 根据以上的流程图写出计数器的C语言程序如下。void count(unsigned char n,bit in) if(!countern.RST) if(in) if(!countern.Cnt)countern.CT+; if(countern.CT=countern.PV) countern.Cnt=1; countern.CT=0; else countern.Cnt=0; else countern.Cnt=0;countern.CT=0; 程序中的n是计数器的编号,有效值是0到9,in是当前的逻辑运算值。汇编程序需要对分别写出每个计数器的程序,但它们都是相同的。下面计数器0为例,写出汇编程序如下。汇编程序中当前逻辑运算值在位累加器C中。COUNT0: JBRST0,Reset0 JNC CExit0 JB C0,End0 INC C0_L MOV A, C0_L JNZ CN0 INC C0_H CN0: MOVA,C0_L CJNE A,PV0_L,End0 MOV A,C0_H CJNE A,PV0_H,End0 SETB C0 MOV C0_L, #0 MOV C0_H, #0 RET Reset0: MOV C0_L, #0 MOV C0_H, #0 CExit0: CLR C0 End0: RET3.7.3 计数器初始化用户需要对用到得计数器进行初始化,计数器的初始化很简单,C语言初始化程序如下。void initi_counter()/*countern.PV=;*/ 程序中的n是使用的计数器编号(0-9)。设置计数器初始值,最大值为65535。汇编语言定时器的初始化方法如下。Initi_Counter: /*MOVPVn_L,#Low MOVPVn_H,#High*/ RET程序中Low=PV/256,High=PV/256。3.8 例子实验实验时我们对梯形图进
展开阅读全文