专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机汇编语言

作者:未知   来源:会员上传   点击数:  更新时间:2014年05月20日   【字体:
 
a)        单个与多个LED灯,位操作与字节操作输出
ORG 0000H
START:
   CLR C
  MOV P0.0,C
  MOV P1.1,C
  MOV P2.2,C
  MOV P3.3,C
  CLR A
  CPL A
  MOV P0,A
  MOV P1,A
  MOV P2,A
  MOV P3,A
  END
程序说明:
可以用7段数码管来代替各端口的8个LED灯,硬件的这种显示方式使得数字表达成为实用。数字显示由数码管的硬件结构与工作原理(7个LED灯的几何变形组合)和数字表达的数据格式确定。
如:
共阳极数码管显示数字3,则有P1口送数据#4FH;
MOV  P1, #0B0H
共阴极数码管显示数字8,则有P1口送数据#80H;
MOV  P1, #7F H
用数据表表示则有:
TABshuziyang: //阳极管(共阴极管取反即可)
DB (数字0~F
C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C6H,A1H,86H,8EH
TABshuziyin: //阴极管(共阳极管取反即可)
DB(数字0~F
        3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
 
b)        单个与多个LED灯闪烁—延时子程序注意定时器


前边已经看到,通过改变位或字节的赋值,可以使得LED灯亮或灭,以此形成闪烁效果。但是硬件的响应时间太短,使得效果不佳。虽然可以通过改变单片机的时钟设置来改变效果。但时钟的改变极其不方便,因此需要利用延时指令(注意定时器功能)获得理想的效果。延时效果是利用单片机空转来实现的。
  ACALL  DELAY   ; 调延时子程序 
*************************************************************************
DELAY:      ; 延时子程序 — 这是一个非常有用、而且常见的一个子程序
  MOV R5,#04H    ;将16进制数04H传递给寄存器R5
F3:
  MOV R6,#0FFH  ;将16进制数0FFH传递给寄存器R6
F2:
  MOV R7,#0FFH  ;将16进制数0FFH传递给寄存器R7
F1:
  DJNZ  R7, F1 ;寄存器R7减1非0跳转到F1,直到减为0顺序执行下一指令
  DJNZ  R6, F2 ;寄存器R6减1非0跳转到F2,直到减为0顺序执行下一指令
  DJNZ  R5, F3 ;寄存器R5减1非0跳转到F3,直到减为0顺序执行下一指令
  RET       ; 子程序结束,返回子程序入口处  ACALL  DELAY   ; 调延时子程序 
***************************************************************************
应用实例
MAIN:
   CLR C      MOV P0.0,C      MOV P1.1,C     MOV P2.2,C   MOV P3.3,C
    ACALL  DELAY   ; 调延时子程序
 CLR A
  CPL A
  MOV P0,A
  MOV P1,A
  MOV P2,A
  MOV P3,A
ACALL DELAY; 调延时子程序 
SJMP MAIN ;相对转移时间短,用AJMP绝对转移时间长,RET是用于子程序的返回
  DELAY:      ; 延时子程序 - 这是一个非常有用、而且常见的一个子程序
  MOV R5,#04H    ;16进制数04H传递给寄存器R5
F3:
  MOV R6,#0FFH  ;16进制数0FFH传递给寄存器R6
F2:
  MOV R7,#0FFH  ;16进制数0FFH传递给寄存器R7
F1:
  DJNZ  R7, F1 ;寄存器R710跳转到F1,直到减为0顺序执行下一指令
  DJNZ  R6, F2 ;寄存器R610跳转到F2,直到减为0顺序执行下一指令
  DJNZ  R5, F3 ;寄存器R510跳转到F3,直到减为0顺序执行下一指令
  RET       ; 子程序结束,返回子程序入口处  ACALL  DELAY   ; 调延时子程序  
  END
程序说明:
注意延时子程序中的DJNZ  R7, F1;DJNZ  R6, F2 ; DJNZ  R5, F3 ;通过增加或减少循环数目控制或改变延时时间
 
c)         单个与多个LED灯流动—位循环、字节循环与延时子程序
ORG 0000H
MAIN:
;****************位循环扫描—流水灯—逐级增加灯的数目*******************
CLR C        MOV P0.0,C          ACALL  DELAY   ; 调延时子程序
MOV P0.1,C   ACALL  DELAY      MOV P0.2,C  
ACALL  DELAY    MOV P0.3,C       ACALL  DELAY     MOV P0.4,C
ACALL  DELAY    MOV P0.5,C      ACALL  DELAY      MOV P0.6,C
    ACALL  DELAY   MOV P0.7,C
    ACALL  DELAY ;注意前面各位状态一直持续。P0口各位电平保持不变
