定时器定时1秒
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
晶振6MHz ,每机周2 us T0 定时100ms ,计数5次,即可实现500ms 定时。
计数值为50000次。
#include<reg51.h>
unsigned char cont; /*声明cont*/
main()
{
while(1) /*无限循环*/
{
P1=0x01; /*p1^0亮*/
TMOD=0x01;
TH0=-50000/256; /*设置初值*/
TL0=-50000%256;
EA=1;
ET0=1;
TR0=1;
}
}
void int0() interrupt 1
{
TH0=-50000/256;
TL0=-50000%256;
cont++;
if(cont==5) /*每次100ms 到了5次500msP1左移一位*/
P1=P1<<1;
}
下面一段文字是对8051单片机定时器初值的计算描述,希望对你有所帮助,对于你的提问,根据下面文字的说明,可以得到初值为:FE0CH(65536-500)
定时器/计数器可用软件随时随地起动和关闭,起动时它就自动加“1”记数,一直记到满,即全为“1”,若不停止,计数值从全“1”变为全“0”,同时将计数溢出位置“1”并向CPU发出定时器溢出中断申请。对于各种不同的工作方式最大的定时时间和计数数不同。这里在使用中就会出现两个问题:
一是要产生比定时器最大的定时时间还要小的时间和计数器最大计数次数还要小的计数次数怎么办?
二是要产生比定时器最大的定时时间还要大的时间和计数器最大计数次数还要大的计数次数怎么办?
解决以上第一个问题只要给定时器/计数器一个非零初值,开定时器/计数器时,定时器/计数器不从0开始,而是从初值开始,这样就可得到比定时器/计数器最大的定时时间和计数次数还要小的时间和计数次数,解决第二个问题就要用到循环程序了,循环几次就相当于乘几。例如要产生1秒的定时你可先用定时器产生50MS的定时,再循环20次就行了,因为1S=1000MS,也可用其它的组合。有时也可采用中断来实现。由上可见,解决问题的基本出路在于初值的计算,下面就来具体讨论计数器的初值计算和最大值的计算。
我们把计数器从初值开始作加1计数到计满为全1所需要的计数值设定为C和计数初值设定为D,由此便
可得到如下的计算通式:
D=M-C (1)
式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213;在方式1时M为216;在方式2和方式3时M为28。
3、定时器初值的计算
在定时器模式下,计数器由单片机脉冲经12分频后计数。因此,定时器定时时间T的计算公式为:
T=(TM—TC)12/fOSC (µs)(2)
式中TM为计数器从初值开始作加1计数到计满为全1所需要的时间,
TM为模值,和定时器的工作方式有关;fOSC是单片机晶体振荡器的频率,TC为定时器的定时初值。
在式(2)中,若设TC=0,则定时器定时时间为最大(初值为0,计数从全0到全1,溢出后又为全0)。由于M的值和定时器工作方式有关,因此不同工作方式下定时器的最大定时时间也不一样。例如:若设单片机主脉冲晶体振荡器频率fOSC为12MHz,则最大定时时间为:
方式0时TMmax=213×1µS=8.192ms
方式1时TMmax=216 ×1µs=65.536ms
方式2和3时TMmax=28 ×1µs=0.256ms
例1、设方式0工作时,定时时间为1ms,时钟振荡频率为6MHz,
解:将数据代入公式(2)得:
(213—TC)12/6 µS =1ms=1000µS
TC=213-500=7692
化成二进制数为TC=11110000 01100
根据13位定时器/计数器特性,高8位F0H送至TH0低5位0CH送TL0,一般TL0的高三位置“0”,可用下列指令实现。
MOV TL0,#0CH;5位送TL0寄存器
MOV TH0,#0F0H;8位送TH0寄存器
例2若单片机时钟频率fOSC为12MHz,请计算定时2ms所需的定时器初值。
解:由于定时器工作在方式2和方式3下时的最大定时时间只有0.256ms,因此要想获得2ms的定时时间定时器必须工作在方式0或方式1。
若采用方式0,则根据式(2)可得定时器初值为:
TC=213-2MS/1µs=6129
用计算机附件中的计算器可将6129转换为十六进制数为1830H
注意:这不是定时器工作在方式0时的初值,因定时器工作在方式0时是13位,高字节8位,低字节5位,所以还要进行适当的变换,因为
1830H 可写成 0001 1000 0011 0000
按13位重新组合成00011000001 10000 这组数就可拼成
1100 0001 0001 0000
这样就得到定时器工作在方式0时的初值C110H
即:TH0应装C1H;TL0应装10H(高三位为0)。
若采取方式1,则有:
TC=216-2MS/1µs=63536=F830H
即:TH0应装F8H;TL0应装30H。
例3、设T1作定时器,以方式1工作,定时时间为10MS;T0作计数器,以方式2工作,外界发生一次事件即溢出。
解:T1的时间常数为:
(216-TC)×2µs=10ms
TC=EC78H
初始化程序:
MOV TMOD,#16H ;T1定时方式1,T0计数方式2,即置TMOD寄存器的内容为00010110 MOV TL0,#0FFH ;T0时间常数送TL0
MOV TH0,#0FFH ;T0时间常数送TH0
MOV TL1,#78H ;T1时间常数(低8位)送TL1
MOV TH1,#0ECH ;T1时间常数(高8位)送TH1
SETB TR0 ;置TR0为1允许T0启动计数
SETB TR1 ;置TR1为1允许T1启动计数
例4 设定时器T0,以方式1工作,试编写一个延时1秒的子程序。
解:若主频频率为6MHZ可求得T0的最大定时时间为:
TMmax=216 ×2µs=131.072ms
我们就用定时器获得100ms的定时时间再加10次循环得到1秒的延时,可算得100ms定时的定时初值: (216-TC)×2µs=100ms=100000µs
TC=216-50000=15536
TC=3CB0H
程序如下:
ORG 0000H
MOV TMOD,#01H
MOV R7,#10
TIME: MOV TL0,#0B0H
MOV TH0,#3CH
SETB TR1
LOOP1:JBC TF0,LOOP2
JMP LOOP1
LOOP2:DJNZ R7,TIME
RET
END