单片机中定时器与计数器的区别
2016-06-01 14:37
316 查看
定时器实际上也是计数器,只是计数的是固定周期的脉冲
定时/计数器很容易理解的啊
定时器实际上也是工作在计数方式下,只是计数的是固定周期的脉冲,由于脉冲周期固定,由计数值可以计算时间,有定时功能
定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
单片机里的寄存器可以看成一个个电子开关,用来切换不同的功能、信号。
51里通过TMOD里的T/C 位切换计数信号的来源
当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数频率为1/12fosc,当晶振频率6MHZ时,计数频率为500KHz,每2us计数值加1;晶振12MHZ就是每1us加1 了。
当T/C工作在计数器是,计数脉冲来自外部脉冲输入管脚T0(P3.4)或T1(P3.5),当T0或T1脚上负跳变时计数值加1 ,识别管脚负跳变需要2个机器周期,即24个振荡周期。所以T0或T1脚输入的可计数的外部脉冲的最高频率为1/24fosc,当晶振12MHZ时,最高计数频率为500KHz,高于此频率将计数出错。
至于赋初值就是杯子原理了,由于51只能加计数,且只能在杯子刚刚满的那一刻发出中断,触发中断程序,所以我们就往杯子里先放好一定的豆子,再来相应数量的豆子就满了,然后中断程序就自动工作了。
注意:
定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
假设我们要定时一定时间(100个机器周期),我们就置初值为(溢出值-100)就行了,假设我们要计件100个,实际上也是置初值为(溢出值-100),然后将输入脉冲设为外部输入就可以了
所以说:定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
在中断里置初值是为下一个循环作准备,没什么好说的,看需要定了。
由于定时计数器的值也可以随时读出来,所以我们也可以从0开始计数,从而计算一段时间或一定脉冲的数量哦,这是照样可以打开中断,中断时就说明已经又计数了(定时器溢出值)个脉冲哦,在中断里进行溢出处理,就可以计算出远远大于(定时器溢出值)的数字了
此时也要注意一点:51读数时除了T/C2的捕捉功能,直接读TH和TL可是不断变化的哦,具体的还是看书。当你理解了定时计数器后,我们甚至还可以将计数值置为(溢出值-1),从而实现自动单步(定时模式)或作为外部中断(计数模式)用哦,仔细想想吧,呵呵;-)
至于中断中的需要保护现场的原因,是为了防止不小心修改了别的程序的参数,从而影响别的程序的运行,所以要且只要保护中断程序自己动过的数据,将动过的那些存储器在退出中断时恢复到进入时的状态,就不会影响被中断的程序了。
汇编需要自己保存现场,反正程序就是自己编的嘛,一切尽在掌握中;
C的话编译器会自动进行覆盖分析,自动保存需要保存的变量,一般应用时尽可放心,当然,如果你很了解编译器做了什么,也可以嵌入汇编天马行空自由发挥啊,但新手可不建议这样哦,还是交给编译器吧。
其实这些可以说都是基础知识啊,如果不明白肯定是你的书看的不够仔细哦
定时/计数器很容易理解的啊
定时器实际上也是工作在计数方式下,只是计数的是固定周期的脉冲,由于脉冲周期固定,由计数值可以计算时间,有定时功能
定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
单片机里的寄存器可以看成一个个电子开关,用来切换不同的功能、信号。
51里通过TMOD里的T/C 位切换计数信号的来源
当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数频率为1/12fosc,当晶振频率6MHZ时,计数频率为500KHz,每2us计数值加1;晶振12MHZ就是每1us加1 了。
当T/C工作在计数器是,计数脉冲来自外部脉冲输入管脚T0(P3.4)或T1(P3.5),当T0或T1脚上负跳变时计数值加1 ,识别管脚负跳变需要2个机器周期,即24个振荡周期。所以T0或T1脚输入的可计数的外部脉冲的最高频率为1/24fosc,当晶振12MHZ时,最高计数频率为500KHz,高于此频率将计数出错。
至于赋初值就是杯子原理了,由于51只能加计数,且只能在杯子刚刚满的那一刻发出中断,触发中断程序,所以我们就往杯子里先放好一定的豆子,再来相应数量的豆子就满了,然后中断程序就自动工作了。
注意:
定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
假设我们要定时一定时间(100个机器周期),我们就置初值为(溢出值-100)就行了,假设我们要计件100个,实际上也是置初值为(溢出值-100),然后将输入脉冲设为外部输入就可以了
所以说:定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
在中断里置初值是为下一个循环作准备,没什么好说的,看需要定了。
由于定时计数器的值也可以随时读出来,所以我们也可以从0开始计数,从而计算一段时间或一定脉冲的数量哦,这是照样可以打开中断,中断时就说明已经又计数了(定时器溢出值)个脉冲哦,在中断里进行溢出处理,就可以计算出远远大于(定时器溢出值)的数字了
此时也要注意一点:51读数时除了T/C2的捕捉功能,直接读TH和TL可是不断变化的哦,具体的还是看书。当你理解了定时计数器后,我们甚至还可以将计数值置为(溢出值-1),从而实现自动单步(定时模式)或作为外部中断(计数模式)用哦,仔细想想吧,呵呵;-)
至于中断中的需要保护现场的原因,是为了防止不小心修改了别的程序的参数,从而影响别的程序的运行,所以要且只要保护中断程序自己动过的数据,将动过的那些存储器在退出中断时恢复到进入时的状态,就不会影响被中断的程序了。
汇编需要自己保存现场,反正程序就是自己编的嘛,一切尽在掌握中;
C的话编译器会自动进行覆盖分析,自动保存需要保存的变量,一般应用时尽可放心,当然,如果你很了解编译器做了什么,也可以嵌入汇编天马行空自由发挥啊,但新手可不建议这样哦,还是交给编译器吧。
其实这些可以说都是基础知识啊,如果不明白肯定是你的书看的不够仔细哦
相关文章推荐
- 团队冲刺2---个人工作总结八(6.1)
- VS2013中web项目中自动生成的ASP.NET Identity代码思考
- Hashtable与ConcurrentHashMap区别
- 免费Gif图片录制工具
- PHP邮箱验证示例教程
- qt4连接mysql(2)
- android背景透明导致能看到桌面解决方案
- 在Linux上配置unixODBC和FreeTDS访问MS SQL Server
- 定位加上拉加载下拉刷新
- Android群英转读书笔记第七章(Android动画机制与使用技巧)
- Android-----fragment-----跳转总结
- 总结一下这两天所学RecyclerView
- ORA-16003: standby database is restricted to read-only access
- 欢迎使用CSDN-markdown编辑器
- org.hibernate.hql.ast.QuerySyntaxException: INVOICE is not mapped [from INVOICE]
- RMQ与LCA(From TopCoder Algorithm Tutorials)
- Java foreach语法糖探秘
- 实战3--实现一组功能的步骤
- cpp 内嵌函数(lambda,struct)
- cocos2D-X源码分析之从cocos2D-X学习OpenGL(5)---绘制基本图形