单片机的定时器 计数器 的用法_第1页
单片机的定时器 计数器 的用法_第2页
单片机的定时器 计数器 的用法_第3页
单片机的定时器 计数器 的用法_第4页
单片机的定时器 计数器 的用法_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章单片机的定时器/计数器定时/计数器的结构与工作原理6.1定时器的控制6.2定时/计数器的工作方式6.3定时/计数器的编程和应用6.4纯软件定时/计数方法:定时——空循环预定周次,等待预定时间计数——读取I/O口电平,统计变化次数基本思路:由CPU统计状态变化次数,待预定结果出现后结束统计。delay(unsigned

inttime){unsignedintj=0;

for(;time>0;time--)

for(j=0;j<125;j++);}存在问题:占用过多CPU机时2023/2/136.1定时/计数器的结构和工作原理

定时/计数器的结构基本型:T0,定时、计数。T1,定时、计数、串口波特率发生器。增强型:增加了T2。TH1、TL1TH0、TL0TCONTMOD定时/计数器的结构2个16位计数器T0(TH0、TL0)和T1(TH1、TL1)——加1计数器2个控制寄存器TCON和TMOD——管理计数器的运行2个外部引脚T0(P3.4)和T1(P3.5)——接入外部脉冲2023/2/15定时/计数器的工作原理实质是16位加1计数器定时器模式时,是对内部机器周期计数。计数值乘以机器周期就是定时时间计数器模式时,是对外部事件计数。脉冲由T0(P3.4)或T1(P3.5)引脚输入。

注意:(若计数值为N,计数初值为X)溢出信号使TF0或TF1置1,并发出中断请求,16位时有:

N=65536-X,或X=65536-N12MHz晶振时,计数频率低于0.5MHz

单片机软硬件联合定时/计数方法:等待CPU响应系统时钟脉冲加1计数器溢出标志溢出定时器外来信号脉冲加1计数器溢出标志溢出等待CPU响应计数器外来信号脉冲加1计数器溢出标志溢出等待CPU响应系统时钟脉冲K定时/计数器定时器的本质是计数器(对时钟脉冲计数),计数器则是对外来脉冲计数.计数器的溢出空间可随计数初值改变→定时时间tt=(计数器最大空间-计数初值)×机器周期

=(2n-a)×12/fosc(s)基本工作原理:t与n、a、fosc三个因素有关

TFx(X=0、1)Tx端(每个机器周期产生一个计数脉冲)逻辑开关功能:=0→定时器方式,=1计数器方式

TFx(X=0、1)Tx端计数值N=(计数器满计数值-计数初值)=(2n–a)N与n、a两个因素有关定时/计数器的控制关系(以T1为例)门控位GATE=0-允许TR1启动计数器GATE=1-允许INT1启动计数器启动控制位TR1=1-启动计数器TR1=0-停止计数器外部中断1参与定时器的启停管理中断请求标志位TF1=1-请求TR1=0-复位

T1模式选择位=0-定时=1-计数6.2定时/计数器的控制2023/2/110工作方式寄存器TMOD

76543210TMODGATEC/TM1M0GATEC/TM1M0字节地址:89HGATE:门控位。GATE=0时,只要TRx为1,就可启动计数器工作;GATA=1时,定时器的启动还要加上INTx引脚为高电平这一条件。

C/T:模式选择位。清0为定时模式,置1为计数方式。M1M0:工作方式设置位。可设置四种工作方式(见下页)。2023/2/111M1M0工作方式说明00方式013位定时/计数器01方式116位定时/计数器10方式28位自动重装定时/计数器11方式3T0分成两个独立的8位定时/计数器;T1此方式停止计数注意:TMOD不能进行位寻址

GATEC/TM1M0GATEC/TM1M0D7D5D4D3D2D1D0TMODD6(89H)T1T0

T1方式选择位00-方式001-方式110-方式2T1工作状态

T1

T0

TF0

TR0

T0脚INT0T0方式选择位00-方式001-方式110-方式211-方式3T0工作状态GATEC/TM1M0GATEC/TM1M0D7D5D4D3D2D1D0TMODD6(89H)T1T0

注意:TMOD只能以字节方式进行初始化例如,设置T0为定时器方式1,允许TR0启动;T1为计数器方式0,允许INT1启动。则TMOD=11000001B=0xc1又如,系统上电默认值为TMOD=0,则默认状态应为:T0和TI均为定时器方式0,允许TR0、TR1启动。2023/2/114控制寄存器TCON

