实验三 定时/计数器实验
一、实验目的
学习MCS-51 内部计数器的使用和编程方法。
二、实验内容
使用MCS-51 内部定时/计数器,定时一秒钟,CPU 运用定时中断方式,实现每一秒钟输出状态发生一次反转,即发光管每隔一秒钟亮一次。
三、实验要求
根据实验内容编写一个程序,并在实验仪上调试和验证。
四、实验步骤
1)系统各跳线器处在初始设置状态,用导线连接CPU 模块P10 到八位逻辑电平显示模块的L0。
2)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。编译无误后,下载程序运行。
3)运行程序观察发光二极管隔一秒点亮一次,点亮时间为一秒。
五、实验参考程序
;//************************************************* ;文件名: TIMER FOR MCU51
;功能: 定时/计数器实验
;接线: 导线连接CPU模块P10到八位逻辑电平显示模块的L0. ;//************************************************* TICK EQU 10000 ; 10000 X 100US = 1S
T100US EQU 156 ; 100US时间常数(6M)
C100US EQU 30H ; 100US记数单元 LEDBUF BIT 20H ORG 0 LJMP START ORG 000BH T0INT:
PUSH PSW
MOV A, C100US+1 JNZ GOON DEC C100US GOON:
DEC C100US+1
MOV A, C100US ORL A, C100US+1
JNZ EXIT ; 100US 记数器不为0, 返回 MOV C100US, #27H ; #HIGH(TICK)
MOV C100US+1, #10H ; #LOW(TICK)
CPL LEDBUF ; 100US 记数器为0, 重置记数器 ; 取反LED EXIT:
POP PSW RETI START:
MOV TMOD, #02H ; 方式2, 定时器 MOV TH0, #T100US
MOV TL0, #T100US
MOV IE, #10000010B ; EA=1, IT0 = 1 SETB TR0 ; 开始定时 CLR LEDBUF CLR P1.0
MOV C100US, #27H ;#HIGH(TICK) MOV C100US+1, #10H ;#LOW(TICK) LOOP:
MOV C, LEDBUF MOV P1.0, C LJMP LOOP END
六、实验结果
运行程序之后,B5区的发光二极管L0隔一秒点亮一次,每次点亮时间为一秒。
七、结果分析
本实验通过定时器0的方式2实现精确定时,但定时器的最长定时时间达不到一秒,所以通过一个时间变量实现,总的定时时间等于定时器定时时间乘以时间变量初值,这样就可实现一秒的定时,程序通过扫描不断检测时间变量的值,当定时时间一秒到时,对P1.0的状态取反,实现L0每隔一秒亮一次。
实验四 交通灯控制实验
一、实验目的
掌握十字路口交通灯控制方法。
二、实验内容
利用系统提供的双色LED 显示电路,和四位静态数码管显示电路模拟十字路口交通信号灯。4 位LED 数码管显示时间,LED 显示红绿灯状态。
三、实验要求
根据实验内容编写一个程序,并在实验仪上调试和验证。
四、实验步骤
1)系统各跳线器处在初始设置状态。P10 同时接G1、G3;P11 同时接R1、R3;P1.2 同时接G2、G4;P1.3 同时接R2、R4;P1.6、P1.7 分别接静态数码显示的DIN、CLK。 2)启动PC 机,打开THGMW-51 软件,输入源程序,并编译源程序。编译无误后,下载程序运行。
3)观察十字路口交通灯效果。
五、实验参考程序
;//******************************************************************* ;文件名:交通灯程序 FOR MCU51
;功能:双色LED模拟交通灯信号,并通过调用静态数码显示状态时间。
;接线:P1.0同时接G1、G3,P1.1接R1、R3,P1.2接G2、G4,P1.3同时接R2、R4, ;P1.6、P1.7接静态数码显示的DIN、CLK。
;//******************************************************************* SECOND1 EQU 30H ;东西秒寄存器 SECOND2 EQU 31H ;南北秒寄存器 DBUF EQU 40H ;显示缓冲1 TEMP EQU 44H ;显示缓冲2 LED_G1 BIT P1.0 ;东西绿灯 LED_R1 BIT P1.1 ;东西红灯 LED_G2 BIT P1.2 ;南北绿灯 LED_R2 BIT P1.3 ;南北红灯
DIN BIT P1.6 ;串行显示数据 CLK BIT P1.7 ;串行显示时钟 ORG 0000H LJMP START
ORG 0100H
START:
LCALL STATE0 ;调用状态0 LCALL DELAY ;调用延时 MOV TMOD,#01H ;置T0工作方式1 MOV TH0, #3CH ;置T0定时初值50MS MOV TL0, #0B0H
SETB TR0 ;启动T0 CLR EA
LOOP: MOV R2,#20 ; MOV R3,#20 ; MOV SECOND1,#25 ; MOV SECOND2,#25 ; LCALL DISPLAY
LCALL STATE1 ;WAIT1: JNB TF0,WAIT1 ; CLR TF0
MOV TH0, #3CH ; MOV TL0, #0B0H
SETB TR0 ; DJNZ R2,WAIT1 ; MOV R2,#20 ; DEC SECOND1 ; DEC SECOND2 ; LCALL DISPLAY
DJNZ R3,WAIT1 ; MOV R2,#5 ; MOV R3,#3 ; MOV R4,#4 ; MOV SECOND1,#5 ; MOV SECOND2,#5 ; LCALL DISPLAY
WAIT2: LCALL STATE2 ; JNB TF0,WAIT2 ; CLR TF0
MOV TH0, #3CH ; MOV TL0, #0B0H
DJNZ R4,WAIT2 ; CPL LED_G1 ; MOV R4,#4 ; DJNZ R2,WAIT2 ; MOV R2,#5 ; DEC SECOND1 ; DEC SECOND2 ;置1S计数初值 50MS*20=1S 红灯20S
东西秒显示初值25S 南北秒显示初值25S 调用状态1 查询50MS到否 恢复T0定时初值50MS 启动T0
判1S到否?未到继续状态1
置50MS计数初值 东西秒显示减一 南北秒显示减一 状态1维持20S
置50MS计数初值 5*4=20 绿灯闪3S
闪烁间隔200MS 东西秒显示初值5S 南北秒显示初值5S 调用状态2 查询50MS到否 恢复T0定时初值50MS 判200MS到否?未到继续状态2 东西绿灯闪
闪烁间隔200MS
判1S到否?未到继续状态2 置50MS计数初值 东西秒显示减一 南北秒显示减一