如果不是Seven问起来,我以为C51这种东西已经属于历史遗迹了。不过简单搜索了一下,发现c51老而弥坚,仍然茁壮的生长着。原因据说,一方面是有很大的用户群和既有的软硬件资源,另外一方面,的确在很多的高校教学中仍然占有一席之地。其实个人感觉,高校课程的更新真的是需要再加快了。

不过不管如何,作为入门类的单片机,c51还好啦,这些学习的经历,并不会浪费,学生能够很快的转化到其它平台上去。

Seven碰到的情况是这样,c51开发工具目前基本以windows为主,在mac上无法工作,总不能为了学习c51就换一台电脑。我搜索了一下,发现了sdcc这个工具,于是来尝试一下,首先是安装sdcc:

brew install sdcc

找一个呼吸灯程序源码,来测试一下编译是否正常:

#include <8051.h>

//  延时函数
// 参数 in 为延时的时间长度(单位时间很短,大约一条指令的时间)
void delay(unsigned int in)
{
unsigned int i;
for(i=0;i<10*in;i++) {;}
}
// 由暗变亮的子函数
// 参数 ledn 为点第几位的灯
void off_on(unsigned char ledn)
{
unsigned int i,j;
for(i=0;i<100;i++)
{
for(j=0;j<100;j++)
{
if(i<=j)
{ // 模拟pwm的低电平输出
P0 = 0;
}
else
{ // 模拟PWM的高电平输出
P0 = 1<<ledn;
}
delay(10); // 这里的延时 根据灯的情况自己调整
}
}
}
// 由亮变暗的子函数
// 参数 ledn 为点第几位的灯
void on_off(unsigned char ledn)
{
unsigned int i,j;
for(i=100;i>1;i--)
{
for(j=0;j<100;j++)
{
if(i<=j)
{ // 模拟pwm的低电平输出
P0 = 0;
}
else
{ // 模拟PWM的高电平输出
P0 = 1<<ledn;
}
delay(10); // 这里的延时 根据灯的情况自己调整
}
}
}
// 主程序开始
void main()
{
unsigned char ledn;
while(1)
{
for(ledn=0;ledn<8;ledn++)
{
off_on(ledn);
on_off(ledn);
}
}
}

(补充知识:在mac电脑中一般都是在命令行工作,编辑文件可以使用vi编辑器,不熟悉vi编辑器的,也可以推荐使用TextMate.app,这个程序可以在启动台找到,也可以在命令行执行mate命令来启动编辑器。如果没有安装过的话,还可以使用brew cask install textmate来安装。)

上面的源代码我们保存到比如test.c文件,接下来编译一下:

#编译命令,后面的test.c就是我们的源码,可以替换成你需要的名字:
sdcc test.c
#编译成功会生成多个文件:
test.asm test.ihx test.lk test.lst test.map test.mem test.rel test.rst test.sym

这些文件中其实只有test.ihx文件是我们需要的输出文件。其它文件都是工作过程中的临时文件,一般没有用处,可以删除,但在大型系统中查错、分析可能会用得到。在windows工作惯了的同学们可能更习惯.hex输出文件,把.ihx转换为.hex的命令是:

packihx test.ihx > test.hex

还有可能会需要.bin文件,转换方法是:

sdobjcopy -I ihex -O binary test.ihx test.bin
#-I指定的是输入格式,-O指定的是输出格式
#最后两个参数分别是输入、输出的文件名
#sdobjcopy不带任何参数执行有更详细的帮助可以参考

.hex/.bin文件,并非是必须的,特别是在mac上工作,只是交流的时候如果需要,可以用上面的方法转换出来。

一般在学习的情况下,知道上面这些就够用了。在正式的开发过程中,特别是项目比较大,有多个模块,你可能还需要知道下面这些用法。

把源代码编译成链接库文件.rel:

sdcc -c test.c

执行完成你会发现已经有了.rel链接库文件。.rel可以经由再次编译,输出成常规的.ihx文件,方法跟普通编译其实是一样的:

sdcc test.rel

