感谢支持
我们一直在努力

Ubuntu下的AT89S52,S51+SDCC+USBASP的开发环境搭建

附件包内容: 程序源码,超级简易Makefile模板,usbasp可烧录51的固件程序,相关文档。


附件下载:


免费下载地址在 http://linux.linuxidc.com/


用户名与密码都是www.linuxidc.com


具体下载目录在 /2012年资料/5月/25日/Ubuntu下的AT89S52,S51+SDCC+USBASP的开发环境搭建/


系列说明:Linux下程序开发具有一定的成熟性,包括大部分的MCU,FPGA,DSP甚至PCB制图等都是可行的。本系列将针对51系列的MCU.。


本文环境如下:


OS系统:Ubuntu 12.04


编译器 :sdcc


烧录软件 :avrdude


烧录器件 :usbasp


开发板:


开发板的确是有个小的,不过这次特意搭接了一个个人的小面包板版本,为此表示~不要怕开发MCU没有硬件基础,只要去做,其实开发就是这么容易~


如下图


最好弄运行的时候只需要电池1.2V*4,用了3个3.6V就可行(我的电池座忘带了,直接连起来啦)~建议最好有个USB接出来的5V电源或者自己有个变压器做的稳压电源,面包板上有一个电源小板子就是如此功能,不过这里没有使用。




注:旁边的小板子是USBASP,也有供电功能~此处就放在那里做个合影~哈~


程序编写:Vim(升级版的记事本,很好用,很推荐)


准备:


软件安装,软件安装建议使用ubuntu的软件中心,比较方便。需要sdcc,avrdude即可了。文本编辑什么都行。可以集成在codeblocks和eclipse里面(51没干过),ubuntu下有个51MCU的IDE,可以下来用‘mcu8051ide’ 。


对于命令行可以如下安装


sudo apt-get install vim


sudo apt-get install avrdude


然后就都安装完毕了。下一步就可以开始了。

源程序:


开始之前需要先写一个main.c的程序


这是一个很简单让一个blink的程序。



  1. #include <8052.h>   

  2. typedef unsigned int size_t;  

  3.    

  4. #define LED P0_0   

  5.    

  6. void delay(size_t t)  

  7. {  

  8.         while(t–);  

  9. }  

  10.    

  11. void main()  

  12. {  

  13.         while(1)  

  14.         {  

  15.                 LED = 0;  

  16.                 delay(20000);  

  17.                 LED = 1;  

  18.                 delay(20000);  

  19.         }  

  20. }  

编译:


之后就要编译程序把程序变成单片机能使用的*.elf *.bin *.hex之类的


这里我们使用的是SDCC默认编译出现的*.ihx (intel hex)


在当前目录下执行


  1. sdcc -mmcs51 main.c  

注 : 没有-mmcs51也可以。



当面目录下就会生成好多好多文件~记住我们需要的main.ihx~



配置avrdude:



使用avrdude烧写 


我们不能直接使用avrdude烧写,这是因为它默认只支持AVR芯片,但是通过一些配置,我们可以使用它来烧写。


对于8051芯片,我们有三种配置文件,分别适用于不同的型号。看看你要哪一种,然后复制到/etc/avrdude.conf并保存。


(sudo gedit /etc/avrdude.conf)


For AT89S51


  1. #————————————————————  

  2. # AT89S51  

  3. #————————————————————  

  4. part  

  5.     id               = “8052”;  

  6.     desc             = “AT89S51”;  

  7.     signature        = 0x1E 0x51 0x06;  

  8.     chip_erase_delay = 500000;  

  9.     pgm_enable       = “1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1”,  

  10.                        “x x x x  x x x x    x x x x  x x x x”;   

  11.   

  12.     chip_erase       = “1 0 1 0  1 1 0 0    1 0 0 x  x x x x”,  

  13.                        “x x x x  x x x x    x x x x  x x x x”;   

  14.   

  15.     timeout      = 200;  

  16.     stabdelay      = 100;  

  17.     cmdexedelay      = 25;  

  18.     synchloops      = 32;  

  19.     bytedelay      = 0;  

  20.     pollindex      = 3;  

  21.     pollvalue      = 0x53;  

  22.     predelay      = 1;  

  23.     postdelay      = 1;  

  24.     pollmethod      = 0;   

  25.   

  26.     memory “flash”  

  27.         size            = 4096;  

  28.         paged           = no;  

  29.         min_write_delay = 4000;  

  30.         max_write_delay = 9000;  

  31.         readback_p1     = 0xff;  

  32.         readback_p2     = 0xff;  

  33.         read            = ”  0   0   1   0    0   0   0   0″,  

  34.                           ”  x   x   x a12  a11 a10  a9  a8″,  

  35.                           ” a7  a6  a5  a4   a3  a2  a1  a0″,  

  36.                           ”  o   o   o   o    o   o   o   o”;   

  37.   

  38.         write           = ”  0   1   0   0    0   0   0   0″,  

  39.                           ”  x   x   x a12  a11 a10  a9  a8″,  

  40.                           ” a7  a6  a5  a4   a3  a2  a1  a0″,  

  41.                           ”  i   i   i   i    i   i   i   i”;  

  42.    mode      = 0x21;  

  43.    delay      = 12;  

  44.       ;   

  45.   

  46.     memory “signature”  

  47.         size            = 3;  

  48.         read            = “0  0  1  0   1  0  0  0   x  x  x  0   0  0 a1 a0”,  

  49.                           “0  0  0  0   0  0  0  0   o  o  o  o   o  o  o  o”;  

  50.       ;  

  51.   ;  

