单片机课程设计-ATMEL51系列单片机编程器
STEP 3. 实现硬件电路
其实硬件电路很简单,打算用串口跟电脑端进行通信,然后使用一片S52做为主控芯片,通过ISP接口给另一片单片机下载程序。用了一个晚上时间用万用板把电路搭建起来,里面用了一片MAX232作电平转换,转换后的电平输给S52,S52接出几只IO口给对应的被下载芯片的ISP引脚,包括MISO MOSI SCK 以及复位端RST。硬件就是这么简单这么傻,下图:
STEP 4. 编写固件
可以说这个设计的90%的工作就是在写代码,包括单片机代码以及电脑烧录软件代码,其中单片机用C语言编写,电脑界面用C++编写(所以必须有一点WINDOWS应用程序编程基础)。
烧写单片机的工作流程其实就是->把复位脚接高,然后送入四个字节码,让它进入编程模式,然后根据协议要求一个一个把数据送进去。我在KEIL上实现了几个最基本的操作函数,比如要擦除芯片就调用:unsigned char Pro_51_Erase(void),如果芯片擦除成功就会返回OK(宏定义,值为1),当然了,在开始工作之前都必须检查芯片是否能使用,所以每次烧写之前都要使用unsigned char Pro_51_CheckChip(void)检查被烧芯片是否工作正常的话就返回OK。等等等等,不再赘述。
实现了基本的操作函数,接下来就要考虑主控单片机要怎样跟电脑进行通信了,使用串口通信,我的做法是自己制定一个简单的传送协议,该协议的第一个字节是指令,接下来的字节可以是地址,数据等等,做成一个数据帧,帧的大小随指令作用不同而异。然后单片机使用串口中断接收,因为主控单片机在给另一个单片机烧写的时候会费时间,为了防止电脑端送过来的数据得不到及时处理而发生错误,我在串口中断服务程序里面实现了一个简单的先进先出循环队列,队列长度设为8B,一接收到数据的时候,中断服务程序就将数据向队列添加,而前台程序要取数据就直接调用GetByte()函数,该函数自动向队列取得一个数据,如果队列为空,则会进入阻塞,直到有数据才会返回。发送队列也是根据此种原理。总之,关于串口,最终实现了两个函数,一个发送,一个接收,给全局使用,不必理会实现细节。
评论