数字钟在单片机上的实现(汇编语言)

数字钟在单片机上的实现(汇编语言)
数字钟在单片机上的实现(汇编语言)

武汉大学电子信息学院电子系统综合设计课程论文数字钟在单片机上的实现(汇编语言)

专业:

年级:

作者:_____________

_____________

指导教师:

2012年06 月29 日

目录

1 作品的背景与意义 (1)

2 功能指标设计 (1)

2.1设计要求 (1)

2.1.1 基本要求 (1)

2.1.2 拓展要求 (1)

2.2 功能设计方案 (1)

3 作品方案设计 (2)

3.1总体方案的选择 (2)

3.2模块划分及分析 (3)

3.3 单模块设计流程图 (3)

4 模块源程序 (7)

5 系统测试 (35)

测试数据: (36)

6 心得体会 (36)

1 作品的背景与意义

数字钟是一种用数字电路技术实现时、分、秒计时的钟表。与机械钟相比具有更高的准确性和直观性,具有更长的使用寿命,已得到广泛的使用。数字钟的设计方法有许多种,例如可用中小规模集成电路组成电子钟,也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟,还可以利用单片机来实现电子钟等等。这些方法都各有其特点,其中利用单片机实现的电子钟具有编程灵活,以便于功能的扩展。

2 功能指标设计

2.1设计要求

2.1.1 基本要求

1.设计一个精确的1秒定时器;

2.根据1秒定时器,设计一个带小时、分钟、秒的时钟,并将小时、分钟、秒显

示在LED上;

3.设计小时、分钟、秒的修改按键,可分别调整小时、分钟、秒(按键设计参考

电子表)。

2.1.2 拓展要求

1.增加小时、分钟、秒的键盘直接修改功能;

2.设计闹钟功能,最多支持5个闹钟,可分别查看和修改闹钟时间,可分别设置

闹钟开关;

3.增加万年历功能。

2.2 功能设计方案

1. 实现正常走时(秒-分-时-日-月-年进位);

2. 能够设置时间和日期;

3. 能够自动区分平闰年和大小月及2月;

4. 具有5个闹钟及其设置功能;

5. 在任何设置状态下,修改位会闪烁显示。

3 作品方案设计

3.1总体方案的选择

以T0计时器中断产生1s信号,T1计时器中断刷新数码管。系统软件流程图如下所示:

设计时使T0优先级高于T1以确保准确计时,初始化完成后,程序一直处于主循

环模块,主循环模块中有设置按键的检测模块,当遇到设置信号暂时跳出主循环

去执行相应的设置模块,时间设置,日期设置,闹钟设置3大模块彼此之间是相

互独立且平行的,他们和主循环模块也不干扰。因此,当进入任何一个模块时,

其他模块中的所有功能和按键都暂时失效,程序由始至终中断服务一直打开。

3.2模块划分及分析

?MAIN:初始化程序模块

进行初值的分配(栈顶地址,初始时间,初始日期,初始化闹钟及相关标志地址)各定时器,中断初始化。

?ZHUXUNHUAN:主循环模块

程序主要执行部分,包含闹钟检测,独立按键检测(日期—时间转换检测),矩阵按键检测(闹钟设置,日期设置,时间设置)3大检测部分。

??SERVE:1s中断服务

中断走时:秒→分→时→日→月→年

?XIAGSHI:刷屏中断服务(显示中断服务)

以人眼不能分辨的频率一次刷新8或6位数码管来显示时间或日期及其他设置界面。

?SHIJIANSHEZHI:时间设置模块

修改时间,其中修改位闪烁显示加以区分,内嵌了时间的自动检测和校正代码,既不允许修改出现不存在的时间。

?WANNIANLISHEZHI:日期设置模块

修改日期,同样的修改位闪烁加以区分,内嵌了日期的自动检测和校正代码,既不允许出现不存在的日期。

?NAOZHONGSHEZHI:闹钟设置模块

修改闹钟时间,闹钟开关的置换,修改位闪烁加以区分,内嵌时间自动监测和校正代码已设置正确的时间。

3.3 单模块设计流程图

在完成的整体设计和模块划分后,便进入到工作量最大的单模块流程设计。

?主循环:

说明:

1.初始化时,将保存5个闹钟(按时分秒顺序排放)的15个地址50H—5EH均清零,将对应的5个闹钟开关0AH—0EH也都清零表示闹钟开关状态,检测闹钟时,从第一个闹钟开始分别检测开关,时分秒只要有任何一项不符合及即检测下一个闹钟,到最后一个闹铃也不符合时,进入按键检测部分。

2.按键检测包含独立按键和矩阵按键两部分,独立按键很简单,矩阵按键则编写检测子程序,将检测到的键值保存在寄存器R7中,没有检测到按键时不改变R7的数值。因此,检测器先将R7里面放入#0FH(只要不是#00H—#0CH中的数即可),然后调用矩阵键盘检测子程序,再来通过检测R7的数值来判断有无按键按下或按下的那个键。

?时间设置模块:

说明:

1.进入时间设置模块后,时的十位开始闪烁,通过独立按键s17,s18可以向右向左移动闪烁即修改位,修改正确的判断实际上是对将要修改完成的时间进行合理性的判断,如合理则修改时间,若不合理则此次按键失效。

2.检测到退出信号后,先要将所有初始化过程中改变了的标志位还原,如闪烁开关位等,再调回主循环。

?日期设置模块:

日期设置模块和时间设置模块几乎完全一样,所不同的是初始化不一样及日期设置里面有8位数码管需要刷新,而且由于日期比时间复杂,因此该模块中有两处日期校正部分,一部分是对按键修改是否正确的判断,使用方法也是使相应按键暂时失效(例如:修改前日期是2012:03:31,那么此时月份上得十位1-9所以数字都暂时失效,日个位上的2-9所以数字也都全部暂时失效);另一部分是修改后的日期校正,通过调用该子程序,防止上一部分不能消除的错误日期设置(例如:修改前日期是2012:01:31,这时修改月份个位为2则日期变为2012:02:31,显然这样的日期是不存在的,这时校正程序将日期进位,日期更改为2012:03:01)。这部分校正模块在后面的1s中断服务中也有使用。下图为该模块流程图:

?闹钟设置模块:

闹钟设置模块和时间设置一是大同小异,主要区别在于多了一部分闹铃开关的

检测。下图为该模块流程图:

4 模块源程序

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP SERVE

ORG 001BH

AJMP XIANSHI

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H ;段选表0,1,2,3,4,5,6,7,8,9,熄灭,-

TAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,00H,40H ;段选表带小数点,同上

MAIN:

/************************************************************************* ****/

//初始化

MOV SP,#60H ;栈指针地址赋值

MOV 3CH,#0CH ;设置界面修改位的闪烁频率具体代码在SERVE 1秒中断服务中

MOV 37H,#0FFH ;临时地址预留给39H

MOV 39H,#0FFH ;段位标志8位数据对应8个数码管为0的那位数码管始终暗

MOV 3AH,#11111101B ;界面转换标志******01为时间界面取反后******10为万年历界面******00为设置闹钟界面

CLR A ;时间万年历初始化时间00:00:00 万年历2000。01。01

MOV 30H,A ;时

MOV 31H,A ;分

MOV 32H,A ;秒

MOV 33H,#01H ;日

MOV 34H,#01H ;月

MOV 35H,A ;年只能显示2000-2099的时间

MOV 3DH,A ;数码管闪烁开关初始化为关闭状态取反后11111111 打开

MOV 40H,A ;闹钟设置界面预留地址地址

MOV 41H,A

MOV 42H,A

MOV 43H,A

MOV 44H,A

MOV 45H,A

MOV 46H,A

MOV 47H,A

MOV 50H,A ;闹钟1 时

MOV 51H,A ;闹钟1 分

MOV 52H,A ;闹钟1 秒

MOV 0AH,A ;闹钟1 开关00000000为关闭状态取反后打开闹钟1

MOV 53H,A ;同上

MOV 54H,A

MOV 55H,A

MOV 0BH,A

MOV 56H,A

MOV 57H,A ;同上

MOV 58H,A

MOV 0CH,A

MOV 59H,A ;同上

MOV 5AH,A

MOV 5BH,A

MOV 0DH,A

MOV 5CH,A ;同上

MOV 5DH,A

MOV 5EH,A

MOV 0EH,A

//中断,定时器初始化

MOV TMOD,#11H

MOV 38H,#14H ;T0定时器每50ms溢出一次溢出20次为一秒

SETB PT0 ;优先级设置1秒中断为最高级屏幕刷新优先级低

SETB PT1

SETB ET0

SETB ET1

SETB EA

MOV TH1,#0DFH ;T1定时器设置显示扫描频率

MOV TL1,#0E0H

MOV TH0,#3CH ;T0定时器设置为50ms

MOV TL0,#0B0H

SETB TR1

SETB TR0

/***********************************************************************/ //程序主循环

ZHUXUNHUAN:

//闹钟检测

MOV A,0AH

JZ NAO2 ;检测闹钟开关若关检测下一个闹钟,否则检测时间是否为闹钟设定时间

MOV A,30H

CJNE A,50H,NAO2

MOV A,31H

CJNE A,51H,NAO2

MOV A,32H

CJNE A,52H,NAO2

AJMP XIANG ;时间为闹钟设定时间吻合进入闹铃程序下同

NAO2:

MOV A,0BH

JZ NAO3

MOV A,30H

CJNE A,53H,NAO3

MOV A,31H

CJNE A,54H,NAO3

MOV A,32H

CJNE A,55H,NAO3

AJMP XIANG

NAO3:

MOV A,0CH

JZ NAO4

MOV A,30H

CJNE A,56H,NAO4

MOV A,31H

CJNE A,57H,NAO4

MOV A,32H

CJNE A,58H,NAO4

AJMP XIANG

NAO4:

MOV A,0DH

JZ NAO5

MOV A,30H

CJNE A,59H,NAO5

MOV A,31H

CJNE A,5AH,NAO5

MOV A,32H

CJNE A,5BH,NAO5

AJMP XIANG

NAO5:

MOV A,0EH

JZ BU

MOV A,30H

CJNE A,5CH,BU

MOV A,31H

CJNE A,5DH,BU

MOV A,32H

CJNE A,5EH,BU

AJMP XIANG

//检测独立按键

BU: JB T0,ZHU1 ;检测s19是否按下按下进入万年历界面,否则检测矩阵键盘MOV A,3AH ;界面转换标志取反即可使得时间和万年历界面相互转换CPL A

MOV 3AH,A

//检测矩阵键盘

//检测到按键1,2,3,4,5时进入对应的闹钟设置界面检测到0BH(对应s11)进入时间设置界面检测到0CH(对应s12)进入万年历设置界面

//若未检测到按键则跳回主程序继续下一个检测周期

ZHU1:

MOV R7,#0FH

ACALL JIANCEANJIAN ;矩阵键盘检测子程序将检测到的键值存入r7

CJNE R7,#0FH,ZHU2

AJMP ZHUXUNHUAN

ZHU2:

CJNE R7,#0BH,ZHU3

AJMP SHIJIANSHEZHI

ZHU3:

CJNE R7,#0CH,ZHU4

AJMP WANNIANLISHEZHI

ZHU4:

CJNE R7,#01H,ZHU5

AJMP NAOZHONGSHEZHI

ZHU5:

CJNE R7,#02H,ZHU6

AJMP NAOZHONGSHEZHI

ZHU6:

CJNE R7,#03H,ZHU7

AJMP NAOZHONGSHEZHI

ZHU7:

CJNE R7,#04H,ZHU8