;****************位循环—流水灯—逐个改变灯亮与灭*******************
  CLR C       MOV P0.0,C         ACALL  DELAY  ; 调延时子程序
CPL C       MOV P0.0,C         ACALL  DELAY
  CLR C       MOV P0.1,C         ACALL  DELAY
CPL C       MOV P0.1,C         ACALL  DELAY
  CLR C       MOV P0.2,C         ACALL  DELAY
CPL C       MOV P0.2,C         ACALL  DELAY
  CLR C       MOV P0.3,C         ACALL  DELAY
CPL C       MOV P0.3,C         ACALL  DELAY
  CLR C      MOV P0.4,C      ACALL  DELAY
CPL C      MOV P0.4,C      ACALL  DELAY
  CLR C      MOV P0.5,C      ACALL  DELAY
CPL C  MOV P0.5,C   ACALL DELAY;注意前面各位状态—电平、输出状态变化
……、……
 ;*******************字节循环—逐级增加输出口的数目********************
  CPL A  MOV P0,A     ACALL  DELAY    MOV P1,A     ACALL  DELAY 
  MOV P2,A      ACALL  DELAY   MOV P3,A    ACALL  DELAY
;*******************字节循环—流水灯—逐渐改变灯的亮灭状态*************
  MOV  P2,#01H ;注意:#01H #02H #04H #08H #80H #40H #20H #10H阳极管
     ACALL  DELAY 
  MOV  P2,#02H;注意:#FEH #FDH #FBH #F7H #7FH #BFH #DFH #EFH阴极管
     ACALL  DELAY   MOV  P2,#04H   ACALL  DELAY  MOV  P2,#08H
     ACALL  DELAY   MOV  P2,#10H   ACALL  DELAY  MOV  P2,#20H
     ACALL  DELAY   MOV  P2,#40H   ACALL  DELAY  MOV  P2,#80H
     ACALL  DELAY 
;****************字节循环—数码管—字符(数字、字母等)**************
  MOV  P1,#40H  ;改变字节中各位的电平状态,以便控制输出、显示所要求的内容
     ACALL  DELAY   MOV  P1,#79H    ACALL  DELAY   MOV  P1,#24H
     ACALL  DELAY   MOV  P1,#30H    ACALL  DELAY   MOV  P1,# 19H
     ACALL  DELAY   MOV  P1,#12H    ACALL  DELAY   MOV  P1,#02H
     ACALL  DELAY   MOV  P1,#78H    ACALL  DELAY 
SJMP MAIN ;相对转移时间短,用AJMP绝对转移时间长,RET是用于子程序的返回
;*******************延时子程序***************************
  DELAY:      ; 延时子程序—去除一个循环,时间变短了。
  MOV R6,#04H ;将16进制数04H传递给工作寄存器R6。改变#04H为#3FH时间变长
F2:
  MOV R7,#0FFH  ;将16进制数0FFH传递给工作寄存器R7
F1:
  DJNZ  R7, F1 ;寄存器R7减1非0跳转到F1,直到减为0顺序执行下一指令
  DJNZ  R6, F2 ;寄存器R6减1非0跳转到F2,直到减为0顺序执行下一指令
  RET       ; 子程序结束,返回子程序入口处  ACALL  DELAY   ; 调延时子程序 
  END
 
********字节循环数码管字符(数字、字母等)数表指针***********
MAIN:
CLR A
       MOV P3,#00H
        MOV P0,#00H
        MOV P2,#00H
     MOV R0,#00H  ;寄存器中放数值0
        MOV DPTR,#TABZshuzi ;指针PC指向数表
DISP:                ;段标记
     MOV A,R0  ;将寄存器中的数值转移到累加器中
        MOVC A,@A+DPTR  ;以DPTR作为基础,与累加器相加得到新地址给累加器
        MOV P3,A   ;将累加器的地址给P3口
        MOV P0,A
        SETB p2.3 ;一位数显示位控制;个位
        SETB p2.7
              ACALL DELAY  ;调延时子程序
              ACALL DELAY
        INC R0 ;寄存器R0加1
        CJNE R0,#16H,DISP ;寄存器与立即数18比较,不相等则转移到DISP循环。相等则顺序执行
TABshuziyang://阳极管
DB  C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C6H,A1H,86H,8EH,0FFH
TABshuziyin: //阴极管
DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH
END
*************字节循环数码管字符(数字、字母等)移位控制***********
RL A  将累加器的值左移一位
RLC A  将累加器含进位C左移一位
RR A  将累加器的值右移一位
RRC A  将累加器含进位C右移一位
 
