1. 51单片机的简单入门(汇编)

序言

能点击进来的朋友们,51单片机这个词想必大家都不会陌生了,废话我也不多说了,直接进入正题吧,开始我们的单片机之旅。

正告声明

笔者在写本栏文章时,是一名本科的大三学生,本栏的所有文章都是讲诉笔者在学习单片机的个人心得和一些个人的关于编程的小技巧,初来乍到,有不对和局限的地方还望大家可以指正出来,多多交流共同进步。

题目大部分来源于实验老师的实验指导书,少部分来自互联网,给出的例程均为笔者所独立编写的,如有雷同,纯属巧合。

我们的学习目标

通过本篇文章我希望,可以带领大家:

1.简单熟悉实验环境
2.掌握一些基本的51单片机入门指令的使用方法
3.介绍一下51单片机的RAM,ROM等的操作方法

环境

1.编程环境为keil软件系统,所选用的板子为Atmel的80C51

开始起飞

1.首先,我们简单的编写一段程序,进行单步执行,观察相应专用寄存器、RAM空间(包括工作寄存器区、位寻址区、用户RAM区)数据的变化情况以及程序存储器的指令代码。

;第一题
ORG 00000H
MOV A,#35H
ADD A,#78H
MOV 36H,#12H
PUSH ACC
INC A
SETB   15H
PUSH ACC
END

逐步执行以上代码,便可以发现到以下现象

--------------执行的代码 ------------------------------------变化的RAM地址----------------------------变化----------------
--------------MOV A,#35H----------------------- 0E0H(专用寄存器ACC的地址)---------------00H=>35H------------
--------------MOV A,#78H----------------------- 0E0H(专用寄存器ACC的地址)---------------35H=>ADH------------
--------------MOV 36H,#12H------------------------------- 36H(用户RAM区)--------------------00H=>12H------------
--------------PUSH ACC------------------------- 08H(堆栈的默认值SP指向07H)--------------00H=>ADH------------
--------------INC A--------------------------------- 0E0H(专用寄存器ACC的地址)---------------ADH=>AEH------------
--------------PUSH ACC------------------------- 09H(堆栈的默认值SP指向07H)--------------00H=>AEH------------

至于怎么看RAM区和ROM区的变化,由于笔者的能力有限,无法在较短的篇幅描述清楚,建议开始操作前可以百度一下。
如果成功的看到了以上变化,我们便可开始试着编写一些简单的加加减减的东西了。

2.设30H和32H开头分别存放两个16位无符号二进制数(低8位在前,高8位在后),完成两个数相加的程序,并将结果放入34H开头的单元。将1122H和3344H分别送入RAM单元,观察结果和CY标志;再分别将8899H和AABBH放入RAM单元,再观察结果和CY标志。

ORG 00000H
MOV 31H,#88H
MOV 30H,#99H
MOV 33H,#0AAH
MOV 32H,#0BBH
MOV  A,30H
ADD A,32H
MOV 34H,A
MOV A,31H
ADDC A,33H
MOV 35H,A
END

这是一个简单的16位二进制数的加法题,即使是更多位的32位、64位的二进制加法也是这个思路:从最低位开始,逐次往上相加,除了最低位其余位的加法均需考虑前一位的进位。
而我们可以观察到的现象是:第一次完成1122+3344时,低位的11+33没有产生相更高一位的进位,故而CY=0;而第二次相加中,低位产生了进位,CY=1。

通过以上的练习,我们已经掌握了利用51单片机完成加减法的操作了,没错,接下来就要乘除了。

3.将30H单元内的2个BCD数相乘,乘积为BCD数,并把乘积送入31H单元。

ORG 0000H
MOV 30H,#88H
MOV A,30H
MOV B,#10H
DIV AB
MUL AB
MOV B,#0AH
DIV AB
SWAP A
ADDC A,B
MOV 31H,A
END

思路:将一个30H中的两个BCD数除10H(相当于十进制数的16),那么它的商就是储存在高4位的BCD数,余数就是储存在低4位的BCD数。

4.实现将无符号数扩大6倍,设扩大6倍后的值不超过255。

ORG 0000H
MOV 20H,#02H
MOV A,20H
RL A
MOV 21H,A
RL A
ADD A,21H
MOV 22H,A
END

注意:笔者在此处用了左移RL操作,二进制中左移操作就等于十进制中的乘2,例如00000001左移一位就变成00000010,十进制中就是1=>2。

5.完成0~9的平方值查表程序,要求分别利用DPTR和PC作为变址寄存器,并比较两者的异同。

;DPTR
ORG 0000H
MOV DPTR,#TAB1
MOV A,#01H
MOVC A,@A+DPTR
MOV 20H,A
ORG 2000H
TAB1:DB 0,1,2,4,9,16,25,36,49,64,81
END


;PC指针
ORG 0000H
MOV A,#03H
MOVC A,@A+PC
MOV 20H,A
TAB1:DB 0,1,2,4,9,16,25,36,49,64,81
END

注意:DPTR不用考虑相对执行代码的偏移量,PC要特别计算偏移量。

笔者的能力有限,里面有很多概念和用法没有系统和详细的讲解,大家可以多去参考其它博主的讲述,后续的博文将会采取一题一篇的专项讲述方式。

猜你喜欢

转载自blog.csdn.net/weixin_44108271/article/details/112985675