For AT89S52


  1. #————————————————————  

  2. # AT89S52  

  3. #————————————————————  

  4. part  

  5.     id               = “8052”;  

  6.     desc             = “AT89S52”;  

  7.     signature        = 0x1E 0x52 0x06;  

  8.     chip_erase_delay = 500000;  

  9.     pgm_enable       = “1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1”,  

  10.                        “x x x x  x x x x    x x x x  x x x x”;   

  11.   

  12.     chip_erase       = “1 0 1 0  1 1 0 0    1 0 0 x  x x x x”,  

  13.                        “x x x x  x x x x    x x x x  x x x x”;   

  14.   

  15.     timeout      = 200;  

  16.     stabdelay      = 100;  

  17.     cmdexedelay      = 25;  

  18.     synchloops      = 32;  

  19.     bytedelay      = 0;  

  20.     pollindex      = 3;  

  21.     pollvalue      = 0x53;  

  22.     predelay      = 1;  

  23.     postdelay      = 1;  

  24.     pollmethod      = 0;   

  25.   

  26.     memory “flash”  

  27.         size            = 8192;  

  28.         paged           = no;  

  29.         min_write_delay = 4000;  

  30.         max_write_delay = 9000;  

  31.         readback_p1     = 0xff;  

  32.         readback_p2     = 0xff;  

  33.         read            = ”  0   0   1   0    0   0   0   0″,  

  34.                           ”  x   x   x a12  a11 a10  a9  a8″,  

  35.                           ” a7  a6  a5  a4   a3  a2  a1  a0″,  

  36.                           ”  o   o   o   o    o   o   o   o”;  

  37.   

  38.         write           = ”  0   1   0   0    0   0   0   0″,  

  39.                           ”  x   x   x a12  a11 a10  a9  a8″,  

  40.                           ” a7  a6  a5  a4   a3  a2  a1  a0″,  

  41.                           ”  i   i   i   i    i   i   i   i”;  

  42.    mode      = 0x21;  

  43.    delay      = 12;  

  44.       ;   

  45.   

  46.     memory “signature”  

  47.         size            = 3;  

  48.         read            = “0  0  1  0   1  0  0  0   x  x  x  0   0  0 a1 a0”,  

  49.                           “0  0  0  0   0  0  0  0   o  o  o  o   o  o  o  o”;  

  50.       ;  

  51.   ; 


For AT89S8253


  1. #————————————————————  

  2. # AT89S8253  

  3. #————————————————————  

  4. part  

  5.     id               = “8253”;  

  6.     desc             = “AT89S8253”;  

  7.     chip_erase_delay = 20000;  

  8.     pgm_enable       = “1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1”,  

  9.                        “x x x x  x x x x    x x x x  x x x x”;   

  10.   

  11.     chip_erase       = “1 0 1 0  1 1 0 0    1 0 0 x  x x x x”,  

  12.                        “x x x x  x x x x    x x x x  x x x x”;   

  13.   

  14.     timeout      = 200;  

  15.     stabdelay      = 100;  

  16.     cmdexedelay      = 25;  

  17.     synchloops      = 32;  

  18.     bytedelay      = 0;  

  19.     pollindex      = 3;  

  20.     pollvalue      = 0x53;  

  21.     predelay      = 1;  

  22.     postdelay      = 1;  

  23.     pollmethod      = 0;   

  24.   

  25.     memory “flash”  

  26.         size            = 12288;  

  27.         paged           = no;  

  28.         min_write_delay = 4000;  

  29.         max_write_delay = 9000;  

  30.         readback_p1     = 0xff;  

  31.         readback_p2     = 0xff;  

  32.         read            = ”  0   0   1   0    0   0   0   0″,  

  33.                           ”  x   x a13 a12  a11 a10  a9  a8″,  

  34.                           ” a7  a6  a5  a4   a3  a2  a1  a0″,  

  35.                           ”  o   o   o   o    o   o   o   o”;  

  36.   

  37.         write           = ”  0   1   0   0    0   0   0   0″,  

  38.                           ”  x   x a13 a12  a11 a10  a9  a8″,  

  39.                           ” a7  a6  a5  a4   a3  a2  a1  a0″,  

  40.                           ”  i   i   i   i    i   i   i   i”;  

  41.    mode      = 0x21;  

  42.    delay      = 12;  

  43.       ;   

  44.   

  45.     memory “signature”  

  46.         size            = 2;  

  47.         readback_p1     = 0x1E;  

  48.         readback_p2     = 0x73;  

  49.         read            = “0  0  1  0   1  0  0  0   x  x  x  x   x  x  x  x”,  

  50.                           “x  x  1  1   0  0  0 a0   o  o  o  o   o  o  o  o”;  

  51.       ;  

  52.   ;  


