zoukankan      html  css  js  c++  java
  • 单片机中定时器与计数器的区别

    定时器实际上也是计数器,只是计数的是固定周期的脉冲
           定时/计数器很容易理解的啊
           定时器实际上也是工作在计数方式下,只是计数的是固定周期的脉冲,由于脉冲周期固定,由计数值可以计算时间,有定时功能
            定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。
            单片机里的寄存器可以看成一个个电子开关,用来切换不同的功能、信号。

    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的话编译器会自动进行覆盖分析,自动保存需要保存的变量,一般应用时尽可放心,当然,如果你很了解编译器做了什么,也可以嵌入汇编天马行空自由发挥啊,但新手可不建议这样哦,还是交给编译器吧。

              其实这些可以说都是基础知识啊,如果不明白肯定是你的书看的不够仔细哦

  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/fjutacm/p/3456716.html
Copyright © 2011-2022 走看看