|
|
MCS-51单片机应用系统开发的几点体会樊韶胜
陈元新 唐 忠(长沙电力学院电力工程系 长沙 410077)
摘 要 讨论在单片机应用系统开发过程中所遇到的几个问题,并提出相应解决措施.关键词 单片机 复位 芯片 电路分类号 TP311.52
由于MCS-51系列单片机具有集成度高,处理功能强,可靠性好,价格低廉等优点,它在智能仪器仪表、控制工程、测试技术等领域得到了广泛的应用.本文讨论在单片机应用系统开发中遇到的几个实际问题,并提出相应的解决措施.1 系统复位问题当单片机系统扩展了8155,8255,8279等接口芯片时,经常会遇到这样的情况:在用仿真开发机运行应用程序时,系统工作正常,但当脱机运行时,系统不能工作,并且随着单片机所选时钟频率的增高,这一现象更加突出.究其原因是单片机与接口芯片复位不一致.单片机与接口芯片有统一复位,也有分开复位,即使统一复位,由于单片机和接口芯片生产厂家不一致,复位时间也稍有不同.当系统上电复位时,单片机先复位而后即开始执行初始化程序,由于接口芯片尚未完成复位,于是初始化指令无效,导致系统运行不正常.解决的办法有两种,一是硬件方法,二是软件方法.硬件方法可在原复位电路中加入门电路整形,使复位脉冲沿更为陡峭,因而其它外围芯片不会迟于单片机复位,从而整个系统能正常运行.软件方法最简单,只要在程序开头加上一段延时程序即可解决,其延时时间需调试决定,一般在几ms至几百ms之间. 以上所述是针对8155,8255,8279,对于其它带系统复位信号的接口芯片,读者在运用时,也应引以为鉴.2 软件抗干扰措施单片机应用系统大量用于工业现场的测试和控制,因此往往工作在比较恶劣的环境当中,除了温度、湿度的影响外,强烈的电场、磁场以及电源或机械干扰都可能导致单片机系统运行异常,提高单片机系统的抗干扰能力既要考虑硬件措施,也要考虑软件措施.软件措施可有如下几种 1) 指令冗余.当单片机受到干扰后,往往将一些操作数当作指令码来执行,造成程序混乱.MCS-51指令系统中有单字节,双字节和三字节指令,当程序弹飞至某一个单字节指令上时,便自动纳入正轨,当弹飞到某一双字节或三字节指令上时,有可能落到其操作数上继续出错.解决的措施是在程序中插入空操作指令NOP,该指令对单片机状态无影响,失控的程序遇到该指令后得到调整,使接下来的程序得以正确进行.具体插入原则为:1在双字节或三字节指令后插入2条NOP指令.2在一些对程序流向起决定作用的指令(如跳转指令)之前插入2条NOP指令.3在比较重要的指令前插入,如中断、堆栈等.指令冗余可减少程序弹飞的次数.(2) 重复设置各种方式控制字.单片机系统受干扰后,系统内芯片(如8255,8279等)的工作方式控制字极易受到破坏,使系统不能正常工作.针对这种情况,可在循环处理程序中定期地、有条件地对各方式控制单元进行重复初始化,使方式控制字一旦被破坏,还可以及时修复.(3) 将程序存储器的剩余存储空间全部填入字节02H.02H是MCS-51单片机指令系统中长跳转指令LJMP的操作码.当系统受干扰而使程序弹入到这些区域时,单片机便会自动执行一条无条件跳转指令LJMP0202H(机器码为020202H).如果在0202H这个地址上设置一条无条件跳转指令LJMPaddress,程序就会跳转到系统正常工作所进行的循环中,这种方法比依次用字节02H,00H,00H填满存储器剩余空间的方法要好,因为后一种方法在程序弹飞到这些区域时,是执行LJMP0000H指令,即跳到0000H单元执行程序,而有些系统有它特定的工作循环,一旦受干扰后,是不允许复位单片机而跳转到“0000H”单元地址执行程序的.3 单片机总线驱动能力问题如果单片机扩展了较多的外围接口芯片,在脱机运行时,不能正常工作,就应着重考虑单片机的驱动能力问题,这是因为多数仿真开发系统都带有总线驱动芯片,因此在仿真调试时,系统不会出现问题.脱机后单片机驱动能力不够,系统不能稳定运行.解决的办法是在原有电路上添加总线驱动芯片,如74LS244,74LS245等.若原有电路不允许改动,可考虑将原有电路芯片全部换成CMOS型.如8031换成80C31,27256换成27C256,74LS373改为74HC373等4 EEPROM的合理使用电擦除可编程只读存储器EEPROM近年来已得到广泛应用,其主要优点是能在应用系统中进行在线改写,并能在断电情况下保存数据而不需要后备电源.EEPROM保存数据可达10年以上,它的每个存储单元可擦除,写入约一万次,显然对于需要频繁存取数据的系统来说,其寿命是不高的.因此系统设计者的首要任务应是尽可能减少写入次数,以提高其工作寿命.对于系统运行时的中间数据,没有必要保存,这样可减少写入次数,但这不是根本解决办法.在单片机应用系统中,一般存储的数据量不大,读写只在EEPROM的局部区域进行,其它区域闲置不用,这样做显然不合理.合理的方法是将存储区域设为浮动的,即可根据存储数据量的大小把整个存储区域分为m个小区域,并规定每个小区域可连续重写n次,n次写满以后,可由程序自动转向或由操作者通过键盘(或其他人机对话方式)转向另一存储小区域,如此进行,可使m个小区域得到充分利用,大大提高了芯片的使用寿命.EEPROM写入时间约为10ms,因此在第1个字节写入后,应调用10ms延时程序,再写入第2个字节.当然也可采用查询或中断方式(取决于EEPROM的RDY/BUSY引脚与单片机的连接方式)来确定下一字节的写入.若RDY/BUSY引脚为高电平允许下一字节写入.5 编程时应注意的问题(1) MOVXA,@A+DPTR与MOVCA,@A+DPTR这两条指令的区别.这两条指令一般出现在查表程序中.在开发机中,这两条指令也可混用,不会出错,因为程序是在RAM中运行.脱机后,程序在ROM中运行,若再用MOVXA,@A+DPTR指令,程序就会出错.(2) 设定定时时间常数时,应先设定高字节,后设定低字节.在单片机系统中,每次定时中断溢出后,须重新设定时间常数.假设某一需要重设的时间常数为80FEH,若先送低字节FEH,后送高字节80H,用指令表示即为:MOVTL0,#0FEHMOVTH0,#80H那么在该指令执行后,会导致定时错误.因为第一条指令本身执行时间为2个机器周期,当第一条指令执行后,定时器T0,已计数两次,即低字节计数器TL0的内容已变成00H,同时向高字节计数器TH0产生进位,当执行第2条指令后,则定时时间常数改变为8000H,显然会出现定时错误.为了避免这种错误,可先设定高字节时间常数,后设定低字节时间常数,若不这样做,则应在送之前,先关闭定时器,送完后,再启动定时器,否则可能出错.(3) 在主程序和中断服务程序中,不可调用相同的子程序.如在主程序中有ACALLSUB,在中断服务程序中也有ACALLSUB,则在单片机系统运行时有可能中断发生在主程序执行ACALLSUB的时间,会出现SUB子程序自己调用自己的情况,程序会找不到断点出口而出错.
6 结束语以上为作者近年来从事单片机应用系统开发所遇到的几个实际问题.采用如前所述的对应解决措施后,系统运行均获得了较满意的结果.现将其作为作者的几点体会加以总结,供大家参考.
|
|