特意要说明一下的是,网上有些配置在S51和S52的delay的参数上给的20000,这个delay太短了,在验证代码的时候会出错。因此还是建议用如上的配置。

使用avrdude烧写:


配置完成之后,就可以烧写啦~要用main.hex哦~



  1. monkey@monkey-ThinkPad-E425:~/McuWork/51_SDCC/workpace/Blink$ make program   
  2. sudo avrdude -p 8052 -c usbasp -e -U flash:w:’./main.ihx’  
  3.   
  4. avrdude: warning: cannot set sck period. please check for usbasp firmware update.  
  5. avrdude: AVR device initialized and ready to accept instructions  
  6.   
  7. Reading | ################################################## | 100% 0.01s  
  8.   
  9. avrdude: Device signature = 0x1e5206  
  10. avrdude: erasing chip  
  11. avrdude: warning: cannot set sck period. please check for usbasp firmware update.  
  12. avrdude: reading input file “./main.ihx”  
  13. avrdude: input file ./main.ihx auto detected as Intel Hex  
  14. avrdude: writing flash (140 bytes):  
  15.   
  16. Writing | ################################################## | 100% 1.69s  
  17.   
  18. avrdude: 140 bytes of flash written  
  19. avrdude: verifying flash memory against ./main.ihx:  
  20. avrdude: load data flash data from input file ./main.ihx:  
  21. avrdude: input file ./main.ihx auto detected as Intel Hex  
  22. avrdude: input file ./main.ihx contains 140 bytes  
  23. avrdude: reading on-chip flash data:  
  24.   
  25. Reading | ################################################## | 100% 0.57s  
  26.   
  27. avrdude: verifying …  
  28. avrdude: 140 bytes of flash verified  
  29.   
  30. avrdude: safemode: Fuses OK  
  31.   
  32. avrdude done.  Thank you.  
  33.   
  34. monkey@monkey-ThinkPad-E425:~/McuWork/51_SDCC/workpace/Blink$  



搞定哈~


选项说明(Options):


  1. -p specifies the type of the MCU connected to the programmer.  
  2. -c specifies the default programmer  
  3. -e causes a chip erase to be executed.  
  4. -U memtype:op:filename  
  5. The op field specifies what operation to perform:  
  6.  r read device memory and write to the specified file  
  7.  w read data from the specified file and write to the device memory  
  8.  v read data from both the device and the specified file and perform a verify  
最后难免会有问题出现,遇到问题就慢慢解决喽~USBASP使用前请用lsusb命令确认识别。USBASP固件在附传~在windows下也有相关的USBASP使用方法在这里就不多说了~USBASP的制作参考 http://www.linuxidc.com/Linux/2012-05/61087.htm

我也做过一个。。不过自己做的腐蚀板子出来的相对看很丑啊~~我也出去开板子做了就2个了,如果大连理工的同学想要的话可以联系下(空板)。(这个USBASP网上买都不到10元~感谢S51系列的在线编程吧,可别买成C51了,那就乖乖用并口或其他烧录吧~至于STC的可以用串口烧录,那就更方便了,不过STC烧录软件没有linux版本的。遗憾了。)

附录:


单源文件简易Makefile


make : 编译


make hex : 生成*.hex


make program : 烧录


  1. #=============================================================================  

  2. #     FileName: Makefile  

  3. #         Desc: sdcc signal file  

  4. #       Author: Galaxy2416(Gin)  

  5. #        Email: sunxiao.gin@gmail.com  

  6. #     Compiler: sdcc  

  7. #      Version: 0.0.1  

  8. #   LastChange: 2012-05-19 16:30:35  

  9. #      History:  

  10. #=============================================================================  

  11.   

  12.   

  13. CC=sdcc  

  14.   

  15. SOURCE = $(wildcard *.c)  

  16.   

  17.   

  18. all :  

  19.     $(CC) -mmcs51 $(SOURCE)   

  20. hex:  

  21.     packihx ‘$(wildcard *.ihx)’ > ‘$(patsubst %.ihx,%.hex,$(wildcard *.ihx))’  

  22.   

  23. program :   

  24.     sudo avrdude -p 8052 -c usbasp -e -U flash:w:’./$(wildcard *.ihx)’  

  25.   

  26. .PHONY: clean  

  27. clean:  

  28.     rm -f *.bak  

  29.     rm -f *.rel  

  30.     rm -f *.asm  

  31.     rm -f *.lst  

  32.     rm -f *.sym  

  33.     rm -f *.map  

  34.     rm -f *.lnk  

  35.     rm -f *.mem  

  36.     rm -f *.i  

  37.     rm -f *.d  

  38.     rm -f *.rst  

赞(0) 打赏
转载请注明出处:服务器评测 » Ubuntu下的AT89S52,S51+SDCC+USBASP的开发环境搭建
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