×
单片机 > 单片机程序设计 > 详情

51单片机汇编语言(三)

发布时间:2020-09-03 发布时间:
|
7.2功能说明

用一位数码管循环显示0~9数字,数字变换间隔的时间为1秒。

程序:SMG2.ASM

01:   START: MOV    DPTR, #TABLE    ; 存表

02:            MOV    R0, #0            ; 设定初始值

03:   LOOP : MOV    A, R0             

04:            MOVC   A, @A+DPTR     ; 取表代码

05:            MOV     P0, A            ; 送P0输出       

06:            ACALL   DLY1S           ; 调延时程序              存表取表 

07:            INC      R0               ; R0值加1      

08:            CJNE    R0, #10 , LOOP     ; 不是10,循环

09:            JMP     START            ; 重新开始                判断循环

10:   DLY1S: MOV    R5, #50            ;

11:   D1:     MOV    R6, #100           ;

12:   D2:     MOV    R7, #100           ;

13:            DJNZ    R7, $              ;

14:            DJNZ    R6, D2             ;

15:            DJNZ    R5, D1                                   1秒延时

16:            RET                        ;                      子程序

17:   TABLE: DB  0C0H, 0F9H, 0A4H, 0B0H ;

18:            DB  99H,  92H,  82H,  0F8H ;

19:            DB  80H,  90H,  88H,  83H  ;

20:            DB  0C6H, 0A1H, 86H,  8EH                        代码表

21:            END                        ;                      程序结束

 

7.3功能说明

使用两位数码管显示器,利用扫描方式循环显示00~99两位数。

程序:SMG3.ASM    

01: START:  MOV    R0, #0         ;初始化计数器                       

02:           MOV    DPTR, #TABLE ;存入查表启始地址

03: LOOP:   ACALL  DISPLAY      ; 调显示子程序

04:           INC     R0            ; 计数器加1       

05:           CJNE    R0 ,#100, LOOP ; 没到100 循环    

06:           JMP     START        ; 到开始处                        主程序         

07: DISPLAY::MOV   A, R0                 

08:           MOV    B, #10     ; 16进制换成10进制

09:           DIV     AB      ; A÷B商存A,余数存B

10:           MOV    R1, A      ; R1内存放十位数               

11:           MOV    R2, B      ; R2内存放个位数              十进

12:           MOV    R3, #50       ; 设导通频率50次

13: LOOP1:  MOV    A,  R2       ; 个位数显示

14:           ACALL  CHANG      ; 调显示子程序                              

15:           CLR     P2.0         ;开个位显示

16:           ACALL  DLY10mS    ; 调延时10ms程序          个位

17:           SETB    P2.0         ; 关闭个位显示                       显示

18:           MOV    A, R1        ; 取十位数

19:           ACALL  CHANG      ; 调取表显示子程序                                

20:           CLR     P2.1          开十位显示

21:           ACALL  DLY10mS    ; 调延时10ms程序  十位

22:           SETB    P2.1          关闭十位显示                        显示

23:           DJNZ    R3, LOOP1   ; 100次没完,继续循环       扫描   

24:           RET                                                 子程序

25: CHANG: MOVC   A, @A+DPTR ;

26:           MOV    P0, A                       

27:           RET                                                                   取表子程序

28: DLY10mS:MOV    R6, #20      ; 

29: D1:      MOV    R7, #248     ;

30:           DJNZ    R7, $        ;

31:           DJNZ    R6, D1                                  延时10 m.S                        

32:           RET                                               子程序

33: TABLE:  DB  0C0H, 0F9H, 0A4H, 0B0H  ;

34:           DB  99H,  92H,  82H,  0F8H  ;

35:           DB  80H,  90H,  88H,   83H  ;

36:           DB  0C6H, 0A1H,  86H,  8EH                        代码表                     

37:           END                                               程序结束

 

 

 

 

键盘控制

8.1功能说明:

用八位指拨开关(DIP)作单片机的输入,控制输出端口连接的八只LED发光二极管。如若DIP1开关为 ON(向右拨动)则LED1亮,其它开关作用相同。                         

程序:SR01.ASM

01:     LOOP: MOV   A, P3   从P3读入DIP开关值

02:             MOV   P1, A   从P1输出

03:             JMP    LOOP  无穷循环

04:             END           程序结束

 

8.2功能说明:

用DIP开关中的低4位作二进制的输入,控制输出端数码管显示器的输出。

程序:SR02.ASM

01:            MOV   DPTR,#TABLE  ; 存表

02:            MOV   P0,  #0FFH     ; LED全灭

03:  LOOP:    MOV   A, P3           ; 从P3口读入DIP开关值

04:            ANL   A, #0FH         ; 高4位清0,取低四位

05:            ACALL CHANG         ; 转成七段显示码

06:            MOV   P0, A           ; 从P0输出

07:            JMP    LOOP          ; 转移LOOP处,循环

08:  CHANG:  MOVC  A,@A+DPTR    ; 取码

