二、AVR单片机定时器初值计算

1、方法一

使用芯片 AT Mega16 外部晶振 4.00MHz

定时器1 (16位定时器)寄存器 TCCR1B = 0x04 设定 256预分频

要利用定时器定时1秒

1,4000000 / 256 = 15625 说明定时器每当 1/15625 秒 就会触发一次中断

2,65535 - 15625 = 49910 计算出要累加多少次才能在1秒后出发定时器1的溢出中断

3,49910 《==》 C2 F6 将计算后的值换算成16进制

4, TCNT1H = 0xC2 ; 对寄存器赋值

TCNT1L = 0xF6 ;

2、方法二

例如用16位定时器TIMER1,4MHZ晶振,256分频,100ms定时,如何求得初值赋给TCNT1?

65536-(4M/256)*0.1=63973.5

其中,4M是晶体频率,0.1是定时时长单位秒。

对于8位的定时器

T=(2^8-计数初值)*晶振周期*分频数=(2^8-计数初值)/晶振频率*分频数计数初值=2^8-T/晶振周期/分频数=2^8-T*晶振频率/分频数

因为AVR一指令 一周期

IAR For AVR 精确延时

C语言中,想使用精确的延时程序并不容易。IAR 中有这样的一个函数 __delay_cycles(),该函数在头文件intrinsics.h中定义,函数的作用就是延时N个指令周期。根据这个函数就可以实现精确的延时函数了(但不能做到100%精确度)。

实现的方法:

建立一个delay.h的头文件:

#ifndef __IAR_DELAY_H

#define __IAR_DELAY_H

#include 《intrinsics.h》

#define XTAL 8 //可定义为你所用的晶振频率(单位Mhz)

#define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) )

#define delay_ms(x) __delay_cycles ( (unsigned long)(x * XTAL*1000) )

#define delay_s(x) __delay_cycles ( (unsigned long)(x * XTAL*1000000) )

#endif

注意: __delay_cycles(x),x必须是常量或则是常量表达式,如果是变量则编译报错!

关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。对于定时器初值的设定可以加深对定时器的工作原理的理解。

ATMega16 里面有8位和16位两种定时器,他们何时会溢出这个是固定的,也就是到达他们的计数范围的最大值就会产生中断,8位的定时器的最大计数范围是0~256(2的8次方),就是累加到256后他就会产生中断,16位的定时器最大计数范围是0~65536(2的16次方),累加到65536时他就会产生中断。

而我们所谓的计数初值是就是要设定定时器在什么地方开始计数,以8位定时器为例比如:初值为100,所以定时器从100开始累加,累加了156次,加到256后产生中断,这就是中间消耗的时间和指令周期就是我们要去设定的时间;再比如:初值是200,所以定时器从200开始累加,累加了56次,加到256后产生中断,可以看到第一定时要累加156次才会中断而第二次只要累加56次就会产生中断,显然第一次设定的时间要比第二次的长。

定时器不仅可以定时,而且我们用到定时器的时候往往是需要精确定时的时候。我们可以计算出我们设定的初值会在多长时间后进入中断。

3、方法三

实验平台:ATMega16

晶振: 11.0592 MHz

对初值的计算:

1,11059200 / 1024 = 10800 设定为1024倍分频 ,得到每1秒需要进行多少次累加

2,10800 / 100 = 108 得到10ms 的定时需要进行多少次累加 。

3,256 - 108 = 148 计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为10ms的时间。

4,148 《==》 0x94 得到十六进制值,赋值给TCNT0

代码: 定时10ms

#include 《iom16.h》

unsigned char flag = 0;

void TImer_init(void)

{

TCCR0 = 0x05; //进行1024分频

TCNT0 = 0x94; //赋计数初值

TIMSK_TOIE0 = 1; //开使能

SREG_I = 1; //开总中断

}

#pragma vector = TIMER0_OVF_vect

__interrupt void time0_normal(void)

{

TCNT0 = 0x94; //重新赋初值

flag++;

}

void main(void)

{

timer_init();

DDRB_Bit0 = 1;

while(1)

{

if(flag == 100) //10ms 重复100次,即为1秒

{

PORTB_Bit0 = ~PORTB_Bit0; //让LED闪烁

flag = 0;

}

}

}

4、方法四

实验平台:ATMega16

晶振:11.0592

16位定时器初值设定:

1,11059200 / 256 = 43200 设定256倍分频,得到每1秒需要进行多少次累加

2,65536 - 43200 = 22336 计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为1s的时间。

3,22336 《==》 0x57 0x40 得到十六进制值,赋值给TCNT1H , TCNT1L

: 定时1s

#include 《iom16.h》

unsigned char flag = 0;

void timer_init(void)

{

TCCR1B = 0x04;

TCNT1H = 0x57;

TCNT1L = 0x40;

TIMSK_TOIE1 = 1;

SREG_I = 1;

}

#pragma vector = TIMER1_OVF_vect

__interrupt void time1_normal(void)

{

TCNT1H = 0x57;

TCNT1L = 0x40;

flag++;

}

void main(void)

{

timer_init();

DDRB_Bit0 = 1;

while(1)

{

if(flag == 1)

}

}

