想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。传统上,51单片机一般用keil c集成环境来进行编译开发,然后直接烧录到芯片上去运行,这有几个缺点:

·keil C是商业软件,很多人都想白嫖,而是要么使用盗版(破解版),要么使用它的演化版,前者存在法律风险,也有道德瑕疵,后者有功能上的限制;

·就算keil C买了正版,也有不尽如人意的地方,比如keil C对C99和C11的支持不好;

·直接烧录到芯片比较繁琐,对反复的测试不直观和方便。

对上面的问题,我们可以采用开源和免费的工具来实现编译和仿真来避免这一类的问题。

首先,我们可以采用开源免费的sdcc来进行编译,关于sdcc的介绍,可以看下面:

SDCC - Small Device C Compilersdcc.sourceforge.net/

SDCCis a retargettable, optimizing Standard C (ANSI C89,ISO C99, ISO C11) compiler suite that targets the Intel MCS51 based microprocessors (8031, 8032, 8051, 8052, etc.), Maxim (formerly Dallas) DS80C390 variants, Freescale (formerly Motorola) HC08 based (hc08, s08), Zilog Z80 based MCUs (z80, z180, gbz80, Rabbit 2000/3000, Rabbit 3000A, TLCS-90), Padauk (pdk14, pdk15) and STMicroelectronics STM8. Work is in progress on supporting the Padauk pdk13 target; Microchip PIC16 and PIC18 targets are unmaintained. SDCC can be retargeted for other microprocessors.
SDCC was originally written by Sandeep Dutta and released under aGPL license.

可见SDCC解决了我们两个大问题:开源免费,以及支持C99和C11(最新版还支持C2x)。

下载安装完成后,可以采用下面的命令来对编好的C程序文件进行编译:

sdcc源文件.c编译选项[-o输出文件名]

简单的使用,我们可以用下面的命令来编译满足C99标准(有少量的不满足)的8051程序:

sdcc源文件.c --std-c99 -o输出文件

除此之外,还可以设置:--std-sdcc99来支持sdcc的扩展功能,或者--std-c11和--std-sdcc11以支持C11的标准(以及sdcc的扩展),和--std-c2x和--std-sdcc2x以支持C2x的草案。

简单归纳一下:

ISO C90 / ANSI C89标准:

·不支持double、long double类型;

·不支持将结构体(struct)和联合体(union)作为函数的参数和返回值;

·不支持 K&R风格的函数定义;

·对于51系列单片机,默认情况下函数是不可重入的(function are not reentrant),意味着默认情况下函数内的变量是static,并被放置在统一的数据空间(data-space),这主要是因为51系列的内存太小的缘故,如果需要变量存放在函数的栈(stack)内,需要单独进行函数的修饰说明,如下:

unsignedcharfoo(chari)__reentrant{...}

或者在编译的时候加上--stack-auto选项,或者如下加上预编译指令:

#pragma stackauto

ISO C99标准:

·(上面C89的那些不支持的内容);

·不支持复合字面量(Compound literals),即能够就地构造一个指定类型的无名对象,在只需要一次数组、结构体或联合体变量时使用,如下简单示例如何使用复合字面量:

int*p=(int[]){2,4};//创建一个无名的 int[2]类型静态存储数组//初始数组为值 {2, 4}//创建指向数组首元素的指针 pconstfloat*pc=(constfloat[]){1e0,1e1,1e2};//只读复合字面量intmain(void){

intn=2,*p=&n;

p=(int[2]){*p};//创建一个无名的 int[2]类型自动存储数组//初始化首个元素为之前 *p所持有的值//初始化第二个元素为零//将首元素的地址存储到 p

structpoint{doublex,y;};

voiddrawline1(structpointfrom,structpointto);

voiddrawline2(structpoint*from,structpoint*to);