09:            RET                   ; 返回              转换显示码子程序        

10:  TABLE:   DB  0C0H, 0F9H, 0A4H, 0B0H  ;

11:            DB  99H,  92H,  82H,  0F8H  ;

12:            DB  80H,  90H,  88H,  83H  ;

13:            DB  0C6H, 0A1H, 86H,  8EH                显示码表

14:            END                                      程序结束

 

8.3功能说明:

用两个按键开关K1和K2作输入,K1为电源指示灯开关,K2为工作指示灯开关。分别控制电源指示灯(P1.0接的LED)和工作指示灯(P1.7接的LED)的接通和关闭。接通电源时,电源指示灯是在亮的状态。

当按K2时,工作指示灯亮,电源指示灯灭。按K1时,电源指示灯亮,工作指示灯灭。

程序:SR03.ASM

01: START: MOV  P1,  #11111110B  ; P1.0所接LED亮

02:          JB     P2.5 , $          ; 判断P2.5(K2键)是否为1

03:   ON:  MOV  P1,  #01111111B  ; P1.7所接LED亮

04:          JNB   P2.4,  START    ; 判断P2.4(K1键)是是否为0

05:          JMP   ON             ; 未按K1键,则跳至ON

06:          END                   ; 程序结束

 

 

 

 

8.4功能说明:

由四个按键开关组成独立式键盘,控制灯左移、右移和闪烁。

程序:JP01.ASM

01:  START:   MOV   P1,#0FFH    ;设置输出口初值

02:           MOV   A,#0FFH     ;设置输入方式

03:           MOV   P2,A        ;

04:  LOOP:    MOV   A,P2        ;读入键盘状态

05:           CJNE  A,#0FFH,LP0 ;有键按下否

06:           JMP   LOOP        ;无键按下等待

07:  LP0:     ACALL DELAY1      ;调延时去抖动

08:          MOV   A,P2        ;重读入键盘状态

09:          CJNE  A,#0FFH,LP1 ;非误读则转

10:          JMP   LOOP                                   按键查询

11: LP1:     JNB   P2.4, A1    ;K1键按下转A1

12:          JNB   P2.5, A2    ;K2键按下转A2

13:          JNB   P2.6, A4    ;K3键按下转A3   

14:          JNB   P2.7, A4    ;K4键按下转A4               键按下后转

15:          JMP   START       ;无键按下返回                功能处理程序

16:  A1:      MOV    R0, #8    ;设置左移位数

17:           MOV    A ,#0FEH  ;设置左移初值

18:  LOOP2:   MOV    P1, A     ;输出至P1

19:           ACALL  DELAY     ;调延时1秒子程序

20:           RL            ;左移一位

21:           DJNZ   R0, LOOP2 ;判断移动位数                 1号功能键

22:           JMP    START     ;返回主程序开始处             处理程序

23:  A2:      MOV    R0,#8     ;设置右移位数

24:           MOV    A ,#0FCH  ;设置右移初值

25:  LOOP3:   RR            ;右移一位

26:           MOV    P1, A     ;输出至P1

27:           ACALL  DELAY     ;调延时1秒子程序

28:           DJNZ   R0, LOOP3 ;判断移动位数                 2号功能键

29:           JMP    START     ;返回主程序开始处             处理程序

30:  A3:      MOV    R0,#6     ;设置闪烁次数

31:           MOV    A ,#0F0H  ;设置初值           

32:  LOOP4:   MOV    P1, A     ;输出至P1

33:           ACALL  DELAY     ;调延时1秒子程序

34:           CPL           ;反相

35:           MOV    P1,A      ;输出            

36:           DJNZ   R0, LOOP4 ;判断移动位数                 3号功能键

37:           JMP    START     ;返回主程序开始处              处理程序

38:  A4:      MOV    R0,#10    ;设置闪烁次数

39:           MOV    A, #00H   ;设置初值

40:  LOOP5:   MOV    P1,A      ;输出

41:           ACALL  DELAY     ;调延时子程序

42:           CPL           ;反相

43:           MOV    P1,A      ;输出   

44:           DJNZ   R0, LOOP5 ;判断闪烁次数                4号功能键

45:           MP    START      ;返回主程序开始处            处理程序

46:  DELAY1:  MOV   R3, #60    ;消抖延时子程序

47:  D2:     MOV   R4, #248                      

48:           DJNZ  R4, $     

49:           DJNZ  R3, D2     ;                            消除抖动

50:           RET                                         延时子程序

51:  DELAY:   MOV   R5, #50    ;延时1秒子程序

52:  DLY1:    MOV   R6, #100   ;

53:  DLY2:    MOV   R7, #100   ;

54:           DJNZ  R7, $      ;

55:           DJNZ  R6, DLY2   ;

56:           DJNZ  R5, DLY1   ;

57:           RET                                         延时子程序

58:           END                                         程序结束



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实验八 交通灯控制(80C51单片机汇编语言编程)