问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

51单片机汇编语言设计流水灯

创作时间:
作者:
@小白创作中心

51单片机汇编语言设计流水灯

引用
CSDN
1.
https://m.blog.csdn.net/m0_73931287/article/details/139013907

本文介绍了如何使用51单片机汇编语言设计流水灯的两种方法。第一种方法是基本的流水灯实现,通过循环移位和延时函数实现流水灯效果。第二种方法引入了外部中断0按键控制,增加了定时器中断和外部中断的使用,使流水灯可以通过按键控制启停。

1、仿真原理图

2、汇编代码及详细注释

(1)、代码1

  
ORG 0000H 		; 设置代码起始地址为0000H 熄灭发光二极管
MOV A,#0FEH 	; 将数值0FEH载入A寄存器,熄灭所有发光二极管
MOV P1, A 		; 将A寄存器的值移动到P1寄存器,将0FEH写入P1端口
LOOP: 			; LOOP标签处的代码
    RL A 			; 将A寄存器的值左循环移位,实现流水灯效果
    MOV P1, A 		; 将A寄存器的值移动到P1寄存器,更新P1端口
    CALL Delay 	; 调用延时函数,进行延时
    SJMP LOOP 		; 跳转到LOOP标签处,循环执行
Delay: 		; Delay标签处的延时函数
    MOV R2,#10 	; 将100载入R2寄存器,作为外循环计数器
    MOV R1,#10 	; 将10载入R1寄存器,作为内循环计数器
    MOV R0,#10 	; 将10载入R0寄存器,作为最内循环计数器
DLP: 			; DLP标签处的代码
    DJNZ R0, DLP 	; 如果R0不为0,则减1并跳转到DLP标签处,进行最内循环
    DJNZ R1, DLP 	; 如果R1不为0,则减1并跳转到DLP标签处,进行内循环
    DJNZ R2, DLP 	; 如果R2不为0,则减1并跳转到DLP标签处,进行外循环
    RET 			; 返回到调用者
    END 			; 程序结束
  

(2)、代码2

引入外部中断0按键控制

  
ORG 0000H 		; 设置代码起始地址为0000H
    AJMP MAIN 		; 跳转到MAIN标签处
    ORG 0003H 		; 设置代码起始地址为0003H
    AJMP ESINT 		; 跳转到ESINT标签处
    ORG 000BH 		; 设置代码起始地址为000BH
    AJMP DST0 		; 跳转到DST0标签处
    ORG 0100H 		; 设置代码起始地址为0100H
MAIN:			; MAIN标签处的代码
    MOV TMOD,#01H 		; 设置定时器模式
    SETB IT0 		; 设置外部中断0为下降沿触发
    MOV TH0,#3CH 		; 设置定时器0的高8位初值
    MOV TL0,#0B0H 		; 设置定时器0的低8位初值
    SETB PT0 		; 设置定时器0为自动重载方式
    CLR TR0 		; 清除定时器0运行控制位
    SETB EX0 		; 使能外部中断0
    SETB ET0 		; 使能定时器0中断
    SETB EA 		; 全局中断使能
        
    MOV P1,#0FEH 		; 将P1寄存器设置为0FEH
    MOV A,P1 		; 将P1寄存器的值移动到A寄存器
    MOV R0,#5 		; 将立即数5移动到R0寄存器
    AJMP $ 		; 无条件跳转到当前地址
    ORG 0200H 		; 设置代码起始地址为0200H
ESINT:			; ESINT标签处的代码
    CPL TR0 		; 完全翻转TR0寄存器的值,控制启停
    RETI 			; 从中断返回
    ORG 0300H 		; 设置代码起始地址为0300H
DST0: 			; DST0标签处的代码
    MOV TH0,#3CH 		; 设置定时器0的高8位初值
    MOV TL0,#0B0H 		; 设置定时器0的低8位初值
    CLR TR0 		; 清除定时器0运行控制位
    DEC R0 		; R0寄存器的值减1
    CJNE R0,#0,UNACT 	; 比较R0寄存器的值是否等于0,如果不等于0,跳转到UNACT标签处
    MOV R0,#5 		; 如果R0寄存器的值等于0,将立即数5移动到R0寄存器
    RL A 		; 将A寄存器的值左循环移位
    MOV P1,A 		; 将A寄存器的值移动到P1寄存器
UNACT: 			; UNACT标签处的代码
    SETB TR0 		; 设置TR0寄存器为1,启动定时器0
    RETI 			; 从中断返回
    END 			; 程序结束
  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号