最近用AT89S52做了一个最小系统板,其中P0口每个口串接了一个电阻和一个LED。同时,由于AT89S系列本身的优势,我使用USBasp直接对它烧录程序,更重要的是,这个单片机还可以通过USBasp直接在Linux下烧录,再也不用担心这个问题了(一开始是这么想的)。
当我把整个电路焊接完成之后,我首先按照这个博客http://www.linuxidc.com/Linux/2012-05/61086.htm的操作一步步来,结果果然可以烧录,只不过花了5分钟左右。
但是烧录完成后我发现P0.0并没有按照那个博客里的程序不断亮灭,而是八个灯全部都在微微发光。我很好奇,摆弄了半天,最后发现用手触及到背后的某些焊点时,电路可以正常工作。于是可以确定下来是焊接的问题了。经过最后排查,我发现只要我把31、32脚短路在一起,就可以正常运行。其中31为OE/Vpp,32为P0.7。我马上又测了一下P0.7的电压,在3V左右,这显然不是正常现象,这个之前也可以判断出来。我因为Vpp是一个比较特殊的管脚,所以我又想到是不是这个管脚本身就应该接一个高电平?事实为大,我短接了40和31脚,发现果然是这样。我之后又仔细查阅了一下资料,发现却是要给Vpp一个高电平单片机才可以正确工作。
所以单片机正常工作的几个必要电路如下:
晶振电路,我的电路中是两个30pF电容和一个12MHz晶振,以及一个短接到地的导线。
复位电路,R、C、按钮即可。其中C和按钮并联,连接高电平和RST,R连接RST和地。
电源电路,高电平,地,以及Vpp也要接高电平
另外,如果和我这次一样是使用USBasp下载程序的话,还需要一个USBasp和单片机的连接电路,主要有Vcc、GND、MOSI、MISO,和RST。
于是我的电路就正常了。可以正常烧写,只是在LInux下烧写速度太慢。于是我自然要想法子来提高它的速度。
首先google,经历过一番摸索,知道这个博主做过相关的工作:http://rgwan.byethost10.com/archives/1328。但是跟他联系之后,我还是没有找到正确的方法来改进。因为根据他说的,我把他修改过的isp.c替换到USBasp的Project中无法成功编译。当然不知他一个人做过相关工作,我在下载AVR fighter 和 progisp时都会发现安装包里有现成的可以烧录AT89S系列的hex,在windows下工作的很好,但是它们却不能在Linux下工作,郁闷。
这其中还有一个小插曲,中间有一段时间,我的电路突然不能正常工作了。当时我正在烧录,结果没有烧录成功,电路上出现了和最开始一样的情况,8个LED全部都微微发光。我转向windows,想用AVR fighter试试看,结果提示进入编程模式失败,额,这是我之前遇到过的情况,当时是电路有问题。于是我就疯狂的开始检查电路,按照我之前提到的几个部分一个个慢慢来,每个点都仔细检查过来(我以为我是这样)。结果无论如何都不行。我开始怀疑是单片机的问题,于是换了一个STC的单片机(当时手上只有这个),结果可以看出8个灯都灭了,这个是正常的!于是我就认为是单片机出了问题,因为想到同样的电路,一个单片机可以正常运行,但是另一个却是错误的结果(这真的是错误的结果吗?而且我没有意识到这两个单片机其实差别还是很大的,比如上电之后的初始状态。)我去市场上重新买了两个同样的芯片,发现还是有同样的结果。
所以,应该还是电路的问题。我找到彭老师,他首先说了个题外话,说我串联在LED上的电阻太大了,导致LED亮度会很低。之后,他仔细检查了我电路上除了下载电路的其他部分,都没有检查出问题。我告诉它我的芯片里是有程序的,可以使P0.0上的LED不断亮灭。但是他说有可能芯片里面没有可以正常运行的程序,我自然不信服,依然**自己的判断。他就提出要重新烧录。但是我的电路是有问题的,无法烧录。他很有经验,问我,你这个电路下载时有没有什么需要注意的地方,比如哪知管脚要接Vcc或GND之类的,我说没有,随时都可以烧录,他笑了(我现在才意识到我当时的回答有多么愚蠢)。后来我提到USBasp的RST要接到单片机的RST上,然后他就用手一直按着复位按钮,然后竟然就可以读取芯片信息了,然后也可以烧录了!我很吃惊!为什么?为什么?脑袋中一阵电闪雷鸣之后我和他同时断定RST虚焊了。重新焊接之后果然正常了。
现在说之前为什么同一个电路STC80C51和AT89S52却是不同的反应。因为STC的默认上电初始态(没有烧写程序)就是每个IO管脚都是高电平。而后者则不是,起码它的P0和P2不是,大概都是在3V左右,具体原因有待探索。 |