drawline1((structpoint){.x=1,.y=1},//创建二个块作用域的结构体(structpoint){.x=3,.y=4});//然后调用 drawline1,以值传递drawline2(&(structpoint){.x=1,.y=1},//创建二个块作用域的结构体&(structpoint){.x=3,.y=4});//然后调用 drawline2,传递其地址}

这真的很可惜,这是C99的很大一个优势,不过8051的sdcc本来就不支持结构体作为函数的参数,所以影响还不大;

·不支持非常量长度数组(Variable-length arrays,VLA),即数组定义时其长度可以是一个变量,下面是简单示例VLA的用法:

{

intn=1;label:;

inta[n];//重分配 10次,每次拥有不同大小printf("The array has %zu elements\n",sizeofa/sizeof*a);

if(n++<10)gotolabel;//离开作用域的&nbsp;VLA结束其生存期}

·不支持非ASCII字符的宏名(Non-ASCII characters in macro names)

烧录到stc 8051芯片上的程序,可以用stcflash,这是python脚本,需要安装python环境。

对于8051的仿真,可以采用多种仿真器,其中,最直观简单的是edSim51,这是用java编写的,可以适用在不同的操作系统上,其自带了LED、按键、数码管、ADC、DAC、步进电机等模拟,非常适合教学和学习练习。

采用开源工具学习51单片机相关推荐

  1. 51单片机c语言学习感想,学习51单片机心得体会

    在这里给大家分享一下学习51单片机心得体会: 1.我从不说51是基础,如果我这么说,也请把这句话理解为微机原理是基础. 2.对51单片机的操作本质上就是对寄存器的操作,对其他单片机也是如此.库只是一个 ...

  2. 如何自己学习51单片机

    第1章 如何学习单片机 在错误的道路上日夜兼程,最终也无法成功,方法和思路绝对是最重要的.一些学技术的同学,往往看到这类章节会直接跳过去,因为大多数类似章节都是废话连篇.但是,今天在这里作者可以很负责 ...

  3. 零基础学习51单片机

    零基础学习51单片机 前言 51单片机是一款非常经典的8位单片机,广泛应用于各种嵌入式系统和电子产品中.本文将从零开始,以简明易懂的方式介绍51单片机的基本原理.基本语法和应用. 什么是单片机 单片机 ...

  4. 用 C学习51单片机——记录 4、中断系统 (1)外部中断

    用 C学习51单片机--记录 4.中断系统 用 C 学习51单片机过程与自我拓展--记录(STC89C52芯片) 前言--其实51并不太难,多看 多写代码,多调试,就一定会有所感悟. 所以我在此留下一 ...

  5. 【手把手教你学习51单片机】74HC138 三八译码器的应用

    注:本文章转载自<手把手教你学习51单片机>!因转载需要原文链接,故无法选择转载! 如若侵权,请联系我进行删除!上传至网络博客目的为了记录自己学习的过程的同时,同时能够帮助其他一同学习的小 ...

  6. 【STC89C52】学习51单片机的必备电子电路知识基础

    电子电路是学习51单片机的基础, 如果能把以下几个模块弄清楚学习51单片机就不成问题啦. 目录 1.电平 2.单片机IO口 3.电阻 4.电容 5.电路原理图 ​编辑 6.单片机最小系统结构 7.单片 ...

  7. 【深入学习51单片机】二、一个极简RTOS源码分析

    目录 一.书接上回 二.初始化过程 三.任务的创建 四.任务的切换 五.任务的等待(系统延时) 一.书接上回 上回写了一个测试程序,可以直观的体会PC指针和堆栈指针的变化和影响.这章写下参考程序的过程 ...

  8. 笔记 学习51单片机串口中断

    单片机的串口通信功能是比较常用的功能. 80C51的串行口 我在学习的过程中,觉得SBUF的使用方法是最难的,于是对着这个图和资料一步步理解,才搞明白一点"A=SBUF"和&quo ...

  9. 用Proteus学习51单片机之I2C(IIC)总线

    最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!www.yo945.com 在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想 ...

最新文章

  1. 第一学期网络技术知识总汇
  2. R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facet、facet_grid)
  3. 算法笔记_156:算法提高 6-17复数四则运算(Java)
  4. 基于simulink的SVC与SVG的性能比较
  5. Python中小括号( )、中括号[ ]和大括号{}分别代表什么?
  6. No package ‘libmarco-private‘ found
  7. 三维激光扫描在堆体体积测算中的应用
  8. 大端模式和小端模式之“终极记忆”
  9. Android 隐藏虚拟按键
  10. 控制JetsonNano风扇命令
  11. 阿里云Api网关导入Swagger功能简介
  12. Kali Linux 使用记录
  13. Thumbnails框架图片缩略处理
  14. Qt创建线程两种方式的区别
  15. linux I2c设备注册
  16. 数据结构知识点总结整理
  17. 如何通过频率计算波特率
  18. 灵活自定义 PDF转换成Word转换器下载
  19. 怎么设置ie10默认浏览模式为兼容模式
  20. 2150: 部落战争

热门文章

  1. (SCA)正弦余弦算法SCA: A Sine Cosine Algorithm(代码可复制粘贴)
  2. (Java)IntelliJ IDEA 2021.1使用技巧、常用快捷键大全(win+mac)
  3. 搜狗输入法如何设置快捷短语
  4. 西子奥的斯服务器光电信号,西子奥的斯怎么看故障
  5. 计算流体力学简介(四)——有限差分法
  6. 拓展:示波器使用_波形分析
  7. Java中如何获取图片的长和宽
  8. MySQL 8.0 参考手册
  9. emu8086:如何实现数组的倒置
  10. 某公司.Net高级开发面试题(1)