当前位置:首页 > 51单片机原理入门教程
MOV B,#2
MUL A,B ;A中的值乘2(详见下面的说明) JMP @A+DPTR ;跳转 TAB: AJMP S1 ;跳转表格 AJMP S2; AJMP S3
在单片机开发中,经常要用到键盘。要求是:当按下功能键A………..G时去完成不同的功能。
前面的程序读入按键的值,如按下'A'的键值是0,按下'B'键后获得'1'等等,然后根据不同的值进行跳转,如键值为0就转到S1执行,为1就转到S2执行。 若干个AJMP语句在存储器中每个AJMP语句都占用两个存储器的空间,并且连续存放。AJMP S1存放的地址是TAB。
第一句MOV DPTR,#TAB执行后,DPTR中的值是TAB, MOV A,R0,假设R0是由按键处理程序获得的键值,按下B键,R0中的值是1,以此类推,现在假设按下的是B键,则执行完后,A中的值是1。第三条、第四条指令将A中的值乘2,值是2。下面执行JMP @A+DPTR了,现在DPTR中的值是TAB,而A+DPTR后就是TAB+2.因此,跳到TAB+2这个地址继续执行。在TAB+2这个地址里面是AJMP S2这条指令。因此,执行AJMP S2指令,程序将跳到S2处往下执行。
请分析按下键?A?、?C?、?D?……之后的情况。
这样我们用JMP @A+DPTR就实现了按下一键跳到相应的程序段去执行的这样一个要求。为什么取得键值后要乘2?如果换成LJMP,还能正确地执行吗?如果不能,应该怎么改?
第十四課 条件转移指令
条件转移指令是指在满足一定条件时进行相对转移。
1. 判A内容是否为0转移指令
JZ rel 如果(A)=0,则转移到标号处,否则顺序执行。 JNZ rel 如果A中的值不等于0,就转移。
2. 比较转移指令 CJNE A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel CJNE @Ri,#data,rel
第一条指令的功能是将A中的值和立即数data比较,如果两者相等,就顺序执行,如果不相等,就转移。如果前面的数(A中的)大,则CY=0,否则CY=1,因此在程序转移后再次利用CY就可判断出A中的数比data大还是小了。 例:
MOV A,R0
CJNE A,#10H,L1 MOV R1,#0FFH AJMP L3 L1: JC L2
MOV R1,#0AAH AJMP L3
L2: MOV R1,#0FFH L3: SJMP L3
JC这条指令的原型是JC rel,作用和上面的JZ类似,它是判CY,如果CY=1,则转移到JC后面的标号处执行,如果CY=0则顺序执行。
分析上面的程序,如果(A)=10H,则顺序执行,即R1=0。如果(A)不等于10H,则转到L1处继续执行,在L1处,再次进行判断,如果(A)>10H,则CY=1,将顺序执行,即执行MOV R1,#0AAH指令,而如果(A)<10H,则将转移到L2处指行,即执行MOV R1,#0FFH指令。 因此最终结果是:本程序执行前,如果(R0)=10H,则(R1)=00H,如果(R0)>10H,则(R1)=0AAH,如果(R0)<10H,则(R1)=0FFH。
其它几条类似,第二条是把A当中的值和直接地址中的值比较,第三条则是将直接地址中的值和立即数比较,第四条是将间址寻址得到的数和立即数比较。
循环转移指令 DJNZ Rn,rel DJNZ direct,rel DJNZ 10H,LOOP .调用与返回指令
调用返回过程:主程序调用了子程序执行完之后再回到主程序继续执行
1. 调用指令
LCALL addr16 ;长调用指令 ACALL addr11 ;短调用指令 (5)返回指令 ret指令
4.空操作指令
Nop 空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。
第十五課 位及位操作指令
在8031单片机中引入一个位处理机制。
1. 位寻址区
2. 在8031中,有一部份RAM和一部份SFR是具有位寻址功能的,
也就是说这些RAM的每一个位都有自已的地址。内部RAM的20H-2FH这16个字节128位,就是8031的位寻址区。如20H,21H的各位定义如下表:(如21H.2可用09H表示0) 字节 第8位 第7位 第6位 第5位 第4位 第3位 第2位 第1位 20H 07H 06H 05H 04H 03H 02H 01H 00H 21H 0FH 0EH 0DH 0CH 0BH 0AH 09H 08H 22H——10H-17H 23H——18H-1FH 24H——20H-27H 25H——28H-2FH 26H——30H 27H——38H 28H——40H 29H——48H 2AH——50H 2BH——58H 2CH——60H 2DH——68H 2EH——70H 2FH——78H 可以位寻址的特殊功能寄存器
8031中有一些SFR可以进行位寻址,特点是其字节地址可被8整除,从80H到0F8H 16个字节128位,如A,B、PSW、IP(中断优先级控制)、IE(中断允许控制)、SCON(串行口控制)、TCON(定时器/计数器控制)、P0-P3。同样从80H到0F8H中的16个字节128位按顺序用80H-0FFH表示.
3.位操作指令(当指令有两个位时,必须有一个是C)
在进行位处理时,CY(进位位)称?位累加器?。 位传送指令 MOV C,BIT MOV BIT,C 位修正指令
1.位清0指令
CLR C ;使CY=0
CLR bit ;使指令的位地址等于0。例:CLR P1.0
2.位置1指令
SETB C ;使CY=1
SETB bit ;使指定的位地址等于1。例:SETB P1.0 ;使P.0变为1
3.位取反指令
CPL C ;使CY等于原来的相反的值。
CPL bit ;使指定的位的值等于原来相反的值。 位逻辑运算指令 位与指令
1. ANL C,bit ;CY与指定的位地址的值相与,结果送回CY 2. ANL C,/bit ;先将指定取反,再和CY相与,结果送回CY,但指定不变。 位或指令 ORL C,bit ORL C, /bit 位条件转移指令 判CY转移指令
JC rel 如果CY等于1就转移,如果不等于1就顺序执行。
JNC rel 和第一条指令相反,即如果CY=0就转移,不等于0就顺序执行。 判位变量转移指令
JB bit,rel ;如果指定的bit位中的值是1,则转移,否则顺序执行。 JNB bit,rel
JBC bit,rel ;如果指定的bit位中的值是1,则转移,同时将该位清0。 下面我们举个例子说明: ORG 0000H LJMP START ORG 30H
START:MOV SP,#5FH MOV P1,#0FFH MOV P3,#0FFH L1: JNB P3.2,L2 ;P3.2上接有一只按键,它按下时,P3.2=0 JNB P3.3,L3 ;P3.3上接有一只按键,它按下时,P3.3=0 LJMP L1 ;均未按下时循环检测 L2: MOV P1,#00H LJMP L1
L3: MOV P1,#0FFH LJMP L1 END
按下接在P3.2上的按键,P1口的灯全亮了,按下接在P3.3上的按键,灯就全灭了。如果P3.2是高电平(键没有按下),则顺序执行JNB P3.3,L3语句,同样,如果P3.3是高电平(键没有按下),则顺序执行LJMP L1语句。这样就不停地检测P3.2、P3.3,如果有一次P3.2上的按键按下去了,则转移到L2,使灯全亮,直到检测到P3.3为0,执行MOV P1,#0FFH,灯全灭,如此循环不已。 稍加改动,将本程序用JB指令改写?
第十六課 定時器與計數器 一、计数概念的引入 二、计数器的容量
8031单片机中有两个计数器, T0和T1,分别由两个8位的RAM单元组成的,即都是16位的计数器,最大计数是65536。 三.定时
8031中的计数器除了可以作为计数之用外,还可以用作时钟,计数脉冲的间隔与晶振有关,12M的晶振,计数脉冲的间隔是1微秒。
共分享92篇相关文档