单片机汇编语言入门实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、用单片机控制发光二极管
图1为单片机控制发光二极管的实验电路图。图中用P1口作为输出端,P1口的P1.0~P1.7引脚分别接了8个LED。
实例1:用单片机控制LED闪烁发光
源程序如下:
MAIN:
SETB P1.0
LCALL DELAY
CLR P1.0
LCALL DELAY
LJMP MAIN
DELAY:
MOV R7,#250
D1:MOV R6,#250
D2:DJNZ R6,D2
DJNZ R7,D1
RET
END
程序说明:
1、SETB P1.0:将P1.0口置“1”,既让P1.0输出高电平,让LED 熄灭。
2、LCALL DELAY:LCALL称为子程序调用指令,指令后面的参数DELAY是一个标号,用于标识第6行程序,执行LCALL指令时,程序转到LCALL后面的标号所指示的程序行处执行,如果执行指令过程中遇到RET指令,则程序就返回到LCALL指令下面的一条指令继续执行。
3、CLR P1.0:将P1.0口置“0”,既让P1.0输出低电平,让LED 亮。
4、LCALL DELAY:调用延时子程序DELAY。
5、LJMP MAIN:跳转到第1条指令处执行第1条指令。
6、第6~10条指令是一段延时子程序,子程序只能在被调用时运行,并有固定的结束指令RET。
7、END:不是S51单片机的指令,不会产生单片机可执行的代码,而是用于告诉汇编软件“程序到此结束”,这类用于汇编软
件控制的指令称为“伪指令”。
延时程序说明:
1、程序中的R6、R7代表工作寄存器的单元,用来暂时存放一些数据。
2、MOV指令的含义是传递数据。指令“MOV R7,#250”的含义是:将数据250送到R7中。250前面的“#”号表示250是一个数,而不是一个地址,“#”号后面的数称为立即数。
3、DJNZ指令后面有两个符号,一个是R6,一个是D2。R6是寄存器,D2是标号。DJNZ指令的执行过程是:将其后面第一个参数中的值减1,然后看这个值是否等于0,如果等于0,往下执行,如果不等于0,则转移到第二个参数所指定的位置去执行,这里是转移到由D2所标识的这条语句去执行。本条指令的最终执行结果是:这条指令被执行了250次(此前R6中已被送了一个数:250)。
在执行完“DJNZ R6,D2”后(即R6中的值等于0后),转去执行下一行程序,即“DJNZ职R7,D1”。由于R7中的值不为0,所以减1后转去D1标号处,即执行“MOV R6,#250”这一行程序,这样R6中又被送入250这个数,然后再去执行“DJNZ R6,D2”这条指令,最终的结果是:“DJNZ R6,D2”这条指令被执行了250×250=62500次,从而实现延时的效果。
4)RET指令的作用是:子程序在执行过程中如果遇到这条指令,会返回到主程序,到调用这段子程序指令的下一条指令继续执行。
实例2:用单片机控制8个LED闪烁发光
源程序如下:
MAIN:
MOV P1,#0FFH
LCALL DELAY
MOV P1,#00H
LCALL DELAY
LJMP MAIN
DELAY:
MOV R7,#250
D1:MOV R6,#250
D2:DJNZ R6,D2
DJNZ R7,D1
RET
END
程序说明:
1、MOV P1,#0FFH:将数据0FFH送到P1口,0FFH用二进制数表示就是11111111B。也就是让所有的P1.x引脚输出高电平,即让LED全部熄灭。
数字FFH前有一个0,是汇编软件所要求的。对于十六进制,如果用来表示数字的第一个字符不是0~9这10个阿拉伯数字中的一个,就要在它的前面加一个0,表示这是一个数字,而不是字
2、LCALL DELAY:调用延时子程序,起延时的作用。
3、MOV P1,#00H:将数据00H送到P1口,00H等于00000000B。也就是让所有的P1.x引脚输出低电平,即让LED全部亮。
4、LCALL DELAY:调用延时子程序,起延时的作用。
5、LJMP MAIN:跳转去执行标号为MAIN处的指令。
6、第6~10条指令是一段延时子程序,子程序只能在被调用时运行,并有固定的结束指令RET。
7、END:程序结束。
实例3:用单片机控制LED依次发光(流水灯)
源程序如下:
MAIN:
MOV A,#0FEH
LOOP:
MOV P1,A
RL A
LCALL DELAY
LJMP LOOP
DELAY:MOV R7,#250
D1:MOV R6,#250
D2:DJNZ R6,D2
DJNZ R7,D1
END
程序说明:
1、MOV A,#0FEH:将数据0FEH送入累加器A中。
2、MOV P1,A:将累加器A中的数据送入P1口。
3、RL A:是一条左移指令,它的用途是把累加器A中的值循环左移。设A=11111110,则执行一次“RL A”指令后,累加器A 中的值就变为11111101,执行第2次后,变为11111011,也就是各位数字不断向左移动,而最右一位由最左一位移入。
4、LCALL DELAY:调用延时子程序。
5、LJMP LOOP:跳转去执行标号为LOOP处的指令。
6)第6~10条指令是一段延时子程序。
实例4:用按钮控制LED
用按钮控制LED的实验电路如图2所示。图中用P1口作为输出端,P1口的P1.0~P1.7引脚分别接了8个LED,用P3口作为输入端,P3口的P3.0~P3.7引脚分别接了8个按钮开关,当按钮按下时,引脚被接地,即引脚为低电平。