记得笔者刚接触AT89C51系列单片机时,心里似乎有种说不出的“轻松”感。因为,AT89C51系列MCU的内部备有了可“随着”擦写的Flash可编程可擦写的只读存储器(EPROM),这与笔者原来接触的80C31、80C39、8751等51系列的单片机已大不一样了。尤其是80C31、80C39等所谓的“单片机”,其实片内根本没有程序存储器,必须要外扩相关的存储器构成一个“最小系统”才能实现单片机的工作。因此,当朋友来约笔者帮他们厂设计一个多功能的电动窗轨控制器时,笔者就欣然答应了。
电路功能
图1是控制装置的电原理简图。单片机AT89C51是电路的核心,它与实时时钟芯片DS1302、八位串入/并出移位寄存器74HC164、驱动单元ULN2003及四位数码管显示器TOF-4403构成了实时时钟的设置、读取、显示电路。其中ULN2003既用于扫描显示的“位”驱动,也作为电动窗轨开关控制输出的继电器驱动。电路中的按钮SB1、SB2、SB3用于功能设置、功能切换及手动开关窗帘。排阻RP1、RP2则是MCU各I/O口连线上的上拉电阻。JD1、JD2两个JQX-14FC继电器作为执行器件,将来自MCU的控制信号转换成相应的对电机开关、正反转控制的动作,以实现电动窗帘的张开与闭合。

装置的设计要求: ⑴具有实时时钟功能;⑵可设置定时开、关窗帘功能;⑶手动开关窗帘功能。而手动开关窗帘又分为: ①点动功能——即不管开或关窗帘可在任意位置上停下来; ②按一下按钮窗帘就能完全打开或完全关闭。
连接晶振的两个引脚
可是,待整个装置编程制板组装后调试时,却事与愿违,不但实现不了诸多功能,连MCU都不能正常工作——数码管显示屏上时而无规则的笔段变化不定,时而毫无反应,只有偶尔出现一下规范的字符——好像是读出的时钟数据。那时笔者还没有仿真器,因而还不能用“单步”、“断点”等手段来监察程序的运行过程。凭经验从数码管显示的现象来看MCU的程序并不按其“程序”执行,而是在胡乱地跳跃,且当显示屏上毫无反应或不规则的笔段保持不动时,也可能是MCU处于“死机”状态。而“死机”又可能是程序“跑飞”引起,也可能是晶振不起振造成。
用示波器监测了单片机的30脚ALE地址锁存允许信号端(因为ALE端只要MCU上电振荡,就会不断地向外输出频率为振荡器频率fosc的1/6的脉冲信号; 在MCU访问片外存储器时,ALE端输出信号作为锁存低8位地址的控制信号,由于这里无外接存储器,所以ALE端与PSEN____程序存储允许输出信号端都没用上而悬空着),当显示屏上毫无信息或不规则的笔段保持不动时,示波器上也无波形了,因而初步判定“死机”是硬件晶振部分不工作的结果。显然,从上面“时好时坏”的现象来看,晶振无振荡不会是晶振损坏或是电容失效短路等引起,而很可能是某处因虚焊而接触不良所致。虚焊的可能性很大,因为用上去的那个40脚的集成电路的插座已存放很久了,其引脚可能已氧化,当时焊接时就不太好焊。于是把连接晶振的18、19两引脚卸去锡,用折断的钢锯条将脚刮过后重新焊上再调试监测,MCU不再出现以上的那种“死机”了。但是显示屏上依然只偶尔出现正常数显,大多数时间还是杂乱无章。
关于EA引脚
用AT89C51本想“轻松”一点,不料第一次就碰到了这种麻烦!笔者拿了份有关AT89C51的资料琢磨:AT89C51到底该“轻松”在哪里呀——就是因为片内有存储器且可多次擦写?有了片内PEROM在程序不太大的情况下,系统不必外接存储器了,那么ALE端、PSEN____端就可不用,EA__端也就……对了,AT89C51的31脚EA端是外部程序存储器地址允许输入端,当EA__端接高电平时,MCU只访问片内ROM/RAM并执行内部程序存储器中的指令,当EA__端接低电平时,MCU只访问外部ROM/RAM并执行外部程序存储器中的指令,而不管是否有片内存储器了。问题就出在这儿,EA端是一个输入控制引脚,对于80C31等无片内程序存储器需外扩ROM时,必须将EA__端接地,而这里用AT89C51片内存储器无需外部扩展时,就必须将EA__端接高电平。可是由于笔者初用AT89C51,忘了将EA__端上拉至高电平,而是与ALE端、PSEN____端一道都悬空起来了。笔者用“飞线”把EA__端(31脚)与电源V\(_{cc}\)处跨接后调试,一切正常了。
AT89C51是由COMS工艺制造的器件,EA___作为输入端的引脚,其输入阻抗是极高的,一般在109Ω数量级,因此当它悬空时,空间中任意的交流杂波都会在其上形成或高或低的压降,这忽高忽低的压降就导致了MCU一会儿访问片内ROM/RAM,一会儿访问外部ROM/RAM。当访问执行内部程序存储器中的指令时,整个系统就运行正常,数码显示屏也就显示正常的字符;当访问外部ROM/RAM时,由于无外扩存储器,也就无指令数据,因而显示屏上也就出现了变化不定的杂乱笔段。
参考资料
电路中的单片机AT89C51、实时时钟芯片DS1302、八位串入/并出移位寄存器74HC164、驱动单元ULN2003的相关资料分别可由以下网站查阅:
1. http://www.lierda.com/upfile/1071536711.pdf。
2. http://www.lierda.com/upfile/1089684457.pdf。
3. http://www.icbase.com/pdf/STM/STM28280105.pdf。
4. http://www.icbase.com/pdf/AGM/AGM00090107.pdf。
文/张春峰