谈谈51

引子

51单片机作为学习单片机的过程中必须要经过的一个过程来讲是非常重要的,原因在于51单片机从内部的硬件到软件有一套完整的按位操作系统。学习单片机是入门计算机科学的一个好方法。

何为单片机

你可以把单片机想象成一台电脑,一台压缩成卡片大小的电脑,CPU、RAM、ROM、I/O口和中断、系统定时器/计数器。拆开你的笔记本或台式电脑,你会发现它们的基本构造几乎是一样的。(这么多年过去了,上层的架构更新了一代又一代,冯诺依曼体系却从未动摇)

51单片机

“上古单片机”

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。是上个世纪80年代的产品了,在功耗、主频、带宽、稳定性等方面都无法与现代单片机相提并论。不过,得益于功能简单、成本低廉,51单片机成了很好的教学单片机。

51单片机的组成

最小系统电路
如上图,不含外部设备,能让51单片机实现图灵完备的最基本电路,它包括:供电电源、时钟晶振、复位开关。尽管市面上有很多现成的开发板,还是建议自己焊一个,顺便提高焊接技术,今后的工作生活中用到烙铁的地方还多着。
众所周知,对计算机来说软件和硬件一样重要,制作好最小系统后,我们需要给我们的单片机注入灵魂。计算机被发明出来就是为了解决问题的,通过程序指令,操纵单片机为我们服务。我们自然不可以在单片机上编程编译环境在windows上。

编程方法

51单片机支持C和汇编编程,C语言简化了编程的过程,reg51.h库函数让一个有 C语言基础的新手快速入门5单片机开发。而汇编语言更接近计算机的本质,编译器也只是把C代码转换为汇编代码的工具,这涉及到编译原理的知识吗,对计算机感兴趣的朋友可以逛逛我的博客,51入门以C为主,在这里就不详细探讨汇编了。

helloworld?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<reg51.h>
#define uint unsigned int

void main(){
uint n=5000;
while(1){
P1=0xfe;
while(n--);
n=5000;
P1=0xff;
while(n--);
n=5000;
}
}

程序分析

一个非常简单的例程,单片机没有显示器,没办法printf在终端打印helloworld,我们只好用灯的亮灭来验证程序执行的结果。和X86下的C语言一样,main函数为程序开始执行的地方,P1变量定义于reg51.h中,对应的是串口寄存器P1的地址,P1=0xfe;这条语句将P1的值设为0xfe,在二进制下这就是11111110,最低位为0。P1=0xff;这条语句将P1的值设为0xff,在二进制下为11111111,最低位为1。
有一点你需要知道的是,单片机P1串口寄存器为一个Byte,也就是8个bit,在电气封装上表现为8个针脚,每一个bit和每一个针脚的高低电平正好对应。刚才的两条语句完成了P1最低位的0,1切换,控制P1.0的电位变换,在P1.0上连接一个发光二极管,就可以控制暗灭了!
注意,我们一般都要将单片机主循环写死,这是与windows下的C不同的,单片机没有操纵系统接管,我们得让程序一直跑下去。在本例程里,程序控制led灯亮暗交替,永不停息,直到没电。。。
单片机的速度很快时钟频率12Mhz,亮暗变化在 1 us间,但是在上面这个程序里我们加了while(n–);语句,相当于程序在这段时间里什么都没做,我们的眼睛就能观察到亮暗的变化了。

烧写程序

可以使用keil编译51单片机的C程序,输出十六进制文件,连接单片机与电脑,通过stc-isp烧写十六进制文件到单片机中。
这就是51单片机编程的全部过程,我在B站有更详细的视频教程,如果还有不明白的地方,在星火交流群里都可以讨论。

进阶与展望

前提是你已经有了比较熟练的C语言基础:循环、判断、选择、指针、结构体、函数调用都能运用自如,会配置IO、定时器、中断、IIC等功能。如果学完这些你还对单片机/嵌入式开发感兴趣的话,可以试试更复杂的系统,MSP430、STM32、Raspberry Pi,开始完整的项目制作,做些小车、飞机、机器人之类的玩玩。
单片机/嵌入式系统是物联网场景的最优解,完美满足物联网低功耗、低成本、轻量化的需求,特别是现在有些单片机支持无线网络接入,大大提升了物联网的发展速度。nodemcu是一个支持高级语言Lua脚本的平台,配合node.js搭建服务器,使用起来非常简便。
本人水平有限,文章如有错误,还请师傅们指出。