AJMP NAOZHONGSHEZHI

ZHU8:

CJNE R7,#05H,ZHUXUNHUAN0

AJMP NAOZHONGSHEZHI

ZHUXUNHUAN0:

AJMP ZHUXUNHUAN

/************************************************************************* ***/

//1秒中断服务见书141例6-6

SERVE:

CLR EA

PUSH B

PUSH DPH

PUSH DPL

PUSH PSW

PUSH ACC

MOV TH0,#3CH

MOV TL0,#0B0H

MOV A,3DH

JZ SE

MOV A,3CH

CJNE A,#6,SE0

MOV 39H,37H

SE0: DJNZ 3CH,SE

MOV 39H,#0FFH

MOV 3CH,#0CH

SE:

DJNZ 38H,RETURN

MOV 38H,#14H

MOV A,#01H

ADD A,32H

MOV 32H,A

CJNE A,#3CH,RETURN

MOV 32H,#00H

MOV A,#01H

ADD A,31H

MOV 31H,A

CJNE A,#3CH,RETURN

MOV 31H,#00H

MOV A,#01H

ADD A,30H

MOV 30H,A

CJNE A,#18H,RETURN

MOV 30H,#00H

MOV A,#01H

ADD A,33H

MOV 33H,A

ACALL NYR

RETURN:

POP ACC

POP PSW

POP DPL

POP DPH

POP B

SETB EA

RETI

/************************************************************************* */

//年月日校正子程序用于万年历进位和万年历设置防止出现不存在的时间

NYR:

MOV A,33H

CJNE A,#32,MONTH ;日为32时,月进位日置1

MOV 33H,#01H

AJMP MONTH0

MONTH:

CJNE A,#31,MONTH1 ;日为31时分辨大小月及2月MOV A,34H

CJNE A,#4,MONTH2

MOV 33H,#01H

AJMP MONTH0

MONTH2:

CJNE A,#2,MONTH6

MOV 33H,#01H

AJMP MONTH0

MONTH6:

CJNE A,#6,MONTH9

MOV 33H,#01H

AJMP MONTH0

MONTH9:

CJNE A,#9,MONTH11

MOV 33H,#01H

AJMP MONTH0

MONTH11:

CJNE A,#11,RETURN0

MOV 33H,#01H

AJMP MONTH0

MONTH1:

CJNE A,#30,MONTH29 ;日为30时分辨2月

MOV A,34H

CJNE A,#02H,RETURN0

MOV 33H,#01H

AJMP MONTH0

MONTH29:

CJNE A,#29,RETURN0 ;日为29时分辨闰平年2月

MOV A,34H

CJNE A,#02H,RETURN0

MOV A,35H

MOV B,#04H

DIV AB

MOV A,B

JNZ MONO

AJMP RETURN0

MONO:

MOV 33H,#01H

MONTH0:

MOV A,#01H ;月进位

ADD A,34H

MOV 34H,A

CJNE A,#0DH,RETURN0

MOV 34H,#01H

MOV A,#01H

ADD A,35H

MOV 35H,A

CJNE A,#100,RETURN0 ;年最多只能99

MOV 35H,#00

RETURN0: RET

/******************************************************************/ //屏幕刷新中断

XIANSHI:

PUSH B

PUSH DPH

PUSH DPL

PUSH PSW

PUSH ACC

MOV TH1,#0DFH

MOV TL1,#0E0H

MOV A,3AH

JNB ACC.0,WANNIANLI ;界面显示判断

//时间界面

MOV A,32H

MOV B,#0AH

DIV AB

MOV 10H,B

MOV 11H,A

MOV A,31H

MOV B,#0AH

DIV AB

MOV 12H,B

MOV 13H,A

MOV A,30H

MOV B,#0AH

DIV AB

MOV 14H,B

MOV 15H,A

MOV 16H,#0AH

MOV 17H,#0AH

AJMP LIANG

//万年历界面

WANNIANLI:

JNB ACC.1,SHEZHI

MOV A,33H

MOV B,#0AH

DIV AB

MOV 10H,B

MOV 11H,A

MOV A,34H

MOV B,#0AH

DIV AB

MOV 12H,B

MOV 13H,A

MOV A,35H

MOV B,#0AH

DIV AB

MOV 14H,B

MOV 15H,A

MOV 16H,#00H

MOV 17H,#02H

AJMP LIANG

//闹钟设置界面

SHEZHI:

MOV 10H,40H

MOV 11H,41H

MOV 12H,42H

MOV 13H,43H

MOV 14H,44H

MOV 15H,45H

MOV 16H,46H

MOV 17H,47H

//刷新屏幕

LIANG:

MOV R6,#11111110B ;位选

MOV R0,#10H ;利用r0间接访问功能实现选中位显示控制MOV R4,#8H ;刷新8次

MAIN0: ;位选子程序

ACALL L

CJNE R0,#12H,TT1

MOV DPTR,#TAB1

AJMP K

TT1:

CJNE R0,#14H,TT2

MOV DPTR,#TAB1

AJMP K

TT2:

MOV DPTR,#TAB

K:

MOV A,@R0

MOVC A,@A+DPTR

MOV R5,A

//数码管开关判断不刷新39H中对应为0的那段数码管

MOV A,39H

JNB ACC.0,AC0

JNB ACC.1,AC1

JNB ACC.2,AC2

JNB ACC.3,AC3

JNB ACC.4,AC4

JNB ACC.5,AC5

JNB ACC.6,AC6

JNB ACC.7,AC7

AJMP J0

AC0: CJNE R4,#08H,J0

AJMP J1

AC1: CJNE R4,#07H,J0

AJMP J1

AC2: CJNE R4,#06H,J0

AJMP J1

AC3: CJNE R4,#05H,J0

AJMP J1

AC4: CJNE R4,#04H,J0

AJMP J1

AC5: CJNE R4,#03H,J0

AJMP J1

AC6: CJNE R4,#02H,J0

