RCAP2H和RCAP2L是定时器2的16位捕捉/自动重载寄存器
这个百科会对你特别有帮助
>
本题技术初值计算如下:
X=2^16-2010^(-3)/(12/1210^6)
=65536-20000=45536=B1E0H
T1INTCOUNT DATA 30H;中断次数累加
ORG 0000H
LJMP START
ORG 001BH
LJMP Timer1Interrupt
START:
MOV SP,#60H
LCALL InitTimer1
MOV T1INTCOUNT,#0;
LOOP:
LJMP LOOP
InitTimer1:
MOV TMOD,#10H;控制字
MOV TH1,#0B1H;初值高位
MOV TL1,#0E0H;初值低位
SETB EA
SETB ET1
SETB TR1
RET
Timer1Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH1,#0B1H
MOV TL1,#0E0H
INC T1INTCOUNT
MOV A,T1INTCOUNT
CJNE A,#5, Timer1Interrupt_EXIT
MOV T1INTCOUNT,#0
CPL P17;在P17脚上输出周期为02秒的方波(高低电平各100ms)
Timer1Interrupt_EXIT:
POP ACC
POP DPL
POP DPH
RETI
END
楼上用的是查询法,我来个中断函数的 呵呵
#include<reg52h>
sbit a0=P1^1;//端口定义
int count=0;//计时变量初始化
/T1中断服务函数/
void T0Int() interrupt 3 using 0 //
{
count++;//200us 加一次
if(count==100)//一百次之后,取反输出端口
{
count=0;//清零计数值
a0=~a0;//端口取反
}
}
void main()
{
TMOD=0X02; //设置T0工作方式与为方式2
TH0=256-200; //设置高位重装的初值
TL0=256-200; //设置低位计数值
TR1=1; //启动定时器0
ET1=1;
EA=1; //开总中断
while(1);//等待中断
}
init()
{
TMOD=0x10;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
TR1=1;
ET1=1;
EA=1;
}
51 单片机中定时器,是个 16 位的加法计数器。
其内容是 0000H ~ FFFFH,即:0 ~ 65535。
每隔一个机器周期,加一次一。加到 65536,就会溢出,产生中断。
在外部振荡器频率 = 110592 MHz 时,机器周期=108506944us。
要想定时 1000us,这就有点困难了。
在外部振荡器频率 = 12 MHz 时,机器周期=1us。
要想定时 1000us,就可以设初始值为:65536 - 1000 = 64536。
分成高、低八位后,写入 THx、TLx,即可。
求出:初始值、分成高低八位,可以人工计算,那么,程序就是:
TH1 = 0XFC;
TL0 = 0X67;
也可以由编译软件来算,程序中,写出公式,这就是:
TH0 = (65535 - 1000)/256;
TL0 = (65535 - 1000)%256;
-------
又因为,中断响应,是不会及时发生的,通常,都会迟到 3 ~ 8 个机器周期。
用 C 语言编程,会耽误更多吧。
所以,定时时间,应该缩短一些,定时才准确。
因此,才有+ 28 的算法。
加上这个数之后,初始值,就大了一些,更接近 65536,定时时间,就短了。
这是个经验数据。
以上就是关于求大神们。那个定时器初始化子程序中的RCAP2H与RCAP2L表示什么啊,还有他们后面的等式是什么意思啊定时全部的内容,包括:求大神们。那个定时器初始化子程序中的RCAP2H与RCAP2L表示什么啊,还有他们后面的等式是什么意思啊定时、假设单片机的晶体振荡器的频率是12MHz,利用定时器1采用方式1定时20ms,计算出初值并写出整个、设89C52单片机Fosc=12MHz。试编写一段程序,对定时器T1初始化,使之工作在模式2,产生200us定时,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)