邢矫健
MCS-51单片机能够通过编程、烧录从而成为特定用途的芯片。单片机的编程一般是使用编译软件把.asm或.a51文件编译成.hex或.bin文件,然后使用专门的编程器烧录到单片机或者外接的可编程ROM中。本文介绍一种在没有编程器的情况下,烧录简单的单片机程序,进而自制一个通过计算机直接烧录多种芯片的实用编程器。如果你想自己制作一个编程器,或者你对手工烧录芯片有兴趣的话,那就照本文介绍的方法试试吧。
1. 硬件原理 图1是手工烧录器的硬件电路图。这一电路是进行手工烧录的最简电路,同时将被作为成型后的编程器的一部分。电路中的89C51芯片选用40脚的零阻力插座接入,当然也可以使用普通的DIP-40插座,只是这样拔插芯片会麻烦一点。电路采用了一般编程器的电路原理,CD4040芯片是12位的二进制计数器,这里用作89C51编程状态的地址输入。当CD4040芯片的RST端输入一高电平时,计数器清零,此时对应的89C51内的闪存地址为“0000”,之后,每向CLK端输入一个低电平,地址就增加“1”,一直可增加到“0FFF”,正好可以编完89C51内4K字节闪存空间。数据输入端采用8位DIP微动开关进行手工输入,89C51的P0.0~P0.7为数据输入端口,当某一引脚未接地,则输入数据为“1”,接地则输入为“0”。P2.6脚为芯片编程/擦除选择,编程时应接低电平。P3.6、P3.7也是芯片编程/擦除选择,编程和检验时均接高电平。P2.7脚为闪存器的读写选择,写入时(烧录)接高电平,读出时(检验)接低电平。另外,测试用表笔可以用来检查地址、数据端口各位数据,端口为“1”即高电平时,LED发光,端口为“0”即低电平时,LED不发光。
当烧录过程中不慎写入错误数据时,则应该进行整片擦除,从头开始。进行擦除时,要先把89C51置于擦除状态,即P2.6接高电平,P2.7、P3.6、P3.7都接低电平,然后按下“写入”按钮10ms以上,芯片即被整片擦除,片内所有地址单元均重新置为FF,可以重新置为编程状态,从头开始烧录。
2. 手工烧录 现以本刊的网站上给出的一段与计算机进行串行通讯的简单程序作为例子,讲一下需要在单片机端烧录的简单程序。例子中的第二列是单片机闪存器的地址编号,第三列即是对应地址单元要烧录的数据。
进行烧录前,需要特别注意你的单片机系统晶振是否为12MHz,如不是则应按本刊第11期文章《如何在单片机上调试Hex文件的程序》里介绍的公式“256-晶振频率×2SMOD÷32÷12÷波特率”,计算对应的重装载数,修改相关的数据,以使计算机端和单片机端能使用相同波特率正常通讯。另外,你应根据RAM使用的实际地址值进行设定。
手工烧录需要细心和耐心,只要有一个地址单元的数据需要改正时,89C51都要求将芯片内整个存储器擦除,然后从头进行。编程之前首先应读懂例子中的编程数据,.a51单片机程序经过编译后生成的.lis文件,第一列为行号,第二列为地址编号,第三列为程序所对应的代码数据,第四列则是源程序语句(包含语句后的注释)。我们把需烧录的内容(即第三列的代码数据)依次写入第二列编号所对应的地址单元,手工烧录的工作即告完成。
代码数据和地址编号均用十六进制数表示,每位十六进制数代表的是四位二进制数,即由0或1组成的四位数。每个十六进制数码表示的二进制数如下:
000001000120010300114010050101
601107011181000 91001A1010B 1011C1100D1101E1110F1111
地址编码有四位,转换成二进制数即为16位。实际上由于89C51内的闪存器仅有4K字节(212),所以只需取后面的12位,即把地址编码的后3位十六进制数转换出来即可,如第一行的地址编码0000,在烧录时取000,即转换为0000 0000 0000。每一地址单元可存储一字节的代码数据,即8位二进制数,对应两位十六进制数。如地址单元0000应写入的代码数据为01,(注意:文件中第一行无数据),烧录时转换为0000 0001。后面两位71,应写入0001单元,转换为0111 0001。接下来的0002单元无数据,烧录时可跳过。接下来的0003单元则在第四行,应写入的数据代码为02,……依此类推。需注意的是,不是每一单元都有数据,烧录时跳过无数据的地址单元,即相应单元不进行写入操作。另外,每行中数据代码最多三字节,最少的一字节,依次写入连续的地址单元中,不会与下一行的地址单元冲突重合。
理解了数据代码后,就可以开始烧录了。首先要将89C51置于编程状态,即P2.6接低电平,P2.7、P3.6、P3.7接高电平,J1接口插上外接12V电源。请注意,手工编程需要细心和耐心,尽量一次烧录完成,不要出差错。按“清零”按钮,使CD4040输出地址编码从高位到低位为0000 0000 0000,可以用接LED的表笔从高位到低位逐位检查一次。无误后在DIP微动开关上表示出对应的代码数据0000 0001,从高位到低位,打开接地的位为0,不开的位为1。无误后,按一下“写入”按钮,0000地址单元即已烧录。按“加1”按钮,地址编码加1,从高位到低位为0000 0000 0001。可再用接LED的表笔从高位到低位逐位检查一次。无误后,在DIP微动开关上表示出对应的代码数据0111 0001。无误后,按一下“写入”按钮,0001地址单元即已烧录。按“加1”按钮,地址编码加1,由于0002这一单元无数据代码可跳过,即再按“加1”按钮,直接到0003地址单元,可用接LED的表笔从高位到低位逐位检查一次。无误后,写入对应数据代码,方法同上。不需每次都用表笔检查地址编码,但有无代码数据的单元跳过或感觉地址计数有误时,应检查一遍,及时对编程错误采取对应措施。否则,错一处就还得整片擦除,从头开始。
出错的处理方式有两条。如果是漏写了一个单元,则可以先把地址清零,一路跳过已编程的单元,到漏写的单元,继续后面的编程。如果写入了错误数据或对应地址单元写入了别的单元的数据,则应该进行整片擦除,从头开始。进行擦除时,把89C51置于擦除状态,即P26接高电平,P2.7、P3.6、P3.7都接低电平,然后按下“写入”按钮10ms以上,芯片即被整片擦除,片内所有地址单元均重新置为FF,可以从头开始烧录。
3. 使用电脑烧录 利用本刊第11期《如何在单片机上调试Hex文件的程序》一文介绍的调试电路和程序来实现上面手工烧录过程中的高低电平控制,就可以实现计算机对芯片的直接烧录,一个自制的编程器就成型了。下面,以《如何在单片机上调试Hex文件的程序》一文中介绍的电路为调试电路,本文介绍的电路为烧录电路,把两部分相应的引脚按图2进行连接。
调试电路工作的前提是89C51中已经烧录了前一部分已经提到的串口通讯必需的源程序,并已插入到调试电路的对应IC插座,可以接收计算机端发送的.Hex程序代码并运行它。
连接完成后,把烧录控制程序shaolu.hex发送到调试电路的RAM中,并运行。这样,当计算机端再发送新的 .Hex文件时,烧录控制程序即会把这一.Hex文件内容烧录到烧录电路端的89C51芯片中。以后的的烧录都将通过这一途径进行,更长的程序简简单单通过计算机几步即可完成。烧录控制程序的工作流程如图3。读者可自行编写,也可到本刊网站下载。除了烧录功能,烧录控制程序shaolu.hex还带有对89C51闪存器的检验和整片擦除功能。使用方法是,当shaolu.hex在单片机端的RAM区运行后,在计算机端的程序窗口中发送“02 A5”命令(详细方法见程序的帮助),单片机即会读出并发回烧录芯片的闪存器内容,计算机端就能看到闪存器,通过适当对比,就可以知道烧录的数据是否正确无误。结束时,单片机端会发回结束标记“AE”,可以判断闪存器内容已全部发回。发送“03 A5”命令,即可对89C51闪存器整片擦除。擦除结束,单片机端也会发回结束标记“AE”。另外,发送“04 A5”命令,则会退出烧录控制程序,回到原来调试控制状态。
当一片新的89C51烧录完成后即可替换原先的芯片,实现系统的更新。编程器可实现的功能也会更多,电路适当改进后还能实现更多型号芯片的烧录。总之,以手工编程的第一片芯片为起点,编程器的功能可以在芯片替换的过程中越来越完善。鉴于89C51芯片有一定的寿命,读者在重新烧录芯片前最好先调试运行,确信无误后再进行烧录操作。
4. 硬件实施 一般情况下,元件采购比较容易一些,电路板则需专门到厂家专门定做,单片制作是很不合算的。通过实践,我发现单片机电路还有一种比较简单的实施方式。
单片机的电路中有许多总线,总线排列都有一定的顺序。因此,电路板的线路排列就很有规律,而且可以比较简单。下面就介绍笔者常用的一种用单面覆铜板制作单片机硬件电路板的简单方法。
以本文中的电路图为例,首先把芯片、DIP微动开关对应的IC插座放在覆铜板的有铜面上,插座的引脚用尖嘴钳折向插座两边(如图4)。放置时,尽量使用IC插座,其余元件也要留出位置,要使尽可能多的需连接的引脚对齐。确定放置位置后即可开始划线,用刻印章用的刻刀把IC插座对应的引脚线路刻成平行的直线条。一般DIP插座引脚间的距离为0.24cm,划线时每厘米四等分,即每隔0.25cm划一道线,把划线处覆铜刻去即可满足要求。IC插座的正中纵向把平行线条断开,不连接线条也都断开。其余元件也依次刻好引脚线。其它应连接线路则用漆包线两头去漆后焊接的方式连接,IC插座和其它元件也同时焊接。焊接完毕,用万用表检查一遍线路连接是否无误,相邻线路间有无短路,有无虚焊。全部无误后,适当固定板上的漆包线。电路板即告完成,把元件插入对应插座,即可使用。
如前所述,建议把调试电路和烧录电路综合后再制作电路板,以减少两电路间连接的麻烦。综合后的电路图不再给出,相信读者可自行绘出。综合后的电路在进行手工烧录时,调试电路部分的芯片最好先不要插上,以免影响手工烧录的进行。