实验三单片机定时/ 计数器实验
1、实验目的
1、学习计数器的使用方法。
2、学习计数器程序的编写。
3、学习定时器的使用方法。
4、学习定时器程序的编写。
5、熟悉汇编语言
2、实验说明
1、8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4 (T0) 引脚进行计数。
将其数值按二进制数在P1 口驱动LED丁上显示出来。
2、用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转
3、实验仪器和条件
计算机
伟福实验箱( lab2000P)
4、实验内容
1、8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0) 引脚进行计数。
将其数值按二进制数在P1 口驱动LED丁上显示出来。
2、外部事件计数脉冲由P3.4引入定时器T0。
单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变。
这就要求被采样电平至少维持一个完整的机器周期,以保证电平在变化之前即被采样。
同时这就决定了输入波形的频率不能超过机器周期频率。
3、用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转
4、定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON TMOD 用于设置定时器/ 计数器的工作方式0-3,并确定用于定时还是用于计数。
TCON 主要
功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。
5、在例程的中断服务程序中,因为中断定时常数的设置对中断程序的运行起到关键作用,所以在置数前要先关对应的中断,置数完之后再打开相应的中断。
五、思考题
1、使用其他方式实现本实验功能;
2、改为门控方式外部启动计数;
3、如果改为定时间隔为200us,如何改动程序;
4、使用其他方式实现本实验功能,例如使用方式1定时间隔为10ms,如何改动程序。
六、源程序修改原理及其仿真结果
思考题一:使用其他方式实现本实验功能
方法一:
movTMOD, #00000100b方式0,记数器
movTH0, #0
movTL0, #0
setbTR0开始记数;由于方式0的特点是计数时使用TL0的低五位和八位
TH0,故用加法器a用与”(ANL)取TL0的低五位,再用yiwei子程序实现TH0 的低三位变为高三位与TL0相加,这样赋给P1时就是八位计数的结果。
Loop:
mova,TL0
anla,#1fh
movr1,a
mova,TH0
adda,r1
movPI, a;将记数结果送P1 口IjmpLoop
;实现THO的高三位移位为高三位,本身TH0是八位,故需要移位五次才能实现
yiwei:
movrO,#O5h
Loop1:
rIa
djnzrO,Loop1
ret
end
硬件:P1.0~P1.7接L0~L7, P3.4接单步脉冲
方法二:
movTMOD, #OOOOO11Ob
movTHO, #O
movTLO, #O
setbTRO
Loop:
MovP1,TL0方式2,记数器暂存初值,可自动加载八位加一计数器
;开始记数;将记数结果送P1 口;
End
硬件:P1.0~P1.7接L0~L7, P3.4接单步脉冲
硬件仿真结果说明:
按动单步脉冲按钮LED灯P0到P7会按照二进制的顺序点亮,即第一次P0亮其他灭,第二次P1亮其他灭,第三次P0 P1亮其他灭,第四次P2亮其他灭••…以此类推,实现了用八位LED灯表示计数器的计数过程的目的。
思考题二:改为门控方式外部启动计数
movTMOD, #00001101b方式1,记数器,门控方式
movTH0, #0
movTL0, #0
setbTR 0开始记数
Loop:
movPI, TL0将记数结果送P1 口
ljmpLoop
end;INT0即P3.2接开关硬件仿真结果说明:
在P3.2所接开关没有拨为高电平之前,按动单步脉冲按钮LED灯没有响应;开关拨为高电平之后按动单步脉冲按钮LED灯的响应同上。
实现了计数器的门控外部启动。
思考题三:如果改为定时间隔为200us,如何改动程序
(2八8-x)*2*10八-6=200*10八-6;
故x=256-100
程序其他部分无需改变,定时变为2sLED丁的状态翻转
Tickequ10000; 10000 x 200us = 2s
TIOOusequ 256-100; 200us时间常数(6M);
C100usequ30h; 200us 记数单元
程序选用方式 1 定时,故计算初值:
(2A16-x)*2*10A6=10*10A3;
故x=65536-5000=60536
1,定时间隔为思考题四:使用其他方式实现本实验功能,例如使用方式
10ms,如何改动程序
Tickequ 500; 500 x 10ms = 5s
T100usequ 60536 ; 10ms计数单位
C100usequ30h; 10ms记数单元
LEDBufequ0
LEDequP1.0
org0000h
ljmpStart
org000bh
方式 1 与方式 2 的区别不仅在于它是16 位计数,同时在于它不能重新装入初值,赋值时要分高八位和低八位分别赋值,并且必须进入中断时手动重装初值
T0Int:
movTH0, #high(t100us)
movTL0, #low(t100us)
pushPSW
mova, C100us+1
jnzGoon
decC100us
Goon:
decC100us+1
mova, C100us
orla, C100us+1
jnzExit;100us 记数器不为0,返回movC100us, #high(Tick)
movC100us+1, #low(Tick) cplLEDBuf
记数器为0,重置记数器;取
反
Exit:
popPSW
reti
Start:
movTMOD, #01h
1,定时器
movIE, #10000010b
IT0 = 1
setbTR0
开始定时LED方式
;; 100us; EA=1,clrLEDBuf
clrLED
movC100us, #high(Tick)
movC100us+1, #low(Tick)
Loop:
movc, LEDBuf
movLED, c
ljmpLoop
end
硬件仿真结果说明:
程序开始执行后LED灯以5s为周期重复的点亮,并且每次点亮时可以维持5s,即LED灯会亮5s,然后灭5s•…如此循环往复。
从现象中可以看出,程序实现了在P1.0 口周期性地输出周期为10s的方波,且占空比为1:1,使得LED灯出现上述点亮规律。
继续阅读。