《单片机学习第四章》由会员分享,可在线阅读,更多相关《单片机学习第四章(17页珍藏版)》请在金锄头文库上搜索。
1、单片机学习第四章汇编语言程序言程序设计中的数中的数计算机只能算机只能识别二二进制数制数机器指令,它原本是不机器指令,它原本是不认识常用的十六常用的十六进制数和十制数和十进制数的。制数的。机器指令机器指令/ /目目标代代码: 由由0/10/1代代码组成的操作成的操作码与操作数。与操作数。十六十六进制数:便于制数:便于读写写记忆的二的二进制数的制数的简写形式。写形式。 (0 09 9,A AF F 后后缀:H/hH/h)BCDBCD码:用二:用二进制数表达的十制数表达的十进制数。制数。 (0 09 9表示表示为:0000:00001001B 1001B 后后缀:B/b,H/h:B/b,H/h)二二
2、进制数制数 :由:由0/10/1组成、成、“逢逢2 2进1”1”的数制。的数制。 如:如:01011110B 01011110B (0 01 1 后后缀:B/bB/b)2汇编语言言编程基本程基本规则汇编语言言: :用助用助记符描述的指令的集合符描述的指令的集合。指令中以指令中以 AF AF 开开头的十六的十六进制数前必制数前必须添一个添一个 “0”“0”。二二进制数必制数必须带后后缀“B”“B”或或“b”“b”;十六;十六进制数制数必必须带后后缀“H”“H”或或“h”“h”;十;十进制数的后制数的后缀是是“D”“D”或或“d”“d”或无或无. . 标号号:操作操作码 目的操作数目的操作数,源操
3、作数源操作数;注注释 汇编程序程序: :汇编语言言编写的程序借助写的程序借助编译工具工具编译成成为目目标代代码, ,计算机才能算机才能识别。这个个编译工具工具称称为汇编程序。程序。3汇编程序的程序的伪指令指令汇编程序程序 软件件 工具工具工具工具软件件: 将程序将程序员用用汇编语言言编写的程序翻写的程序翻译成机器成机器码 ( (真真) )指令指令: :告告诉计算机算机如何操作以及做何种操作如何操作以及做何种操作用用汇编语言言编写的程序在此被称写的程序在此被称为应用程序用程序伪指令:告指令:告诉汇编程序在翻程序在翻译应用程序用程序时有何具有何具体体约定定。伪指令不指令不进行具体的操作,那是真指令
4、行具体的操作,那是真指令的事。的事。 比如:从何比如:从何处开始,何开始,何处结束,某些束,某些编程者自己程者自己规定的表述代表什么意思定的表述代表什么意思 4汇编程序的常用程序的常用伪指令指令ORG addr16ASM51ORG addr16ASM51程序中一定要写!程序中一定要写!规定定编译后的机器代后的机器代码存放的起始位置。存放的起始位置。END ASM51END ASM51程序中一定要写!程序中一定要写!表示翻表示翻译到此到此结束,其后的任何内容不予理睬。束,其后的任何内容不予理睬。符号名称符号名称 EQU EQU 表达式表达式将表达式的将表达式的值赋予符号名称。程序中凡出予符号名称
5、。程序中凡出现该符符号名称就等同于号名称就等同于该表达式。表达式。$ “$ “当前当前PCPC值”也叫位置也叫位置计数器数器 代代表正在表正在执行的指令所在位置。行的指令所在位置。5符号名称符号名称 BITBIT 位地址位地址将位地址的将位地址的值赋予符号名称。程序中凡出予符号名称。程序中凡出现该符号名称就代表符号名称就代表该位地址。位地址。DWDW 双字双字节数据数据 或双字或双字节数据数据组 将双字将双字节数据数据 或双字或双字节数据数据组 顺序存放在此序存放在此后的存后的存储单元中。占据相元中。占据相应存存储空空间。DBDB 8 8位数据位数据 或或8 8位数据位数据组 将将8 8位数据
6、位数据 或或8 8位数据位数据组 顺序存放在此后的存序存放在此后的存储单元中。占相元中。占相应数量的存数量的存储空空间。6程序的程序的顺序序/ /分支分支/ /循循环三种基本三种基本结构构 ORG 2000H ORG 2000HBCD2BBCD2B:MOV AMOV A, R2 ; R2 ;取入口数据取入口数据 ANL A ANL A, #0F0H ; #0F0H ;取出十位取出十位 SWAP A ; SWAP A ;高高4 4位位 低低4 4位位 MOV B MOV B, #0AH #0AH MUL AB ; MUL AB ;十位乘十位乘1010 MOV R3 MOV R3,A ;A ;积暂
7、存存进R3R3 MOV A MOV A, R2; R2;再取入口数据再取入口数据 ANL A ANL A, #0FH ; #0FH ;取出个位取出个位 ADD A ADD A, R3 R3 MOV R2 MOV R2,A ;A ;结果果 R2 R2 RET ; RET ;若不是子程序可用若不是子程序可用END END 例例:将将R2R2中中BCDBCD码数数转为二二进制制数存数存进R2R2(此子程序在(此子程序在下一例中下一例中还要要用到)用到)7编程要点:程要点: 两字两字节 BCD BCD码数范数范围为: 0000H9999H 0000H9999H 相相应2 2进制制/16/16进制数制数
8、为: 0000H270FH 0000H270FH 调用用 BCD2BBCD2B子程序子程序实现“千位,百位千位,百位”转为二二进制制, , 并乘并乘100;100; 再再调 BCD2BBCD2B子程序子程序实现“十位,个位十位,个位”转为二二进制制; ; 最后,最后,对位相加。位相加。例:将例:将R5R4R5R4中的双字中的双字节BCDBCD码数数转为 二二进制数存于制数存于R5R4R5R4中中。8例例: 将将R5R4R5R4中中的两字的两字节BCDBCD码数数转为二二进制制数存于数存于R5R4R5R4中中X 100X 100千千 百百十十 个个二二进制制+ +CyCy+ +(R5)(R4)(
9、R5)(R4)(R6)(A)(R5)(A)二二进制制二二进制制二二进制制二二进制制二二进制制调 BCD2B调 BCD2B9 ORG 2000H ORG 2000H VAR EQU 30H ; VAR EQU 30H ;定定义缓存存单元元 FUNC EQU 31H FUNC EQU 31HBR1: MOV ABR1: MOV A,VAR ;VAR ;取出取出变量量“X”“X” JZ COMP ; JZ COMP ;若若=0,=0,就就赋 0 0 JNB ACC.7,POS1 ; JNB ACC.7,POS1 ;判断判断 = = 正?正? MOV A,#0FFH ;(-1 = +1 MOV A,#
10、0FFH ;(-1 = +1取反加取反加1)1) SJMP COMP ; SJMP COMP ;输出出 -1 -1POS1POS1:MOV AMOV A,#01H ;#01H ;输出出 +1 +1COMPCOMP:MOV FUNCMOV FUNC,A ;A ;赋给函数函数“Y”“Y”HEREHERE:AJMP HEREAJMP HERE END END例3:1 (X0) 1 (X0) 0 (X=0) 0 (X=0) 1(X0)1(X0)Y=Y=10任任务一:控制一一:控制一盏灯点亮灯点亮 任任务二:二:红灯周期性亮灯周期性亮/ /灭 任任务三:三:红外防盗外防盗报警警 0RG 0000H 0R
11、G 0000H AJMP MAIN AJMP MAIN ORG 0003H ORG 0003H RL A RL A ACALL DELAY ACALL DELAY RETI RETIMAINMAIN:MOV AMOV A,#80H#80H SETB EX0 SETB EX0 SETB EA SETB EAWAIT:JB ACC.0,JOB1WAIT:JB ACC.0,JOB1 JB ACC.1,JOB2 JB ACC.1,JOB2 JB ACC.2,JOB3 JB ACC.2,JOB3 AJMP WAIT AJMP WAITJOB1:JOB1: CLR P1.0 ; CLR P1.0 ;亮亮红
12、灯灯HERE: AJMP HEREHERE: AJMP HEREJOB2: CPL P1.0 ;JOB2: CPL P1.0 ;亮亮/ /灭 ACALL DELAY ; ACALL DELAY ;延延时1 1秒秒 AJMP JOB2 ; AJMP JOB2 ;重复重复JOB3: CLR P1.1 ;JOB3: CLR P1.1 ;亮亮绿灯灯REDO: SETB P1.3 REDO: SETB P1.3 CHECK:JNB P1.3,CHECK LOOP: CHECK:JNB P1.3,CHECK LOOP: ; ;报警!警! AJMP REDO ; AJMP REDO ;再再检测11 ORG
13、1000H ORG 1000HDELAYDELAY:MOV R6MOV R6,#200 ; 1Tm#200 ; 1TmLOOP1:MOV R7LOOP1:MOV R7,#248 ; 1Tm#248 ; 1Tm NOP ; 1Tm NOP ; 1TmLOOP2:DJNZ R7LOOP2:DJNZ R7,LOOP2 ; 2TmLOOP2 ; 2Tm DJNZ R6 DJNZ R6,LOOP1 ; 2TmLOOP1 ; 2Tm RET ; 1Tm RET ; 1Tm例例: :软件循件循环延延时100mS(100mS(晶振晶振12MHz)12MHz) 1Tm =1uS 100mS = 100000 u
14、S 1Tm =1uS 100mS = 100000 uS MOV Rn #data MOV Rn #data 和和 NOP NOP 是是单机器周期指令机器周期指令 DJNZ Rn DJNZ Rn,rel rel 是双机器周期指令是双机器周期指令 200 = 0C8H ; 248 = 0F8H 200 = 0C8H ; 248 = 0F8H1+1+ 1+1+ 248x248x2 2 =498=498(498+2(498+2)x200)x20012 ORG 1000H ORG 1000HDL1SDL1S:MOV R7MOV R7,#10#10DL1: MOV R6DL1: MOV R6,#200#
15、200DL2: MOV R5, #250 DL2: MOV R5, #250 DL3: DJNZ R5, DL3DL3: DJNZ R5, DL3 DJNZ R6 DJNZ R6,DL2DL2 DJNZ R7 DJNZ R7,DL1DL1 RET RET例例: :软件循件循环延延时1S(1S(晶振晶振12MHz)12MHz) 1Tm =1uS 1S = 1000000 uS 1Tm =1uS 1S = 1000000 uS MOV Rn #data MOV Rn #data 是是单机器周期指令机器周期指令 DJNZ Rn DJNZ Rn,rel rel 是双机器周期指令是双机器周期指令1+ 1
16、+ 250x2250x21+ 1+ (1+250x2) (1+250x2) +2)x200+2)x2001+ 1+ (1+250x2+2) (1+250x2+2) x200+2x10x200+2x1013 ORG 2000H ORG 2000HH2ASC: MOV A,R2 ;H2ASC: MOV A,R2 ;取待取待转换的数据的数据( (入口入口) ) ADD A,#0F6H ; ADD A,#0F6H ;判此数是否判此数是否10 10 ? 若若10,10,则C=1C=1;10,10,则C=0C=0 MOV A,R2 ; MOV A,R2 ;重取待重取待转换的数据的数据 JNC AD30H
17、; JNC AD30H ;小于小于1010就跳去加就跳去加30H30H ADD A,#07H ;10 ADD A,#07H ;10就先加就先加7 7 再去加再去加30H 30H AD30H: ADD A,#30H AD30H: ADD A,#30H MOV R2,A ; MOV R2,A ;存存结果果( (出口出口) ) RET RET例例:16:16进制数制数(00H0FH)(00H0FH)转ASCIIASCII码子程序子程序算法:凡算法:凡1010的十六的十六进制数加制数加37H37H;凡;凡1010的的 十六十六进制数加制数加 30H 30H。( (ASCIIASCII码表表0 09 3
18、0H9 30H39H, A39H, AF 41HF 41H46H 46H 14TABL: DW 050FH,0E89H,0A695H,1EAAH,0D9BH,7F93H TABL: DW 050FH,0E89H,0A695H,1EAAH,0D9BH,7F93H DW 0373H,26D7H, 2710H,9E3FH,1A66H,22E3H DW 0373H,26D7H, 2710H,9E3FH,1A66H,22E3H DW 1174H,16EFH, 33E4H,6CA0H DW 1174H,16EFH, 33E4H,6CA0H例:根据例:根据1616个双字个双字节数的序号数的序号查表找出表找出
19、对应数据数据表地址表地址#TABL#TABL#TABL+1#TABL+1#TABL+2#TABL+2#TABL+3#TABL+3#TABL+30#TABL+30#TABL+31#TABL+31数据数据Y YY0Y0高高Y0Y0低低Y1Y1高高Y1Y1低低Y15Y15高高Y15Y15低低序号序号X X00H00H01H01H0FH0FH编程思路:以表格首地址程思路:以表格首地址(TABL)(TABL)为基址,以序号基址,以序号( (的的2 2倍倍) )为偏移量,偏移量,查找找对应的数据的数据15 ORG 2000H ORG 2000HSTA1: MOV A,R2 ;STA1: MOV A,R2
20、;取待取待查数据的序号数据的序号 X ( X (入口入口) ) RL A ; RL A ;每数占每数占2 2个个单元,序号要乘元,序号要乘2 2 MOV R4 MOV R4,A ;R4 A ;R4 序号序号 x2 ( x2 (即偏移量即偏移量) ) MOV DPTR,#TABL ;DPTR MOV DPTR,#TABL ;DPTR 表格首地址表格首地址 MOVC A,A+DPTR ;(A) MOVC A,A+DPTR ;(A) 查到数据高到数据高8 8位位 XCH A XCH A,R4 ;R4 ;数据高数据高8 8位存位存进R4(R4(出口出口) ) ; ;同同时取出偏移量到取出偏移量到A A INC DPTR ;DPTR INC DPTR ;DPTR指向下一个指向下一个单元元 MOVC A,A+DPTR ; MOVC A,A+DPTR ;再再查到数据低到数据低8 8位位 MOV R3,A ; MOV R3,A ;将数据低将数据低8 8位存位存进R3(R3(出口出口) ) RET RETTABL: DW ;TABL: DW ;表格数据表格数据见前前页 END END16OVER !17