任务要求
用 AT89S52 单片机控制彩灯(流水灯)图形及继电器。即:
①AT89S52 单片机上电时控制由发光二极管组成的图形有规律地不停闪烁(亮、灭的时间不能为 5 秒!);
②当按下按钮(任什么时候候)时彩灯图形全灭,而继电器工做吸合(控制~220V 30W灯泡亮)5 秒,5 秒后返回彩灯闪烁。编程
思路
中断可采起外部中断INT0方式,定时器可采用模式一(一次定时50ms,循环100次即为5s);
流水灯部分,咱们的想法是作一个“CXK”运球的动做,顺序为左——中——右——中——左,并经过换位实现流水灯的变化,具体代码实现以下:ide
汇编代码
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 ;循环 RETDELAY1:MOV R6,#200 ;50ms延时子程序 L1:MOV R7,#200 L2:NOP DJNZ R7,L2 DJNZ R6,L1 RET ;子程序返回 END
仿真电路
任务要求
用 AT89S52 单片机控制彩灯(流水灯)图形及继电器。即:
①AT89S52 单片机上电时控制由发光二极管组成的图形有规律地不停闪烁(亮、灭的时间不能为 5 秒!);
②当按下按钮(任什么时候候)时彩灯图形全灭,而继电器工做吸合(控制~220V 30W灯泡亮)5 秒,5 秒后返回彩灯闪烁。编程
思路
中断可采起外部中断INT0方式,定时器可采用模式一(一次定时50ms,循环100次即为5s);
流水灯部分,咱们的想法是作一个“CXK”运球的动做,顺序为左——中——右——中——左,并经过换位实现流水灯的变化,具体代码实现以下:ide
汇编代码
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 ;循环 RETDELAY1:MOV R6,#200 ;50ms延时子程序 L1:MOV R7,#200 L2:NOP DJNZ R7,L2 DJNZ R6,L1 RET ;子程序返回 END
仿真电路
举报