博主近期在疫情学校上网课期间里开始汇编语言的51单片机学习,由于博客与论坛上的单片机教程几乎都是基于C语言的,汇编的寥寥无几,所以博主打算将自己的学习记录连载在博客上,当然本菜鸟也还是在读学生(还是非电信类的hh),所以不免会出现错误,还望大家多多指正。
该系列文章基于80C51单片机,Keil2(这个版本是比较古老,不过keil2和keil5其实区别不大)
在开始讲单片机之前,相信大家已经对进制转换与码值已经有了一定的了解,如果完全没学过,可以随便弄本C语言啥的书,一般应试教育的计算机入门类教材第一章都会讲这个2333。
学单片机我们就要先了解一下它的硬件结构
单片机的硬件组成有
1、1个8bit的CPU
2、1个片内振荡器和时钟电路
3、程序存储器,4KB(其实我用的有64K,相信大部分人也是,4k估计是Intel原始设计)的掩膜ROM,用于存放程序、原始数据和表格
4、数据存储器
5、64KB总线扩展控制器(也就是常说的外RAM)
6、4个8位并行I/O口(P0、P1、P2、P3)
7、一个全双工串行接口
8、2个十六位的定时/计数器
9、5个中断源z
另外相信大家发现程序存储器与数据存储器是分开的,仿佛符合哈佛结构,但是51的IC总线输入输出是一根,故不是严格意义上的哈佛结构。
80C51总共有40个外部引脚,其中并行I/O口占了4x8=32个
VCC:芯片电源,+5V
VSS:接地
细节大家看书吧,我这里留个例题大家也好结合教材理解
1T机器周期=6T状态周期S=12T时钟(振荡)周期P
解:由已知得,晶振频率为12MHZ,周期为频率的倒数
故,1/T=12MHz => T=1/12M (s)
机器周期=12x1/12M=1/1M(s)=1us
同理晶振频率为24MHz,机器周期为0.5us
RST/VPD:复位信号输入端/备用电源输入端
EA/VPP:内外ROM选择端/片内EPROM编程电源
ALE/PROG:地址锁存允许/片内EPROM编程脉冲
PSEN:外部ROM读选通信号
ROM:用于存储程序,断电后信息保留
RAM:用于存储数据,断电后信息消失,分片内片外
存储器是由大量寄存器组成的,其中每一个寄存器称为一个存储单元。它可存放一个二进制代码。一个代码由若干位(bit)组成,80C51系列单片机中算术单元是八位,即一个字节(Byte),存储器的大小也可称为存储器的容量,以字节(B)为单位,80C51系列单片机内部有4KB的程序存储器,也就是说80C51单片机的内部程序存储器可以存放4x1024个Byte
读操作,不会破坏该单元原来的内容,只相当于数据的复制
写操作,要改变或刷新该单元原来的内容,相当于原来的内容被覆盖了
80C51的存储器组织结构可以分为三个不同的存储空间
地址范围:0000H~FFFFH,共计64KB
低段4KB:0000H~0FFFH
80C51和87C51在片内,80C31在片外。高段60KB:1000H~FFFFH。在片外。
读写ROM用MOVC指令,控制信号是PSEN和EA。
数据存储器分为外RAM和内RAM
外RAM地址范围:0000H~FFFFH共64K
内RAM地址范围:00H~FFH共256B,分为两个部分:
作用:有专用于工作寄存器操作的指令,读写速度一般比内RAM要快,指令字节比一般直接寻址指令短,还具有间接寻址功能 (只有R0、R1可以)
工作寄存器 区分为四个区:0、1、2、3区。每区有八个寄存器:R0~R7
作用:不但有字节地址,而且每一字节地址还有位地址,可以进行位操作
作用:用于存放各种数据和中间结果,起到数据缓冲作用。堆栈一般开辟在这个区域
00H~7FH是一般用户能操作的区
21个特殊功能寄存器,其中字节地址末尾是0H或8H的寄存器每一位都有位地址,可以进行位操作
占用地址字节:80H~FFH
位寻址器:其字节地址可被8整除,也即上面讲的0H、8H结尾
A、B、PSW、DPTR、SP
I/O接口寄存器:
P0、P1、P2、P3、SBUF、TMOD、TCON、SCON…
最常用的寄存器,所有的运算类指令都要使用它。累加器在指令中助记符位A,自身带有全零标志Z,若A=0则Z=1;若A != 0则Z = 0。该标志常用于程序分支转移的判断条件
80C51中,在做乘除法时必须使用B寄存器,不做乘除法时,可作为一般寄存器使用
以后用到再来完善
分成DPL(低8位)和DPH(高8位)两个寄存器,用来存放16位地址值。
四个8位的双向并行端口:P0、P1、P2、P3
P0、P1、P2、P3口对应四个数据锁存器:P0、P1、P2、P3,对应内部RAM地址为80H、90H、A0H、B0H,访问I/O端口可以位寻址,当单片机复位时,P0~P3锁存器内容均为1
当P3口的第二功能都保持高电平时,P3口作为通用I/O口使用,功能与P1相同
复位**(RST)**引脚(9脚)上加一个持续时间为两个机器周期的高电平
若单片机时钟频率为 12MHz,则机器周期为 1us,那么则需要持续 2us以上的时间。