本讲介绍汇编语言程序设计及指令。
要进行单片机设计,首先要学会编写程序。
单片机它必须配合各种各样的软件才能发挥其运算和控制功能。
汇编语言是一种采用助记符表示指令、数据和地址来设计程序的语言。
例如MoVA,#0AH表示取一个(立即)数0A(十六进制,如转成二进制为00 ̄1010)传送到A累加器。
汇编语言指令的一般格式如下: [标号:]操作码助记符[第一操作数][,第二操作数][,第三操作数][;注释] 其中带方括号[..·]的部分为可选项。
标号是表示该指令位置的符号地址。
它是以英文字母开始的由1~6个字母或数字组成的字符串,并以“:”结尾。
通常在子程序人口或转移指令的目标地址处才赋予标号。
操作码助记符是表示指令操作功能的英文缩写。
每条指令都有操作码。
它是指令的核心部分。
操作数字段表示指令操作所需要的操作数或操作数的地址。
操作数字段的表达形式与寻址方式有关。
指令的操作数可以是1个、2个或3个,有些指令可能没有操作数。
操作数与操作数之间以“,”分隔,操作码与操作数之间以空格分隔。
注释字段是用户给该条指令或该段程序的功能说明,是为了方便阅读程序的一种标注。
注释以“:”为开始。
注释部分不影响指令的执行。
在学习指令之前,先必须了解 一22一电子制作2000年第3期 维普资讯 维普资讯 节中直接给出。
因此叫立即数寻 址。
例如:M0V A,#data撑为立即 数标志,立即数data的范围是0~ FFH。
2.直接寻址。
例如:M0V direct1,direct2这条指令的含义是 将地址direct2单元中的内容传送 给地址diI1ect1单元中。
3.寄存器寻址 例如M0V A, Rn n=O,1,…7。
这条指令的含义 是将工作寄存器Rn中的内容传送 给累加器A。
4.寄存器间接寻址。
例如: M0V A,@Ri i=l,2。
这条指令的 含义是将Ri中的内容取出,作为另 一个单元的地址,将此单元中的内 容取出传送到累加器A。
5.位寻址。
例如: M0V c. 07H这条指令的功能是将内部 RAM2OH-q ̄-元的D7位(位地址为 O7H)的内容传送到位累加器C中。
6.变址寻址。
变址寻址方式是 以DPTR或PC作基址寄存器,以累 加器A作变址寄存器,并以两者内 容相加形成的16位地址作为操作 数的地址 例如:M0VC A,@A+ DPTR;其功能是把DPTR和A的内 容相加,再把所得到的程序存储器 地址单元的内容送A。
变址寻址方 式只能对程序存储器进行寻址,或 者说它是专门针对程序存储器的 寻址方式。
7.相对寻址。
相对寻址以程序 计数器PC的当前值作为基地址, 与指令中给定的相对偏移量rel进 行相加,把所得之和作为程序的转 移地址 例如:JZ 3OH 当A=O 时,PC—PC+2+rel;若A≠0,贝U PC+一PC+2。
讲了那么多,可能有的读者会 说,我还是云里雾里,一头雾水,舍 也搞不懂 .那也没关系,学单片机 一开始就是这样,还是让我们结合 程序与实验吧。
以后实验做多了, 再结合指令学习,就会逐步搞明白 的。
打开Keil C51 Windows集 01 101 101,结果点亮的发光管右移 成开发环境,按讲座(二)的方法, 一位。
先在我的文档中建立一个文件目 序号7:调用延时子程序DEL. 录(如S1).然后建立一个S1.uv2的 维持发光管点亮。
工程项目.最后建立源程序文件 序号8:将立即数B6H传送到 ( ̄13S1.asm)。
输入以下源程序: P1口,B6H的___二进制数为 序号:1 2 3 4 5 6 7 8 ORG 0000H: UMP MAIN: ORG 030H: MAIN:MOV P1.#ODBH; ACALL DEL; MOV P1,#O6DH: ACALL DEL; MOV P1,#OB6H; 11011011,点亮的发光管继续右移
一 一 位。
序号9:调用延时子程序DEI . 维持发光管点亮 序号10:跳转到主程序处循 环。
AJMP xx这条转移指令我们还 ; 未学到,以后再解释。
9 ACALL DEL: lO l1 AJMP MAIN; DEL: MOV R7.#OFFH: 12 l3 l4 15 DELl:MOV R6.#OFFH: DEL2:DJNZ R6,DEL2; DJⅣZ R7,DELl; RET; 序号11:延时子程序开始,将 立即数FFH传送给寄存器R7。
冒号 j 前的DEL为标号. j 序号12:将立即数FFH传送给 { j 寄存器R6。
同理DELl为标号。
序号13:将R6中的内容减1后 l6 END: 判断,若为0则程序向下执行;若不 编译通过后,将其烧录到 为0则跳转到DEL2处(即本身)执 89C51芯片中,将芯片插入到S1型 行。
LED- ̄出试验板上(配套器材的供 序号14:将R7中的内容减1后 应消息见本刊1、2月的配文广告),! 判断,若为0则程序向下执行;若不 通电后会发现P1口的8个发光管每 为0则跳转到DEL处执行。
这样将 隔2个右循环点亮。
现在我们结合 总共做FFHxFFH(即256x256= 试验情况来详释一下程序。
65536)次减1,用于增大延时时间 序号1(程序解释,以下同):程】 序号15:返回调用子程序处。
序开始,ORG是一条伪指令,表示{ 序号16:程序结束。
END也是 程序从 ̄O000H开始运行。
一条伪指令,表示程序从这里结 序号2:跳转到MAIN主程序 束。
处。
现在我们弄明白了,只要改变 序号3:主程序MAIN从地址 传送给P1口的立即数,即可控制使 0030H开始 哪个发光管亮、哪个发光管灭 改 序号4:主程序开始后的第
一 变第一次、第二次、第三次传送给 条指令是将立即数DBH传送到P1 P1口的立即数数字,就可控制点亮 口,DBH的¨_ 进制数为11011011, 的发光管实现右循环或左循环 改 其中低电平0可将发光管点亮。
冒 变传送给R6、R7寄存器的立即数 号前的MAIN为标号,表示主程序 就可调整延时时间 你可以试一下 开始。
改变这些立即数,看看有什么变 序号5:调用延时子程序DEL, 化,看能不能控制一组彩灯 维持发光管点亮(延时结束时从子 下面给出MCS-51内部的RAM 程序返回)。
ACALL xx这条调用指 和特殊功能寄存器SFR的数据传 令我们还未学到,以后再解释。
』 送指令。
序号6:将立即数6DH传送到j 1.以累加器为目的操作数 P1口,6DH的二进制数为 MOV A.Rn 表示将寄存 电子制作20o3年第3期 一23— 维普资讯 器Rn中的内容送累加器A。
MOV A,direct表示将直接 :1 ̄tlkdireet中的内容送累加器A。
MOV A,@Ri表示将寄存器 Ri中内容作为地:111:的单元内容送 累加器A。
M0V A,#data表示将立即数 data送累加器A。
2.以寄存器为目的操作数 MOV Rn,A 表示将累加器 A中的内容送寄存器Rn中。
M0V Rn,direct表示将直接 地址单元direct中的内容送寄存器 Rn中。
M0V Rn,#data表示将立即 数clata ̄ 器Rn中。
3.以直接地址为目的操作数 MOV direct,A表示将累加器 A中的内容送直接地:111:单元direct 中。
MOV direct,Rn表示将寄存 器Rn中的内容送直接地:111:单元 direct中。
M0V direct2,direct 1表示 将直接地:111:单元direct1中的内容 送直接地址单元direct2中。
MOV direct,@Ri表示将寄 存器Ri中内容作为地址的单元内 容送直接地址单元direct中。
M0V direct,#data表示将立 即数data送直接地址单元direct中。
4.以寄存器间接地:111:为目的 操作数 M0V@Ri,A表示将累加器 A中的内容送间接t ̄:llkRi中。
MOV@Ri,direct表示将直 接地址单元direct中的内容送间接 地址Ri中。
M0V@Ri,#data 表示将立 即数dataJ ̄_间接t ̄:llkRi中。
5.16位数据传送 M0V DfrrR,#datal6表示将 16位二进制数传送到DPTR寄存器 中。
为了学习:h-便,下面给出M0V 指令中操作数的各种组合关系。
刚才我们做了单片机的输出 实验,是不可控的。
那么能不能由 输入信号去控制输Lp,信号,让单片 机受人的控制产生输Lp,信号,做到 可控呢?答案是肯定的,下面我们 再做一个实验。
输入以下源程序。
序号:1 2 3 4 5 6 7 8 9 1O 11 12 13 14 15 16 17 18 19 2O 21 22 23 24 25 26 27 28 29 3O 31 32 33 34 35 36 37 38 ORG 000oH 【JMP MAIN: ORG O3OH: MAIN:MOV P3.#OCOH: ACALL DEI4MS: M0V P3.加FOH: M0V A.P3; CJNE A,#0FDH,F1; AJMP MAIN: F1: MOV P3.#0F9H; ACALL DEL1S: MOV P3.#OA4H: ACALL DEL1S: M0V P3.#0BOH: ACALL DELIS: M0V P3,#O99H: ACALL DEL1S: M0V P3. )92H: ACALL DEL1S: M0V P3.#082H: ACALL DEL1S: M0V P3.加F8H: ACALL DEL1S: M0V P3.#08OH: ACALL DEL1S: M0V P3.#O9OH; ACALL DEL1S: AJMP MAIN; DEI4MS:M0V R7,#O4H; DL0: M0V R6.#0FFH: DL1: DJNZ R6.DL1: DJNZ R7.DL0; RET: DEL1S:M0V!t5.OFFH: F2: ACALL DEI4MS: DJNZ R5.F2: RET: END 编译通过后,将其烧录到 89C51芯片中,将芯片插入 ̄llS2型 LED数码管输出试验板上,通电后 左边第一个数码管显示“0”。
这时 若按动S1~S12按键的一个,则数码 管以1秒的间隔显示“1、2…9”九个 数字,最后回停到“0”。
这样就能实 现输出的数字由人工输入触发。
下面我们解释一下程序。
序号1(程序解释,以下同):程序开始 序号2:跳转到MAIN主程序处。
序号3:主程序MAIN从地址o03OH开始。
序号4:P3口输出COH,数码管显示“0”。
序号5:调用4Ⅱ 延时子程序,维持发光管 点亮。
序号6:向P3口送FoH,准备读P3口的输 入状态。
序号7:将P3口的输入状态读人累加器A。
序号8:若A的内容(即读入的P3口状态) 等于FUH,说明无按键按下,程序向下执行;反 之有键按下则程序跳转到F1。
序号9:跳转到主程序处循环。
序号1O:将立即数f、9H传送给P3口,数码 管显示“1”。
序号l1:调用延时1S子程序。
序号12:将立即数A4H传送给P3口,数码 管显示“2”。
序号13:调用延时1S子程序。
序号14:将立即数BOH传送给P3f1,数码 管显示“3”。
序号15:延时1s子程序。
序号16:将立即数99H传送给P3口.数码 管显示“4”。
序号17:调用延时1S子程序。
序号18:将立即数92H传送给P3口,数码 管显示“5”。
序号19:调用延时1S子程序。
序号2O:将立即数82H传送给P3口,数码 管显示…6’。
序号21:调用延时1S子程序。
序号22:将立即数F8H传送给P3口,数码 管显示“7”。
序号23:调用延时1S子程序 序号24:将立即数80H传送给P3u.数码 管显示“8”。
序号25:调用延时1s子程序: 序号26:将立即数90H传送给P3口.数码 管显示…9’。
序号27:调用延时1S子程序: 序号28:跳转到主程序处循环 序号29~33:延时4mS子程序 序号34~37:延时lS子程序: 序号38:程序结束 (下一讲继续介绍指令的学习及实验): 有关Keitc51软件及编程嚣邮购信息请见 上期介绍或打皂话向021—64066571咨询。
.
一 一24一电子嗣作2OO3年第3期
要进行单片机设计,首先要学会编写程序。
单片机它必须配合各种各样的软件才能发挥其运算和控制功能。
汇编语言是一种采用助记符表示指令、数据和地址来设计程序的语言。
例如MoVA,#0AH表示取一个(立即)数0A(十六进制,如转成二进制为00 ̄1010)传送到A累加器。
汇编语言指令的一般格式如下: [标号:]操作码助记符[第一操作数][,第二操作数][,第三操作数][;注释] 其中带方括号[..·]的部分为可选项。
标号是表示该指令位置的符号地址。
它是以英文字母开始的由1~6个字母或数字组成的字符串,并以“:”结尾。
通常在子程序人口或转移指令的目标地址处才赋予标号。
操作码助记符是表示指令操作功能的英文缩写。
每条指令都有操作码。
它是指令的核心部分。
操作数字段表示指令操作所需要的操作数或操作数的地址。
操作数字段的表达形式与寻址方式有关。
指令的操作数可以是1个、2个或3个,有些指令可能没有操作数。
操作数与操作数之间以“,”分隔,操作码与操作数之间以空格分隔。
注释字段是用户给该条指令或该段程序的功能说明,是为了方便阅读程序的一种标注。
注释以“:”为开始。
注释部分不影响指令的执行。
在学习指令之前,先必须了解 一22一电子制作2000年第3期 维普资讯 维普资讯 节中直接给出。
因此叫立即数寻 址。
例如:M0V A,#data撑为立即 数标志,立即数data的范围是0~ FFH。
2.直接寻址。
例如:M0V direct1,direct2这条指令的含义是 将地址direct2单元中的内容传送 给地址diI1ect1单元中。
3.寄存器寻址 例如M0V A, Rn n=O,1,…7。
这条指令的含义 是将工作寄存器Rn中的内容传送 给累加器A。
4.寄存器间接寻址。
例如: M0V A,@Ri i=l,2。
这条指令的 含义是将Ri中的内容取出,作为另 一个单元的地址,将此单元中的内 容取出传送到累加器A。
5.位寻址。
例如: M0V c. 07H这条指令的功能是将内部 RAM2OH-q ̄-元的D7位(位地址为 O7H)的内容传送到位累加器C中。
6.变址寻址。
变址寻址方式是 以DPTR或PC作基址寄存器,以累 加器A作变址寄存器,并以两者内 容相加形成的16位地址作为操作 数的地址 例如:M0VC A,@A+ DPTR;其功能是把DPTR和A的内 容相加,再把所得到的程序存储器 地址单元的内容送A。
变址寻址方 式只能对程序存储器进行寻址,或 者说它是专门针对程序存储器的 寻址方式。
7.相对寻址。
相对寻址以程序 计数器PC的当前值作为基地址, 与指令中给定的相对偏移量rel进 行相加,把所得之和作为程序的转 移地址 例如:JZ 3OH 当A=O 时,PC—PC+2+rel;若A≠0,贝U PC+一PC+2。
讲了那么多,可能有的读者会 说,我还是云里雾里,一头雾水,舍 也搞不懂 .那也没关系,学单片机 一开始就是这样,还是让我们结合 程序与实验吧。
以后实验做多了, 再结合指令学习,就会逐步搞明白 的。
打开Keil C51 Windows集 01 101 101,结果点亮的发光管右移 成开发环境,按讲座(二)的方法, 一位。
先在我的文档中建立一个文件目 序号7:调用延时子程序DEL. 录(如S1).然后建立一个S1.uv2的 维持发光管点亮。
工程项目.最后建立源程序文件 序号8:将立即数B6H传送到 ( ̄13S1.asm)。
输入以下源程序: P1口,B6H的___二进制数为 序号:1 2 3 4 5 6 7 8 ORG 0000H: UMP MAIN: ORG 030H: MAIN:MOV P1.#ODBH; ACALL DEL; MOV P1,#O6DH: ACALL DEL; MOV P1,#OB6H; 11011011,点亮的发光管继续右移
一 一 位。
序号9:调用延时子程序DEI . 维持发光管点亮 序号10:跳转到主程序处循 环。
AJMP xx这条转移指令我们还 ; 未学到,以后再解释。
9 ACALL DEL: lO l1 AJMP MAIN; DEL: MOV R7.#OFFH: 12 l3 l4 15 DELl:MOV R6.#OFFH: DEL2:DJNZ R6,DEL2; DJⅣZ R7,DELl; RET; 序号11:延时子程序开始,将 立即数FFH传送给寄存器R7。
冒号 j 前的DEL为标号. j 序号12:将立即数FFH传送给 { j 寄存器R6。
同理DELl为标号。
序号13:将R6中的内容减1后 l6 END: 判断,若为0则程序向下执行;若不 编译通过后,将其烧录到 为0则跳转到DEL2处(即本身)执 89C51芯片中,将芯片插入到S1型 行。
LED- ̄出试验板上(配套器材的供 序号14:将R7中的内容减1后 应消息见本刊1、2月的配文广告),! 判断,若为0则程序向下执行;若不 通电后会发现P1口的8个发光管每 为0则跳转到DEL处执行。
这样将 隔2个右循环点亮。
现在我们结合 总共做FFHxFFH(即256x256= 试验情况来详释一下程序。
65536)次减1,用于增大延时时间 序号1(程序解释,以下同):程】 序号15:返回调用子程序处。
序开始,ORG是一条伪指令,表示{ 序号16:程序结束。
END也是 程序从 ̄O000H开始运行。
一条伪指令,表示程序从这里结 序号2:跳转到MAIN主程序 束。
处。
现在我们弄明白了,只要改变 序号3:主程序MAIN从地址 传送给P1口的立即数,即可控制使 0030H开始 哪个发光管亮、哪个发光管灭 改 序号4:主程序开始后的第
一 变第一次、第二次、第三次传送给 条指令是将立即数DBH传送到P1 P1口的立即数数字,就可控制点亮 口,DBH的¨_ 进制数为11011011, 的发光管实现右循环或左循环 改 其中低电平0可将发光管点亮。
冒 变传送给R6、R7寄存器的立即数 号前的MAIN为标号,表示主程序 就可调整延时时间 你可以试一下 开始。
改变这些立即数,看看有什么变 序号5:调用延时子程序DEL, 化,看能不能控制一组彩灯 维持发光管点亮(延时结束时从子 下面给出MCS-51内部的RAM 程序返回)。
ACALL xx这条调用指 和特殊功能寄存器SFR的数据传 令我们还未学到,以后再解释。
』 送指令。
序号6:将立即数6DH传送到j 1.以累加器为目的操作数 P1口,6DH的二进制数为 MOV A.Rn 表示将寄存 电子制作20o3年第3期 一23— 维普资讯 器Rn中的内容送累加器A。
MOV A,direct表示将直接 :1 ̄tlkdireet中的内容送累加器A。
MOV A,@Ri表示将寄存器 Ri中内容作为地:111:的单元内容送 累加器A。
M0V A,#data表示将立即数 data送累加器A。
2.以寄存器为目的操作数 MOV Rn,A 表示将累加器 A中的内容送寄存器Rn中。
M0V Rn,direct表示将直接 地址单元direct中的内容送寄存器 Rn中。
M0V Rn,#data表示将立即 数clata ̄ 器Rn中。
3.以直接地址为目的操作数 MOV direct,A表示将累加器 A中的内容送直接地:111:单元direct 中。
MOV direct,Rn表示将寄存 器Rn中的内容送直接地:111:单元 direct中。
M0V direct2,direct 1表示 将直接地:111:单元direct1中的内容 送直接地址单元direct2中。
MOV direct,@Ri表示将寄 存器Ri中内容作为地址的单元内 容送直接地址单元direct中。
M0V direct,#data表示将立 即数data送直接地址单元direct中。
4.以寄存器间接地:111:为目的 操作数 M0V@Ri,A表示将累加器 A中的内容送间接t ̄:llkRi中。
MOV@Ri,direct表示将直 接地址单元direct中的内容送间接 地址Ri中。
M0V@Ri,#data 表示将立 即数dataJ ̄_间接t ̄:llkRi中。
5.16位数据传送 M0V DfrrR,#datal6表示将 16位二进制数传送到DPTR寄存器 中。
为了学习:h-便,下面给出M0V 指令中操作数的各种组合关系。
刚才我们做了单片机的输出 实验,是不可控的。
那么能不能由 输入信号去控制输Lp,信号,让单片 机受人的控制产生输Lp,信号,做到 可控呢?答案是肯定的,下面我们 再做一个实验。
输入以下源程序。
序号:1 2 3 4 5 6 7 8 9 1O 11 12 13 14 15 16 17 18 19 2O 21 22 23 24 25 26 27 28 29 3O 31 32 33 34 35 36 37 38 ORG 000oH 【JMP MAIN: ORG O3OH: MAIN:MOV P3.#OCOH: ACALL DEI4MS: M0V P3.加FOH: M0V A.P3; CJNE A,#0FDH,F1; AJMP MAIN: F1: MOV P3.#0F9H; ACALL DEL1S: MOV P3.#OA4H: ACALL DEL1S: M0V P3.#0BOH: ACALL DELIS: M0V P3,#O99H: ACALL DEL1S: M0V P3. )92H: ACALL DEL1S: M0V P3.#082H: ACALL DEL1S: M0V P3.加F8H: ACALL DEL1S: M0V P3.#08OH: ACALL DEL1S: M0V P3.#O9OH; ACALL DEL1S: AJMP MAIN; DEI4MS:M0V R7,#O4H; DL0: M0V R6.#0FFH: DL1: DJNZ R6.DL1: DJNZ R7.DL0; RET: DEL1S:M0V!t5.OFFH: F2: ACALL DEI4MS: DJNZ R5.F2: RET: END 编译通过后,将其烧录到 89C51芯片中,将芯片插入 ̄llS2型 LED数码管输出试验板上,通电后 左边第一个数码管显示“0”。
这时 若按动S1~S12按键的一个,则数码 管以1秒的间隔显示“1、2…9”九个 数字,最后回停到“0”。
这样就能实 现输出的数字由人工输入触发。
下面我们解释一下程序。
序号1(程序解释,以下同):程序开始 序号2:跳转到MAIN主程序处。
序号3:主程序MAIN从地址o03OH开始。
序号4:P3口输出COH,数码管显示“0”。
序号5:调用4Ⅱ 延时子程序,维持发光管 点亮。
序号6:向P3口送FoH,准备读P3口的输 入状态。
序号7:将P3口的输入状态读人累加器A。
序号8:若A的内容(即读入的P3口状态) 等于FUH,说明无按键按下,程序向下执行;反 之有键按下则程序跳转到F1。
序号9:跳转到主程序处循环。
序号1O:将立即数f、9H传送给P3口,数码 管显示“1”。
序号l1:调用延时1S子程序。
序号12:将立即数A4H传送给P3口,数码 管显示“2”。
序号13:调用延时1S子程序。
序号14:将立即数BOH传送给P3f1,数码 管显示“3”。
序号15:延时1s子程序。
序号16:将立即数99H传送给P3口.数码 管显示“4”。
序号17:调用延时1S子程序。
序号18:将立即数92H传送给P3口,数码 管显示“5”。
序号19:调用延时1S子程序。
序号2O:将立即数82H传送给P3口,数码 管显示…6’。
序号21:调用延时1S子程序。
序号22:将立即数F8H传送给P3口,数码 管显示“7”。
序号23:调用延时1S子程序 序号24:将立即数80H传送给P3u.数码 管显示“8”。
序号25:调用延时1s子程序: 序号26:将立即数90H传送给P3口.数码 管显示…9’。
序号27:调用延时1S子程序: 序号28:跳转到主程序处循环 序号29~33:延时4mS子程序 序号34~37:延时lS子程序: 序号38:程序结束 (下一讲继续介绍指令的学习及实验): 有关Keitc51软件及编程嚣邮购信息请见 上期介绍或打皂话向021—64066571咨询。
.
一 一24一电子嗣作2OO3年第3期
声明:
该资讯来自于互联网网友发布,如有侵犯您的权益请联系我们。