avr单片机c语言计算log,AVR单片机定时器初值计算公式与方法 - 单片机定时器初值计算公式(51单片机和AVR单片机的初值计算三种方法)...相关推荐

  1. 计算地球上两点距离(震中距)的Matlab函数(兼容度数和度分秒)及另外三种方法

    目录 写在前面 方法1: taup 方法2: ObsPy 方法3: Mapping Toolbox的distance函数 方法4: 自己写的Matlab函数 参数 公式 函数 写在前面 最近要计算震中 ...

  2. 11【C语言 趣味算法】个人所得税问题(结构体应用):结构体的声明、定义结构体类型的三种方法等

    Contents 一.Review 二.New Problem:Personal income tax issues(个人所得税问题) 2.1 Description of the problem 2 ...

  3. 单片机跑马灯程序c语言,MCS-51单片机控制跑马灯的三种方法

    描述 在MCS一51单片机的控制系统中,它的四个并行8位输入输出端口P0一P3是我们经常使用的.在并行端口的编程学习中,"跑马灯"是单片机并行端口输出控制的典型实例.所谓跑马灯,是 ...

  4. stcisp一直检测单片机_三种方法对比:STC51单片机实现免冷启动

    具体实现方法实践可用的无外乎三种: 1)使用CH340的DTR和RTS控制单片机断电再上电.点上位机下载按钮的时候,DTR和RTS引脚电平变化. 2)再使用一个单片机,检测串口下载命令流. 3)在程序 ...

  5. c语言程序π,C语言求圆周率π(三种方法)

    题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止. 题目2) 根据公式②,用前100项之积计算π的值. 题目1)提供了一种解法,题目2)提供了两种解法,请看解析. 题目1) ...

  6. c语言求圆周率 . 4,C语言求圆周率π(三种方法)(4页)-原创力文档

    C语言求圆周率π(三种方法) 题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止.题目2) 根据公式②,用前100项之积计算π的值.题目1)提供了一种解法,题目2)提供了两种 ...

  7. 计算两个数平均值的三种方法

    第一种方法: 思路:两数相加求和再除2 代码 int a=10;int b=20;int avg=0;avg=(a+b)/2;//平局值//或者avg=(a+b)>>1://右移表示除2, ...

  8. c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程

    c语言计算机编程三种方法求解非线性方程 本 科 专 业 学 年 论 文题 目:非线性方程求解比较姓 名: 何 娟 专 业: 计算机科学技术系 班 级: 08 级本科(2)班 指 导 老 师: 刘 晓 ...

  9. c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程.doc

    c语言计算机编程三种方法求解非线性方程.doc 本 科 专 业 学 年 论 文题 目非线性方程求解比较姓 名 何 娟 专 业 计算机科学技术系 班 级 08 级本科(2)班 指 导 老 师 刘 晓 娜 ...

  10. 两数求最大公约数的三种方法的C语言实现

    任意输入两个数,求出二者的最大公约数,以C语言实现.以下是三种方法以及对应思路: <1>辗转相除法. 定义两个变量存放两个数(a,b),先以冒泡法将较大数存放在在b内,较小数存放于a. 相 ...

最新文章

  1. 日常开发中常用到哪些设计模式
  2. 请指出document load和document ready的区别?
  3. 执行delete触发器及示例演示
  4. 操作系统 chapter 12 死锁
  5. Linux buffer/cache异同
  6. 组合的输出pascal程序
  7. 万字综述,核心开发者全面解读PyTorch内部机制
  8. 【Linux】一步一步学Linux——groups命令(93)
  9. 【Linux网络编程】套接字的介绍
  10. nzhtl1477-ただいま帰りました ( bfs )
  11. 【渝粤题库】国家开放大学2021春2768养禽技术题目
  12. oracle用户获取datameta权限,Oracle数据库提权(低权限提升至dba)
  13. 51 Nod 1161 Partial sums
  14. dij算法堆优化_BZOJ 3040 最短路(road) 堆优化Dijkstra | 学步园
  15. O-RAN: Towards an Open and Smart RAN
  16. python求解LeetCode习题Find Peak Element in Given num_list
  17. 前端实现Flexpaper的界面的效果
  18. matlab二次曲线插补,圆弧插补器插补非圆二次曲线的方法
  19. 戴尔机架式服务器哪个型号好,戴尔_PowerEdge R540_机架式服务器参数_服务器推荐购买 | Dell 中国大陆...
  20. 使用 Anaconda 安装 Pytorch

热门文章

  1. 给本本K46C升级内存并升级64位WIN7
  2. 技术总监需要做些什么?
  3. html图片的边框属性,css3:border-image边框图像详解
  4. html5页面分享到微信qq,HTML 分享页面到QQ/微信、微博等平台
  5. Ubuntu终端中字体颜色含义
  6. java程序员的电脑配置_JAVA程序员笔记本电脑推荐?
  7. JavaScript+css+html鼠标指针经过某些元素时背景变色
  8. 基于深度学习的多目标跟踪(MOT)技术一览
  9. 【AI视野·今日CV 计算机视觉论文速览 第169期】Fri, 22 Nov 2019
  10. VB操作EXCEL表的常用方法