产品选型

loop 单片机 跟电师傅学单片机(18):单片机控制转移指令编程案例讲解

小编 2024-11-24 产品选型 23 0

跟电师傅学单片机(18):单片机控制转移指令编程案例讲解

单片机程序案例:

要求把06H~09H,20个数据按顺序放入内部数据存储器RAM:10H~23H单元中。

案例要求示意图

一:程序编程

▶MOV R0,#10H;将单片机内部RAM单元的首地址10H送到工作寄存器 R0中。

▶MOV R1,#14H;将十进制数20(20个数放入20个单元中)转成16进制数14H送到工作寄存器R1中。

▶MOV A,#06H;;将第1个数06H送到单片机累加器A中。

▶LOOP:MOV @R0,A;把单片机累加器A中的内容送到工作寄存器R0里面的内容所确定的地址单元中。

是间接寻址方式。LOOP:是标号,表示程序要循环的意思,指令需要重复执行时,可以使用标号LOOP循环来实现。

▶INC A;加1指令,数据加1,累加器A中的内容加1。例如:刚才是06H,现在加1就是07H。

▶INC R0;加1指令,地址加1,工作寄存器R0里面的内容加1。例如:地址单元10H,现在加1就是11H。

▶DJNZ R1,LOOP;减1非零转移指令,将工作寄存器R1里面的内容减1,判断为零吗,不为零程序就跳到标号LOOP处执行。共要判断19次,直到为零时程序才结束,此时20个数也放入要求的20个地址单元中了。

指令判断转移示意图

▶SJMP $;让单片机程序停在此处,也就是程序原地踏步。

二:十进制数转十六进制数

将十进制数20数转成16进制数,采用除16取余法,余数要除到小于16。

就是将十进制数20直接除以16,余数除到小于16。从最后1个余数倒着读到第1个就是16进制数了。

十进制数转十六进制数示意图

从一个详细的实例来知道单片机编程,你照着做就行了

我们要想使单片机工作,就需要编写程序,再将程序写入单片机,单片机在程序的控制下工作以完成指定的任务。没有程序的控制,单片机就无法工作。那么如何编写单片机程序呢?

1.从一个实例初步了解编程

上面这张图所示是一个边长为100m的正方形跑道,有一个人(称作甲)处于A点,如果要让甲到达B点,可以执行如下的程序:

起点 前进 50m

左转

前进 100m

左转

前进 50m

结束

甲逐条执行程序中的命令:先前进 50m,左转,然后前进100m,左转,再前进50m,结束,就可以到达B点。如果将上述程序改成:

起点 前进 50m

左转

前进 100m

左转

前进 50m

返回到 起点

结束

甲执行上述程序中的命令时会怎样呢?当他执行到第5行命令时,会到达B点,接着执行第6行命令,该命令使他又返回到起点(标号),甲于是又会执行第1行指令……由于执行到第6行的指令时又会返回执行第1行的命令,永远执行不到结束命令,所以,如果甲执行上述程序,就会不断在A、B点之间反复运动,不会停止。如果只要求甲在A、B点之间往返3次,上述程序应如何编写呢?读者可以思考一下,在后面的章节将会讲到这个问题。

2.分析一个单片机汇编语言程序

从前面的介绍初步了解了编程思想后,再来分析用到的汇编语言程序,程序如下:

MAIN: MOV P3,#0FFH

LOOP: MOV P1,P3

LJMP LOOP

END

为了更好地理解上面的程序,下面对照图所示的单片机应用电路来进行讲解。

第1 行指令“MAIN:MOV P3,#0FFH”的含义是将数据11111111(0FFH)送到P3 端口的8个寄存器,让P3端口的P3.0~P3.7这8个引脚全部为高电平。

“MAIN:”为标号,表示该行为主程序开始,这里也可省略,并不影响程序的运行;“MOV”为数据传送指令;“P3”表示单片机P3端口内部的8个寄存器;“#0FFH”中的“#”号表示它后面的“0FFH”是一个数据,而不是地址编号,“0FFH”是一个十六进制数,转换成二进制数就是11111111。

该行指令运行后,图中的单片机P3.0~P3.7这8个引脚内部的寄存器全部为高电平,相应的这8个引脚也为高电平。

第2行指令“LOOP:MOV P1,P3”的含义是将P3端口8个寄存器中的数据送到P1端口的8个寄存器中。

“LOOP:”为标号,用来标识指令“MOV P1,P3”,由于该标号后面的指令会被调用,所以不能省略。