1.  单个按键,单个与多个LED最小系统位输入与位、字节输出判断与子程序
a)       单个按键与单个LED灯(位操作输入与输出)判断与子程序
b)      单个按键与多个LED灯(位操作输入与字节操作输出)
c)       单个按键与多个LED灯(位操作输入与位、字节操作输出)
d)      单个按键与单个电机控制开环控制
 
1. 单个按键,单个与多个LED位操作输入位、字节操作输出)—最小系统
a)  单个按键,单个LED灯(位操作与位输入、输出)—有、无判断而传送数据
通过三个方面(程序指令、虚拟仿真、实体电路)探讨单输入与单输出:主要是理解位数据传送,包括汇编语言的数据传送指令实践、实际虚拟电路的数据传送响应,以体现抽象与具体的可理解性。
??  单输出的电子线路 — 静态特性— 动态特性,指令控制输出
??  单输入与单的电子线路 — 静态特性(线路组成与结构)
??  单输入与单输出电子线路的控制指令 — 动态特性(行为与状态)
;分号,这是一种注释方式符号
ORG  0000H   ;这是伪指令,机器并不执行,用于程序的交流。指令执行的起始地址,十进制用D表示,十六进制用H表示,二进制用B表示。一个字节(8位机、16位机、32位机、64位机)一次执行。也可以按位来执行,也就是一个bit。
ORG  00000000B与ORG  0000H作用相同。注意8位(bit)一个字节。16位的处理器需要用0000 0000H 表示。16或32位以上,使用操作系统(Wince、Linux等)更有效,可以利用大量的、底层的、专业化、标准化的面向控制的库函数(如:API等)。
START:  ;这是伪指令,机器并不执行。只是为了汇编语言讲故事的可理解性
   MAIN:    ;伪指令,主程序,用于区别子程序
   PC→MOV  A#00H   ;将立即数00000000B(常数0D)传送给累加器ACC(专用寄存器,可用于存放计算结果等)。要通过累加器A和其它存储地址进行数据交换。注意PC是自动移位(自动+1)到下一个语句的地址。使用该语句实质上是让PC具有初始位置。
PC→MOV  P1   ;将累加器中的数(常数0D)传送给端口P1(P1口8位全部置0,低电平, P1端口各位处于关闭状态,LED灯处于系统响应的准备状态),按字节传送数据。特别记忆:PC→表示指针所指地址,并会自动加1。输出口字节
PC→MOV  C0A0H   ;检测P2.0口的状态,将P2.0口的状态(由按键状态决定)传送给位累加器C,位累加器C的地址是PSW(程序状态字寄存器)的进位标志位CY(D7H\PSW.7)。P2.0口可以是开或关,也就是置1或0,高电平或低电平),按字节传送数据。要通过位累加器C和其它存储地址进行数据交换。该语句也可以写成:MOV  CP2.0,比较字节数据传送MOV A,#00H或MOV  A,P1。输入口
PC→MOV  P1.0C   等价于MOV  90HC  ;将位累加器C地址中的值传送给P1.0口(90H是其直接地址),也就是将P2.0口的状态(由直接地址0A0H状态决定)传送给直接地址90HP1.0口,输出口
PC→MOV  P1.1  ;等价于MOV  91HC
PC→MOV  P1.2  ;等价于MOV  92HC
PC→MOV  P1.3  ;等价于MOV  93H 等等
END ;伪指令,程序结束标志
程序说明
单个按键控制单个LED灯及其状态,也可以控制若干个LED灯及其状态。也就是多个LED灯,单个按键。反过来,可以是多个按键控制单个灯或多个按键控制多个LED灯。通过简单硬件连接和汇编语言的位指令运用,理解单片机作为数字电路的特点,门电路的特点,开关电路的特点,高与低电平时的电子线路处于开或关的状态,或叫关闭与导通。

图1-单个LED灯-单个按键的实现。用P2.0口的状态来控制其它Px.i口的状态,从而实现灯的开与关。其中:左图为Proteus软件的界面,右图为Keil软件的界面。


图2-单个LED灯与数码管-单个按键的实现。用P2.0口的位状态来控制其它P1口的字节状态,从而用字节数据传输实现数码管的开与关。详细的说明,后续再谈。其中:图2的左图为Proteus软件的界面,右图为Keil软件的界面。图3为汇编指令集—汇编程序。
关闭窗口

相关文章