- 1、本文档共45页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4讲 定时器/计数器 Atmel AT89C51 Atmel AT89C52 定时器/计数器的主要特性 C51系列有2个定时/计数器(T0、T1) C52系列有3个定时/计数器(T0、T1、T2) 通过编程设置,每个定时器/计数器可以根据系统时钟实现定时,也可以对外部信号计数(T0/P3.4、T1/P3.5) 每个定时器/计数器都有多种工作方式 每个定时器/计数器都会在预设定时计数时间到时产生溢出,可以通过查询或中断方式处理 使用定时/计数器的步骤 方式选择——TMOD 初值设置——TH0、TL0( TH1、TL1 ) 中断允许——EA、ET0( ET1 ) 启动操作——TR0(TR1) 定时/计数器的方式寄存器TMOD 可以一次定义两个定时/计数器的工作方式 定时/计数器的方式寄存器TMOD C/T=1 计数方式 C/T=0 定时方式 GATE —— 控制定时/计数器的启动是否受外部中断请求信号的影响 GATE=1 —— 外部中断请求高电平启动计数 GATE=0 —— 定时/计数器启动与外部中断请求无关 定时/计数器的控制寄存器TCON 用于控制定时/计数器的启动与溢出 TF1——溢出标志 TR1——启动位(=1:启动 =0:停止) TF0——溢出标志 TR0——启动位(=1:启动 =0:停止) 方式2——自动重置8位计数 M1M0 = 10 TL0——计数(最大定时256μs) TH0——保存初值,便于自动重置 例: TH0=0x06 TL0=0x06 TL0计数到256发生溢出,计数值为250 然后重新置入0x06,继续计数 在P1.0端口输出周期为500μs的方波 //查询方式(晶振频率12MHz) #includereg52.h sbit P1_0=P1^0; void main() { TMOD=0x02; //定时器T0设置为方式2 TH0=0x06; //256-6=250,定时250μs TL0=0x06; TR0=1; //启动定时器T0 while(1) { if(TF0==1) //如果检测到溢出,意味着定时时间到 { TF0=0; //取消溢出标志 P1_0=!P1_0; //输出高/低电平转换 } } } 说明 晶振频率12MHz,作为定时/计数器的基准信号 定时/计数器进行12分频,定时工作频率1MHz,定时工作周期1us TMOD=0x02) T0工作于方式2(8位自动重置定时) 定时器方式 说明 TL0=0x06 TH0=0x06 计数从6开始,每个工作周期(1us)加1,经过250us之后产生溢出,TF0==1 方式2为自动重置,将TH0的值再次装入TL0 ,继续计数 每次检测到TF0==1,就使P1^0的状态改变一次,从而产生了周期为500us的对称方波 思考 设单片机晶振频率为12MHz,对于前例,如果要求T0输出的方波周期为200μs,计数初值应该怎样设置? 在P1.0端口输出周期为500μs的方波 //中断方式 #includereg52.h sbit P1_0=P1^0; void main() { TMOD=0x02; //T0设置为方式2 TH0=0x06; TL0=0x06; EA=1; //中断允许总控 ET0=1; //允许定时器T0中断 TR0=1; //启动定时器 while(1); //等待中断的发生 } void time0_int(void) interrupt 1 //定时器T0对应interrupt 1 { P1_0=!P1_0; } LED0以200ms间隔闪烁(方法一) #includereg52.h sbit LED0=P0^0; //LED0接在P0^0端口 char i; void main() { TMOD=0x01; //方式1,16位定时/计数 TH0=0xd8; TL0=0xf0; // 0xd8f0 = 55536 计数初值,定时10ms EA=1; ET0=1; //定时器T0允许中断 i=0; TR0=1; //启动定时器T0 while(1); } void time0_int(void) interrupt 1 //定时器T0对应的就是interrupt 1 { TH0=0xd8; TL0=0xf0; //恢复计数初值,继续延时 i++; //每计数一次,延时10ms if(i==20) //若满足200ms { LED0=!LED0; //LED0闪烁一次 i=0; //恢复初始状态 } } LED0以200ms
文档评论(0)