这里大多初学者会有一个疑问,既然最终都是要.ihx文件,为啥还要编译成.rel文件呢?原因很多,常见的如下:

  • 当一个工程很大的时候,会分成多个.c程序来写,这就需要分别编译。而如果很多个.c文件,这编译也是很慢的,所以通行的做法是哪个文件被修改了,就仅编译改变了的文件。这时候使用.rel文件就会快很多,因为从.c文件到.rel文件,编译做了大多工作,只是没有做最后的拼装。一个大工程编译仅修改过的文件到.rel,然后把所有的.rel拼装在一起成为.ihx文件,速度会很快。
  • 还有的时候,比如你编写了一个模块,这个模块是通用的,可以供很多人使用,但你不希望别人看到源码或者避免别人修改搞乱了源码。你可以只给对方.rel文件和函数描述的.h文件,对方把你的模块放到自己的项目中而不去关心源代码是怎样的。

继续我们的话题。单片机为了提高效率,还经常会用到汇编语言,汇编语言在sdcc软件包中是分cpu来实现的,一般默认提供这些cpu的汇编器:

sdas390    sdas6808   sdas8051   sdasgb     sdasrab    sdasstm8   sdastlcs90 sdasz80

这些汇编器统一的命名规则是sdasxxxx,xxxx是指cpu的型号,比如8051的cpu就使用sdas8051,z80的cpu就使用sdasz80。汇编器使用的方法是(以8051为例):

sdas8051 -ols filename.asm

汇编结果输出.rel文件以及一些其它的过程文件。

重要:使用sdcc编译单片机程序,跟windows下面keil的c代码是有一些差别的,列表如下:

  Mac sdcc Windows Keil c
头文件 8051.h/8052.h reg51.h/reg52.h
IO端口 P2_0 P2^0
IO口定义 #define LED P2_0 sbit LED = P2^0
中断函数 void INT0_ISR() __interrupt 0 void INT0_ISR() interrupt 0

可以看到,这个差别是非常小的。对于初学者来说,一般就是引用头文件的时候要注意别用错。其它的内容,碰到了就注意用对应的语法,碰不到就不用管。

————————————————————————————————————————————

有了编译的结果,还要烧录到51单片机上来测试结果,烧录这个词是行业内的“黑话”,表达同样意思的常用说法还有“刷机”、“烧机”、“烧写”、“下载到单片机”等,当然”下载到单片机”其实是最正式的说法。

烧录需要有一个烧录软件,mac上可以这样安装:

#首先到一个保存烧录程序的目录:
cd ~/bin/
#下载程序
wget https://raw.githubusercontent.com/laborer/stcflash/master/stcflash.py
#下载的程序实际是一个文本文件,设定这个文件的可以执行标志
chmod +x stcflash.py

51单片机都是通过串口跟电脑连接的,当前的电脑一般都没有串口,所以都是使用usb串口卡,mac电脑一定要安装对应的mac版本电脑驱动程序。这时候51单片机通过串口插到电脑上之后,在/dev/目录会看到这个串口设备,设备的名字根据串口卡厂商的不同而不同,比如叫:/dev/tty.usbserial 。

刚才下载的这个烧写软件支持.ihx文件和.bin文件,也就是说我们刚才编译的.ihx文件直接就可以烧录到51单片机上,烧录的命令是:

stcflash.py test.ihx

文章看起来似乎比较复杂,其实包含了才开始搭建环境以及你需要知道的所有入门型知识,只需要折腾这一次,以后的使用,应当能感觉到在mac更加的迅速、高效。

参考资料链接:

sdcc官网:http://sdcc.sourceforge.net/,建议以官方文档为主。

sdcc简单说明:http://blog.csdn.net/baskmmu/article/details/43683289,因版本问题,此文档中有一些错误,请甄别性的阅读。

使用SDCC在Linux/macOS上开发51单片机程序:https://lonord.name/article/580cb1f67240257ec13293fb

烧录软件:https://github.com/laborer/stcflash

