AT89C52流水灯+外部中断INT0+定时器(汇编语言)
任务要求
用 AT89S52 单片机控制彩灯(流水灯)图形及继电器。即:
①AT89S52 单片机上电时控制由发光二极管组成的图形有规律地不停闪烁(亮、灭的时间不能为 5 秒!);
②当按下按钮(任何时候)时彩灯图形全灭,而继电器工作吸合(控制~220V 30W灯泡亮)5 秒,5 秒后返回彩灯闪烁。
思路
中断可采取外部中断INT0方式,定时器可采用模式一(一次定时50ms,循环100次即为5s);
流水灯部分,我们的想法是做一个“CXK”运球的动作,顺序为左——中——右——中——左,并通过换位实现流水灯的变化,具体代码实现如下:
汇编代码
ORG 0000H ;单片机上电后从0000H地址执行
AJMP START ;跳转到主程序存放地址处
ORG 0003H ;设置主程序开始地址
AJMP INSER ;设置中断入口地址
ORG 0030H
MOV SP,#60H ;设置堆栈起始地址为60H
START:
SETB TR0 ;允许启动定时器
SETB EX0 ;中断设置优先级
SETB IT0
MOV R3,#32H ;R3初值
SETB EA ;字卸宪开关
MOV A,#0FFH ;灯全灭
MOV P1,A
MOV A,#0FEH ;1灯亮
MOV P1,A
MOV R2,#08H
LOOP1:RL A ;左移,向右流水灯亮(向右流水灯)
MOV P1,A
ACALL DELAY1
DJNZ R2,LOOP1
MOV R2,#05H
LOOP2:MOV A,#0FFH ;灯全灭(外圈灯闪烁5次)
MOV P1,A
ACALL DELAY1
MOV A,#00H ;灯全亮
MOV P1,A
ACALL DELAY1
DJNZ R2,LOOP2
MOV A,#0FFH ;灯全灭
MOV P1,A
ACALL DELAY1
MOV A,#0EEH ;0和4灯亮
MOV P1,A
MOV R2,#10H
LOOP3:RL A ;(流水灯)
MOV P1,A ;右移,0和4,1和5,2和6,3和7灯亮
ACALL DELAY1
DJNZ R2,LOOP3
MOV A,#0FFH
MOV P1,A ;灯灭
MOV R2,#10H
MOV A,#0EEH
MOV P1,A
ACALL DELAY1
MOV A,#77H
LOOP4:RR A ;左移,(流水灯)
MOV P1,A
ACALL DELAY1
DJNZ R2,LOOP4
MOV R2,#08H
MOV A,#0FEH
LOOP5:RR A ;左移,向右流水灯亮(向左流水灯)
MOV P1,A
ACALL DELAY1
DJNZ R2,LOOP5
MOV A,#0FFH
MOV P1,A
MOV R2,#05H
LOOP6:MOV A,#0FFH ;灯全灭(外圈灯闪烁5次)
MOV P1,A
ACALL DELAY1
MOV A,#00H ;灯全亮
MOV P1,A
ACALL DELAY1
DJNZ R2,LOOP6
MOV R0,#05H
MOV A,#0F0H ;(运球)
MOV P0,A ;身体部位亮
SETB P2.0
SETB P2.1
SETB P2.2 ;三个球都灭
CLR P2.3
CLR P2.4
CLR P2.5 ;CXK亮
LOOP7:CLR P2.0 ;左球亮
CLR P2.3 ;C亮
SETB P2.4
SETB P2.5 ;XK不亮
ACALL DELAY1
SETB P2.0 ;左球灭
SETB P2.3 ;C灭
CLR P2.1 ;中间球亮
CLR P2.4 ;X亮
ACALL DELAY1
SETB P2.1 ;中间球灭
SETB P2.4 ;X灭
CLR P2.2 ;右球亮
CLR P2.5 ;K亮
ACALL DELAY1
SETB P2.2 ;右球灭
SETB P2.5 ;K灭
CLR P2.1 ;中间球亮
CLR P2.3
CLR P2.4
CLR P2.5 ;CXK全亮
ACALL DELAY1
SETB P2.1 ;中间球灭
SETB P2.3
SETB P2.4
SETB P2.5 ;CXK全灭
CLR P2.0 ;左球亮
ACALL DELAY1
DJNZ R0,LOOP7 ;循环5次
MOV R1,#0AH
LOOP8:MOV A,0FFH ;(人亮,球不亮,且人闪烁)
MOV P0,A ;身体不亮
SETB P2.0
SETB P2.1
SETB P2.2 ;三个球都要不亮
ACALL DELAY1
MOV A,#0F0H
MOV P0,A ;身体亮
CLR P2.3
CLR P2.4
CLR P2.5 ;CXK亮
ACALL DELAY1
CPL A
MOV P0,A ;身体灭
SETB P2.3
SETB P2.4
SETB P2.5 ;CX灭
ACALL DELAY1
DJNZ R1,LOOP8
MOV R1,#0AH
AJMP START
HERE:SJMP HERE ;查询中断
ORG 0200H
INSER:SJMP MIE ;跳转中断服务程序
MIE:MOV P0,#0FFH ;灯灭
MOV P1,#0FFH ;灯灭
MOV P2,#0FFH ;灯灭
CLR P3.7
ACALL DELAY ;调用定时器
MOV R3,#32H ;循环100次
SETB P3.7
RETI ;中断子程序返回
DELAY:MOV TMOD,#01H ;定时器基础设计,模式1,查询方式
MOV TL0,#0B0H ;每隔50ms定时一次
MOV TH0,#3CH ;同上
JNB TF0,$ ;查询判断TF0的溢出
CLR TF0 ;清0
DJNZ R3,DELAY ;循环
RET
DELAY1:MOV R6,#200 ;50ms延时子程序
L1:MOV R7,#200
L2:NOP
DJNZ R7,L2
DJNZ R6,L1
RET ;子程序返回
END
仿真电路
硬件电路
一共用了67个灯,大部分灯为并联接到一个口
实际效果
新能源1第一组流水灯
后言
汇编程序不难,难的是焊接工作和排线,焊接大概花费了3-4天的时间,希望这篇文章能给以后学习相关综合实验的师弟师妹一个参考,非专业非科班某单片机课设留。