如果不是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. java位移运算符3 转

    https://www.cnblogs.com/winsker/p/6728672.html 移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数. 理解java移位运算符 运算 ...

  2. SpringBoot使用prometheus监控

    本文介绍SpringBoot如何使用Prometheus配合Grafana监控. 1.关于Prometheus Prometheus是一个根据应用的metrics来进行监控的开源工具.相信很多工程都在 ...

  3. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  4. 编译ROCKSDB总结

    Rocksdb是挺好的一个东西,就是取得一个可用的库太麻烦.之前我是用的rocksdbsharp里面他有编译好windows 和 linux的库 兼 容性还挺好,ubuntu win10 直接跑没毛病 ...

  5. Vue 随机分配的打扫卫生H5 :打扫让我快乐

    情况是这样子的,每周四是我们小组打扫卫生,一共有四件活,7个人分配. 活分别是 : 扫地 拖地 倒垃圾 擦桌子 人分别是: '军', '春', '龙', '东', '贤', '磊','卿' 但是,每次 ...

  6. Egret获取和显示时间,年,月,日,时分秒

    let now = new Date(); this.nowYear = now.getFullYear(); this.nowMonth = now.getMonth() + 1; let noww ...

  7. linux查看分区是否开启acl权限

    1.为什么需要ACL权限 ACL的全称是 Access Control List (访问控制列表) .对于文件或者目录,都有相应的操作权限 r(read 读),w(write 写),x(execute ...

  8. Spring Cloud 组件 —— feign

    feign 作为一个声明式的 Http Client 开源项目.在微服务领域,相比于传统的 apache httpclient 与在 spring 中较为活跃的 RestTemplate 更面向服务化 ...

  9. PageHelper分页插件的使用

    大家好!今天写ssm项目实现分页的时候用到pageHelper分页插件,在使用过程中出现了一些错误,因此写篇随笔记录下整个过程 1.背景:在项目的开发的过程中,为了实现所有的功能. 2.目标:实现分页 ...

  10. Python tkinter 学习记录(一) --label 与 button

    最简的形式 from tkinter import * root = Tk() # 创建一个Tk实例 root.wm_title("标题") # 修改标题 root.mainloo ...