PIC18F定时器初值计算
- 格式:xls
- 大小:30.50 KB
- 文档页数:2
单片机定时器初值计算公式(51单片机和A VR单片机的初值计算三种方法)单片机定时器初值计算公式
一、51单片机定时器初值计算1、方法一
void main(void)
{
s1=1;
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-46083)/256; //定时器T0的高8位设置初值
TL0=(65536-46083)%256; //定时器T0的低8位设置初值
函数功能:定时器T0的中断服务函数
********************************************************/
void TIme0(void )interrupt 1 using 0 //定时器T0的中断编号为1,使用第1组工作寄存器
{
count++; //每产生1次中断,中断累计次数加1
if(count==20)//如果中断次数计满20次
count=0; //中断累计次数清0
s++; //秒加1
网络上阅读一段程序,定时器初值46083 是怎么计算出来的?一般我们如用AT892051的话定时50MS 就是TH0=(65536-50000)/256;
猜想应该是使用的12M晶体,20次为1S.
2、方法二
10MS定时器初值的计算:
1)晶振12M
12MHz除12为1MHz,也就是说一秒=1000000次机器周期。
10ms=10000次机器周期。
65536-10000=55536(d8f0)。
该模块具有以下寄存器:•A / D控制寄存器0(ADCON0寄存器)•A / D控制寄存器1(ADCON1)进行•A / D控制寄存器2(ADCON2寄存器)•A / D端口配置寄存器1(ANCON0)•A / D端口配置寄存器2(ANCON1)•装入ADRESH(上,A / D结果寄存器)•ADRESL(较低,A / D结果寄存器)ADCON0寄存器,如寄存器23-1所示,控制的A/ D模块的操作。
将ADCON1寄存器,如寄存器23-2所示,电压配置参考和特殊触发。
该ADCON2寄存器寄存器,如寄存器23-3所示,配置A/ D转换时钟源和采集时间和程序理由。
ADCON0寄存器第7位未用:读为0bit 6-2 CHS<4:0>:模拟通道选择位00000=通道00(AN0的)10000=(保留)(2)00001=通道01(AN1)=10001(保留)(2)00010=通道02(AN2的)=10010(保留)(2)00011=通道03(AN3的)=10011(保留)(2)00100=通道04(AN4的)=10100(保留)(2)00101=通道05(AN5使用相同)(1,2)=10101(保留)(2)00110=通道06(AN6)(1,2)=10110(保留)(2)00111=通道07(AN7)(1,2)=10111(保留)(2)01000=通道08(AN8的)=11000(保留)(2)01001=通道09(AN9)=11001(保留)(2)01010=通道10(AN10的)=11010(保留)(2)01011=(保留)(2)=11011(保留)(2)01100=(保留)(2))=11100(复用器断开)(3)01101=(保留)(2))11101=通道29(温度二极管)01110=(保留)(2))11110=通道30(VDDCORE的)01111=(保留)(2)11111 =31频道(1.024V带隙)第1位GO / DONE:A / D转换状态位1 = A / D转换周期进度。
PIC 单片机的定时器精准计时的计算关于PIC 单片机的定时器精准计时的计算
在此用了16C711 单片机的TMR0 做定时中断,希望实现精准计时,在程
序中,TMR0 用了晶振的32 分频,初值#0FCH,因此POPBEAR 兄弟计算出
每个定时中断的计时时间为(256-X)*32*4/32768=0.015625 秒。
注意,问题就
在这里!实际上这个时间是TMR0 的初值被置入后两个指令周期后(见PIC 单
片机定时器/计数器资料)到下一次中断发生时的时间。
如果要用到定时器的精准定时,必须理解这一概念!
如采用32768Hz 的晶振,每个指令周期为122us,在中断处理程序中,到TMR0 的初值被置入,共有7 条指令,加上TMR0 的初值被置入后两个指令
周期,如果中断处理程序不直接放在0004H 地址而采用GOTO 指令的两个周期,一共为11 个指令周期。
也就是说,每个定时中断发生的间隔为0.015625 秒+11*122us。
程序中64 次中断为1 秒,那幺1 秒误差为
64*11*122us=85.9375ms,1 分钟的误差为5.156s。
那幺怎样得到精准计时呢?这就要在对定时器的初值赋值上和中断处理程序中做文章。
关于如何产生一个大致比较精准的时间中断
使用TMR0 的时候,如果仅TMR0 一个中断,显然,使用。
计数初值的计算定时或计数方式下计数初值如何确定,定时器选择不同的工作方式,不同的操作模式其计数值均不相同。
若设最大计数值为 M ,各操作模式下的 M 值为:模式 0 : M=2 13 =8192模式 1 : M=2 16 =65536模式 2 : M=2 8 =256模式 3 : M=256 ,定时器 T0 分成 2 个独立的 8 位计数器,所以 TH0 、 TL0 的 M 均为 256 。
因为 MCS-51 的两个定时器均为加 1 计数器,当初到最大值( 00H 或 0000H )时产生溢出,将 TF 位置 1 ,可发出溢出中断,因此计数器初值 X 的计算式为: X=M- 计数值式中的 M 由操作模式确定,不同的操作模式计数器的长不相同,故M值也不相同。
而式中的计数值与定时器的工作方式有关。
1 、计数工作方式时计数工作方式时,计数脉冲由外部引入,是对外部冲进行计数,因此计数值根据要求确定。
其计数初值: X=M- 计数值例如:某工序要求对外部脉冲信号计 100 次, X=M-1002 、定时工作方式时定时工作方式时,因为计数脉冲由内部供给,是对机器周期进行计数,故计数脉冲频率为 f cont =f osc × 1/12 、计数周期 T=1/f cont =12/f osc 定时工作方式的计数初值 X 等于:X=M- 计数值 =M-t/T=M- ( f osc × t ) /12式中: f osc 为振荡器的振荡频率, t 为要求定时的时间。
定时器有两种工作方式:即定时和计数工作方式。
由 TMOD 的 D6 位和 D2 位选择,其中 D6 位选择 T1 的工作方式, D2 位选择 T0 的工作方式。
=0 工作在定时方式, =1 工作在计数方式。
并有四种操作模式:1 、模式 0 : 13 位计数器, TLi 只用低 5 位。
2 、模式 1 : 16 位计数器。
3 、模式 2 : 8 位自动重装计数器, THi 的值在计数中不变, TLi 溢出时, THi 中的值自动装入 TLi 中。
PIC单片机简答题参考(包括:定时器、ADC、CCP、SPI等4MHZ:void DELAY(unsigned int n){unsigned int j;char k;for (j=0;j<n;j++)for (k=246;k>0;k--) NOP();}简答题定时器延时计算用TMR0定时tms,--> us256 * K * TCY = T(us) –》k = (预分频1:2^1 、1:2^2 …1: 2^8) 向大取(256 - x)*k*TCY = T(us) ----> x = 四舍五入tmr0 = x用TMR1定时tms -- > us65536 * k * tcy = t(us)--> k = (预分频1、2、4、8) 向大取65536 – x) * k * tcy = t --》x = 四舍五入= 0x____ 转成16进制--》TMR1H = 0X__ TMR1L = 0X__TMR2 – PR2TMR2延时tms --> us(256) * k * tcy = t us --> k = (分频值2^k) 往上取--》k = k1 前分频* k2后分频k1 = 1、4、8 (取2^k)k2 = 1:1 – 1:16 (取2^k)(PR2 +1) *K *TCY = t(us) --> PR2 = 四舍五入CCP模块PWM计算PWM模式参数计算tp td = _0% tp1.周期Tp=256×K (TMR2预分频值) ×TCY --> K= 1:1、1:4、1:16 (向上取) 如算出K = 1.953 应取K=42.(PR2 +1) *K *TCY = TP(us) --> PR2 = 四舍五入3.Td=DC1×K (TMR2预分频值) ×Tosc(tcy / 4) --> DC1 = 化为16进制–》化为二进制DC1=(CCPR1L:CCP1CON<5:4>) 10 位--》可得CCPR1L和CCP1CON<5:4>的值。
51单片机定时器初值的计算一。
10MS定时器初值的计算:1.晶振12M12MHz除12为1MHz,也就是说一秒=1000000次机器周期。
10ms=10000次机器周期。
65536-10000=55536(d8f0)TH0=0xd8,TL0=0xf02.晶振11.0592M11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。
65536-9216=56320(dc00)TH0=0xdc,TL0=0x00二。
50MS定时器初值的计算:1.晶振12M12MHz除12为1MHz,也就是说一秒=1000000次机器周期。
50ms=50000次机器周期。
65536-50000=15536(3cb0)TH0=0x3c,TL0=0xb02.晶振11.0592M11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。
65536-46080=19456(4c00)TH0=0x4c,TL0=0x00三。
使用说明以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。
而T 每次溢出最多65536 个机器周期。
我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的干扰也就最小。
开发的时候可能会根据需要更换不同频率的晶振(比如c51单片机,用11.0592M的晶振,很适合产生串口时钟,而12M晶振很方便计算定时器的时间),使用插接式比较方便。
对12MHz 1个机器周期1us 12/fosc = 1us方式0 13位定时器最大时间间隔 = 2^13 = 8.192ms方式1 16位定时器最大时间间隔 = 2^16 = 65.536ms方式2 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us定时5ms,计算计时器初值 M = 2^K-X*Fosc/12 12MHz 方式0: K=13,X=5ms,Fosc=12MHz 则M = 2^13 - 5*10^(-3)*12*10^6/12= 3192 = 0x0C78THx = 0CH,TLx = 78H,方式1: K=16,X=5ms,Fosc=12MHz 则M = 2^16 -5*10^(-3)*12*10^6/12= 60536 = 0xEC78THx = ECH,TLx = 78H,50ms 12MHz THx = 3CH,TLx = B0H,10ms THx = D8H,TLx = F0H,方式2: 最大时间2^8Fosc/12 = 0.256ms十进制数是怎么来的?6MHz 一个机器周期12/6 = 2us定时1ms 计数初值x(2^16-x)*2us = 1000usx = 2^16 - 500 ,TH,TL 可置-50012MHz 一个机器周期12/12 = 1us12MHz 一个机器周期12/12 = 1us定时50ms 计数初值x(2^16-x)*1us = 50000usx = 2^16 - 50000 ,TH,TL 可置-500定时器计内部晶振频率计数器计外部输入CPU脚上的脉冲个数 P3.4(T0) P3.5(T1) 负跳变加一当晶振为6MHz时,最高计数频率500KHz。