C8051单片机汇编实现流水灯

桂林电子科技大学51单片机实验二流水灯参考

具体要求

3b9c7f74d207472495cf69a33d614190.png

仿真

 4f8a095976e942ccb7c55f684ba2f7f4.png

汇编代码如下:

注:只有结束了当前状态才会识别开关,再选择状态

 ORG 0000H

AJMP START

ORG 000BH

AJMP TIMING

START:

;定时器T0作为流水灯

MOV TMOD,#01H;工作方式1,50ms

MOV TH0,#3CH

MOV TL0,#0B0H

MOV R0,#0AH; 10*50ms=0.5s ,时间改这里R0=20就是1S

MOV R1,#02H ;2*0.5S=1S ,这个时间是上面的两倍

;开中断

SETB EA

SETB ET0

SETB TR0

SETB P1

SETB P3

MOV P1,#00H;全灭

 

MAIN:

MOV A,P3 ;开关接的P3.0,P3.1

ANL A,#03H ;保留P3.0与P3.1 ,开关如果接P3.2 和P3.3,这里03H改为0CH

CJNE A,#00H,NEXT01 ;

ACALL STATE00

AJMP MAIN

NEXT01:

CJNE A,#01H,NEXT10 ; 开关如果接P3.2 和P3.3, 01改04

ACALL STATE01

AJMP MAIN

NEXT10:

CJNE A,#02H,NEXT11 ;改08

ACALL STATE10

AJMP MAIN

NEXT11:

ACALL STATE11

AJMP MAIN

 

STATE00: ;状态1 P1.7<---P1.0

MOV A,#01H

WAIT00:

CJNE R1,#01H,WAIT00

INC R1

MOV P1,A

RL A

CJNE A,#01H,WAIT00

RET

 

STATE01: ;状态2 P1.7--->P1.0

MOV A,#80H

WAIT01:

CJNE R1,#01H,WAIT01

INC R1

MOV P1,A

RR A

CJNE A,#01H,WAIT01

RET

 

STATE10: ;状态3

MOV A,#03H

WAIT101:

CJNE R1,#00H,WAIT101

MOV R1,#02H

MOV P1,A

CJNE A,#0C0H,CONTINUE1

 

WAIT102:

CJNE R1,#00H,WAIT102

MOV R1,#02H

MOV P1,A

CJNE A,#03H,CONTINUE2

RET

 

CONTINUE2:

RR A

RR A

AJMP WAIT102

CONTINUE1:

RL A

RL A

AJMP WAIT101

 

STATE11: ;状态4

MOV A,#01H

WAIT11:

CJNE R1,#01H,WAIT11

INC R1

MOV R3,A

ORL A,P1

MOV P1,A

MOV A,R3

RL A

CJNE A,#01H,WAIT11

MOV P1,#00H

WAIT110:

CJNE R1,#01H,WAIT110

INC R1

RET

 

TIMING: ;定时器T0中断

PUSH A

MOV TH0,#3CH

MOV TL0,#0B0H

DJNZ R0,DEAL

MOV R0,#08H

DEC R1

DEAL:

POP A

RETI

 

单片机汇编语言实现流水灯是一种常见的微控制器实验,通常用于学习基本的硬件操作和程序控制。流水灯的工作原理是通过轮换点亮一组LED灯,让人眼看起来像是连续变化的效果。 以下是简单的8段LED流水灯实现步骤: 1. **初始化**:首先,配置GPIO口作为输出,将LED灯连接到单片机相应的I/O引脚上。 ```assembly ; 设置IO口为输出模式 MOV P0, #0FFh ; 或P1, #0FFh,取决于你的单片机和LED布局 ``` 2. **定时器设置**:为了形成动画效果,需要周期性地改变LED状态。你可以使用单片机自带的定时器或者外部计数器。 ```assembly ; 如果有定时器,如8051的TMOD,可以设置定时器工作模式并开始计数 MOV TMOD, #0x01 ; 设置定时器1为模式1 SETB TR1 ; 启动定时器1 ``` 3. **主循环**:在一个无限循环里,依次改变每个LED的状态。 ```assembly LOOP: MOV R0, #0 ; 存储当前LED编号(从0开始) loop_leds: MOV P0, R0 ; 把当前LED的值输出到GPIO JNB TF1, next ; 等待定时器1中断标志TF1变为1(定时溢出) DJNZ R0, loop_leds ; LED编号减一,没到最后一盏就继续 next: SETB TF1 ; 清除TF1标志,准备下一次计数 INC R0 ; LED编号加1,切换到下一盏灯 DJNZ R0, LOOP ; 循环直到所有LED都亮过一遍 JMP LOOP ; 返回循环开始 ``` 4. **中断服务程序**:当定时器溢出时,会触发中断,此时更新LED状态并跳转回主循环继续下一轮。 ```assembly ; 定时器1中断处理函数 TIMER1_ISR: CLR TF1 ; 清除TF1标志 SJMP LOOP ; 跳回主循环 ``` 记得替换示例中的寄存器名称和指令集以适应你的单片机型号。运行此程序后,你会看到LED流水灯逐个亮起和熄灭。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值