AJMP J1

AC7: CJNE R4,#01H,J0

AJMP J1

J0: ACALL R ;段选子程序

J1: MOV A,R6

RL A

MOV R6,A

INC R0

ACALL DELAY1 ;延时越长数码管越亮但过长导致刷新过慢数码管不能同时全亮

MOV DPTR,#8200H

MOV A,#00H

MOVX @DPTR,A

DJNZ R4,MAIN0

POP ACC

POP PSW

POP DPL

POP DPH

POP B

RETI

L:

MOV DPTR,#8300H

MOV A,R6

MOVX @DPTR,A

RET

R:

MOV DPTR,#8200H

MOV A,R5

MOVX @DPTR,A

RET

/********************************************************************/ //延时子程序

DELAY: ;延时20毫秒用于矩阵键盘的检测

MOV 3EH,#120

LOOP1:

MOV 3FH,#30

LOOP2:

DJNZ 3FH,LOOP2

DJNZ 3EH,LOOP1

RET

MDELAY:

MOV 3EH,#5

MLOOP1:

MOV 3FH,#0AAH

MLOOP2:

DJNZ 3FH,MLOOP2

DJNZ 3EH,MLOOP1

RET

DELAY1:

MOV 3EH,#15

LOOP11:

MOV 3FH,#40

LOOP21:

DJNZ 3FH,LOOP21

DJNZ 3EH,LOOP11

RET

DELAY0:

MOV 3EH,#0FFH

LOOP10:

MOV 3FH,#0FFH

LOOP20:

DJNZ 3FH,LOOP20

DJNZ 3EH,LOOP10

RET

/***********************************************************/

//时间设置

SHIJIANSHEZHI:

MOV 39H,#11011111B ;时的十位闪烁

MOV 37H,39H

MOV 3DH,#0FFH ;开闪烁开关

M:

JB T1,S1 ;检测独立按按键s20 按下则退出时间设置继续进入主循环

MOV 39H,#0FFH

MOV 3DH,#00H

AJMP ZHUXUNHUAN

S1: JB INT0,S2 ;闪烁位即修改为右移

MOV A,37H

CJNE A,#11111110B,SS0

RR A

RR A

RR A

MOV 37H,A

S10:

JNB INT0,S10 ;右移按键松开才继续下面的程序防止一次按键右移多位下同

AJMP M

SS0:

RR A

MOV 37H,A

S11: ;左移

JNB INT0,S11

AJMP M

S2: JB INT1,M1

MOV A,37H

CJNE A,#11011111B,SS1

RL A

RL A

RL A

MOV 37H,A

S12:

(完整版)快速入门单片机汇编语言

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(p0.0—p0.7):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(p1.0—p1.7):其每一位都能作为可编程的输入或输出线。 P2口(p2.0—p2.7):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(p3.0—p3.7):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释]

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

汇编语言指令表

汇编语言指令表文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

伪指令 1、定位伪指令 ORG m 2、定义字节伪指令 DB X1,X2,X3,…,Xn 3、字定义伪指令 DW Y1,Y2,Y3,…,Yn 4、汇编结束伪指令 END 寻址方式 MCS-51单片机有五种寻址方式: 1、寄存器寻址 2、寄存器间接寻址 3、直接寻址 4、立即数寻址 5、基寄存器加变址寄存器间接寻址 6、相对寻址 7、位寻址 数据传送指令 一、以累加器A为目的操作数的指令(4条) MOV A,Rn ;(Rn)→A n=0~7 MOV A,direct ;( direct )→A MOV A,@Ri ;((Ri))→A i=0~1 MOV A,#data ; data →A 二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)→ Rn MOV Rn ,direct;( direct )→ Rn MOV Rn ,#data; data → Rn 三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)→direct MOV direct,Rn;(Rn)→direct MOV direct,direct ;(源direct)→目的direct MOV direct,@Ri;((Ri))→direct MOV direct,#data; data→direct 四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)→(Ri) MOV @Ri,direct;(direct)→(Ri) MOV @Ri,#data; data→(Ri) 五、十六位数据传送指令(1条) MOV DPTR,#data16;dataH→DPH,dataL →DPL

51单片机实用汇编程序库(word)

51 单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH DJNZ R1,$ RET

五、定时器功能实例 5.1 定时1 秒报警 程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0 入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50 个 0.2 秒,即50*0.2=1 秒 MOV TMOD,#00000001B;定时器0 工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 11 SETB EA ;开总中断 SETB ET0 ;开定时器0 中断允许 SETB TR0 ;开定时0 运行 SETB P1.0 LOOP: AJMP LOOP DIN0: ;是否到一秒//////////////////////////////////////// INCC: INC TFLAG MOV A,TFLAG CJNE A,#20,RE MOV TFLAG,#00H CPL P1.0 ;////////////////////////////////////////////////// RE: MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05 秒,定时 20 次则一秒 RETI END 5.2 频率输出公式 介绍:f=1/t s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为例: 200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

51单片机汇编语言

51单片机汇编语言 a)单个与多个LED灯,位操作与字节操作—输出 ORG 0000H START: CLR C MOV P0.0,C MOV P1.1,C MOV P2.2,C MOV P3.3,C CLR A

CPL A MOV P0,A MOV P1,A MOV P2,A MOV P3,A END 程序说明: 可以用7段数码管来代替各端口的8个LED灯,硬件的这种显示方式使得数字表达成为实用。数字显示由数码管的硬件结构与工作原理(7个LED灯的几何变形组合)和数字表达的数据格式确定。 如: 共阳极数码管显示数字3,则有P1口送数据#4FH;MOVP1, #0B0H 共阴极数码管显示数字8,则有P1口送数据#80H;MOVP1, #7F H 用数据表表示则有: TABshuziyang: //阳极管(共阴极管取反即可) DB(数字0~F) C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C 6H,A1H,86H,8EH

