前言
正在写作这篇文章的笔者是一名大四的软件工程学生,因为实习工作的需要,奉命研究单片机开发,所以我所扯的内容可能更适合跟我的情况比较相同的人。
如果你懂一些计算机原理和C语言开发,读下面的文章就不会很费劲。但如果不懂也没关系,那就交叉学习吧。
什么是单片机
从CPU说起。
CPU(Central Processing Unit, 中央处理器)
CPU由运算器、缓存器及总线构成。其中,运算器是指ALU(Arithmetic logic unit,算术逻辑单元),是CPU的核心;缓存器(Cache)可分为一级缓存、二级缓存和三级缓存,容量逐步递增,读写速度速度递减,成本递减;总线(Bus)分为数据、控制和状态三种。典型代表:8086。
-
物理结构
从物理结构上看,CPU可分为逻辑部件、寄存器部件和控制部件。逻辑部件主要用于定点或浮点算术运算操作、移位操作和逻辑操作;寄存器部件可分为通用、专用和控制。每一种寄存器都有它自己的用处;控制部件主要用于指令译码和发出控制信号。 -
性能参数
作为数据处理的中心,最主要的参数可以说是主频和外频了。先说外频,外频是基准频率,它决定了主板的运行速度,人们所说的超频,超的就是外频。
主频=外频倍频*
主频,又叫时钟频率。由上述公式可以看出主频由外频决定。主频表示CPU内数字脉冲信号震荡的速度,它可以说明CPU的运算和处理数据的速度。简而言之,主频越高,CPU越快。CPU每做一个动作,处理数据或发布命令,都要随着主频的节奏来。所以这是个很有节奏感的东西。
计算机(Computer)
依照冯诺依曼体系,计算机的五大组成部件为运算器、控制器、存储器、输入设备和输出设备。其中运算器和控制器合起来就是CPU;存储器又可以拆分为内存和外存;输入和输出设备就是键盘、鼠标、显示器等。
-
处理器
运算器和控制器可以合称为处理器,CPU主要就是这两个部件。前者负责数据处理,后者发布命令。 -
存储器
存储器主要是指内存(RAM,Random Access Memory,随机存取存储器),靠电容的充放电存储电容信号进而可在逻辑上表示数字信号。由于电容充放电速度很快,所以内存的读写速度仅次于CPU中的缓存。但又因为是电容,所以无法在不通电的情况下存储这些信息。这样就催生了ROM,为了保存数据但只能写入一次的只读存储器。再后来为了能擦了重写就出现了EPROM和EEPROM等可擦写ROM。硬盘、U盘等都是前者的衍生物,他们都统称为外存(external storage),其主要作用就是在断电的时候能够保存数据。因为涉及到物理动作(掰硬盘里面的小磁针、在光盘上烫洞),所以相对于内存的速度要慢上要几个档次。 -
I/O
I/O就是与之交互的基础了,通过输入设备来告诉它,通过输出设备来告诉你。就是机器交互的耳朵和嘴了。
单片机(MCU, Microcontroller Unit)
是一种集成电路(IC, Integrated Circuit),其实应该叫微控制器,单片机这个名字主要是指之前的SCM(Single Chip Micyoco, 嗯… Micyoco是个神奇的单词)。而现在MCU是由SCM发展而来的,在高级点就可以说是SoC(System on Chip)。但后面的我所提到的单片机就是说MCU啦(因为我主要玩了下51单片机,这个是什么鬼我后面会说)。
说正事儿,单片机可以说是“浓缩的计算机”而不是“浓缩的CPU”,首先维基百科对他的解释是:
a small computer on a integrated circuit。
其次是因为它内部不仅仅有运算器、控制器和寄存器这种CPU三件套,他还常封装有RAM、ROM这种存储器部件,还有I/O口供人们编程及操作。所以总结来说,他有处理器、存储器和I/O,也算是符合冯诺依曼体系的“浓缩计算机”。
-
应用领域
说到这种“浓缩计算机”的应用,可以说是广到没朋友。智能仪表、实时工控、通讯设备、导航系统、家用电器等等。随着物联网(IoT)时代的到来,单片机可谓再一次大展神威,我们手中的控制端可能是手机这种高级玩意儿,但是用来控制设备电路的接收端就是单片机要做的事情了。让家用电器接入网络,就是在其内部放一块带Wifi模块的单片机即可。 -
封装类型
刚才说到它算一个计算机,他的那些部件都是怎么放在一起的?这就涉及到封装问题了。以下列出主要的单片机封装形式。
封装 | 全称 | 中文名称 |
---|---|---|
DIP | Dual In-Line Package | 双列直插式封装 |
PLCC | Plastic Leaded Chip Carrier | 带引线的塑料芯片封装 |
QFP | Quad Flat Package | 塑料方形扁平式封装 |
PGA | Pin Grid Array Package | 插针网络阵列封装 |
BGA | Ball Grid Array Package | 球栅阵列封装 |
这里不做详细描述,具体资料可点击封装名称进入查阅。
51单片机
你若是初学单片机,并且直接上网去查“单片机入门”之类的关键词,你绝对会看到“51单片机什么什么的”。谁知道51单片机是啥玩意,一开始我还以为51是个牌子,然后就开始吐槽满世界的广告啊,能不能安安静静的学个单片机啊。
什么是51单片机
百度百科的摘要是这样说的:
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。
维基百科是这样说的:
The page "51-MCU" does not exist. You can ask for it to be created, but consider checking the search results below to see whether the topic is already covered.
嗯,看来这个词是国内出来的。根据百度百科上的内容我们可以了解到如下信息
Key | Value |
---|---|
指令集 | 8031 |
始祖 | Intel 8004 单片机 |
处理器 | 8位 |
I/O线 | 32条 |
这跟“51”有个蛋的关系啊?!
后来了解到,这款单片机的起点是Intel的MCS51系列单片机,此系列包括:8031,8051,8751,8032,8052,8752等,后来Intel普度众生,将技术传了下去。人们将后来的那些单片机都统称为51单片机。那为毛我入个门就给我个51单片机啊?!
因为此款单片机应用非常广,而且支持在线编程(ISP, In-System Programmability),用它可以搭建比较为复杂的系统,相较于其他8位单片机(AVR、PIC)而言,他出现较早,可以获取大量学习资料。所以…
引脚
单片机的操作向来靠引脚,51系列也不除外。常见的是40脚DIP封装,以此为例说说以下几类引脚。
- 电源
引脚 | 说明 |
---|---|
Vcc | 电源,用于引入正电平 |
GND | 地线,引入负电平 |
关于电平的资料请参考:逻辑电平
- 时钟
引脚 | 说明 |
---|---|
XTAL2 | 片内震荡电路输出端 |
XTAL1 | 片内震荡电路输入端 |
- 编程控制
引脚 | 说明 |
---|---|
RST | 用于复位 |
PSEN | 当有扩展ROM时用,在读外部ROM时,低电平有效 |
ALE/PROG | 当有扩展RAM时用 |
EA/Vpp | 当有扩展ROM时用,高电平读取内部ROM,低电平读取外部ROM |
- I/O
引脚 | 说明 |
---|---|
P0 | 双向,8位,三态 |
P1 | 准双向,8位 |
P2 | 准双向,8位 |
P3 | 准双向,8位,拥有第二功能 |
P3第二功能定义:
标号 | 第二功能 | 说明 |
---|---|---|
P3.0 | RXD | 串行输入口 |
P3.1 | TXD | 串行输出口 |
P3.2 | INT0 | 外部中断0 |
P3.3 | INT1 | 外部中断1 |
P3.4 | T0 | 定时器/计数器0外部输入端 |
P3.5 | T1 | 定时器/计数器1外部输入端 |
P3.6 | WR | 外部数据存储器写脉冲 |
P3.7 | RD | 外部数据存储器读脉冲 |
扩展的关键字
单片机编程支持汇编和C,其他的我没用过也不太清楚。如果入门的话最好的选择就是C啦,首先你很有可能学过C,就算没学过也很好上手,去买本谭浩强的《C程序设计》吧。
除了标准的ANSI C关键字外,单片机编程还扩展了如下几个类型的关键字:
- 位标量说明
关键字 | 说明 |
---|---|
bit | 声明一个位标量或位类型函数 |
sbit | 声明一个可位寻址变量,必须定义为外部变量 |
- 特殊功能寄存器声明
关键字 | 说明 |
---|---|
sfr | 声明一个特殊功能寄存器,必须定义为外部变量 |
sfr16 | 声明一个16位的特殊功能寄存器,必须定义为外部变量 |
- 存储器类型说明
关键字 | 说明 |
---|---|
data | 直接寻址的内部数据存储器 |
bdata | 可位寻址的内部数据存储器 |
idata | 间接寻址的内部数据存储器 |
pdata | 分页寻址的外部数据存储器 |
xdata | 外部数据存储器 |
code | 程序存储器 |
- 其他
关键字 | 说明 |
---|---|
interrupt | 定义一个中断函数 |
reentrant | 定义一个再入函数 |
using | 定义芯片的工作寄存器 |
STC89C52
我的第一个实体单片机开发,就是这款了,STC89C52,可以说是增强型8051单片机。来,先看一下它的配置:
- 处理器
Key | Value |
---|---|
核心 | MCS-51 |
最高运作频率 | 35MHz |
- 物理参数
关键字 | 说明 |
---|---|
I/O | 39 |
工作温度 | 商业级:0°C75°C;工业级:-40°C85°C |
封装 | DIP |
- 存储器
关键字 | 说明 |
---|---|
RAM | 512B |
ROM | 8KB |
EEPROM | 4KB |
- 功能
关键字 | 说明 |
---|---|
定时器 | 3个 |
串口 | 1个,全双工 |
外部中断 | 4个 |
看门狗 | 支持 |
内置复位 | 支持 |
ISP/IAP | 支持 |
- 可选模式
关键字 | 说明 |
---|---|
掉电模式 | 支持 |
空闲模式 | 支持 |
我的这款的具体型号为:STC89C52_35I_PDIP40_1550HHT352.C90C
关于标识命名规则请参阅:STC全系列芯片命名规则说明
软件准备
既然要编程,我们就需要开发环境,你可以选择Keil,也可以选择加载Keil插件的Eclipse。
代码写好后,通过编译器编译成单片机可以识别的机器码。机器码通常会保存为.hex文件,这个文件可以用那些十六进制文件查看器查看。这个文件的数据要写入到单片机的程序存储器中,通常为一个ROM。通常买的开发板都会集成串口及其芯片,还有配套的下载软件。你只需要安装好它的串口芯片的驱动程序,然后用下载器直接下载就好。如果是自己焊的板子就会麻烦一些了。这里不做说明,因为笔者还没干过。
还有一种就是通过Proteus模拟,在没有实体板的情况下可以考虑这种方式。Proteus可以模拟单片机的逻辑线路和演示效果。向里面的逻辑单片机下载程序的话,更是十分方便,在Proteus内可以很方便的操作完成。若是要模拟单片机与PC通信,那你就需要一个模拟串口连接的程序了---VSPD(Virtual Serial Port Driver)。
- 列个清单
程序 | 说明 |
---|---|
Keil | 单片机开发的IDE,支持编译c、asm、c++。 |
单片机串口驱动 | 用于让计算机识别单片机 |
Proteus | 模拟集成电路,可以演示效果 |
VSPD | 模拟串口连接 |
程序下载程序 | 用于将编译好hex文件下载到单片机 |
一个软工狗的总结
作为一个软工狗,我对我们专业的理解是更专注于一个软件的工程项目的始终而不是技术实现,偏向于“工”。而单片机开发是更加贴近计算机底层的一种开发,更偏向于“理”,而且也不会采用面向对象的思想。所以,比起之前所做的网页开发也好,客户端开发也罢,都显得更加不友好。
-
内存可能不够用
在开发过程中会开始考虑内存够不够用这种问题,这个是现代IT学子几乎不会考虑的问题,不说电脑,手机的内存都大的一腿,但是来到单片机的地盘,你就得考虑了,考虑好不要动不动就上个double(我目前用的最长的变量类型也就是unsigned int),而且为了拓展范围长度还要考虑是不是要把变量声明称无符号类型,更严重的情况可能还要掰指头数清楚你的变量有没有声明的太多。 -
一切从优
也是因为硬件资源的限制,所以在做一些实现的时候你不能只考虑如何实现,还要考虑单片机吃不吃得起你的代码。所以在这个领域,面向对象这种思想是基本弃用的(面向对象的思想向来是对程序员友好,对机器不太友好的)。考虑好你程序的时间及空间复杂度,因为单片机不仅内存小,主频一般也特别低。 -
二进制是爸爸
好好的巩固一下之前所学的C语言吧,还有二进制操作才是爸爸级别的操作。说到这一点其实还是因为硬件资源的限制。各种且或非、异或、移位会让代码变得高效,虽然我们之前并不习惯这样做。其实很多牛逼的程序员都会很擅长使用二进制操作,因为这样很对机器的口味(1024吧,凑个整)。 -
很好玩!
不像客户端或web开发,我们只是在调用,很少有思维上的突破。我觉得单片机开发会更灵活,你可以去网上花十块钱不到买各种小部件添加上去调用着玩。自己设计小型自动电路是我觉得再有趣不过的事情了。 -
怎么个开始
要是没学过C语言,先去把C学了。若是学好了,那就了解基础知识后直接实战。关于实战,我的建议是,先在Proteus上模拟,等稍微熟练再往实体开发板里写。一个是因为Proteus模拟,能简单实践一下画板子,可以学习简单的线路,但又不像真正画板子那样麻烦。另一个是因为单片机的程序存储器的擦写次数是有限的,虽然这个次数也不用特别在意,但是能少一次就少一次嘛。到了实体开发板阶段,就不是为了验证你的程序逻辑了,而是解决实际问题,因为Proteus并不会完美模拟出实际情况,这也是由模拟到实践的真正过度。最后,可以自己买各种工具(洞洞板、锡丝、松香、烙铁、吸锡器、烙铁架)来焊个板子,在自己焊的板子上编程。这样就完成了从焊到编再到实现的一条龙DIY。
我很推荐软工狗们尝试单片机开发,因为这可以让你对计算机原理和底层有更深的认识,还可以体会到设计并实现各种DIY小器件的乐趣。望各位就着汗水尽情释放创造力吧!
玩的开心~