实验一:51单片机架构与汇编指令
文章目录
- 实验一:51单片机架构与汇编指令
- 三.实验
- (一) 点亮一个LED灯
- (二) 点亮LED流水灯
- 1.汇编指令
- 2.c语言
##一.51单片机架构
内核
51单片机由一个IP核和片上外设组成,IP核(内核)就是上图中的CPU,片上外设就是上图中的:时钟电路、SFR和RAM、ROM、定时/计数器、并行I/O口、串行I/O口、中断系统。IP核跟外设之间由系统总线连接,且是8bit的,速度有限。
51内核是上个世纪70年代Intel公司设计的,速度只有12M,外设是IC厂商(STC)在内核的基础上添加的,不同的IC厂商会在内核上添加不同的外设,从而设计出各具特色的单片机。这里Intel属于IP核厂商,STC属于IC厂商。我们后面要讲的STM32也一样,ARM属于IP核厂商,ARM给ST授权,ST公司在Cortex-M3内核的基础上设计出STM32单片机。
外设
我们在学习51的时候,关于内核部分接触的比较少,使用的最多的是片上外设,我们在编程的时候操作的也就是这些外设。
编程的时候操作的寄存器位于SFR和RAM这个部分,其中SFR(特殊功能寄存器)占有 128字节(实际上只用了 26 个字节,只有 26 个寄存器,其他都属于保留区),RAM占有 128 字节,我们在程序中定义的变量就是放在RAM中。其中SFR和RAM在地址上是重合的,都是在80~FF地址区间,但在物理区间上是分开的,所以51的RAM是有256个字节。
编写好的程序是烧写到ROM区。剩下的外设都是我们非常熟悉的IO口,串口、定时器、中断这几个外设。
##二.汇编指令
汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,end),汇编指令同机器指令一一对应。每一种CPU都有自己的汇编指令集。
计算机是通过执行指令来处理数据的,为了指出数据的来源、操作结果的去向及所执行的操作,一条指令一般包含操作码和操作数两部分。
指令是计算机能够识别和执行的操作命令,由二进制数“0”、“1”组成。每条指令的编码格式由机器指令系统规定。通常,一条指令包含操作码和操作数两部分内容,格式如下图所示:
操作码(Operation Code)用来说明指令操作的性质与功能,常用OP表示。操作码是指令中不可缺少的部分,通常由1~2个字节组成,机器通过译码电路来识别指令。操作数用于提供指令中要处理的数据或数据所在的地址信息。
以MOV指令作为例子,MOV指令的格式为:MOV dst,src。其中:MOV为指令助记符,表示传送,dst为目标操作数,src表示源操作数,该指令的功能是将源操作数传送到目标单元。例如:
MOV…AL,20H;将8位立即数20H传送到AL中。
MOV…AX,1234H;将16位立即数1234H传送到AX中。
MOV…EAX,34568020H;将32位立即数34568020H传送到EAX中。
三.实验
(一) 点亮一个LED灯
ORG 0100H SETBP2.0 SJMP $END
- ORG 0100H:设置程序的起始地址为0100H,表示程序从地址0100H处开始执行。
- SETB P2.0:将P2寄存器的第0位设为1,即设置P2寄存器的第0位为1。
- SJMP $:无条件跳转指令,跳转到当前指令的地址,实现一个无限循环。
- END:指示程序结束。
(二) 点亮LED流水灯
1.汇编指令
ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV A,#0FEH LOOP: MOV P0,A LCALL DELAY RL ALJMP LOOP DELAY: MOV R2,#255 D1:MOV R3,#250 D2:DJNZ R3,D2 DJNZ R2,D1 RET END
- ORG 0000H:设置程序的起始地址为0000H,表示程序从地址0000H处开始执行。
- LJMP MAIN:无条件跳转指令,跳转到标签MAIN处执行。
- ORG 0100H:设置程序的起始地址为0100H。
- MAIN::标签,表示程序的入口处。
- MOV A,#0FEH:将立即数0FEH(带符号的十六进制数)移动到寄存器A中。
- LOOP::标签,定义一个循环开始处。
- MOV P0,A:将寄存器A中的值移动到P0端口。
- LCALL DELAY:调用子程序DELAY。
- RL A:将A寄存器的值向右循环移位。
- LJMP LOOP:无条件跳转到LOOP处,实现循环。
- DELAY::定义了一个子程序DELAY。
- MOV R2,#255:将立即数255移动到寄存器R2中。
- D1::标签,用于延时循环开始处。
- MOV R3,#250:将立即数250移动到寄存器R3中。
- D2::标签,用于内部延时循环开始处。
- DJNZ R3,D2:R3不为零时跳转到标签D2处,实现内部延时。
- DJNZ R2,D1:R2不为零时跳转到标签D1处,实现整体延时。
- RET:子程序返回。
- END:指示程序结束。
2.c语言
#include #include void delay_ms(int a) { } int i,j; for(i=0;i