51单片机之最简系统
题外话
现在才发现写一个博客有多难坚持,主要还是没人关注。如果没人关注就感觉自己的付出没有意义,也没有什么成就感。难怪那么多博主总是说,读者的支持是坚持下去的最大动力。加油,菜鸟也要努力坚持!
电源
这个就不需要太多解释了,没有电源是不可能正常工作的。关键问题在于单片机需要什么样的电源,又应该接在什么那个管脚(引脚)上?见下图:
通常我们给一个芯片的管管脚标序号时,使半圆形缺口朝上,逆时针从1开始,依次编号(不仅仅是单片机,很多的芯片都是这样给管脚标序号的)。对于STC89C51RC系列的5V的单片机,供电范围在5.5V-3.3V;3V的单片机,供电范围在3.8V-2.0V(这些信息都可以在官网的数据手册中查到)。针对于常用的5V单片机,电脑的USB口刚好就是5V的,通过下载电路就能供电了,而3V的单片机,下载器也有对应的电源接口。
如果我们制作自己的作品的时候,考虑到需要用电池供电,我们就不得不自己设计一下我们整套的电源电路,如果使用市面上常见的1.5V干电池,大概需要的3节(4.5V),如果用像18650这种的锂电池(4.2V-3.7V),一节就够了。当然了,这只是考虑到单片机的供电,有些模块如果需要3.3V的电压,就需要用到像ASM1117这种的稳压器了。
时钟信号
为什么需要它
说到这个,就不得不举一些例子了。军队行军的时候,需要一个领队的来喊口令,“121”,这样才会是每个人的步伐一致,上下一心。同样的道理,单片机执行命令的时候,可能部分电路任务简单,执行的快,有的电路任务重,执行的慢。这就需要有一个信号来把所有的士兵们统一起来,这个信号就叫时钟信号。可想而知,时钟信号的频率决定了单片机的速度,STC89C51系列的单片机甚至支持0~80M的时钟频率(查手册就可以知道)。
晶体or晶振
这的确是两个很容易搞混的概念,有时候有对这两个概念不加区分,其实晶体才是我们常说的那个东西,具体信息可以参考这篇文章
https://blog.youkuaiyun.com/tq384998430/article/details/53905584
在电路中通常是这样设计的(官方手册中的)
两个小竖线便是电容(陶瓷的),中间那个表示晶体。关于这些参数选择都已查找相应的手册。
三个周期
时钟周期:也就是振荡周期,指的是始时钟频率的倒数。
机器周期:单片机完成一项基本操作(取指令,读寄存器等)需要若干个时钟周期。在12T模式下,一个机器周期包含了12时钟周期:在6T模式下,一个机器周期包含了6个机器周期。STC12/15系列还支持1T模式。
指令周期:一条基本的汇编指令的指令周期包含若干个机器周期。比如一个简单的空指令(nop)就只需要一个机器周期,计数器也是每隔一个机器周期加1。但是其他的指令可能会包含2个或者更多机器周期。
注意:这里说的一条指令并不等同于C语言里面的一条语句。实际上C语言的一条语句编译后是好几条汇编语句。
一个简单的延时程序
接下来我们来一个计算。如果单片机需要1s的延时(比如说让某个LED亮1秒,灭1秒),我们怎么通过程序实现呢?
有两种方法,我们先讲一种简单的(另一种我们在讲定时器时再说):
假设我们使用的是12Mhz的晶体,那么
时钟周期
1
12
M
h
z
=
1
12
u
s
\frac{1}{12Mhz}=\frac{1}{12}us
12Mhz1=121us
机器周期(12T模式)
1
12
u
s
∗
12
=
1
u
s
\frac{1}{12}us*12=1us
121us∗12=1us
指令周期
对于nop空指令,只占用一个机器周期,也就是1us。那我们立刻想到,需要延时1s的话,那我们用1 000 000个空指令不就行了么。确实是这样的,但是你想想一个延时塞一百万个空指令也太2了,估计会被后来人好好的嘲笑一番。机智的小伙子立马想到,这太简单了,用循环不就搞定了么。确实需要循环,但有一点问题,一个循环到底包含多少条指令我们是不知道的,这就需要借助STC提供的烧录工具了,对于软件延时,这个软件能够精确地帮你计算好,甚至连误差都有,并提供C代码(简直是神器)。
但是在选择的时候,注意晶振的选择,还有适用于STC89C52单片机的指令集的选择。
也有可能你会遇到这种问题,这一个函数_nop_()
无法识别。你需要在头文件加上#include <intrins.h>
,这个头文件里包含了一些移位,测试这样的汇编指令,能够让你在C语言中使用。当然了,如果你不是特别在乎这1us,删掉岂不是更简单。
复位电路
在接上电源的时候,我们希望程序从最开始的地方执行,这是一个很朴素的愿望。或者有时候程序卡住了,我们希望从头开始,这就牵扯到复位的问题。这两种复位的方式通常称为上电复位,按键复位。单片机的9号引脚(RST,reset)就是用来复位的,当这个引脚接收到一定时间的高电平时,就会复位。
可以用以下电路实现
其中原理可以这样解释:在接通电源瞬间,电容相当于导通,此时RST引脚为高电平,然后电容充电,RST引脚的电压逐渐降低,充电完成,电容相当于断开,RST始终为低电平。
当电容并联上一个按键时,按下按键,RST也能达到高电平,同样起到了复位的作用。
外部程序存储器访问控制
说到这个,就不得不提一提以前的条件有多差了。那时候(上个世纪八九十年代)的51单片机,单片机里面没有给的程序太多空间,就把程序放在了外部存储器上,所以需要一些引脚和外部的存储器的连接,而单片机的的31号引脚 E A ‾ \overline{EA} EA/VPP就指定了,当单片机执行完内部的程序时,会不会访问外部的程序。如需要,就需要把该引脚接低电平,否则接高电平。
值得注意的是,对于这个写法, E A ‾ \overline{EA} EA/VPP,带有上划线的表示低电平有效,在其它地方也会经常看见这种表示方法。
因为外部存储访问在现在来说实在是太鸡肋了,也几乎没有人用,内部程序存储器也够用了,STC就默认上拉了(接高电平)。实际应用时,把这个引脚悬空就行。这在自己制作最简系统时会简单一点。
附录
最后,补上我提到过N次的数据手册:
http://www.stcmcudata.com/datasheet/STC89C52.pdf