《索奥科技中心》第四讲.ppt

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
我们发现: 貌似如果单片机的定时器只能通过改变预分频和软件的方法,能实现的定时的数就太少了,, 答案见实验: 比较匹配_66ms; 如果也想用比较匹配中断实现定时200ms又该怎么办呢?自己写试着写一下: 公式; 答案见实验: 比较匹配200ms; 这样,我们就把定时器的工作原理基本掌握了。 作业: 与前面的公式对照一下 索奥科技中心 第四讲 本讲初步涉及定时器,两个中断: 比较匹配中断,溢出中断 作业讲解: 见第三讲作业 先来看一下我们以前是怎么定时的: 见实验1_普通流水灯_262ms: #include <delay.h> delay_ms(262); 这句事实上相当于: void delay ( unsigned char ms) { unsigned char i, j ; for ( i=0 ; i<ms ; i++) for ( j=0; j<1141 ; j++); } 然后主函数里写: void main(void) {…delay(262); …} 这种计数方式是软件定时,不仅不够 准确,而且占用过多的系统资源,虽然什么都不需要做,程序却还在执行。 那么单片机有什么硬件资源可以代替这种软件的定时吗?(就像外部中断代替按键查询那样) 答案是肯定的——定时器 定时器的必要性及原理 单片机是时序逻辑器件,执行每一条指令必须要有确定的时钟周期数,必须有一个基准时钟作参考。 计数器:对外部事件进行统计,外部事件以输入有效脉冲的方式表示。 定时器:当计数器的脉冲频率恒定时,计数器记录的数值代表了时间的概念。其计数的来源可以是外部脉冲输入,也可以是内部时钟。 我们的单片机的频率是1MHz。 硬件介绍 ATmega16总共有两个8位定时器/计数器: T/C0、T/C2,它们都是通用的多功能定时计数器,其主要特点是: 单通道计数器。 比较匹配时清零计数器 可产生无输出抖动(glitch-free)的,相位可调的脉宽调制(PWM)信号输出。 频率发生器。 外部事件计数器(仅 T/C0)。 带 10位的时钟预分频器。溢出和比较匹配中断源 允许使用外部引脚的32kHz 手表晶振作为独立的计数时钟源(仅 T/C2)。 注意: 定时计数器的长度: 定时计数器的长度是指计数单元的位长度,一般为8 位(一个字节)或16 位(2 个字节)。 计数的过程是由硬件完成的,不需要MCU 的干预。 中断服务函数只能在中断发生时由硬件自动调用,不能像其他函数一样可以通过软件调用。 TCNT0计数示意 计数器计数形式: 预分频: 每来一个上升沿,计数器TCNT0自增一 预分频: ? Bit 1 – OCIE0: T/C0 输出比较匹配中断使能 当OCIE0 和状态寄存器的全局中断使能位I 都为”1” 时,T/C0 的输出比较匹配中断使能。当T/C0 的比较匹配发生,即TIFR 中的OCF0 置位时,中断服务程序得以执行。 ? Bit 0 – TOIE0: T/C0 溢出中断使能 当TOIE0 和状态寄存器的全局中断使能位I 都为”1” 时,T/C0 的溢出中断使能。当T/C0发生溢出,即TIFR 中的TOV0 位置位时,中断服务程序得以执行。 TCNT0计数示意 T/C寄存器TCNT0长八位,用来存放计数器计数的值,是一直在变化的 输出比较寄存器包含一个8 位的数据,不间断地与计数器数值TCNT0 进行比较。匹配事件可以用来产生输出比较中断,或者用来在OC0 引脚上产生波形。 注意那两条红线,各自分别对应一种中断: 从上往下: 溢出中断 比较匹配中断 溢出中断 溢出中断;当计数器计数到达计数上限值255 时,产生“溢出”信号,向MCU 申请中断。 interrupt[TIM0_OVF] void Timer0 (void) { … } 此处定时器定时计算公式: 其中fclk_I/O为系统时钟1MHz 那么我们的硬件最多可以延时多少呢? 看程序: 2_溢出中断_262ms (当分频数最大为1024时, 为硬件最大延时数。) 那如果我们想延时更长时间怎么办呢?(五分钟) 提示: 试着用软件的方法去实现 答案见实验: 2_2_溢出中断_520ms char i = 0; interrupt[TIM0_OVF] void Timer0 (void) { if(++i == 2) { i = 0;…. } 但是:在溢出中断中可以改变TCNT0的值,从而实现了定时器所定时间连续可变。 看一个程序: 溢出中断_200ms; 流水灯依次闪烁(间隔时间为200ms) 定时计算公式: 与前面的公

文档评论(0)

***** + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档