找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8912|回复: 4
打印 上一主题 下一主题
收起左侧

用开源软件开发8051应用程序

[复制链接]
跳转到指定楼层
楼主
ID:24072 发表于 2010-5-26 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

51hei开发板赠送了一个盗版的Keil c51 IDE,用这个IDE可以进行任何8051的编程工作,但是使用盗版软件始终是有风险的,可能有一天Keil也会搞黑屏或律师函什么的,所以采用开源软件搭建8051开发环境还是有必要的。

 

首先下载8051开发自由软件Mide:http://www.opcube.com/home.html (注意在网页中下部),下载打包的那个,也就是4M多的那个,那个里面带有一个编辑器,一个8051 c编译器SDCC(开源软件),和一个8051软件模拟器JSIM(自由软件,v1.x的代码可以得到)。

 

首先,启动安装并启动Mide,将编译器配置为SDCC。由于SDCC编译器和Keil编译器语法有些不同,所以这里给出一个具体例子,该例子将在指定的8个LED数码管的一个上显示指定数字,本例中是在第六个数码管上显示A:

 

#include <8051.h>

sbit at (0xA6) seg_sel ; // 段选
sbit at (0xA7) digit_sel ; // 位选

 

//全局变量定义,注意如果非中断函数和中断函数都可能使用的变量需要进行禁止中断保护
//同时需要将变量定义为volatile . exp: volatile u8 timer_count = 0;
//如果只是在该文件中使用的变量或函数请在前面加static

 

void led_show(int digit, int hexVal);

 

void main(void)
{
 //变量定义
 //相关初始化工作
 led_show(5, 0xA);  // 在第六个数码管(参数为5)显示A 
 while(1)
 {
  //做具体工作
 }
}

/**
  功能: 在指定数码管上显示指定数字,由调用者保证参数的有效性
  参数:
    1. digit: 1~8 指定数码管
    2. hexVal: 0~0xF 需要显示的数字
  返回值:无
*/
void led_show(int digit, int hexVal)
{
 //                           0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F
 unsigned char led_char[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

 P0 = 0xff;
 digit_sel = 1;
 P0 ^= (0x1<<(digit-1));
 digit_sel = 0;

 seg_sel = 1;
 P0 = led_char[hexVal];
 seg_sel = 0;
}

 

选择重建工程可以生成*.hex文件,直接下载到hei51开发板就可以使用。本程序可以做为hei51开发板LED驱动使用。

 

另外,周立功公司的KTStudio也是使用SDCC编译器,也有软件模拟功能,目前也是免费的,可以考虑使用。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:22246 发表于 2010-5-26 18:42 | 只看该作者
但是这个软件生成的hex文件的质量能和keil相提并论吗?
回复

使用道具 举报

板凳
ID:24072 发表于 2010-5-26 20:12 | 只看该作者

通过试验温度测量led显示的例子,用Keil编译的hex文件大小是1661,而用SDCC编译出来的文件大小是1840,代码大小大了将近200个字节。

 

应该还算可以。

回复

使用道具 举报

地板
ID:24072 发表于 2010-5-27 09:45 | 只看该作者

hi

jjide说的很对,可能Heil C51编译器比SDCC生成代码质量要好,所以我们在编制程序时可以考虑同时支持这两种平台。

 

在C语言中有丰富的预处理指令,可以设置各种编译选项来帮助我们实现这个功能。

 

首先定义global.h文件,存放项目中的全局定义,定义采用哪种编译器:

#define USE_SDCC 1
#define USE_KEIL 0

然后在需要sbit定义的地方写如下代码:

#if USE_SDCC
sbit at 0xA6 DUAN;
sbit at 0xA7 WEI;
sbit at 0x97 TMDAT;
#elif USE_KEIL
sbit DUAN = P2^6; //74HC573的LE端    LED的段选端
sbit WEI = P2^7; //74HC573的LE端    LED的位选端
sbit TMDAT = P1^7; //DS1820温度接口
#endif

 

这样在KEIL编译时只需将USE_KEIL设置为1,而USE_SDCC设置为零就可以了。

 

另外,代码生成质量和我们对编译器的了解程度有很大的关系,如果我们写的程序利于特定编译器进行优化,那么生成代码的质量当然就会提高,在SDCC的手册里列出了许多优化策略,如果充分利用的话,可以提高代码生成质量。另外,SDCC首先将*.c编译成汇编语言*.asm,如果对代码质量要求很高的,可以直接优化*.asm程序。

回复

使用道具 举报

5#
ID:22246 发表于 2010-5-27 16:20 | 只看该作者
免费软件能做到这个水平实在是太牛逼了,看来德国keil的地位要受到挑战了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表