avr单片机c语言计算log,AVR单片机定时器初值计算公式与方法 - 单片机定时器初值计算公式(51单片机和AVR单片机的初值计算三种方法)...
二、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单片机的初值计算三种方法)...相关推荐
- 计算地球上两点距离(震中距)的Matlab函数(兼容度数和度分秒)及另外三种方法
目录 写在前面 方法1: taup 方法2: ObsPy 方法3: Mapping Toolbox的distance函数 方法4: 自己写的Matlab函数 参数 公式 函数 写在前面 最近要计算震中 ...
- 11【C语言 趣味算法】个人所得税问题(结构体应用):结构体的声明、定义结构体类型的三种方法等
Contents 一.Review 二.New Problem:Personal income tax issues(个人所得税问题) 2.1 Description of the problem 2 ...
- 单片机跑马灯程序c语言,MCS-51单片机控制跑马灯的三种方法
描述 在MCS一51单片机的控制系统中,它的四个并行8位输入输出端口P0一P3是我们经常使用的.在并行端口的编程学习中,"跑马灯"是单片机并行端口输出控制的典型实例.所谓跑马灯,是 ...
- stcisp一直检测单片机_三种方法对比:STC51单片机实现免冷启动
具体实现方法实践可用的无外乎三种: 1)使用CH340的DTR和RTS控制单片机断电再上电.点上位机下载按钮的时候,DTR和RTS引脚电平变化. 2)再使用一个单片机,检测串口下载命令流. 3)在程序 ...
- c语言程序π,C语言求圆周率π(三种方法)
题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止. 题目2) 根据公式②,用前100项之积计算π的值. 题目1)提供了一种解法,题目2)提供了两种解法,请看解析. 题目1) ...
- c语言求圆周率 . 4,C语言求圆周率π(三种方法)(4页)-原创力文档
C语言求圆周率π(三种方法) 题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止.题目2) 根据公式②,用前100项之积计算π的值.题目1)提供了一种解法,题目2)提供了两种 ...
- 计算两个数平均值的三种方法
第一种方法: 思路:两数相加求和再除2 代码 int a=10;int b=20;int avg=0;avg=(a+b)/2;//平局值//或者avg=(a+b)>>1://右移表示除2, ...
- c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程
c语言计算机编程三种方法求解非线性方程 本 科 专 业 学 年 论 文题 目:非线性方程求解比较姓 名: 何 娟 专 业: 计算机科学技术系 班 级: 08 级本科(2)班 指 导 老 师: 刘 晓 ...
- c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程.doc
c语言计算机编程三种方法求解非线性方程.doc 本 科 专 业 学 年 论 文题 目非线性方程求解比较姓 名 何 娟 专 业 计算机科学技术系 班 级 08 级本科(2)班 指 导 老 师 刘 晓 娜 ...
- 两数求最大公约数的三种方法的C语言实现
任意输入两个数,求出二者的最大公约数,以C语言实现.以下是三种方法以及对应思路: <1>辗转相除法. 定义两个变量存放两个数(a,b),先以冒泡法将较大数存放在在b内,较小数存放于a. 相 ...
最新文章
- 日常开发中常用到哪些设计模式
- 请指出document load和document ready的区别?
- 执行delete触发器及示例演示
- 操作系统 chapter 12 死锁
- Linux buffer/cache异同
- 组合的输出pascal程序
- 万字综述,核心开发者全面解读PyTorch内部机制
- 【Linux】一步一步学Linux——groups命令(93)
- 【Linux网络编程】套接字的介绍
- nzhtl1477-ただいま帰りました ( bfs )
- 【渝粤题库】国家开放大学2021春2768养禽技术题目
- oracle用户获取datameta权限,Oracle数据库提权(低权限提升至dba)
- 51 Nod 1161 Partial sums
- dij算法堆优化_BZOJ 3040 最短路(road) 堆优化Dijkstra | 学步园
- O-RAN: Towards an Open and Smart RAN
- python求解LeetCode习题Find Peak Element in Given num_list
- 前端实现Flexpaper的界面的效果
- matlab二次曲线插补,圆弧插补器插补非圆二次曲线的方法
- 戴尔机架式服务器哪个型号好,戴尔_PowerEdge R540_机架式服务器参数_服务器推荐购买 | Dell 中国大陆...
- 使用 Anaconda 安装 Pytorch
热门文章
- 给本本K46C升级内存并升级64位WIN7
- 技术总监需要做些什么?
- html图片的边框属性,css3:border-image边框图像详解
- html5页面分享到微信qq,HTML 分享页面到QQ/微信、微博等平台
- Ubuntu终端中字体颜色含义
- java程序员的电脑配置_JAVA程序员笔记本电脑推荐?
- JavaScript+css+html鼠标指针经过某些元素时背景变色
- 基于深度学习的多目标跟踪(MOT)技术一览
- 【AI视野·今日CV 计算机视觉论文速览 第169期】Fri, 22 Nov 2019
- VB操作EXCEL表的常用方法