故障现象:
做了一个单片机温度监测系统,仿真机上一切正常,烧写芯片无法工作。
相关电路框图:
用51做处理器,外围电路如图,一片双积分转换芯片ICL7135做AD,它的时钟需要125K,用51的ALE经过一片CD4024分频得到。1403提供基准源。另外,一片7660提供7135工作所需要的负压。
为了省电,把所有模拟电路部分电源用一个晶体管管理起来,由P1.0来控制。(上图为示意图,省去了电阻没画)P1.0为地的时候,模拟系统才上电
现在怪现象如下:
仿真机正常运行,烧写芯片后无反应。
仿真正常,说明外围芯片完全正常,电路也没有错误。
经过检查,晶体正常,复位可靠,EA高,程序堆栈都没有溢出,并排除其它一切低级错误的可能。
再编写一程序,
main()
{
while(1) {P1.1=0;}
}
P1.1和VCC间接有一发光管,开机无反应。
后来,发现更奇怪的现象:
拔除CD4024,MC1403,ICL7135,ICL7660中的任何一个,系统就可以正常运行!
百思不得其解,茶饭不思,郁闷了N久
更换全部芯片,如故。
更换ATMEL/PHILIPS/WINBOND的N款单片机,如故。
检查,排除电路故障的可能,
后来又发现,只要上电之前把P1.0对地短路,(也就是模拟部分强加电源),上电,系统正常运行。
但是,如果开机前P1.0不对地短路,上电一定不能运行,此后即使再把P1.0对地接,也不行。
顺这个思路,应该是和模拟部分有关……
又是郁闷N久,之后,无意间翻看CD4024内部图,茅塞顿开……
CD4024等TTL/CMOS逻辑芯片,为了防止静电或错误的IO电平,内部都有保护电路
如图2,每个IO口都有如图的2个二极管,集成在芯片内部。保证IO口电压在-0.6~5.6V之间
复位的过程中,全部IO为高,P1.0和ALE当然也是高。这样模拟部分不上电。
那么,ALE的输出角就等效于通过一个二极管向这四块模拟芯片供电!!!(如图)
ALE的输出能力不强,自然,ALE就被拉低了。
在查看51的手册,ALE和/PROG脚是复用的!!
在复位过程中,ALE如果为低,芯片进入编程状态!!!
也就是说,我的系统在上电复位的过程中就进入了PROG编程模式,难怪一条语句都不能执行
那么,也很好解释为什么四个芯片中拔掉一个就能正常工作了,因为负载轻了,ALE可能还没有被拉到2.5V以下,所以正常复位进入程序。
解决的办法:ALE接2K的上拉,再通过47K电阻接到Cd4024上,上电,一切正常!
结论:单片机编程模式/ISP模式是通过用户很不容易出现的一个时序来启动的,在一些特殊应用时要小心避开这些非用户代码模式。