1、晶振 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; T
2、R0=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”,若不停止,计数值从全
3、1”变为全“0”,同时将计数溢出位置“1”并向CPU发出定时器溢出中断申请。对于各种不同的工作方式最大的定时时间和计数数不同。这里在使用中就会出现两个问题: 一是要产生比定时器最大的定时时间还要小的时间和计数器最大计数次数还要小的计数次数怎么办? 二是要产生比定时器最大的定时时间还要大的时间和计数器最大计数次数还要大的计数次数怎么办? 解决以上第一个问题只要给定时器/计数器一个非零初值,开定时器/计数器时,定时器/计数器不从0开始,而是从初值开始,这样就可得到比定时器/计数器最大的定时时间和计数次数还要小的时间和计数次数,解决第二个问题就要用到循环程序了,循环几次就相当于乘几。例如要产
4、生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、定时器初值的计算 在定时器模式下,计数器由单
5、片机脉冲经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时
6、 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”,可用下列
7、指令实现。 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 注意:这不是定时器
8、工作在方式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;T
9、0作计数器,以方式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
10、 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






