C51单片机04(定时器)_第1页
C51单片机04(定时器)_第2页
C51单片机04(定时器)_第3页
C51单片机04(定时器)_第4页
C51单片机04(定时器)_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、51系列单片机第第4讲讲 定时器定时器/计数器计数器Atmel AT89C51Atmel AT89C52定时器定时器/计数器的主要特性计数器的主要特性 C51系列有系列有2个定时个定时/计数器(计数器(T0、T1) C52系列有系列有3个定时个定时/计数器(计数器(T0、T1、T2) 通过编程设置,每个定时器通过编程设置,每个定时器/计数器可以根计数器可以根据系统时钟实现定时,也可以对外部信号据系统时钟实现定时,也可以对外部信号计数(计数(T0/P3.4、T1/P3.5) 每个定时器每个定时器/计数器都有多种工作方式计数器都有多种工作方式 每个定时器每个定时器/计数器都会在预设定时计数时计数器

2、都会在预设定时计数时间到时产生溢出,可以通过查询或中断方间到时产生溢出,可以通过查询或中断方式处理式处理使用定时使用定时/计数器的步骤计数器的步骤 方式选择方式选择TMOD 初值设置初值设置TH0、TL0( TH1、TL1 ) 中断允许中断允许EA、ET0( ET1 ) 启动操作启动操作TR0(TR1)定时定时/计数器的方式寄存器计数器的方式寄存器TMOD 可以一次定义两个定时可以一次定义两个定时/计数器的工作方式计数器的工作方式GATEC / TM1M0GATEC / TM1M0D7 D6 D5 D4 D3 D2 D1 D0定时器定时器1定时器定时器0M1M0工作方式工作方式方式说明方式说明

3、00013 位定时位定时/计数器计数器01116 位定时位定时/计数器计数器1028 位自动重置定时位自动重置定时/计数器计数器113两个两个8 位定时位定时/计数器计数器(仅仅T0有此方式有此方式)定时定时/计数器的方式寄存器计数器的方式寄存器TMOD C/T=1 计数方式计数方式 C/T=0 定时方式定时方式 GATE 控制定时控制定时/计数器的启动是否计数器的启动是否受外部中断请求信号的影响受外部中断请求信号的影响 GATE1 外部中断请求高电平启动计外部中断请求高电平启动计数数 GATE0 定时定时/计数器启动与外部中计数器启动与外部中断请求无关断请求无关一般情况下一般情况下GATE=

4、0定时定时/计数器的控制寄存器计数器的控制寄存器TCON用于控制定时用于控制定时/计数器的启动与溢出计数器的启动与溢出 TF1溢出标志溢出标志 TR1启动位(启动位(1:启动:启动 0:停止):停止) TF0溢出标志溢出标志 TR0启动位(启动位(1:启动:启动 0:停止):停止)TF1TR1TF0TR0IE1IT1IE0IT0D7 D6 D5 D4 D3 D2 D1 D0外部中断控制方式方式2自动重置自动重置8位计数位计数 M1M0 = 10 TL0计数计数(最大定时最大定时256s) TH0保存初值,便于自动重置保存初值,便于自动重置例:例: TH0=0 x06 TL0=0 x06 TL0

5、计数到计数到256发生溢出,计数值为发生溢出,计数值为250 然后重新置入然后重新置入0 x06,继续计数,继续计数在在P1.0端口输出周期为端口输出周期为500s的方波的方波/查询方式(晶振频率查询方式(晶振频率12MHz)#includesbit P1_0=P10;void main()TMOD=0 x02;/定时器定时器T0设置为方式设置为方式2TH0=0 x06;/256-6=250,定时,定时250sTL0=0 x06;TR0=1;/启动定时器启动定时器T0while(1)if(TF0=1)/如果检测到溢出,意味着定时时间到如果检测到溢出,意味着定时时间到TF0=0;/取消溢出标志取

6、消溢出标志P1_0=!P1_0;/输出高输出高/低电平转换低电平转换250s250s说明说明 晶振频率晶振频率12MHz,作为定时,作为定时/计数器的基准计数器的基准信号信号 定时定时/计数器进行计数器进行12分频,定时工作频率分频,定时工作频率1MHz,定时工作周期,定时工作周期1us TMOD=0 x02(00000010B) T0工作于方式工作于方式2(8位自动重置定时)位自动重置定时) 定时器方式定时器方式GATEC / TM1M0GATEC / TM1M0D7 D6 D5 D4 D3 D2 D1 D0定时器定时器1定时器定时器0说明说明 TL0=0 x06 TH0=0 x06 计数从

7、计数从6开始,每个工作周期开始,每个工作周期(1us)加加1,经,经过过250us之后产生溢出,之后产生溢出,TF0=1 方式方式2为自动重置,将为自动重置,将TH0的值再次装入的值再次装入TL0 ,继续计数,继续计数 每次检测到每次检测到TF0=1,就使,就使P10的状态改变的状态改变一次,从而产生了周期为一次,从而产生了周期为500us的对称方波的对称方波思考思考 设单片机晶振频率为设单片机晶振频率为12MHz,对于前例,对于前例,如果要求如果要求T0输出的方波周期为输出的方波周期为200s,计,计数初值应该怎样设置?数初值应该怎样设置?机器周期时钟周期机器周期时钟周期*12 12 / 晶

8、振频率晶振频率 1s计数初值计数初值256 200 / 2 156 (0 x9c)TH0=0 x9c;TL0=0 x9c;在在P1.0端口输出周期为端口输出周期为500s的方波的方波/中断方式中断方式#includesbit P1_0=P10;void main()TMOD=0 x02;/T0设置为方式设置为方式2TH0=0 x06;TL0=0 x06;EA=1;/中断允许总控中断允许总控ET0=1;/允许定时器允许定时器T0中断中断TR0=1;/启动定时器启动定时器while(1);/等待中断的发生等待中断的发生void time0_int(void) interrupt 1 /定时器定时器

9、T0对应对应interrupt 1P1_0=!P1_0;LED0以以200ms间隔闪烁间隔闪烁(方法一方法一)#includesbit LED0=P00;/LED0接在接在P00端口端口char i;void main()TMOD=0 x01;/方式方式1,16位定时位定时/计数计数TH0=0 xd8;TL0=0 xf0;/ 0 xd8f0 = 55536 计数初值,定时计数初值,定时10msEA=1;ET0=1;/定时器定时器T0允许中断允许中断i=0;TR0=1;/启动定时器启动定时器T0while(1);void time0_int(void) interrupt 1/定时器定时器T0对

10、应的就是对应的就是interrupt 1TH0=0 xd8;TL0=0 xf0;/恢复计数初值,继续延时恢复计数初值,继续延时i+;/每计数一次,延时每计数一次,延时10msif(i=20)/若满足若满足200msLED0=!LED0;/LED0闪烁一次闪烁一次i=0;/恢复初始状态恢复初始状态LED0以以200ms间隔闪烁间隔闪烁(方法二方法二)#includesbit LED0=P00;char i;void main()TMOD=0 x01;/方式方式1,16位定时位定时/计数计数TH0=0 x3c;TL0=0 xb0;/ 0 x3cb0 = 15536 计数初值,定时计数初值,定时50

11、msEA=1;ET0=1;i=0;TR0=1;while(1);void time0_int(void) interrupt 1/定时器定时器T0对应的就是对应的就是interrupt 1TH0=0 x3c;TL0=0 xb0;/恢复计数初值,继续延时恢复计数初值,继续延时i+;/每计数一次,延时每计数一次,延时50msif(i=4)/若满足若满足200msLED0=!LED0;/LED0闪烁一次闪烁一次i=0;/恢复初始状态恢复初始状态思考思考 方法一:定时方法一:定时 10ms,i 计数计数20次次 方法二:定时方法二:定时 50ms,i 计数计数4次次 这两种做法,哪种更好些?这两种做法

12、,哪种更好些?方法二更好些,因为充分利用了定时器的方法二更好些,因为充分利用了定时器的最大定时能力,减少了对最大定时能力,减少了对CPU时间的占用时间的占用练习练习 利用定时器利用定时器T1产生定时时钟,由产生定时时钟,由P0口控制口控制8个个LED依次逐个闪动,频率为依次逐个闪动,频率为10次次/秒,秒,循环重复循环重复程序代码(主程序部分)程序代码(主程序部分)#include#includeunsigned char LED,i;void main()i=0;LED=0 xfe;/LED0首先发光首先发光P0=LED;TMOD=0 x01;/定时器方式定时器方式1(16位定时)位定时)T

13、H1=0 x3c;/定时初值定时初值 0 x3cb0=15536TL1=0 xb0;EA=1;/中断总控允许中断总控允许ET1=1;/定时器定时器1中断允许中断允许TR1=1;/启动定时器启动定时器1while(1);/等待中断发生等待中断发生程序代码(中断服务程序部分)程序代码(中断服务程序部分)void time1_int(void) interrupt 3 /定时器定时器1允许允许TH1=0 x3c;/重置定时重置定时50ms的初值的初值TL1=0 xb0;i+;if(i=20)/定时时间到,闪动一次定时时间到,闪动一次LED=_cror_(LED,1);P0=LED;i=0;/恢复初始

14、状态恢复初始状态练习练习 利用定时器产生定时控制信号,在利用定时器产生定时控制信号,在8个个LED上稳定地显示上稳定地显示“01234567” 分析:分析: 要实现稳定地显示,根据以往经验,切换速度要实现稳定地显示,根据以往经验,切换速度要求不大于要求不大于2ms 定时器完全可以代替以前使用的延时程序,这定时器完全可以代替以前使用的延时程序,这样就节省了样就节省了CPU时间时间程序代码程序代码#includeunsigned char code table11 = 0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x0

15、0;unsigned char i;void main()i=0;TMOD=0 x01;TH1=0 xf8;TL1=0 x30; /延时延时2ms , 0 xf830=63536EA=1;ET1=1;/允许定时器允许定时器1中断中断TR1=1;/启动定时器启动定时器1while(1);void time1_int(void) interrupt 3/定时器定时器1产生产生 interrupt 3 中断中断TH1=0 xf8;TL1=0 x30;P0=tablei;/获取段位码获取段位码P2=i;/选择选择LEDi+;if(i=8) i=0;/轮流显示了全部轮流显示了全部8个个LED之后,回归原

16、位之后,回归原位练习练习 利用定时器实现的定时间隔,在利用定时器实现的定时间隔,在8个个LED上上稳定地显示电话号码稳定地显示电话号码“68752219”程序代码程序代码#includeunsigned char code table10 = 0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char code Number8 = 6,8,7,5,2,2,1,9;unsigned char i, j;void main()i=0;TMOD=0 x01;TH1=0 xf8; TL1=0 x30;EA=1;E

17、T1=1;TR1=1;while(1);void time1_int(void) interrupt 3TH1=0 xf8;TL1=0 x30;j=Numberi;P0=tablej;P2=i;i+;if(i=8) i=0;练习练习 在在8个个LED数码管的右端从数码管的右端从0开始显示数字,开始显示数字,利用定时器控制,以利用定时器控制,以200ms的间隔逐次加的间隔逐次加1,到达到达255之后归之后归0,循环往复,循环往复 分析:分析: 本题的任务最好使用两个定时器来完成本题的任务最好使用两个定时器来完成 T1的定时间隔为的定时间隔为200ms,用来修正计数,用来修正计数 T0的定时间隔为

18、的定时间隔为2ms,用来刷新,用来刷新LED主程序主程序#include#define uchar unsigned charuchar code table10 = 0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0 x6f;uchar mydata3=0,0,0;uchar i, number, d0;void main()i=0;number=0;TMOD=0 x01;TH1=0 x3c;TL1=0 xb0;EA=1;ET1=1;TR1=1;TH0=0 xf8;TL0=0 x30; ET0=1;TR0=1;d0=0;while

19、(1);定时器定时器1的中断服务程序的中断服务程序void time1_int(void) interrupt 3TH1=0 x3c;TL1=0 xb0;i+;if(i=40)/定时间隔定时间隔5ms,乘以,乘以40倍倍number+;mydata2=number/100;mydata1=number/10%10;mydata0=number%10;i=0;定时器定时器0的中断服务程序的中断服务程序void timer0_int(void) interrupt 1TH0=0 xf8;TL0=0 xf0;P0=tablemydatad0; /获取段位码获取段位码if(d0=2)P2=5;/百位数

20、显示在百位数显示在LED5elseP2=(d0=1)?6:7;/十位数显示在十位数显示在LED6d0=(d0+1)%3;练习练习 在在8个个LED数码管上按右对齐的方式从数码管上按右对齐的方式从0开开始显示数字,利用定时器控制,以始显示数字,利用定时器控制,以200ms的间隔逐次加的间隔逐次加1,到达,到达255之后归之后归0,循环往,循环往复复练习练习 LED0的亮度分为的亮度分为09共共10档可调,每按一档可调,每按一次独立开关次独立开关S17(连接到连接到P34),LED0亮度增亮度增加一个档次,增加到加一个档次,增加到10时则回到最低亮度时则回到最低亮度数据定义与准备数据定义与准备#i

21、nclude #define uchar unsigned char#define uint unsigned intsbit LED0 = P00; /要控制的要控制的LED 灯灯 sbit K1= P34; /控制亮度,每按一次增加一档亮度控制亮度,每按一次增加一档亮度uchar scale=5; /占空比的低电平时间份额,总共占空比的低电平时间份额,总共10 份份 uint n=0; 定时器初始化定时器初始化void timer0_init()TMOD=0 x02; /T0 为方式为方式2,自动重置,自动重置8位计数位计数TH0=0 x06;/晶振频率晶振频率12MHz,定时,定时250

22、sTL0=0 x06; TR0=1; /启动定时器启动定时器0ET0=1; /开放定时器开放定时器0 中断中断 EA=1; /开放总控中断开放总控中断定时器中断定时器中断timer0() interrupt 1 /定时器定时器T0中断服务程序中断服务程序 /每每10次中断,次中断,LED0发光保持发光保持scale次次static uchar tt; /保存当前时间在一秒中的比例位置保存当前时间在一秒中的比例位置TF0=0; /清除溢出标志,迎接下次中断清除溢出标志,迎接下次中断tt+; /统计中断发生的次数统计中断发生的次数if(tt=10) /每发生每发生10次中断,开始次中断,开始LED

23、0发光发光 tt=0; if(scale!=0) /加这句为了消除灭灯状态产生的鬼影加这句为了消除灭灯状态产生的鬼影 LED0=0; if(scale=tt) /按照当前占空比切换输出高电平按照当前占空比切换输出高电平LED0=1; /LED0熄灭熄灭主函数主函数void main(void) Timer0_init();while(1) if(!K1) /如果检测到如果检测到K1 按下按下 for(n=0;n1000;n+); /等待等待K1稳定按下稳定按下 while(!K1); /等待等待K1松开松开 for(n=0;n1000;n+); /等待等待K1稳定松开稳定松开 scale+;

24、/亮度增加一档亮度增加一档if(scale=10) scale=0; /亮度增加到亮度增加到10则回归最暗状则回归最暗状态态 Atmel 89C52定时器定时器/计数器计数器2编程编程 定时器定时器2的工作方式:的工作方式: 16位重装载方式位重装载方式 16位捕获方式位捕获方式 16位波特率发生器方式位波特率发生器方式 工作方式由工作方式由T2CON寄存器决定寄存器决定TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2D7 D6 D5 D4 D3 D2 D1 D0T2CON寄存器各位功能寄存器各位功能符号符号功能功能TF2定时器定时器2溢出标志。溢出时,又由硬件置位,必须由软

25、件清溢出标志。溢出时,又由硬件置位,必须由软件清0。当。当RCLK或或TCLK=1时,定时器时,定时器2溢出,不对溢出,不对TF2置位置位EXF2外部标志。外部标志。RCLK接收时钟允许。接收时钟允许。=1,用定时器,用定时器2溢出脉冲作为串口接收时钟;溢出脉冲作为串口接收时钟;=0,用定时器用定时器1的溢出脉冲作为接收时钟的溢出脉冲作为接收时钟TCLK发送时钟允许。发送时钟允许。=1,用定时器,用定时器2溢出脉冲作为串口发送时钟;溢出脉冲作为串口发送时钟; =0,用定时器用定时器1的溢出脉冲作为发送时钟的溢出脉冲作为发送时钟EXEN2外部允许标志。外部允许标志。=1,若定时器,若定时器2未用

26、作串行口的波特率发生器,未用作串行口的波特率发生器,T2EX端出现负跳变时,激活定时器端出现负跳变时,激活定时器2捕获或重装载捕获或重装载TR2启动启动/停止控制。停止控制。=1,启动定时器,启动定时器2C/T2定时器定时器/计数器方式控制。计数器方式控制。=0,定时器方式;,定时器方式;=1,对外部事件计,对外部事件计数方式(下降沿触发)数方式(下降沿触发)CP/RL2捕获捕获/重装载选择。重装载选择。=1,若,若EXEN2=1,且,且T2EN端出现负跳变时发生捕获端出现负跳变时发生捕获操作;操作;=0,若溢出或,若溢出或EXEN2=1,T2EN出现负跳变时自动重装载出现负跳变时自动重装载在

27、数码管中显示多个浮点数在数码管中显示多个浮点数 要求:要求: 第第0位显示温度传感器编号位显示温度传感器编号 第第25位显示温度值(位显示温度值(2位小数,带小数点)位小数,带小数点) 第第67位显示位显示C 原始温度数据由原始温度数据由float类型数组提供类型数组提供 每个温度数据显示每个温度数据显示2秒,依次轮换秒,依次轮换数据定义与准备数据定义与准备#include #define uchar unsigned char#define uint unsigned intfloat tempfloat8=37.65,33.28,36.10,32.39,33.57,36.40,34.66,35.17;uchar code table18 = 0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71,0 x63,0 x00; /0 1 2 3 4 5 6 7 8 9

温馨提示

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

评论

0/150

提交评论