76543210TCONTF1TR1TF0TR0字节地址:88HTFx:Tx溢出标志位。响应中断后TFx有硬件自动清0。用软件设置TFx可产生同硬件置1或清0同样的效果。TRx:Tx运行控制位。置1时开始工作;清0时停止工作。TRx要由软件置1或清0(即启动与停止要由软件控制)。TF1TR1TF0TR0IE1IT1IE0IT08FH8DH8CH8BH8AH89H88HTCON8EH(88H)定时器控制位外部中断控制位

T1

T0

TF0

TR0

T0脚INT0注意,系统上电默认值为TCON=0,则默认状态应为:TR0和TR1均为关闭状态、电平中断触发方式、没有外部中断请求M1M0工作方式功能说明00110101012313位定时/计数器16位定时/计数器8位自动重装定时/计数器3种定时/计数器关系T0工作方式注意:T0有4种工作方式,每种工作方式都有定时和计数2种方式。T1只有3种工作方式(T0的方式3中占用了T1的部分资源)。M1M0工作方式功能说明00101001213位定时/计数器16位定时/计数器8位自动重装定时/计数器T1工作方式学习顺序:方式1→方式2→方式06.3定时/计数器的工作方式2023/2/117方式1:16位方式

X=216-N=65536-N计数范围:1~65536

计数初值要分成2个字节分别送入TH0、TL0方式1定时时间:t=(216-a)×12/fosc(s)——使用16位定时/计数器(THx+TLx)(M0M1为01组合时)定时范围为1~65,536μs(≈65ms)。最大定时时间(a=0,fosc=12MHz):t=216(s)=65536(s)定时方式最大计数值:N=65536(脉冲)计数值:N=(216–a)由于检测一个负跳变需要2个机器周期,即24个振荡周期,故最高计数频率=。计数方式故,对于12MHz晶振,最大外部脉冲的频率为0.5MHz。实例1

设单片机的fosc=12MHz,采用T0定时方式1在P1.0脚上输出周期为2ms的方波。虚拟示波器分析:周期为2ms的方波由2个半周期为1ms的正负脉冲组成方波输出原理:定时1ms后将端口输出电平取反。2ms1msTH0

=

0xfc

TL0

=

0x181ms定时的计数初值应为:a=216–t*fos/12=216–1000*12/12=64536=0xfc18注意:需要不断重装计数初值。(1)查询方式#include<reg51.h>sbitP1_0

=

P1^0;main(){

TMOD

=

0x01;

//设置T0定时方式1(00000001B)TR0=1;//启动T0

for(;;){

TH0

=

0xfc;

//装载计数初值

TL0

=

0x18;

do{

}while(!TF0);//等待TF0溢出P1_0

=!P1_0;

//定时时间到P1.0反相

TF0

=

0;

//TF0标志清0

}}T0图6.14实例1仿真波形图(2)中断方式#include<reg51.h>sbitP1_0=P1^0;timer0()interrupt1{//T0中断函数P1_0=!P1_0; //P1.0取反

TH0=0xfc; //装载计数初值

TL0=0x18;}main(){

TMOD=0x01; //T0定时方式1

TH0=0xfc; //装载计数初值

TL0=0x18;EA=1; //开总中断

ET0=1; //开T0中断

TR0=1; //启动T0 while(1);}注意:中断响应后系统可自动将TFx标志位清0小结:使用定时/计数器的步骤强调:TMOD的设置只能以字节形式给出T0

(1)设置TMOD——确定定时/计数器的工作状态

(2)计算计数初值——产生期望的定时间隔计数初值a=216-t×fosc/12(t≤65536s)THx=a/256TLx=

a/

%256

装载计数初值:3)确定采用何种方式处理溢出结果若是查询方式——采用条件判断语句若是中断方式→中断初始化设置和中断服务程序:do{}while(!TFx);

//x=0或1……ETx=1;//开定时x中断,x=0或1EA=1; //开总中断tx_srv()interruptn

{//n=1或3……}4)启动定时器:

TR0=1

或TR1=1

5)进行定时或计数结束后的其它工作6)为下次定时/计数做准备(清TFx标志+重装载计数初值)若是中断方式,则无需软件清TFx标志位;若是查询方式,需要软件清除TFx标志位。2023/2/129方式2:8位自动重装方式

X=28-N=256-N计数范围:1~256

特别适合于脉冲信号发生器采用8位计数器,延时时间t=(28-a)×12/fosc(微秒)→12MHz时的最大定时量为256s;可自动重装载计数初值(TLx溢出后,THx数值可自动装入TLx);因没有装载计数初值造成的定时延误,方式2定时精度相对较高。方式2(1)查询方式#include<reg51.h>sbitP1_0

=

