定时器(一)中断

JKD的6-1、6-2课程 

1.定时器介绍

72MHZ计算72个数,就是 1MHZ,占用1us的时间。

2.基本定时器

 

基本定时器只支持向上计数模式。计数器从零开始向上自增,计数到等于重装载值,清零同时申请中断。

基本时钟72M 控制器 到 预分频器 到 计数器然后和自动重装载值比较。

 计数值等于自动重装值就会产生两个方向,向上箭头是通往NVIC到CPU更新中断。向下箭头是通往NVIC到更新事件,可以映射到TRGO连接到DAC(数模转换)。

3.通用定时器

 支持向上计数、向下计数(向下自减到重装载值)、中央对齐方式(向上自增到重装载值,在自减到0)。

下面黑色阴影的寄存器都是带缓冲寄存器的。称之为影子寄存器。

时钟源选择:

1、内部的72M。

2、ETR引脚(外部时钟可以选择外部脉冲输入,即外部方波脉冲输入,相当于计数器)进来可以先滤波对外部时钟进行整形,因为会有一些毛刺。接下来可以走ETRF(外部时钟模式 2),也可以TRGI(触发输入,定时器的从模式)。

 3、ITR引脚0-3都是其他的定时器TRGO输入的,TRGI是外部时钟模式1, 可以实现定时器级联功能。

 

图中最右边是4个通道的输出比较电路 ,左侧是4个通道的输入捕获电路。中间是捕获比较寄存器,是输入捕获和输出比较公用的,因为不能输入捕获和输出比较不能同时使用。

4.高级定时器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于定时器的计数器设计问题。 首先,需要设置定时器的计数时间为1秒。这可以通过设置定时器的计数器初值和计数器重载值来实现。假设使用的是8051单片机,可以使用定时器0,设置计数器初值为0x00,计数器重载值为0x4C(即76),这样定时器每计数一次就需要76个机器周期,而8051单片机的晶振频率为12MHz,每个机器周期为1/12MHz=83.33ns,因此,76个机器周期需要的时间为(76 * 83.33ns) = 6.33us,即定时器每6.33us计数一次,约1秒钟可以计数156,250次。 其次,需要在定时器中断服务程序中实现计数器值的累加,并将结果存储到40H单元中。在8051单片机中,可以使用中断向量表来定义中断服务程序的入口地址。假设使用的中断向量号为11,可以在程序中添加如下代码: ```c void timer0_isr(void) interrupt 1 using 1 { static unsigned char counter = 0; counter++; if(counter == 0) { // 计数值溢出,清零并显示 counter = 0; P1 = 0x00; P0 = 0x40; P1 = counter; } else { // 更新计数值 P1 = counter; } } ``` 上述代码中,定义了一个静态变量counter用于记录计数值,每次定时器中断发生时,counter自增1。当counter值溢出时,即为1秒钟计数一次,将counter清零,并通过8个LED灯显示40H单元中的值;否则,只需要更新计数值即可。 最后,需要在主程序中启动定时器并开启中断。可以添加如下代码: ```c void main(void) { // 初始化定时器0 TMOD = 0x01; // 定时器0工作在模式1 TH0 = 0x00; // 计数器初值 TL0 = 0x4C; // 计数器重载值 ET0 = 1; // 允许定时器0中断 EA = 1; // 开启总中断 TR0 = 1; // 启动定时器0 while(1) { // 主程序循环 } } ``` 上述代码中,首先对定时器0进行初始化设置,然后启动定时器并开启总中断。在主程序中只需要添加需要处理的代码即可。 总之,以上就是利用定时器设计1S中断计数器的详细步骤,希望能够帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值