实验名称 实验三 综合实验-LED灯控制器 加深对定时/计数器、中断、IO端口的理解,掌握定时/计数器、中断的应用编程技术及中断程序的调试方法。 首先设计大体框架,分成三个主要功能: 1.P0.0口产生三种频率的波形控制指示灯,同时完成P3.1口的波形输出 2.动态显示的方法在八段数码管上面显示当前的模式与频率值 3.通过kint控制三种频率的转换 三、资源分配 1.R1:外部中断数据存储位置,根据数据的不同执行不同的模式,可以再00,01,02三个模式依次切换 2.R4:判断切换和转到当前所处的模式 3.R2,R3,R6:控制八段数码管和led灯蜂鸣器 4.R5:数码管模式切换 5. 20H: P0口的等效输出口  
可以先在89C51运行,查看P3.1 P0.0波形是否正确 无外部中断的时候,波形没20秒有规律地变化一次 

触发外部中断的时候 
此时波形不再是规律的20秒切换一次模式,而是随着中断的触发进入新的模式,在下次中断到来或者到达20秒的时候进入下一个模式。
思考题 - 若想实现3种闪烁方式的持续时间在5s-60s范围内可调,且每种方式的持续时间各不相同,应如何设计程序?
可以改变程序寄存器中的循环次数,比如模式为1hz的时候,循环取反40次,若要让时间可以调节,通过改变寄存器的值来调节循环次数,就可以改变持续时间。但是在5HZ 的时候可能需要两个寄存器来定值,因为此时持续时间为60秒,需要寄存器的值大于600,已经超过了255。
其它说明:
1.标题:黑体,小四号
2. 正文:宋体,五号,1.5倍行距
3.流程图使用 SmartDraw7 或Visio软件绘制
4.不要加封面
源代码 (含文件头说明、语句行注释)
- STOP4:
- ORG 0000H
- LJMP MAIN ; 转主程序
- ORG 0003H
- LJMP INTER0
- ORG 000BH ; T0的中断入口
- LJMP ITOP ; 转T0中断处理程序
- ORG 001BH ; T1的中断入口
- JMP IMER_INT1
-
- ORG 0100H
- MAIN: LCALL Init_Device
- P0T EQU 20H ;设置P0口的输出值
- MOV P0T,#0FFH
- MOV R1,#0FFH ;外部中断数据存储位置,根据数据的不同执行不同的模式,可以再00,01,02三个模式依次切换
- MOV R3,#0 ;间接选址的时候的指针中间值
- MOV R4,#00H ;控制三种模式的区分的自变量
- SETB EX0 ;开启外部中断
- SETB PX0
- SETB EX0
- MOV DPTR,#SEGTAB1
- MOV SP,#60H ; 设堆栈指针
- MOV TMOD,#11H ; 设置T0和T1为方式1
- ACALL PT0M0 ; 调用初始化子程序PT0M0
- HERE:
-
- JB P0.1 ,HERE ; 自身跳转
- LJMP CHECK
- RET
- ITOP:
- CJNE R4,#00H,PT0M022JIN ;模式选择的中间跳板
- CJNE R2,#202,delay1m
-
- MOV TL0, #15H ; 延时程序指令,延时100ms
- MOV TH0,#0E7H
- CLR P3.1
- DEC R2
- RETI
- PT0M022JIN : ;跳到另一个模式
- CJNE R5,#00,ITOP2JIN ;判断是否已经进行过初始化 ,为0说明未进行初始化
-
- LJMP PT0M022
-
- delay1m: ;让蜂鸣器响一次
- DEC R2
- MOV TL0, #15H ; T0置初值
- MOV TH0,#0E7H
- CPL P0T.0 ;P0.0的状态取反
- MOV P0,P0T
- CJNE R2,#200,NORING1 ;开始的时候响一次
- SETB P3.1 ;
- RETI
- ITOP2JIN:LJMP ITOP2
- NORING1: CLR P3.1
- CJNE R2,#01,NORING2
- SETB P3.1 ;结束的时候响一次
- RETI
- NORING2:
- CLR P3.1
- CJNE R2,#00H,GOON1
- LJMP STOP1
- GOON1:
- RETI
-
- PT0M0222JIN:
- LJMP PT0M022
- PT0M0:
- CJNE R4,#00H, PT0M0222JIN ;选择模式,如果不是模式0,就跳到下一个初始化程序
- MOV TH1, #0FEH ;初始化程序,延时一秒后进入模式
- MOV TL1, #0C2H
- MOV DPTR,#SEGTAB1
- CLR P3.1
- MOV R2,#202
- SETB TR0;允许T0中断
- SETB ET0 ;全局开中断
- MOV TMOD, #11H
- MOV TH1, #0FEH ;延时100ms
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器1中断
-
- SETB TR1 ;打开定时器1
- SETB EA
- RETI
- IMER_INT12JIN:LJMP IMER_INT12
- IMER_INT1:
- CJNE R4,#00H,IMER_INT12JIN ; 位选信号的对应的模式选择
- MOV P1,#00H
-
- CJNE R3,#00H,FIVEHZ1
- MOV TMOD, #11H ;定时器0,1工作方式1,16位
- MOV TH1, #0FEH
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC ;存储段码
- CLR A
- ORL A,P0T ;作为p0口的等价输出口
- ORL A,#0D0H ;进行移位
-
- MOV P0T,A
- MOV P0,P0T
- POP ACC ;弹出段码
- MOV P1,A
- RETI
-
- FIVEHZ1: CJNE R3,#01H,FIVEHZ2 ;位选信号
- MOV TMOD, #11H ;定时器0,1工作方式1,16位
- MOV TH1, #0FEH
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC
-
-
-
- MOV A,P0T
- ADD A,#0C0H
- MOV P0T,A
- MOV P0,P0T
- POP ACC
- MOV P1,A
- RETI
- FIVEHZ2:
- MOV TMOD, #11H ;定时器0,1工作方式1,16位
- MOV TH1, #0FEH
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC
-
- MOV A,P0T
- ADD A,#0C0H
- MOV P0T,A
- MOV P0,P0T
-
-
- POP ACC
- MOV P1,A
- MOV R3,#0
- RETI
- ;**********************************************************************
- ;***********************************************************************
- STOP1:MOV P1,#00H ;熄灭LED
-
- MOV R4,#01H
-
- PT0M022: ;模式二的初始化
- CJNE R4,#01H, PT0M023JIN ;作为跳板进行跳到下一个模式
-
- MOV TL0, #66H ; 延时1秒
- MOV TH0,#83H
- MOV DPTR,#SEGTAB2
- CLR P3.1
- MOV R5,#42
- SETB TR0;允许T0中断
- SETB ET0 ;全局开中断
- SETB IT0
- MOV TMOD, #11H ;
- MOV TH1, #0FEH ;2ms方波
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
-
- SETB TR1 ;打开定时器0
- SETB EA
- RETI
- PT0M023JIN: LJMP PT0M023 ;跳到下一个模式
- ITOP2: CJNE R4,#01,ITOP3
-
- CJNE R5,#42,delay1m2
-
- MOV TL0, #0CBH ; T0置初值
- MOV TH0,#06H
- CLR P3.1
- DEC R5
- RETI
- ITOP3:LJMP ITOP4
- delay1m2:
- DEC R5
- MOV TL0, #66H ; ;延时0.5秒
- MOV TH0,#83H
- CPL P0T.0 ;P0.0的状态取反
- MOV P0,P0T
- CJNE R5,#40,NORING11 ;让蜂鸣器响
- SETB P3.1
- RETI
- NORING11: CLR P3.1 ;结束的时候熄灭蜂鸣器
- CJNE R5,#01,NORING21
- SETB P3.1
- RETI
- NORING21:
- CLR P3.1
- CJNE R5,#00H,GOON11 ;已经达到了20秒,清零
- LJMP STOP3
- GOON11:
- RETI
-
-
- IMER_INT13JIN:LJMP IMER_INT13
-
- IMER_INT12:
- CJNE R4,#01H,IMER_INT13JIN ;切换到下一个模式
- MOV P1,#00H
-
- CJNE R3,#00H,FIVEHZ12
- MOV TMOD, #11H ;定时器0,1工作方式1,16位
- MOV TH1, #0FEH
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
-
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC
- CLR A
- ORL A,P0T
- ORL A,#0D0H
-
- MOV P0T,A
- MOV P0,P0T
- POP ACC
- MOV P1,A
- RETI
-
- FIVEHZ12: CJNE R3,#01H,FIVEHZ22
- MOV TMOD, #11H ;定时器0工作方式1,16位
- MOV TH1, #0FEH ;2ms方波
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC
-
-
-
- MOV A,P0T
- ADD A,#0C0H
- MOV P0T,A
- MOV P0,P0T
- POP ACC
- MOV P1,A
- RETI
- FIVEHZ22:
- MOV TMOD, #11H ;定时器0工作方式1,16位
- MOV TH1, #0FEH ;2ms方波
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC
-
- MOV A,P0T
- ADD A,#0C0H
- MOV P0T,A
- MOV P0,P0T
-
-
- POP ACC
- MOV P1,A
- MOV R3,#0
- RETI
- ;**************************************************************************************
- ;***************************************************************************************
- ;***************************************************************************************
- STOP3:
- MOV P1,#00H
- MOV R4,#02H
- LJMP PT0M023
- PT0M023:
- CJNE R6,#00H,ITOP4
-
- MOV TL0, #66H ; T0置初值
- MOV TH0,#83H
- MOV DPTR,#SEGTAB3
- CLR P3.1
- MOV R6,#22 ;延时1秒
- SETB TR0;允许T0中断
- SETB ET0 ;全局开中断
- MOV TMOD, #11H ;
- MOV TH1, #0FEH ;2ms方波
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
-
- SETB TR1 ;打开定时器0
- SETB EA
- RETI
- ITOP4:
- MOV DPTR,#SEGTAB3
- MOV P1,#00H
- CJNE R6,#22,delay1m3
-
- MOV TL0, #0CBH ; 延时一秒
- MOV TH0,#06H
- CLR P3.1
- DEC R6
- MOV DPTR,#SEGTAB3
- RETI
-
- delay1m3:
- DEC R6
- MOV TL0, #0CBH ; 1S
- MOV TH0,#06H
- CPL P0T.0 ;P0.0的状态取反
- MOV P0,P0T
- CJNE R6,#20,NORING13
- SETB P3.1
- RETI
- LJMP NORING11
- NORING13: CLR P3.1
- CJNE R6,#01,NORING23
- SETB P3.1
- RETI
- NORING23:
- CLR P3.1
- CJNE R6,#00H,GOON13
- MOV R4,#00H
- LJMP STOP4
- GOON13:
- RETI
-
-
-
-
- IMER_INT13:
- MOV P1,#00H
-
- CJNE R3,#00H,FIVEHZ13
- MOV TMOD, #11H ;定时器0工作方式1,16位
- MOV TH1, #0FEH ;2ms方波
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC
- CLR A
- ORL A,P0T
- ORL A,#0D0H
-
- MOV P0T,A
- MOV P0,P0T
- POP ACC
- MOV P1,A
- RETI
-
- FIVEHZ13: CJNE R3,#01H,FIVEHZ23
- MOV TMOD, #11H ;定时器0工作方式1,16位
- MOV TH1, #0FEH ;2ms方波
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC
-
-
-
- MOV A,P0T
- ADD A,#0C0H
- MOV P0T,A
- MOV P0,P0T
- POP ACC
- MOV P1,A
- RETI
- FIVEHZ23:
- MOV TMOD, #11H ;定时器0工作方式1,16位
- MOV TH1, #0FEH ;2ms方波
- MOV TL1, #0C2H
- SETB ET1 ;允许定时器0中断
- SETB EA ;允许全局中断
- SETB TR1 ;打开定时器0
- MOV A, R3
- MOVC A, @A+DPTR
- INC R3
- PUSH ACC
-
- MOV A,P0T
- ADD A,#0C0H
- MOV P0T,A
- MOV P0,P0T
-
-
- POP ACC
- MOV P1,A
- MOV R3,#0
- RETI
-
-
- INTER0: INC R1
- CJNE R1,#03H,FUZHI
- MOV R1,#00H
- FUZHI: MOV 71H,R1
- MOV R4,71H
- LJMP PT0M0
- BACK: LJMP HERE
- CHECK:
- LJMP HERE
-
-
-
-
-
- SEGTAB1: DB 0B7H, 0FCH, 6EH
- SEGTAB2: DB 0DH, 0FCH, 6EH
- SEGTAB3: DB 0FDH,0B6H, 6EH
复制代码
完整的Word格式文档51黑下载地址:
单片机 LED灯控制.doc
(469.5 KB, 下载次数: 8)
|