在Mac电脑编译c51程序的更多相关文章

  1. 一个在mac上编译c++程序的低级失误

    今天在编译hadoop的pipes的wordcount例子时,总是报错不能成功. g++ -m64 -I/Users/stephen/Downloads/hadoop-0.20.2/c++/Mac_O ...

  2. 19-02【mac电脑操作】最小化应用程序

    最小化应用程序 windows下很简单,直接使用windows+M即可: mac电脑下,官方建议是:option+command+m+h.但实际使用的时候,这个快捷键并不好使: 解决方案:mac系统设 ...

  3. 为开发用途mac电脑瘦身

    本文介绍的瘦身方法仅仅针对开发用途的mac电脑,在我们的开发过程中会发现随着编译的程序过多非常导致硬盘空间的占用率不断上升. 原文地址:http://blog.csdn.net/qqmcy/artic ...

  4. 为OPENCV添加freetype支持并显示中文字符(在mac上编译opencv及contrib库)

    在mac电脑上管理这些gnu的库一般都使用Homebrew,但总有一些你个性化的需要是官方的Homebrew配方无法满足的.比如在屏幕的输出中使用中文字符. 在OPENCV中输出UTF8字符集早已经有 ...

  5. Mac电脑C语言开发的入门帖

    本文是写给Mac电脑开发新手的入门帖,诸神请退散. C语言 C语言可说是电脑环境中的"镇国神器",从发明至今,虽然C语言的使用者缓慢的减少,但从当前市场应用情况看,尚无一台电脑能够 ...

  6. mac 电脑下添加 HTMLtestrunner.py 生成 报表

    HTMLTestRunner是Python标准库unittest模块的一个扩展.它生成易于使用的HTML测试报告. 1.下载HTMLTestRunner.py模块地址 http://tungwaiyi ...

  7. [Mac A]为什么国外程序员爱用 Mac?

    from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜 ...

  8. 【工具使用】mac电脑使用技巧

    本文地址 分享提纲: 1.  mac命令行和finder的交互 2. 一些mac的插件 3. 一些开发的配置 1.mac命令行和findder交互           1)命令行中打开当前文件夹: o ...

  9. Mac Pro 编译安装 Redis-3.2.3

    Redis官方下载地址:http://redis.io/download Redis安装 cd /usr/local/src/redis-3.2.3 sudo make sudo make insta ...

随机推荐

  1. hive的概述和数据类型

    一.Hive概述 1.Hive简介 Hive数据仓库软件有助于使用SQL读取.编写和管理驻留在分布式存储中的大型数据集.提供了命令行工具和JDBC驱动程序以将用户连接到Hive. Hive可以将SQL ...

  2. Vue-Router动态路由匹配

    //重点在于路由出口 <p> <!-- 使用 router-link 组件来导航. --> <!-- 通过传入 `to` 属性指定链接. --> <!-- & ...

  3. ios12版本以上键盘唤起后,收回页面不回滚问题

    最近提测后,发现ios升级到12版本之后,引发了调用确认框的组件之后按钮失效问题. 然后开始了升级复现bug的各种操作,最后发现是完成后键盘收起后,页面没有回滚,因为页面整体被推上了一定高度,导致错位 ...

  4. webServices 使用GET请求接口方法

    webServices  若要使用GET请求接口方法在Web.config 下添加这段 <webServices>     <protocols>       <add  ...

  5. java.lang.ClassCastException: net.sf.json.JSONNull cannot be cast to net.sf.json.JSONObject的解决方法

    报错情况已经说明了,在百度查了好几个解决方法,这里总结一下: 首先:加一个判断是否为空,再做操作 // 得到json串 String jsonString = UtilPOSTGET.UPost(FO ...

  6. 微信公众平台测试号 “微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003”

    设置"网页授权获取用户基本信息" 点击"修改" 弹出"OAuth2.0网页授权",注意域名不加"https://"或&q ...

  7. Sqoop葵花宝典

    Sqoop葵花宝典 基于Sqoop1.x 场景 导入流程 graph LR A[RDBMS] -->|Sqoop| B(Hive) 导出流程 graph LR A[Hive] -->|Sq ...

  8. spring-security权限管理学习目标

    1.SVN基本介绍: 1.svn基本的概念 2.svn架构 3.svn下载与安装 4.svn搭建与基本操作 2.svn基本操作 1.操作1 2.操作2 3.冲突产生 4.冲突解决 3.SVN在IDEA ...

  9. sqlmap Windows 安装教程

    第一步:下载 python :https://www.python.org/downloads/    (这里有python各种版本,但是一般建议安装3和2.7) sqlmap:https://git ...

  10. centos7 mysql自动备份

    MySQL自动备份shell脚本   在数据库的日常维护工作中,除了保证业务的正常运行以外,就是要对数据库进行备份,以免造成数据库的丢失,从而给企业带来重大经济损失.通常备份可以按照备份时数据库状态分 ...