资源预览内容
第1页 / 共76页
第2页 / 共76页
第3页 / 共76页
第4页 / 共76页
第5页 / 共76页
第6页 / 共76页
第7页 / 共76页
第8页 / 共76页
第9页 / 共76页
第10页 / 共76页
亲,该文档总共76页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章 定时器/计数器第一节 概述 第二节 模式0、模式1及其应用 第三节 模式2及其应用 第四节 模式3及其应用 第五节 定时器/计数器21第一节 概述回忆8051结构特点:由单一内部总线连接各功能模 块,通过特殊功能寄存器(SFR)集中控制。嵌入式结 构,不同型号引脚定义和SFR定义有所不同,因此,从两个方面来认识和掌握某一个功能模块。相关引脚功能相关SFR功能23n两个16位定时计数器,最大计数范围:0000-FFFFH。n相关的SFR:TMOD、TCON、TH0、TL0、TH1、TL1。n相关引脚:T0、T1、INT0、INT1。n4种工作方式。8051定时器/计数器概况4T0、T1相关引脚T0、T1:计数脉冲输入, 定时方式时不用,作I/OINT0、INT1:与定时器 运行控制有关,也可以无 关,可编程设定5T0、T1相关SFR6定时器/计数器原理7定时功能:对固定频率的机器周期计数,每个机器周期定时器加1,计数速率=Fosc/12计数功能:对外部引脚(T0和T1)上的负跳变计数,每产生一个负跳变,计数器加1,要求高低电平均要大于1Tm, 计数速率/要用到SFR sbit SQW=P17;/*定义输出方波引脚*/ main() TMOD=0x01; /* T0 模式1, 定时, GATE=0 */ TR0=1;/* 启动 T0 运行 */while(1) /* 无限循环作为main的结束 */ TH0=0xD8; TL0=0xF0; /* 每次要重新赋10ms 定时的初值*/while (! TF0); TF0=0; /* 查询等10ms时间到,并清除标志 */SQW = ! SQW ;/* 引脚每隔10ms电平取反,产生50Hz方波*/ 26编程实现(中断方式)#include /* 要用到SFR */ sbit SQW=P17;/*定义输出方波引脚*/ main()/*主程序*/ TMOD=0x01; /* T0 模式1, 定时, GATE=0 */ TH0=0xD8;/* 赋初值 */ TL0=0xF0; ET0=1; EA=1; /* 允许T0中断 */TR0=1;/* 启动 T0 运行 */while(1); /* 无限循环作为main的结束 */ 27编程实现(中断方式)void out_sqw(void) interrupt 1/*中断服务程序*/ /* TF0 标志被自动清除 */SQW = ! SQW; /* 引脚每隔10ms电平取反,产生50Hz方波 */TH0=0xD8; TL0=0xF0; /* 重赋初值 */ 28例2 :在P1.0引脚上输出周期1秒,占空比 为20%的方波,已知Fosc=12MHz。291、确定定时对象: 1s、200ms 或 800ms ?应当小于定时器的最大定时时间,对于模式1,最长为 65.536ms,为了便于计算,取50ms作为定时对象,再 用一个字节对溢出计数。50ms * 4 = 200 ms50ms * 16 = 800 ms分析: 占空比20%的方波,周期为1s302、Fosc=12MHz, 1Tm=1us, 产生50ms定时, 应选择 模式0、1、2、3 ?应选择模式1,16位定时器,最大范围65.536ms。在所 有工作模式中,模式1的定时/计数范围是最大的。分析: 占空比20%的方波,周期为1s313、计算初值TC=65536-50ms/1us=15536=3CB0H分析: 占空比20%的方波,周期为1s32编程实现(查询方式)#include /要用到SFR sbit SQW=P10;/*定义输出方波引脚*/ bit will_be_high=0; /*定义一个标志位,0:将要输出低电平, 1:将要输出高电平*/ unsigned char overflow_counter=16; /*由800ms低电平开始 ,减到0,时间到,改200ms定时, overflow_counter=4 */ main() TMOD=0x10; /* T1 模式1, 定时, GATE=0 */ TH1=0x3C; TL1=0xB0; /* 赋50ms定时初值 */TR1=1;/* 启动 T1 运行 */33编程实现(查询方式)for(; ;)/* 无限循环作为main的结束 */ /* 如果要输出高电平,则输出高电平,4*50ms,下一次将为低电平 ;否则输出低电平,16*50ms,下一次将为高电平 */if (will_be _high)overflow_counter=4; SQW=1; will_be _high=0;else overflow_counter=16; SQW=0; will_be _high=1;dowhile (! TF1); TF1=0; /* 查询等50ms时间到,并清除标志 */TH1=0x3C; TL1=0xB0; /* 每次要重新赋50ms 定时的初值*/ while( - overflow_counter);/end of for(; ;)/end of main34编程实现(中断方式)#include /要用到SFR sbit SQW=P10;/*定义输出方波引脚*/ bit is_high=0; /当前状态 unsigned char overflow_counter=16; /*由800ms低电平开始 ,减到0,时间到,改200ms定时, overflow_counter=4 */ main() TMOD=0x10; /* T1 模式1, 定时, GATE=0 */ TH1=0x3C; TL1=0xB0; /* 赋50ms定时初值 */ET1=1; EA=1; /* 允许T1中断 */TR1=1;/* 启动 T1 运行 */SQW=0; /* 输出低电平 */while(1); /* 无限循环作为main的结束 */35编程实现(中断方式)void out_sqw(void) interrupt 3/*中断服务程序*/ /* TF1 标志被自动清除 */TH1=0x3C; TL1=0xB0; /* 重赋50ms定时初值*/if (- overflow_counter != 0) return; /* 定时未到返回 */if (is_high) overflow_counter = 16; SQW=0; is_high=0;else overflow_counter = 4; SQW=1; is_high=1; 36例3 :在P1.0引脚上每隔2ms产生4us的负 脉冲,已知Fosc=6MHz,采用T0模式0。371、确定定时对象: 2ms 或 4us ?应当是2ms, 而4us负脉冲可以通过指令本身的延时来实 现。如:P10=0;/1Tm =2us_nop_(); /1Tm =2usP10=1; /1Tm =2us分析: 周期性负脉冲382、指定模式0,不用选择。3、计算初值TC=213-2ms/2us=7192=1C18H0001 1100 0001 1000B, 初值: TH0=0E0H, TL0=18H分析: 周期性负脉冲(高8位)(低5位) 39编程实现(查询方式)#include /要用到SFR #include /包含_nop_(); sbit Pulse=P10;/*定义输出脉冲的引脚*/ main() TMOD=0x0; TR0=1; /* T0 模式,定时, GATE=0, 启动 T0 */ while(1) /* 无限循环作为main的结束 */ TH0=0xE0; TL0=0x18; /* 每次要重新赋2ms 定时的初值*/while (! TF0); TF0=0; /* 查询等2ms时间到,并清除标志 */Pulse=0; _nop_(); Pulse=1; /* 产生4us负脉冲*/ 40编程实现(中断方式)#include /要用到SFR #include /包含_nop_(); sbit Pulse=P10;/*定义输出脉冲的引脚*/ main() TMOD=0x0; /* T0 模式,定时, GATE=0 */ TH0=0xE0; TL0=0x18; /* 赋2ms 定时的初值*/ET0=1; EA=1; /* 允许T0中断 */TR0=1;/* 启动 T0 运行 */for(;); /* 循环结束, 也可以做别的事 */ 41编程实现(中断方式)void out_pulse(void) interrupt 1/*中断服务程序*/ /* TF0 标志被自动清除 */TH0=0xE0; TL0=0x18; /* 重赋2ms定时初值*/Pulse=0; _nop_(); Pulse=1; /* 产生4us负脉冲*/ 42例4 :利用T0门控位测量INT0引脚上出现 的正脉冲的宽度,并以机器周期数表示。431、设置GATE=0,则GATE=1, 因此Y=TR0,这样: TR0=1; 启动定时器T0运行 TR0=0; 停止定时器T0运行我们把这种控制定时器运行的方法叫软触发,最常用。2、设置GATE=1,则GATE=0, 因此Y=TR0*INT0电平,进一步令TR0=1, 则Y=INT0电平, 这样: INT0为高电平,启动定时器T0运行 INT0为低电平,停止定时器T0运行我们把这种控制定时器运行的方法叫硬触发,较少用,可以用来测量正脉冲的宽度。回顾:定时器/计数器运行控制方法441、确定定时对象?高电平期间定时器计了多少个机器周期,因此在上升的时 候让(TH0,TL0)=0000并开始计时, 下降后停止,看计 数器的值为多少即为所求,假定机器周期数不超过定时器 的最大值。分析452、应选择模式0、1、2、3 ?应选择模式1,16位定时器,最大范围65536Tm。在所 有工作模式中,模式1的范围是最大的。3、计算初值从0000开始,但要注意要在从低到高跳变前赋值。分析46#include /要用到SFR sbit PPulse=P32;/*定义输入脉冲的引脚*/ unsigned char data *p=0x30; /结果存入30H开始的2个单元中 main() TMOD=0x09; TH0=0; TL0=0; /* T0 模式1, 定时, GATE=1*/ while (PPulse); TR0=1;/等低电平,准备计时while (! PPulse);/等高电平后,自动开始计时while (PPulse); TR0=0;/等低电平,停止计时*p+=TH0; *p=TL0; /存入结果while(1) ;/* 循环结束 */ 编程实现47n第一节 概述n第二节 模式0、模式1及其应用n第三节 模式2及其应用n第四节 模式3及其应用n第五节 定时器/计数器248Timer/Counter 0 Mode 2: 8-Bit Auto-Reload 49Timer/Counter 1 Mode 2: 8-Bit Auto-Reload 50例5:在P1.7引脚上输出2KHz的方波, 已知Fosc=12MHz。511、确定定时对象: 250us, 便于产生方波:每隔250us引 脚电平取反。2、Fosc=12MHz, 1Tm=1us, 产生256us定时, 应选择 模式0、1、2、3 ?应选择模式2,8位定时器,最大范围256us,由于自动重 装载,重装过程没有引入误差,最理想。分析: 2KHz的方波,周期为1/2000=500us523、计算初值TC=256-250us/1us=6分析: 2KHz的方波,周期为1/2000=500us53编程实现(查询方式)#include /要用到S
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号