/*************************************************************************
实验名称:定时器原理学习实验
功能描述:本程序演示定时器比较匹配中断和溢出中断中对定时器相关寄存器的操作,在while(1)循环中也一直读取定时器的寄存器的值。
实验目的:了解定时器工作原理。
实验说明:MCU--M16
内部1M RC振荡器
本实验讨论地址:http://bbs.avrvi.com/read-htm-tid-2564.html
连接方式:PA0--LED0
PA1--LED1
PORTB--七段数码管的a~f
建议使用JTAG在线调试程序,在中断中设置断点,然后全速运行,通过查看断点以及寄存器的值深入了解定时器工作流程。
Copy Right (c) www.avrvi.com AVR与虚拟仪器
创建时间:2008.1.29
最后修改:2008.1.29
修改说明:
*************************************************************************/
文件结构:
--readme.txt
--source
--main.c
--main.prj
--output
--main.cof
--main.hex
--sch
--timer_2.pdf
/*************************************************************************/
定时器是独立运行的,它不占用CPU的时间,不需要指令,只有调用对应的寄存器的时候才需要参与。
以AVR mega16为例,它有三个寄存器,timer0,timer1和timer2,T0和T2是8位定时器,T1是16位寄存器,T2为异步定时器,三个定时器都可以用于产生PWM。
以定时器T0来简单介绍定时器的操作方法,T0有三个寄存器可以被CPU访问,TCCR0,TCNT0,OCR0,下面看一段ICC生成的定时器初始化程序。
CODE:
//TIMER0 initialize - prescale:8
// WGM: Normal
// desired value: 1KHz
// actual value: 1.000KHz (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x83; //set count
OCR0 = 0x7D; //set compare
TCCR0 = 0x02; //start timer
}
TCCR0为控制寄存器,用于控制定时器的工作模式细节;
TCNT0为T/C 寄存器,它的值在定时器的每个工作周期里加一或减一,实现定时操作,CPU可以随时读写TCNT0;
OCR0:输出比较寄存器,它包含一个8 位的数据,不间断地与计数器数值TCNT0 进行比较。匹配事件可以用来产生输出比较中断,或者用来在OC0 引脚上产生波形。
这里说最简单的模式,TCNT一直加一,到达最大值0xFF然后清零,进入下一次计数,在上面的程序中。
TCCR0=0x00;关闭T0的时钟源,定时器停止工作。
TCNT0=0x83;设置T/C寄存器的初始值,及让定时器从TCNT0从0x83开始定时或计数。
OCR0 = 0x7D;设定比较匹配寄存器的值,这个程序里没有使用。
TCCR0 = 0x02;选择时钟源,来自时钟8分频,设置后定时器就开始工作。
初始化后定时器开始工作,TCNT0在每一个定时器时钟加一,当TCNT0等于OCR0的值时,T/C 中断标志寄存器- TIFR中的OCF0 置位,如果这时候TIMSK中OCIE0为1(即允许T0比较匹配中断),并且全局中断允许,比较匹配中断即运行。中断程序中可以对TCNT0和0CR0进行操作,对定时器进行调整。
TCNT0继续加一,当达到0xFF时,T/C 中断标志寄存器- TIFR中的TOV0置位,如果这时候TIMSK中TOIE0为1(即允许T0溢出中断),并且全局中断允许,溢出中断即运行。中断程序中可以对TCNT0和0CR0进行操作,对定时器进行调整。
和定时器相关的寄存器还有SREG和TIMSK,前者位1控制全局中段允许,后者位1(OCIE0)和位0(TOIE0)分别控制比较匹配中断和溢出比较匹配中断允许。
实际的过程中,定时器相关寄存器的操作非常灵活,可以在溢出中断中修改TCNT0的值,也可以在中断中修改OCR0的值,后面的实验中会讲到用定时器1修改OCR1A的方法实现1S精确定时。
师傅领进门,修行靠个人,定时器的基本原理说到这里,要更深入的了解定时器,请看数据手册。
定时公式:Time=PRE*(MAX-TCNT0+1) /F_cpu单位S ,其中,PRE为与分频数,本例中为8,MAX即为最大值255,TCNT0为初始化时的值,本例中为0x83(十进制的131),T_cpu,系统时钟频率,本例中为1000000。
本例程序中定时时间为:Time=8*(255-131+1)/1000000=0.001 S ,即为1ms,1Khz。可以看出,如果晶振选为8M,则定时时间变为0.000125S,也就是说晶振越大,定时时间越短,预分频越大,定时越长。
在设置时如果你选择1ms,会得到如下结果,和上面的1Khz相同。
CODE:
//TIMER0 initialize - prescale:8
// WGM: Normal
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x83; //set count
OCR0 = 0x7D; //set compare
TCCR0 = 0x02; //start timer
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
AVR单片机ATmega16实验代码 (1772个子文件)
sio._c 13KB
function._c 12KB
main._c 10KB
3310_5110LCD._c 8KB
3310_5110LCD._c 8KB
3310_5110LCD._c 8KB
3310_5110LCD._c 8KB
3310_5110LCD._c 8KB
serial_lcd._c 7KB
main._c 7KB
PCF8563._c 6KB
7segled._c 6KB
key_board._c 5KB
key_board._c 5KB
PCF8563._c 4KB
AT24C01._c 4KB
18b20._c 3KB
single_key._c 3KB
softuart._c 3KB
main._c 3KB
uitil._c 3KB
step_motor._c 3KB
main._c 2KB
single_key._c 2KB
main._c 2KB
main._c 2KB
main._c 2KB
main._c 2KB
main._c 2KB
adc._c 2KB
TWI._c 2KB
TWI._c 2KB
adc._c 2KB
main._c 2KB
main._c 2KB
main._c 2KB
main._c 2KB
main._c 2KB
main._c 2KB
delay._c 2KB
main._c 2KB
main._c 2KB
main._c 2KB
7segled._c 2KB
7segled._c 2KB
main._c 1KB
main._c 1KB
key._c 1KB
delay._c 1KB
main._c 1KB
uitil._c 1KB
uitil._c 1KB
main._c 1KB
main._c 1KB
main._c 1KB
main._c 1KB
SPK._c 1KB
main._c 1KB
soft_test._c 1KB
Master._c 1KB
main._c 1KB
main._c 1KB
main._c 1KB
main._c 1KB
main._c 1KB
uitil._c 1KB
uitil._c 1KB
main._c 1KB
spi._c 1KB
spi._c 1KB
spi._c 1KB
spi._c 1KB
delay._c 1KB
main._c 1KB
main._c 1KB
main._c 1KB
main._c 1KB
main._c 1002B
main._c 984B
main._c 969B
Slave._c 961B
main._c 953B
main._c 947B
main._c 941B
main._c 897B
main._c 892B
delay._c 864B
delay._c 863B
main._c 858B
main._c 854B
main._c 828B
main._c 811B
main._c 748B
main._c 720B
delay._c 704B
delay._c 704B
delay._c 704B
main._c 615B
main._c 512B
main._c 479B
共 1772 条
- 1
- 2
- 3
- 4
- 5
- 6
- 18
资源评论
- wuyecaoabc2012-11-29希望这份资料对我有很大的帮助,谢谢分享!
- 普通网友2020-02-17这个还可以,不错
- liu2wei2013-10-01对我有很大的帮助,谢谢分享!
chenxi0040
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于c语言哈夫曼树编码压缩实践项目
- 51单片机C开发实例带讲解视频LCD12864串行模式
- ITK中2D中基于B样条BSpline的可变形多分辨率配准样例的输入输出图像
- Free_UNetModel(扩散模型).py
- 51单片机C开发实例带讲解视频LCD12864并行模式
- When in the course of human events, it becomes necessary for one.txt
- 51单片机C开发实例带讲解视频GPS信息获取LCD1602显示UTC转换
- k210在maixhub平台上训练模型用到的固件
- 基于 C++通过动态规划来查找最长公共子序列计算字符串之间的相似度
- 51单片机C实例带讲解视频DS18B20温度传感器测量程序LCD1602显示
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功