T/C1是16位定时器/计数器,它的计数器由两个8位寄存器TCNT1H,TCNT1L构成,TCNT1H是高8位寄存器,TCNT1L是低8位寄存器。最大计算值为2的16次幂,十六进制是0xFFFF=65535.
例如:定时200ms ,晶振8MHZ,分频系数1024,计数时钟频率为8MHZ/1024=8000000HZ/1024=7812.5HZ,每个计数脉冲的周期时间为1/7812.5=0.128ms,计时200ms的计数器值为:65635-200ms/0.128ms=63972=0xF9E4 ,则TCNT1H付初值为0xF9,TCNT1L付初值为0xE4.
//函数功能:实现PA口的led亮0.1S,灭0.9S
#include
#define uchar unsigned char
/********以下是端口初始化函数********/
void port_init()
{
DDRA = 0xFF; //PA设置为输出口
PORTA = 0xFF; //PA输出高电平
}
/********定时器1初始化********/
void timer1_init()
{
TCNT1H = 0xCF;//计数器置初值
TCNT1L = 0x2C;
TCCR1A |= 0x00; //普通端口模式
TCCR1B |= (1<TIMSK&=(1<}
/********以下是主函数********/
void main(void)
{
uchar count,T1_OVR;
port_init();
timer1_init();
while(1)
}
/*定时器1中断函数*/
#pragma interrupt_handler timer1_ovf:9
void timer1_ovf(void)
{
TCNT1H=0xCF;
TCNT1L=0x2C;
COUNT++
if (count==9)
PORTA=0x00;
if (count>=10
{
count=0;
PROTA=0xFF;
}
关键字:avr 定时器 计数器 CTC模式 输出PWM
引用地址:
4. avr 定时器/计数器1 --TC1 --CTC模式输出PWM
推荐阅读最新更新时间:2024-03-16 15:47
关于STM32定时器触发SPI逐字收发之应用示例
我们在做SPI应用时,有时希望通过定时器来定时地触发SPI的收发,并利用DMA完成数据的传输。这里,以STM32L476芯片为例来做个演示,以供参考。 本示例的大致过程是这样的: 片内SPI1做Master,SPI2做Slave,均工作在全双工模式。 这里使用片内定时器TIM3,通过它的更新事件触发DMA请求,通过DMA将数据给到SPI1的数据寄存器并发送出去,同时也开启SPI1接收事件的DMA传输。总之,SPI2的收、发事件都启用DMA完成。 TIM3的更新事件周期控制两个SPI的收发节奏,即定时器每产生一次更新事件,SPI1/SPI2这两个主从通信模块就进行一个数据的收发。我们可以通过调整定时器的计时周期来调整
[单片机]
AVR单片机实现电子时钟设计
#include avr/signal.h #include avr/interrupt.h #include avr/delay.h #include avr/wdt.h #include avr/eeprom.h #include math.h #include stdlib.h #include string.h #define uchar unsigned char #define uint unsigned int #define xtal 8 #define CS PA5 #define SID PA6 #define SCLK PA7 #define Set_CS() DDRA |= (1 CS);
[单片机]
关于51单片机定时器的灵活使用
前段时间,做一个项目,有串口收发指令判断,按键类型判断,长短按之类,power的定时关电,事件的轮询扫描更新和display的定时扫描。这些要求就对定时器提出了要求,但是我的51单片机只有两个定时器,其中一个又有debug口的波特率产生之用。于是乎我可以用的定时器就只剩下了一个。怎么办?可能大家都只能用变量在定时中断函数去做多了任务就行了,但是我总是感觉这样会导致代码看起来太不具有条理性,而且对于日后的管理不是很容易。思来想去,就想到了linux内核中对于定时器的封装,那种面向对象的思想。 想法有了,我觉得实现就是很简单了。下面给大家贴上我的代码: .h 文件: #ifndef __SC_TIMER_H #define
[单片机]
IAR Systems发布支持AVR UC3的开发套件
IAR发布最新的开发套件,向Atmel AVR32的专业用户提供了新项目开发必要的开发工具。这个套件包含了Atmel EVK1100开发板、32k代码限制的IAR Embedded Workbench for AVR32集成开发环境以及Atmel公司的MKII仿真器。 IAR Embedded Workbench for AVR32与AVR32架构的开发从最初就是同步配合进行的,从而保证了编译产生的代码能最大程度发挥这个内核的高性能。IAR Embedded Workbench有领先的优化功能,且充分利用了AVR32 UC内核的单时钟Load/Store以及DSP指令,从而占用最小的内存空间且大大提高了单周期处理能力。 EVK110
[嵌入式]
关于AVR ATmega8 串口数据协议传输的奇偶校验码的一点想法
在我们本科甚至在刚刚参加工作的时候(例如博主),写串口通信基本都是一位开始一位结束八位数据位没有奇偶校验位,那么这样的好处是方便,的确很方便,但是对于数据传输的隐蔽性和封装的保护就没有那么好的效果了。今天博主初步的探究下在程序中加入奇偶校验位的使用和通信方式。 对于一帧数据的传输,如果以我博客第4张的说法,就是一帧数据有4位有效数据位,剩下的两位用来奇偶校验(因为使用16位编码),将高八位存储在第五位。低八位存储在第六位。 这个校验的基本方式和想法是,在各种主流的单片机都有一个奇偶校验的函数表,通过该表可以很简单的调用使用奇偶校验功能并且将校验码进行赋值给最后两位,那么校验对比的过程就是,PC机发送一个帧的数据,格式是四位有效数据
[单片机]
【STM32H7教程】第35章 STM32H7的定时器应用之高精度单次延迟实现(支持TIM2,3,4和5)
35.1 初学者重要提示 学习本章节前,务必优先学习第32章,HAL库的几个常用API均作了讲解和举例。 STM32H7支持TIM1-TIM8,TIM12-TIM17共14个定时器,而中间的TIM9,TIM10,TIM11是不存在的,这点要注意。 在不需要任何补偿的情况下,误差可以做到正负1微秒以内。 TIM2和TIM5是32位定时器,而TIM3和TIM4是16位定时器。 35.2 定时器单次延迟驱动设计 单次定时器要实现1us的精度,可以直接将定时器时钟设置为1MHz,这样定时器每计数1次就是1us。对于16位定时器最大值就是0xFFFF微秒,而32位定时器就是0xFFFFFFFF微秒。 剩下的问题就是单次延迟时间到了可以及
[单片机]
STC单片机输出可调的pwm
第一步:首先是要配置相关的PCA寄存器 比如我们配置CCP0引脚输出PWM。 // PCA0初始化 AUXR1 &= ~0x30; AUXR1 |= 0x10; //切换IO口, 0x00: P1.2 P1.1 P1.0 P3.7, 0x10: P3.4 P3.5 P3.6 P3.7, 0x20: P2.4 P2.5 P2.6 P2.7 CCAPM0 = 0x42; //工作模式 PWM PCA_PWM0 = (PCA_PWM0 & ~0xc0) | 0x00; //PWM宽度, 0x00: 8bit, 0x40: 7bit, 0x80: 6bit CMOD = (CMOD & ~0xe0) | 0x08
[单片机]