TABshuziyin: //阴极管(共阳极管取反即可) DB(数字0~F) 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,3 9H,5EH,79H,71H b)单个与多个LED灯闪烁—延时子程序—注意定时器 前边已经看到,通过改变位或字节的赋值,可以使得LED灯亮或灭,以此形成闪烁效果。但是硬件的响应时间太短,使得效果不佳。虽然可以通过改变单片机的时钟设置来改变效果。但时钟的改变极其不方便,因此需要利用延时指令(注意定时器功能)获得理想的效果。延时效果是利用单片机空转来实现的。 ACALLDELAY;调延时子程序 ************************************************* ************************

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

51单片机中的汇编语言与C语言.

51单片机中的汇编语言与 C 语言 C 语言, 更多的是为了掌握单片机的应用, C 语言是高效的应用程序开发工具, 与汇编语言比却不是开发高效应用程序的工具。就目前而言, 更多的是为了应用单片机, 开发应用程序, 更多的是强调开发效率, 而不是程序的运行效率 (相对而言。再就是应用程序对单片机内部资源的使用效率, 这在过去, 单片机内部资源紧缺的年代, 特别的强调, 现在已经不是特别重要了。所以, 大多数人都认为,只用 C 语言,就可以应对大多数单片机的应用开发了。 其实,汇编语言跟 C 语言在本质上一样的,只是语言形式不同而已,一个接近底层逻辑, 一个接近人类语言, 本质上都是对寄存器或存储器的读写操作而已。 汇编语言中,用 MOV 来回传送数据, C 语言里,用等号表示数据传送。汇编语言中,用 call 转去执行子过程程序, C 语言里,用个函数名调用子程序。汇编语言中,用 JMP 完成分支转移, C 语言里用 if 、 switch 、 while 、 for 来判断跳转。汇编语言跟 C 一样可以给寄存器指定命名,然后对定义的名称进行操作。汇编语言提供了对很多标志位的操作, C51根据需要也进行了改进, C 语言可以通过 #include给存储器命名来简化操作。 我觉得, C 语言是最接近汇编语言的一种高级语言, 要说不同, 也许具有大量函数的函数库,是 C 语言与汇编语言的最大区别,也是 C 语言比汇编语言有更大开发效率的原因。 在应用汇编语言进行应用程序开发时, 如果精心规划好程序结构, 设计好各种数据结构、子程序、中断程序,积累大量的算法程序(相当于函数库,也可以高效率的用汇编语言进行单片机开发。倒是兼容性、可移植性是汇编语言的最大限制,因为不同单片机有不同的指令系统,而 C 语言把这个问题,交给了机器也就是编译器去解决了。其实, 计算机的发展, 就是把尽可能多的事情交个机器去解决。

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

汇编语言指令

汇编语言指令集 数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2

格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL 影响标志: C,P,Z,S,O ROR,ROL,RCR,RCL

基于汇编语言的单片机led点阵显示(含c)

8X8 LED点阵显示技术 在8X8LED点阵上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。 电路原理图 图4.24.1 硬件电路连线

(1).把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块” 区域中的“DR1-DR8”端口上; (2).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块” 区域中的“DC1-DC8”端口上; 程序设计容 (1).8X8点阵LED工作原理说明 8X8点阵LED结构如下图所示

从图4.24.2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。 一根横柱:对应的行置0,而列则采用扫描的方法来实现。

汇编源程序 ORG 00H START: NOP MOV R3,#3 LOP2: MOV R4,#8 MOV R2,#0 LOP1: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC A,A+DPTR MOV P3,A INC R2 LCALL DELAY DJNZ R4,LOP1 DJNZ R3,LOP2 MOV R3,#3 LOP4: MOV R4,#8 MOV R2,#7 LOP3: MOV P1,#0FFH MOV DPTR,#TABA MOV A,R2 MOVC A,A+DPTR MOV P3,A DEC R2 LCALL DELAY DJNZ R4,LOP3

单片机汇编语言经典一百例

51单片机实用程序库 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例() ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#B

MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY: MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 方波输出 程序介绍:口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。

程序实例(): ORG 0000H MAIN: ;直接利用口产生高低电平地形成方波步移位 ;显示个,十,百,千算机的内部计算都是二进 制,而二进制每除一个2,实际上是向右移一次。所以为了计算方便,我们选择取6个数,最后在算除法的时候,只需要用单片机自带的右移位命令移2次就行了。 27 十六进制六位数加法(数码显示) 程序实例: ORG 0000H MAIN: ADNUMBER EQU 30H ;AD转换值 ADDNUMBER EQU 31H ;加数值1

ADL EQU 32H ;// ADH EQU 33H ;ADL转换高低位值 DISL EQU 34H ;// DISH EQU 35H ;显示高低位值 ADDTOTAL EQU 36H ;第一次AD转换值ADDJW EQU 37H ;加法进位数 ADDHOLD EQU 38H ADDFLAG EQU 39H ;加标志 ENDFLAG EQU 40H ;赋初值//////////////////////////////////////////// MOV ADDHOLD,#00H MOV ADDNUMBER,#00H MOV ADL,#00H MOV ADH,#00H MOV DISL,#00H

汇编语言指令速查表

附录 附录A 常用80x86指令速查表 指令按助记符字母顺序排列,缩写、符号约定如下: (1) 指令中,dst, src表示目的操作数和源操作数。仅一个操作数时,个别处也表示为opr。 (2) imm表示立即数,8/16/32位立即数记作:imm8/imm16/imm32。 (3) reg表示通用寄存器,8/16/32位通用寄存器记作:reg8/reg16/reg32。 (4) mem表示内存操作数,8/16/32等内存操作数记作:mem8/mem16/mem32等。 (5) seg表示段寄存器,CS, DS, SS, ES, FS, GS。 (6) acc表示累加器,8/16/32累加器对应AL/AX/EAX。 (7)OF, SF, ZF, AF, PF, CF分别表示为O, S, Z, A, P, C,相应位置为:字母,根据结果状态设置;?,状态不确定;-,状态不变;1,置1;0,清0;例如:0 S Z ? P -表示:OF清0,AF不确定,CF不变,其它根据结果设置。若该栏空白,则表示无关。 (8)寄存器符号诸如(E)CX, (E)SI, (E)DI, (E)SP, (E)BP和(E)IP等,表示在16地址模式下使用16位寄存器(如CX),或在32地址模式下使用32位寄存器(如ECX)。 (9)周期数表示指令执行所需的CPU时钟周期个数,即执行时间为:周期数/主频(秒)。 (10)诸如(386+)是表示该指令只能用于80386及以后微处理器上。

·252·

附录 ·253·

·254·

附录 ·255·

·256·

LCD1602-51单片机汇编程序

1602汇编程序,51单片机汇编程序,仅需修改引脚定义即可。晶振大小12M,程序测试完全正确。内部包含写数据、写命令(包括读忙和不读忙)、初始化等子函数。调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。 ;端口引脚定义区 LCD_RS BIT P2.4 ;1602数据命令选择端口 LCD_RW BIT P2.5 ;1602读写选择端口 LCD_EN BIT P2.6 ;1602使能端口 LCD_DATA EQU P0 ;1602数据端口 ;变量声明区 ALL_FLAG EQU 20H ;标志位 LCD_FLAG EQU ALL_FLAG.7 ;1602读忙标志位 LCD_DAT EQU 30H ;1602数据命令字 DELAYED EQU 31H ;延时字 /***************************************** 1602读命令函数,高位存至LCD_LAG中 *****************************************/ LCD_R_DATA: MOV LCD_DATA,#0FFH LCD_BUSY: CLR LCD_RS SETB L CD_RW NOP SETB L CD_EN NOP MOV Acc,LCD_DATA MOV C,Acc.7 MOV LCD_FLAG,C CLR LCD_EN NOP JB LCD_FLAG,LCD_BUSY RET /***************************************** 1602写数据函数,数据存在LCD_DAT *****************************************/ LCD_W_DATA: LCALL LCD_R_DATA SETB L CD_RS CLR LCD_RW NOP MOV LCD_DATA,LCD_DAT

微机原理与接口技术汇编语言指令详解吐血版

第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过 程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及 有效地址的计算。 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码 操作数 …… 操作数 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。 例如:MOV AX ,3000H

立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄

基于单片机的汇编语言入门教程

入门教程2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用

单片机汇编语言实验教程(1).

本文由zaoangy贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 实验一熟悉MCS-51寻址方式及传送类指令 一.实验目的: 1.熟悉uVision2集成调试环境 2.熟悉 MCS-51寻址方式及传送类指令二.uVision2集成调试环境的使用uVision2是德国Keil Software公司用于多种嵌入式微处理器的一个理想、快速、 可靠的程序调试器。此调试器包含一个高速模拟器,能够让你模拟整个8051 系统,包括片上外围.....器件和外部硬件。 1.创建项目uVision2是以项目来管理你的任务,它可以使你的8051应用系统设计变得简单。要创建一个应用,你需要按下列步骤进行操作:①第一次使用,首先为我们编写的实验程序在D盘上新建一个文件夹D:\单片机实验;②启动uVision2,新建一个项目文件并从器件库中选择一个器件,操作步骤如下:直接在桌面上点击uVision2程序图标就可以启动它。要新建一个项目文件,从uVision 2的Project菜单中选择New Project,这将打开一个标准的Windows对话框,此对话框要求你输入项目文件名,例如为实验一新建项目:D:\单片机实验\ex1.vu2。紧接着,Select Device for Target,即为你的项目选择一个CPU。我们选择Gene ric下的8032。 2.新建一个源文件你可以用菜单选项File-New来新建一个源文件。这将打开一个空的编辑窗口让你输入你的源代码。编辑后,我们把我们的实验程序保存为D:\单片机实验\dpj1.asm。 3.将你的源文件加入到你的项目中在你的P roject Workspace窗口双击Target1及Suorce Group1,将你的目标系统一直展开到看到源文件组,如图1(a所示。右击Suorce Group1,出现Add files选项, 选择它可打开一个标准的文件对话框,从对话框中选择你刚刚生成的文件dpj1.asm 。 (a (b

单片机主要使用汇编语言

1.单片机主要使用汇编语言,而编写汇编语言程序设计人员必须精通 (指令系统)和(单片机硬件结构)。 2.CHMOS工艺是(CMOS)工艺和(HMOS)工艺结合,具有(低功 耗)的特点。 3.与8051比较80C51的最大特点是(使用CHMOS工艺)。 4.MCS—51单片机的时钟电路包括2部分,即芯片内的(高增益反相 放大器)和芯片外跨接的(晶体振荡器)与(微调电容)。 5.在MCS—51中,位处理器的数据位存储空间是由(专用寄存器)的 可寻址位和内部RAN为寻址区的(128)个位。 6.MCS—51的4个I/O口中,P0是真正的双向口,而其它的口则为准 双向的,这一区别在口线电路结构中表现在(口的输出缓冲器)的 不同上。 7.在寄存器间接寻址方式中,其“间接”体现在指令中寄存器的内容 不是操作数,而是操作数的(地址)。 8.在直接寻址方式中,只能使用(8)位二进制数作为直接地址,因此 其寻址对象只限于(内部RAM)。 9.在变址寻址方式中,以(累加器A)作变址寄存器,以(DPTR)或 (PC)作基址寄存器。 10.在相对寻址方式中,寻址得到的结果是(程序转移的目的地址)。 11.中断技术是解决资源竞争的有效方法,因此可以说中断技术实质上 是一个资源(共享)技术。 12.中断采样用于判断是否有中断请求信号,但MCS——51中只有(外 中断)才有中断采样的问题。 13.响应中断后,首先把(PC)内容压入堆栈,然后把长指令送(PC), 使程序转向(程序存储器)中的地址区。 14.从单片机的角度看,连接到数据总线的输出口应具有(锁存)功能, 连接到数据总线的输入口应具有(三态缓冲)功能。 15.在MCS—51单片机系统中,采用的编址方式是(统一编址方式)。 16.在查询和中断两种数据输入输出控制方式中,效率较高的是(中断 方式)。 17.输入口扩展是为了实现数据的(缓冲)功能,输出口扩展是为了实 现数据的(锁存)功能。 18.异步串行数据通信侦格式由(起始)位、(数据)位、(奇偶校验) 位和(停止)位组成。 19.串行接口电路的主要功能是(串行)化和(反串行)化,把侦中格 式信息滤除而保留数据位的操作是(反串行)化。 20.MCS—51的串行口在工作方式0下,是把串行口作为(同步移位) 寄存器使用。在串入并出移位下作(并行输出)口使用,在并入串 出移位下作(并行输入)口使用。 21.使用定时器/计数器1设置串行通信波特率时,应把定时器/计数器1 设定为工作方式(2),即(自动重新加载)方式。 22.D/A转换必须设置数据锁存器,这是因为(转换需要一定时间才能 完成,数字量需要稳定一段时间)。 23.对于电流输出的D/A转换器,为了得到电压的转换结果,应使用(运 算放大器)。 24.在脉冲调控法控制电机启动和调节电机转速的控制电路中,可使用 D/A转换器产生(调控脉冲)。 25.使用双缓冲方式的D/A转换器,可以实现多路模拟信号的(同步) 输出。 26.A/D转换器,按转换原理可分为4种,即(计数)式、(双积分)式、 (涿次逼近)式和(并行)式。 27.A/D转换器芯片ADC0809中,可作为查询的状态标志,可作为中断 请求信号使用的(转换结束)信号。28.把数/模转换器转换的数据传送给单片机,可使用的控制方式有(定 时传送)、(查询)和(中断)3中。 29.假定累加器A是内容为30H,执行指令:1000H:MOVC A,·A+PC 后把(1031H)单元送A中。 30.DPTR内容8100H,A内容40H执行MOVC A,·A+DPTR后送入 A的是(8140H)单元的内容。 31.SP=60H,ACC=30H,B=70H,执行PUSH ACC PUSH B后SP 为62H,61H为30H,62H为70H。 32.SP=62H,(61H)=30H,(62H)=70H执行POP DPH POP DPL后 DPTR为7030H,SP为60H。 33.A=50H,B=0A0H执行MUL AB后,B为32H,A为00H,CY为0, OV为1。 34.A=0FBH,B=12H执行DIV AB后,A为0DH,B为11H,CY为0, OV为0。 35.A=83H,R0=17H,(17H)=34H,执行ANL A,#17H ORL 17H, A XRL A,@R0 CPL A 后,A的内容为(CBH)。 1.80C51与87C51的区别在于(内部程序存储器的类型不同)。 2.80C51芯片采用的半导体工艺是(CHMOS)。 3.对程序计数器PC的操作(是自动进行啊)。 4.单片机程序存储器的寻址范围由PC决定,MCS—51的PC为16位, 因此其寻址范围是(64KB)。 5.PC和DPTR的结论中错误的是(它们都具有加“1”功能)。 6.不属于位处理器资源的是(通用寄存器的可寻址位)。 7.在相对寻址方式中,“相对”是指相对于(当前指令的末地址)。 8.对程序存储器的读操作,只能使用(MOVC指令)。 9.执行返回指令时,返回的断点是(调用指令下一条指令的首地址)。 10.可以为访问程序存储器提供和构成地址的有(PC、A、DPTR)。 11.原来寄存器0组为当前寄存器,现要改1组为当前寄存器组,不能 使用指令(MOV PSW。3,1)。 12.不是给程序存储器扩展使用的是(/WR). 13.不是给数据存储器扩展使用的是(/EA). 14.2片INTEL2732(4K×8),除应使用P0的8条外,还至少使用P2口的 口线(5条). 15.中断查询,查询的是(中断标志位). 16.在MCS—51中需要外加电路实现的中断撤除的是(电平方式的外部 中断). 17.执行中断返回指令,要从堆栈弹出断点地址, 从堆栈弹出的断点地址 送给(PC). 18.MCS—51中断优先级叙述中,错误的是(同时同级的多中断请求,将形 成阻塞,系统无法响应). 19.三态缓冲器的输出应具有3种状态,其中不包括(低阻抗状态). 20.在接口电路中的“口”一定的一个(可编址的寄存器). 21.在LED显示中,为了输出位控和段控信号,应使用指令(MOVX). 22.在D/A转换\并分时输入数据应用中,它的2级数据锁存结构可以(保 证各模拟电压能同时输出). 23.把DAC0832连接双缓冲方式数据转换中,错误的是(在程序中使用一 条MOVX指令输出数据). 24.执行MOV SP,#3AH/ MOV A,#20H / MOV B,#30H/ PUSH ACC/ PUSH B/ POP ACC/ POP B后,A和B的内容为(30H 20H) 1.MCS—51单片机的/EA信号有何功能?在使用8031时/EA信 号引脚如何处理? 答:/EA访问程序存储器控制信号,当/EA信号为低电平时,则对RO M的读操作限定在外部程序存储器,而当/EA信号为高电平时,则对RO M的读操作的从内部程序存储器开始,并可延续至外部程序存储器.在 使用8031时/EA信号引脚应接地. 2.内部RAM低128单元划分为哪3个主要部分?说明个部分的 使用特点答:分为寄存器区\位寻址区\用户RAM区 寄存器区:一般有2种使用方法1是以寄存器的形式使用,用寄 存器符号表示,2是以存储单元的形式使用,以单元地址表示. 位寻址区:一种是以位地址的形式,另一种是以存储单元地址加位 的形式表示. 用户RAM区:只能以存储单元的形式使用,其它没有任何规定和 限制. 3.堆栈有哪些功能?堆栈指示器(SP)的作用是什么?在程序设计 时,为什么要对SP重新赋值? 答:堆栈功能:保护断点和保护现场. SP的作用:为了指示栈顶地址所以要设置堆栈指示器(SP) SP的内容一经确定,堆栈的位置也就跟着确定下来,因为堆栈的 位置的浮动的,所以要对SP的初始化赋不同的值. 4.使单片机复位有几种方法?复位后机器的初始状态如何? 答:复位操作有上电自动复位和按键手动复位两重方式.. 复位后单片机 进入初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单 元开始执行程序. 1.把长度为10HD的字符串从内部RAM的输入缓冲区inbuf向设在外部 RAM的输出缓冲区outbuf进行传送,一直进行到遇见回车符CR或整个字 符串传送完毕。 MOV R0,#inbuf/ MOV DPTR,#outbuf/ MOV R,#10H/ LOOP1:MOV A, @R0/ CJNE A,#0DH,LOOP2/ SJMP HERE/ LOOP2:MOVX @DPTR A/ INC R0/ INC DPTR/ DJNZ R1,LOOP1/HERE:SJMP HERE / END 2.内部RAM从list单元开始存放一正数表,表中之数作无序排列,并以“— 1”作结束标志。找出最小数。 MOV R0,#list/ LOOP1:MOV A,@R0/ CJNE A,#0FFH,LOOP2/ SJMP HERE/ LOOP2:INC R0/ MOV R1,A/ CLR C/ SUBB A,@R0/ JC LOOP3/ MOV A,@R0/ LOOP3:INC R0/ MOV A,R1/ SJMP L1/ HERE: SJMP HERE/ END 3.搜索一串ASCII码字符中最后一个非空格字符,字符串从外部RAM8100H 单元开始存放,并用一个回车符(0DH)作结束。编程实现搜索并把搜索 到的非格字符的地址存入内部RAM单元40H和41H中,其中高字节放入 41H单元。 MOV DPTR,#8100H/ LOOP1:MOVX A,@DPTR/ INC DPTR/ CJNE A, #0DH,LOOP1/ LOOP2:DEC DPL/ MOVX A,@DPTR/ CLR C/ SUBB A, #20H/ JZ LOOP2/ MOV 41H,DPH/ MOV 40H,DPL/ SJMP $/ END 4.从内部RAM20H单元开始存放一组带符号数,字节个数存在1FH中。请 统计出其中大于0、等于0和小于0的数的数目,并把统计结果分别存入 ONE、TWO、THREE3个单元中。 MOV R0,#20H/ MOV ONE,#00H/ MOV TWO,#00H/ MOV THREE, #00H/ L0:MOV A,@R0/ JNZ L1/ INC TWO/ SJMP L2/ L1:JNB ACC.7, L3/ INC THREE/ SJMP L3/ L3:INC ONE/ L2:INC R0/ DJNZ 1FH, L0/ HERE:SJMP HERE 5.5个双字节数,存放在外部RAM从barf开始的单元中,求它们和,把和 存放在sum单元中,请编程实现。 MOV R0,#barf/ MOV R3,#05H/ MOV R1,#SUM/ MOV R2,#03H/ CLR A/ L1:MOV @R1,A/ DJNZ R2,L1/ L2:CLR C/ MOV R1, #SUM/ MOV A,@R1/ SDDC A,@R0/ MOV @R1,A/ INC R0/ INC R1/ MOV A,@R0/ MOV A,R1,A/ INC R0/ MOV A,#00H/ MOV @R1,A/ INC R0/ DJNZ R3,L2 HERE:SJMP HERE 6.有晶振频率为6MHZ的MCS—51单片机,使用定时器0以定时方法在P1.0 输出周期为400us,占空比为10:1的矩形脉冲,以定时工作方式2编程实现. X1=28-20=236=0ECH X2=28-180=76=4CH ORG 0000H/ AJMP MAIN/ ORG 000BH/ AJMP S1/ ORG 0500H/ MAIN:MOV TMOD,@#02H/ SETB P1.0/ MOV TL0,#0ELH/ MOV TH0,#4CH/ MOV A,#0ECH/ SETB EA/ SETB ET0/ SETB TL0/ HERE:SJMP HERE/ ORG 06OOH/ S1:CPL P1.0/ XCH A,TH0/ RETI 5.什么是指令周期,机器周期和时钟周期?如何计算机器周期的确切时间? 答:指令周期的最大的时序定时单位,执行一条指令所需要的时间称之为指令 周期. 规定一个机器周期的宽度为6个状态,并依次表示为S1~S6.由于一个状态 又包括2个节拍,因此一个机器周期总共有12个节拍,分别记作 S1P1,S1P2,…….S6P2.由于一个机器周期共有12个振荡脉冲周期,因此机 器周期就是振荡脉冲的十二分频.当振荡脉冲频率为12MHZ时,一个机器 周期为1us,当震荡脉冲频率为6MHZ时,一个机器周期为2us. 6.定时的方法有? 答:软件定时;硬件定时;可编程定时器定时. 7.中断响应是有条件的,当存在哪些情况时,中断响应被封锁? 答○1CPU正处在为一个同级或高级的中断服务中;○2查询中断请求的机器 周期不是当前指令的最后一个机器周期;○3当前指令是返回指令(RET,RETI) 或访问IE、IP的指令. 在MCS-51单片机系统中,外接程序存储器和数据存储器共用16位地址线 和8位数据线,为什么不会冲突? 答:指令区分,读外部ROM使用指令“MOVC”读外部RAM使用指令 “MOVX”选通信号,外部ROM的选通信号为PSEN,外部RAM的选 通信号为RD和WR

相关文档
最新文档