没理解你的问题,看来你对定时器的工作还有一些疑惑,用STC89C52单片机来说,它有3个定时器,分别是T0,T1和T2。
其中T2有捕捉功能。
举例如定时器配置为 16 位定时器/计数器(模式1), TL0 的 8 位和 TH0 的 8 位所构成16位计数器(就是2位数16位,转换为10进制就是0到65535),当它溢出是将置位TCON的TF0位。
如果开了T0中断,将进入T0中断程序(一定要有,哪怕是空的),硬件将自动清除中断标志。
初值的意义就是从这个数字开始到65536溢出,这个差值乘以计数周期就是定时的时间。
如果初值为0,就是最长定时周期,如果为65535,就是来一个计数周期,就会溢出,产生中断。
用一段程序来说明。
要使用定时器,需要设置TMOD定时器寄存器,指定工作模式,设置定时器初值。
开定时器,开中断。
如果不开,就需要程序中手动判断TF0标志位,进行处理。
void T0_init() { TMOD&=0xF0; TMOD|=0x01; TH0=0xEE; TL0=0x00; TR0=1; //开定时器 ET0=1; //开中断} void Timer0() interrupt 1 //中断程序,需要重新赋初值{ static unsigned char cnt=0; TH0=0xEE; TL0=0x00;cnt++; //200次中断,产生1秒标志位 if(cnt>=200) { cnt=0; flag1s=1; LED=~LED; //1sLED指示 } P0 = 0xFF; //消隐 switch(i) //动态切换P0口,显示LED值{ case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=(LedBuff[1]&0x7F);break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i=0; P0=LedBuff[2];break; default:break; }} 附图是T0模式1的结构,89C52可以选择6T(速度快1倍))或12T模式。
定时器计数器模式选择。
是否与外部中断0一起控制启动计数器(脉宽测量)。
来一个计数脉冲TH0TL0加1,到65536,溢出置位标志TF0,产生中断。
题主你好!单片机中0x00作为定时器的初值,在计数时0x00不计算在内,但参与了计数。
为何这样说,从以下分析便可清楚。
1:51单片机的定时器/计数器是加计数器。
工作时该单片机有0至3四种工作方式,每种方式的定时/计数最大值都不一样;2:设定某种方式后,都是定时/计数到该方式最大值后才会溢出,产生中断信号给单片机中CPU。
溢出启动中断后须对中断位清零,重新对定时器高低赋值。
3:假设设定定时工作方式为0方式,此时单片机定时/计数最大值为8192,若设定初值为0x00,启动定时器后,定时器便会以0x00为基数开始加1,直至数满溢出,产生中断。
具体过程参看下图便明白。
从上面波形图可以看出:①:定时初值赋为0x00时,定时从0到1每加一次,都由一个由高(低)到低(高)的高低两个电平组成;②赋初值为零(0x00)时,定时启动后,无论0x00处是高或低电平开始,都竖到1(0x01)才为加1。
故而讲,0x00计数时不计算在内,但参与了计数!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)