P1^0;main(){TMOD

=

0x02;

TH0=

TL0=0x06;

TR0=1;

for(;;){

do{}while(!TF0);

P1_0

=!P1_0;

TF0

=

0; }}(2)中断方式#include<reg51.h>sbitP1_0=P1^0;timer0()interrupt1{P1_0=!P1_0; }main(){TMOD=0x02;

TH0=TL0=0x06;EA=ET0=1; TR0=1;

while(1);}实例2采用T0定时方式2在P1.0口输出周期为0.5ms的方波(设fosc=12MHz)。分析:计数初值TL0=((256-250)*12/12)%256=0x06,TMOD=0x02周期为0.5ms方波实例3

将第4章实例5“计数显示器”中的软件查询法进行按键检测改用T0计数器方式2,并以中断方式编程。【解】原图中按键是由I/O口P3.7引脚接入的,本实例需要将其改由T0(P3.4)引脚接入。分析:将T0设置为计数器方式2,设法使其在1个外部脉冲到来时就能溢出(即计数溢出周次为1)产生中断请求。计数初值为:a=28–1=255=0xff初始化TMOD=00000110B=0x06实例3参考程序运行效果2023/2/137方式0:13位方式

工作方式0使用13位的定时/计数器(THi7-0+TLi4-0)定时时间t=(213-a)×12/fosc(μs)计数初值a=213-t×fosc/1212MHz时的最大定时量t=213μs=8.192ms解:计数初值a=213-5000×12/12=3192=110001111000BTH0TL0011000110

0

011000

6 3 1 8H实例4

计算T0方式0定时5ms的计数初值a(设fosc=12MHz)由于方式0的TL0高3位未用(一般填0),因此

a=0110001100011000=6318H即,TH0=0x63;TL0=0x18;除计数器位数不同外,方式0与方式1的逻辑结构并无差异。方式0采用13位计数器是为了与早期产品MCS-48单片机兼容。方式0的初值计算比较麻烦,一般采用方式1替代。方式0方式1应用:定时器——用于定时控制,或作为分频器发生各种不同频率的方波;计数器——用于外部脉冲统计或外部中断源扩充;复杂应用—需要将定时与计数结合起来。6.4定时/计数器的应用实例5由P3.4口输入一个外部低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc=6MHz)。1)将T0设置为1次计数方式2,初值设为0xff。这样P3.4一旦发生负跳变T0就会产生溢出;2)查询TF0标志位。当TF0=1时将T0设置为500s定时方式2,初值a为0x06(=256-500×6/12),同时使P3.0输出低电平;3)查询TF0标志位。待T0再次溢出后使P3.0输出高电平,然后将T0设置为1次计数方式2,如此往复进行。分析:可以采取如下做法:T0实例5参考程序实例5仿真运行效果P3.0P3.4实例6

采用10MHz晶振,在P1.0脚上输出周期为2.5s,高电平占空比为20%的脉冲信号。分析:10兆晶振,方式1最大定时为54.613ms;可以采用定时中断与软件计数联合法:利用定时中断进行中断次数统计;若取10ms产生定时,则2.5s=250次中断之和;则500ms(20%占空比)相当于50次中断之和。a=216-10000×12/10=0xd1202.5s0.5s实例6参考程序实例6仿真运行效果实例7采用定时中断控制流水灯,实现每秒1位,自上而下循环功能(fosc=12MHz)。分析:可以利用20次50ms的定时中断方案,计数初值为:

a=65536-50000×12/12=0x3cb0中断函数的任务过多,不利于实时控制。如何减少中断函数任务?新方案:中断函数中仅做中断次数统计和计数初值重入,控制操作改在主函数中进行。实例6的问题:实例7参考程序实例7运行效果实例8测量从P3.2(INT0)输入的正脉冲的宽度,测量结果以BCD码形式存放在片内RAM40H开始的单元处(设40H地址存放个位,系统时钟为12MHz,被测脉冲信号周期不超过100ms)

。0分析:GATE=TR0=1时允许INT0的脉冲控制定时器的启停,则根据T0先启动、再关闭后的计数值可算出被测脉冲宽度。INT0端信号T0中的脉冲数实例8参考程序INT0端信号T0中的脉冲数0实例8电路脉冲设置(100ms)在Proteus软件中实现C51源码级调试的方法:形成OMF(absoluteobjectmoduleformatfiles,绝对目标文件)格式文件。omf文件设置omf文件加载启动调试omf文件窗口片内RAM窗口实例8的运行结果结果:计数值为50000脉冲→脉宽值为50ms。运行到光标实例8小结1、测量未知脉冲宽度的方法——利用INTx引脚接入待测脉冲

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论