由于第1行指令已经让P3端口8个寄存器内的数据全部为“1”,执行“MOV P1,P3 ”指令后,P1端口8个寄存器内的数据也全部为“1”,单片机的P1.0~P1.7这8个引脚全部为高电平,故发光二极管VD1~VD4全部不亮。

第 3 行指令“LJMP LOOP”的含义是返回执行标号LOOP所在行的指令。也就是说,当执行到该行指令后,又会返回去执行第2行指令“MOV P1,P3”,即不断将 P3 端口 8 个寄存器中的数据送到P1端口的8个寄存器中。

第4行指令“END”的含义是程序结束。由于执行到第 3 行指令时会自动返回执行第 2行指令,所以无法执行到第4行指令,即程序无法结束。

将上面的汇编语言程序汇编成机器语言程序并写入单片机后,在程序的控制下,单片机内部电路不断将P3端口8个寄存器中的数据送给P1端口的8个寄存器。

图示的单片机应用电路的工作过程分析如下。

在没有按下任何按键时,P3端口8个寄存器的数据都为“1”,所以P1端口8个寄存器的数据也为“1”,P1.0~P1.7这8个引脚都为高电平,发光二极管VD1~VD4全部不亮。

若按下S1按键,P3.2引脚变为低电平,P3.2端口内部寄存器的数据变为“0”,P3.7~P3.0端口的数据分别为11111011,在第2条指令的控制下,这些数据被送到P1端口,P1.7~P1.0端口的数据分别为11111011,其中P1.2端口的数据为“0”,P1.2引脚为低电平,于是它外接的发光二极管VD1有电流通过而发光。

如果松开S1按键,P3.2引脚变为高电平,P3.2端口的“1”送到P1.2端口,P1.2引脚为高电平,其外接的发光二极管VD1截止而不亮。

相关问答

djnz r2 loop 指令怎么使用?

这是51单片机的一条汇编指令,常用于循环程序,意思就是寄存器R1的值减1后不为0的话,跳转到标号为loop的地方执行Ddcrease减JJump跳转Nno非Zzero零R1...

mcs51 单片机 循环指令程序编写?

MCS-51单片机常见的循环指令有JC/JNC、DJNZ和CJNE等,下面是一个简单的循环指令程序编写示例:```ORG0;程序入口地址MOVR0,#10H;将初值10H赋给R0寄存器...

单片机 的延时,延时时间长度是怎么算的?最好有一个例子,来...

单片机的延时可以使用定时器和循环来实现。以下是两种常见的方式:1.使用定时器延时时间长度取决于定时器的时钟源和预分频器的设置。例如,如果使用...

用汇编语言编写8255a控制一组发光二极管的亮灭?

MOVAL,10010000B;设置A口为方式0的输入,B口和C口输出OUT203H,AL;将控制字送到控制口LOOP0:INAL,200H;取A口的输入信号值CMPAL,00001010BJ...

【从这两段 单片机 汇编程序来看,RR,RL和RRC,RLC在这里区别不...

[最佳回答]不一样,不带C的循环,就A里的8位数据自循环,移动8次,循环一周.带C的就不一样,移动一次,C的状态会移入A,而A的移出的位会移进C.就是C参与了移动,所以C...

用C语言编写以下 单片机 程序。将R2中的各位倒序排列后送入R3....

[最佳回答]是什么单片机51吗我是做单片机开发的

如何设置8051 单片机 的中断优先级

PIC系列单片机只有一个中断入口(004H),所有的中断都通过该入口进入中断服务子程序,至于是哪一个中断源,只有在进入中断服务子程序后查询中断标志才...

单片机 延迟400ms的程序肿么编啊,-ZOL问答

程序如下:DELAY:MOVR2,#4;1DELAY1:MOVR3,#200;1*4DELAY2:MOVR4,#249;1*200*4DJNZR4,$;2*249*200...

tmod使用方法

如果说单片机就是一个电脑你可能不会认可,其实它和我们用的电脑的在本质上没有区别,只是5步和100步的区别,想当年比尔.盖茨也给类似的东西搞过编程,...

怎样51 单片机 调用两个子程序 - nCqfmaGy 的回答 - 懂得

MOVR0,#08HMOVA,#0FEHLOOP:MOVP1,ALCALLDELRRADJNZR0,LOOP使用DJNZ指令。为0执行下一指令,不为0跳转。就可以调用两个子程序了估计是进入到倒计时....

猜你喜欢