单片机
返回首页

单片机课程设计-ATMEL51系列单片机编程器

2015-05-15 来源:51hei

用单片设计过很多东西,可以说把AT单片机(包括AVR单片机)的所有外设资源都使用过了,所以在寻思着要设计一个什么样的东东??

  有次去面试,我对面试官说我设计过一块开发板,然后那面试官直接问了个核心问题:这个编程器的固件是你自己写的吗?一下子就问到了痛处。是的,编程器固件不是自己写的,那为什么不自己设计一个呢? 我说的自己设计是包括硬件电路、单片机程序以及电脑端界面等等所有东西全部自己DIY。当一个真正的DIYer。所以我动手了,用了几天几夜时间弄了一个可以支持两种芯片(AT89S51 AT89S52)
的基于ISP下载的编程器
  首先要说的是,要设计个编程器, 这方面的资料在网上基本是找不到的,估计是大家不想开源(open source code)...所以必须自己按照某一芯片的官方数据手册慢慢搞懂它的下载协议,然后写成固件。


  STEP 1. 研究数据手册
  首先找了一份S52芯片的中文数据手册,一看傻了眼,翻译得很垃圾,垃圾还不要紧,最重要是里面把关于FLASH编程的章节直接忽略掉了。。想看都没得看。没办法,那就直接研究英文数据手册算了,用了一天多时间认真把数据手册看懂。。这里本人一直有个误区,从大一的时候开始就以为S52会有256B的用户RAM,比S51高级,其实不是,S52也只有128B内存,FLASH容量比S51多4KB也就是8KB。。谨记谨记。。或者你可以选择接入外部RAM,不过这会浪费掉你至少16个IO口用来做数据及地址总线,而且还要加外一个地址锁存器用来复用本来就不够用的IO口,而汇编指令中的MOVX就是用来操作外部RAM的。OK数据手册研究完毕(还算幸运的,因为S52的数据手册只有30多页)。


 

 

 

  STEP 2. HEX文件的本来面目以及怎样将HEX文件转换成机器码

  之前我一直以为HEX文件就像镜像文件一样对应着单片机FLASH的每一个数据,然后烧录软件LOAD程序的时候是直接将HEX文件里面的数据一个一个输入到单片机的FLASH中,又来了个误区,事实情况却不是这样的。正解是:HEX文件是一种用ASCII编码的文件,就是说里面的数据都是字符来的,比如说里面记录了一个地址为0X00EF的话,如果按照二进制格式应该是:0000 0000 1110 1111 这样记录的,但HEX采用了ASCII字符编码,直接在里面写成:‘0’ ‘0’ ‘E’ ‘F’ (这是ASCII字符!!!)。基于这个原理,要想正确下载程序就必须写一个HEX->机器码转换算法,将HEX文件转换成机器码。用了几个小时就把算法搞定。具体实现过程就不说了,想了解的可以直接找我聊啦,总之最后结果就是我实现了一个 HEX_Translate(char *Input,char *Output)函数搞定


  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()函数,该函数自动向队列取得一个数据,如果队列为空,则会进入阻塞,直到有数据才会返回。发送队列也是根据此种原理。总之,关于串口,最终实现了两个函数,一个发送,一个接收,给全局使用,不必理会实现细节。

 


  STEP 5. 编写电脑端界面

  电脑端界面是使用串口进行通信的,所以电脑必须有串口,或者使用USB转串口。

  开发环境使用了本人最喜欢的C++ Builder 6.0 。因为开发速度很快,很适合我这种非专业WINDOWS程序员使用。最终开发出来的应用程序可以打开HEX文件,并自动转换成机器码,然后通信串口一个一个按照地址发给单片机。如图:


 


  STEP 6. 测试

  虽然原理简单,但是编写过程却很费时,BUG不断出现,晕死,其实让我选择去当苦力搬砖或者选择写代码,还是选择挺搬砖比较好,因为砖总可以搬完嘛,代码却不一定能写得出。所幸经过几天调试,所有功能完成了。

 测试: 写了一个单片机的8*8点阵显示程序,然后连接设备,打开文件。擦除芯片。。点击“编程”。。。经过两秒钟,界面进度条显示下载完成。小心地将下载好的芯片拔出来,插到单片机开发板上,接电。。查看效果。一接电,点阵上显示出期待已久的图案了,说明测试成功。下图:


 

 

  STEP 7. 拓展功能

  完成后想进一步拓展编程器的功能,在想着要弄点什么好,于是想到了手工汇编,就是不用开发环境,自己把指令一条一条写出来然后下载,SO,要怎么下载???,没问题,我在单片机里面实现了一个类似命令行的对话窗口,只要在电脑上打开超级终端或者串口助手,就可以通过字符指信与单片机进行对话,可要设置好地址,就可以查看或者修改单片机FLASH存储器中的任意一个值,想怎么改就怎么改,如图:


 

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章