考试使用T2定时器实现1秒精确定时附有C程序和汇编程序先看看再说吧不错免费.docx
- 文档编号:10939688
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:12
- 大小:21.99KB
考试使用T2定时器实现1秒精确定时附有C程序和汇编程序先看看再说吧不错免费.docx
《考试使用T2定时器实现1秒精确定时附有C程序和汇编程序先看看再说吧不错免费.docx》由会员分享,可在线阅读,更多相关《考试使用T2定时器实现1秒精确定时附有C程序和汇编程序先看看再说吧不错免费.docx(12页珍藏版)》请在冰豆网上搜索。
考试使用T2定时器实现1秒精确定时附有C程序和汇编程序先看看再说吧不错免费
[考试]使用T2定时器实现1秒精确定时附有C程序和汇编程序先看看再说吧,,不错。
免费
使用T2定时器实现1秒精确定时
使用T2定时器实现1秒精确定时2009-10-0216:
22[小雨的成长]中断精确定时1S作者小雨日期2009-4-178:
12:
00这一课,我们将告诉大家如何精确定时1S。
要精确定时,就需要用到中断方式,并工作在自动重装载方式。
这里我们用到了T2定时器,它具有16位的自动重装载功能。
我们知道,T0,T1的自动重装载功能都是8位的,用它们将会带来很大的误差。
T2定时器,它有一个专门的自动重装载寄存器,当计数满了以后,它将我们预置进去的数自动的载入TH2,TL2这样就都很好的保证精确定时。
我们用的是12MHZ的晶振。
就算是计满也只有几十毫秒。
要定时一秒,就需要一个变量来保存溢出的次数,积累到了多少次之后,才执行一次操作。
这样就可以累加到1秒或者更长的时间才做一次操作了。
T2寄存器还有一个和其他寄存器不一样的地方,就是它的中断标志位TF2要软件清零。
现在我们来计算一下,要精确定时,那么,进去中断的次数是越少越好,这样,数据更精确,还能很好的防止对主函数的影响。
T2定时器预装载值的计算:
设晶振为12MHz,每秒钟可以执行1000000(12000000/12)个机器周期。
而T2每次溢出时最多经过了65536个机器周期。
我们应该尽量让T2定时器的溢出中断的次数最少。
选择每秒中断14次,每次溢出1000000/14=71428.57个机器周期,不为整数且超出65536。
选择每秒中断16次,每次溢出1000000/16=62500个机器周期,小于65536,有效。
选择每秒中断20次,每次溢出1000000/20=50000个机器周期,小于65536,有效。
其他的就不再算了,我们通过上面的计算,我们可以发现,我们可以选择的方式有很多,但是最佳的是每秒中断16次,每次溢出62500个机器周期。
下面看程序:
include
#defineucharunsignedchar
#defineuintunsignedint
sbitLed=P0^0;//定义LED位
voidTimer2()interrupt5//调用定时器2,自动重装载模式
{
staticuchari=0;//定义静态变量i
TF2=0;//定时器2的中断标志要软件清0i++;//计数标志自加1
if(i==16)//判断是否到1s
{
i=0;//将静态变量清0
Led=~Led;//LED位求反
}
}
voidmain()
{
RCAP2H=(65536-62500)/256;//重装载计数器赋初值RCAP2L=(65536-62500)%256;
ET2=1;//开定时器2中断
EA=1;//开总中断
TR2=1;//开启定时器,并设置为自动重装载模式while
(1);
}
这里我们看到我们在中断中用到了staticuchari,0;定义i为静态函数。
静态函数的特点:
函数值在调用结束后不消失保留原值,即其占用的存储单元不释放。
在下一次该函数调用时,该变量已有值,就是上一次的函数调用结束时的值。
它只赋一次初值。
也就是说,只有在第一次进入中断时staticuchari,0;才对i赋初值,在以后进入中断执行这句时,不会对i赋值。
这里重点给大家讲讲我们开发板上STC单片机的T2定时器的用法。
定时器2是一个16位定时/计数器。
通过设置特殊功能寄存器T2CON中的C/T2位,可将其作为定时器或计数器(特殊功能寄存器T2CON的描述如表1所列)。
定时器2有3种操作模式:
捕获、自动重新装载(递增或递减计数)和波特率发生器,这3种模式由T2CON中的位进行选择。
这里我只将和我们递增计数自动重装载功能有关的几个寄存器,关于T2的其他功能,大家可以参看官方的一些资料。
TF2定时器2溢出标志。
定时器2溢出时置位,必须由软件清除。
当RCLK或TCLK=1时,TF2将不会置位。
TR2定时器2启动/停止控制位。
置1时启动定时器。
C/T2定时器/计数器选择。
(定时器2)
0=内部定时器(OSC/12或OSC/6)
1=外部事件计数器(下降沿触发)
CP/RL2捕获/重装标志。
置位:
EXEN2=1时,T2EX的负跳变产生捕获。
清零:
EXEN2=0时,定时器2溢出或T2EX的负跳变都可使定时器自动重装。
当RCLK=1或TCLK=1时,该位无效且定时器强制为溢出时自动重装。
RCAP2H,RCAP2L是定时器T2一个专门存放预置数的寄存器。
定时器2递增计数到0FFFFH,并在溢出后将TF2置位,然后将RCAP2L和RCAP2H中的16位值作为重新装载值装入定时器2。
RCAP2L和RCAP2H的值是通过软件预设的。
从表一,表二可以看到,因为我们复位后T2CON是全0。
所以,只要我们设制好预置数,开好中断,再将TR2置为1,就能启动T2的递增计数自动重载功能了。
下面汇编程序是由严复平会员写,非常感谢~~
;******************************************************************************
;51汇编定时器T2精确1s定时程序
;功能:
使用T2定时器实现1秒精确定时并闪灯
;晶振:
12MHz
;芯片:
AT89S52
;作者:
Jurassic_K.M
;日期:
2009年2月24日
;******************************************************************************
;keil默认情况下只能认识标准的8051的寄存器,T2不再此列,需要手动加入寄存器定义T2CONEQU0C8H;T2控制寄存器,用以程控定时器2和外部中断操作格式
;T2CON.7TF2溢出中断标志位
;T2CON.6EXF2外部中断标志位
;T2CON.5RCLK串行接口接受时钟标志位
;T2CON.4TCLK串行接口发送时钟标志位
;T2CON.3EXEN2外部允许控制位
;T2CON.2TR2运行控制为
;T2CON.1C/T2定时器/计数器功能选择位
;T2CON.0CP/RL2捕捉/重装载标志位
T2MODEQU0C9H;T2控制寄存器,用以定时器2在装入计数方式选择
;T2MOD.0DCEN向下计数允许位
;T2MOD.1T2OET2输出允许位
TL2EQU0CCH;T2计数寄存器低字节
TH2EQU0CDH;T2计数寄存器高字节
TR2EQU0C8H.2;T2启动位
RCAP2LEQU0CAH;T2计数重栽陷阱寄存器低字节RCAP2HEQU0CBH;T2计数重栽陷阱寄存器高字节TF2EQU0C8H.7;定时计数器2计满回零溢出中断请求标志位ET2EQUIE.5;定时器T2中断允许;PT2EQUIP.;定时器T2的中断
优先级控制位,不过我不确定这个具体是那一位,
;因此空了下来,有知道的朋友请告诉我一声
org0000h
sjmpmain
org002bh
sjmptimer2_isr
org0033h
main:
clrp1.7
movr0,#16
movrcap2h,#0bh
movrcap2l,#0dch
;movth2,#0bh;;movtl2,#0dch;这两句可要可不要
setbea
setbet2
movt2con,#04h;设置t2定时器的工作模式为16位自动重装载定时器方式
sjmp$
timer2_isr:
clrtf2;定时器t2不同与定时器t0和t1,它需要软件清零
djnzr0,next
cplp1.7
movr0,#16;每次退出前,对软件计数器重装初值
next:
nop
nop
reti
end
------------------------------
高准确度时钟程序算法2009-09-2721:
09作者:
广州增城市电力局(511300)黄沛芳来
源:
《电子技术应用》
摘要:
通过对引起实时时钟计时误差因数的分析,给出了一种提高实时时钟长期计时准
确度的实用而有效的软件方法。
该方法具有成本低、易实现、通用性强、彻底校正等优点。
关键词:
实时时钟准确度定时器软件校正
电子计时器通常以石英晶振为时钟源。
时钟源的频率通常为几十kHz乃至几十MHz,而学用时钟的最小计单位一般在0.01s,1s。
高频的时钟源脉冲通过分频器后产生基本定时脉冲。
电子计时器的计时部分就是对基本定时脉冲进行累加,产生秒、分、时等时间信息乃至日、月、年等日期信息。
1引起计时误差的因数
一个常规电子计时器的计时准确度,取决于晶振标称频率(fs)与实际频率(fo)的频率偏差和晶振频率的时漂、温漂等离散参数。
普通晶振的实际频率与标称频率有较大的偏差,可达万分之五(万分之5),折算到一天计时误差就是43.2s。
一般室内气温变化在每天10?
左右,对应晶振频率温漂<10
-5,若以一段较长的时间取温漂的平均值则更小。
因此电子计时器的误差主要取决于晶振实际频率与标称频率的偏差。
2减少计时误差的方法
2.1纯硬件方法
对于纯硬件计时电路,因分频系数N固定不变,要提高计时准确度只能调整fo,使得已尽可能接近于fs。
常规减少计时误差的方法是:
微调元件L、C、R的参数,调节硬件频率,使得时钟源的频率误差减小。
但此方法操作复杂,没有一定的电子技术知识和专用仪器很难校准,而且会降低晶振频率稳定度。
2.2纯软件方法
由微控制器控制的实时时钟,可以采用软件的方法消除晶振实际频率与标称频率间误差引起的计时误差。
令晶振标频率为fs,而实际频率为fo,则fs=k×fo。
若fs=fo则k=1,否则k?
1。
TNS=Ns×(1/fs)=Ns×(1/k)×(1/fo),Ns是在标称频率fs下定时TNS的分频系数。
由微控制器控制的实时时钟,可以用软件模拟,将1/k归入总的计时程序中,从而消除fs和fo间偏差引来的计时误差。
对于专用硬件时钟电路如:
DS1320、PCF8583等,可以采用每小时或每10分钟读出时间,然后乘上1/k再写回芯片的方法校正。
对于采用可编程分频定时器,由软件模拟时钟功能的软件实时时钟,则有更好的提高计时准确度的方法。
因为定时器的分频系数是可以动态改变的,如89C52内置的16位计数器,分频系数可以在1,2
16内任意选取。
令N=(1/k)Ns作为分频系数写入计数器,这样每个基本计时周期TN=TNS,从而实现软件校正定时周期。
在(1/k)×Ns刚好为整数时,可以使得计时误差为0。
大部分的情况(1/k)×Ns并不是整数,若将四舍五入后的值作为Ns,就会带来的量化误差,最大可达(1/2N),这是一个不容忽视的问题。
以12MHz的89C52T2定时器定时10ms为例,每天最大量化误差累加是:
24×3600?
(2×10000)=4.32s。
若在片内RAM中定义1个字节发尾数,令它的满码值为1/N,则最大量化误差就从原来的1/2N下降到1/(2×N×256)。
对应于上述的10ms定时程序,其最大量化误差的累加值由原来的4.32秒/天减少到0.016875秒/天,这是很大的改进。
根据精度要求,可以在片内RAM中定义2个字节,令它的满码值为1/N,这样最大量化误差就可降为1/(2×N×65536)。
减少量化误差的具体算法是:
对于使用89C52的T2决定器,若标称为12MHz的晶振实际长期平均振荡频率fo=12.0006MHz,量化精度取1字节,取TNS=10ms,则分频系数为:
N0=fo/(12×TNS)=12.0006/(12×106×10
-2)=10000.5
令N=INT(N0)=10000
NT=INT[(N0-N)×256+0.5]=128
Ni为第I决定时值,可能是10000或10001,这取决于Nti的进位;Nti为第I次尾数暂存值。
每次定时中断服务程序均执行
(1)式,取得第I次定时计数值,然后实时时钟增加10ms,完成时钟功能。
值得注意的是,Ni是实际的计数值,至于实际写入特定定时器的数值,则须根据具体定时器的递减、递加计时性质分别写入Ni或Ni的补码,同时定时器在溢出到新的定时值装入并开始新定时周期这段时间,将TLOAD考虑在内。
例如89C52
T2工作于自动重装定时初值、递加定时方式时,实际写入定时器T2的捕获/自动重装载寄存器(Rcap
2H,Rcap2L)的值是Ni的补码,即65536-Ni;而对于89C52T0和T1定时器则实际写入的定时初值是:
Ni的补码+TLOAD对应的机器周期数。
3测量晶振实际长期振荡频率
没有专用仪器,怎样测得晶振实际长期振荡频率,有一个很简单的方法。
以标称频率下的定时计数值Ns作为实际计数值,在电台报时时将时间设置正确,然后让它运行一段较长的时间,再与电台的报时比较求出误差的秒数,即可算出实际频率。
例如晶振标称频率是12Mz,时钟运行了10天,快了432s,则
fo=[(10×24×3600+432)/(10×24×3600)]×12
=1.0005×12
=12.0006MHz
若将上述算法编成程序,让用户直接输入N和NT的值;或输入运行了多少天、时、分、秒,快或慢了多少秒,让系统自动算出N和NT,将会为从根本上校准时钟带来极大方便。
任何人都可以轻松地提高时钟准确度而无需专业知识和专用仪器。
现在微控制器已广泛应用于人们日常生活的各个方面,电子时钟也随着它融入到各种电器和设备中,如专门时钟功能的石英表和各种附带电子计时器的电器如手机、普通液晶显示电话、VCD机、DVD机、电视及高档音响、空调遥控器、电力系统微机自动化设备等。
高档专用计时器如高档石英表,因为计时是它的主功能,须保证计时准确度而对计时时钟源准确度要求严格,每天误差在1s以下。
以上提到的其它电器,其时钟只是的一个附带功能,出厂时一般不严格校正,甚至根本不做任何校正。
所以误差通常在1秒/天以上,有些达10秒/天以上,每天都需校正,否则运行几天就会因误差太大而变得不可信,令用户不胜烦恼。
在电力系统中,无人值班变电部须安装无功自动控制设备。
它根据一天中的不同时间段和电网无功情况自动投退电容器组,使得电网的功率因数尽可能接近于1,以利于经济运行。
但有些设备仙部时钟每天误差>5分种。
若将本文算法编入计时程序中,让用户自己校正定时参数,将大大提高各种附带时钟的计时准确度。
将基于软件提高实时时钟准确度的算法应用于普通石英晶振,利用89C52
T2定时器的软实时时钟,未作校正每天11s;进行软件计时校正后,每10天的计时误差<1s。
本文提出的基于软件提高时钟准确度的算法,具有极高的实用价值。
/*
C52有T0T1T2三个定时器其中T2定时器比较特殊T2为16位的定时器可以设置成自动载入
TF2中断标识位需要手动清零也就是软件置零这样才能响应下一次中断
11.0592MHZP1为流水灯每次中断时间设置为20MS
*/
#include
voidTime1_Init(void);
voidTime0_Init(void);ucharflag=0xf0;uintnum=0;
uintdi=0;
uintaa=0;
voidmain(void){
Time0_Init();
Time1_Init();
Time2_Init();
TR0=1;
TR1=1;
TR2=1;
while
(1)
{
if(aa>=50)
{
flag=~flag;
aa=0;
}
P1=flag;
}
}
////////////////////////////////////////////////////////
一次定时20MSvoidTime2_Init(void){
EA=1;
ET2=1;
//T2CON
EXEN2=0;
C_T2=0;
TF2=0;
RCAP2L=(65535-18432)%256;
RCAP2H=(65535-18432)/256;
}
voidTime2(void)interrupt5{
TF2=0;
aa++;
}
//////////////////////////////////////////////////////////////////
voidTime1_Init(void){
EA=1;
ET1=1;
TMOD|=0x30;
TH0=(256-184);
}
voidTime0_Init(void){
EA=1;
ET0=1;
TMOD|=0X03;
TL0=(256-184);
}
//定时0.2msT0voidTime0(void)interrupt1{
num++;
TL0=(256-184);}
voidTime1(void)interrupt3{
TH0=(256-184);
di++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 考试 使用 T2 定时器 实现 精确 定时 附有 程序 汇编程序 看看 再说 不错 免费