51チップマシン-タイマ/カウンタ


タイマーはその名の通り時間を設定し、この時間になると中断をトリガーし、中断の中で私たちの任務を処理することができます.タイマーのもう一つの機能はカウントであり、毎回1つの出発タイマー内部のTHである.TLが1つ追加され、満タンになるとオーバーフロー割り込みが発生します.タイマーはどうやって制御しますか?1つ目はモードレジスタTMOD
gate
T/C
M1
M0
gate
T/C
M1
M0
タイマー1
タイマー2
ここで、T/Cフラグは、タイミング機能かカウント機能かを選択するために使用される.1はタイミング、0はカウントです.
M1
M0
動作モード
0
0
方式0,13ビットカウント/タイマー
0
1
方式,1,16ビットカウント/タイマー
1
0
方式2,8ビット自動ロードカウント/タイマー
1
1
方式3は、T 0のみに適用され、タイマ0は2つの独立した8ビットタイマ/カウンタTH 0およびTL 0に分けられ、T 1は方式3で動作を停止する
もう一つTCONのレジスタ
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
  • TF 1:タイマT 1オーバーフローフラグは、プログラムによって問い合せてクリアすることができ、TF 1も割り込み要求源であり、CPUがT 1割り込みに応答するとハードウェアによってクリアされる.
  • TF 0:タイマT 0オーバーフローフラグは、プログラムによって照会され、クリアすることができ、TF 0も割り込み要求源であり、CPUがT 0割り込みに応答するとハードウェアによってクリアされる.
  • TR 1:T 1チャージカウント制御ビットは、1の場合チャージT 1カウントとなる.
  • TR 0:T 0チャージカウント制御ビット、1の場合チャージT 0カウント.
  • IE 1:外部割り込み1はソース(INT 1,P 3.3)フラグを示す.IE 1=1であり、外部割り込み1はCPUに割り込みを要求しており、CPUが割り込むべき時にハードウェアによって“0”IE 1をクリアする(エッジトリガ方式).
  • IT 1:外部割り込み源1トリガ方式制御ビット.IT 1=0、外部割り込み1のプログラム制御はレベルトリガ方式であり、INT 1(P 3.3)が低レベルに入力と、IE 1がセットされる.
  • .
  • IE 0:外部割り込み0はソース(INT 0,P 3.2)フラグを示す.IE 0=1、外部割り込み1はCPUに割り込みを要求しており、CPUが割り込むべき時にハードウェアによって“0”IE 0をクリアする(エッジトリガ方式).
  • IT 0:外部割り込みソース0トリガ方式制御ビット.IT 0=0、外部割り込み1のプログラム制御はレベルトリガ方式であり、INT 0(P 3.2)が低レベルに入力されると、IE 0がセットされる.
    割り込みラベルはご覧いただけます
    わりこみばんごう
    わりこみげん
    わりこみいりぐちアドレス
    0
    INT 0-外部割り込み0
    0003H
    1
    T 0-タイマ/カウンタ0
    000BH
    2
    INT 1—外部割り込み1
    0013H
    3
    T 1-タイマ/カウンタ1
    0018H
    4
    TI/RIシリアルポート割込み
    0023H
    タイミングとカウントのメインレジスタはTHx,TLxである.この2つのレジスタは、カウント値とタイミング値を格納するために使用されます.選択カウント機能が各パルスである場合、THTLレジスタの値は自動的に加算され、選択されたモードに収容された最大カウント値を超えると、TFはハードウェアをセットし、割り込みが発生する.級数機能を選択すると、クロックサイクルごとに自動的に1が加算され、選択したモードの許容最大値に加算され、出発が中断されます.タイマーの割り込みには2つの方法があります1つは、カウント値が最大(タイミングでもカウントでも可)になるとオーバーフロー割込みが発生します.もう1つは、外部パルスが割込み(カウント時のみ)をトリガする場合です.このときの割込みフラグビットITにはソフトウェアクリアが必要です.では、タイミング50 msなどのタイミングはどうすればいいのでしょうか.タイマーは、マシンサイクルごとに自動的に1つずつ加算されます(クロック周期=1/水晶振動数、機械周期は12クロック周期).水晶振動が12 Mの場合、機械周期は12*1/12 M=1 usである.50 msのタイミングであれば、カウンタは50 ms/1 us=50000回加算される.THTLが初期に0に設定されていれば、THTLが50000のときに操作できるが、問題はTHTL=50000というイベントをどのようにキャプチャするかである.THTL初期値=65536-50000=15536に設定すると、タイマが15536から65536に加算されるまでオーバーフロー割込みが発生し、割込みイベントをキャプチャし、周波数読み出しを行うことができます.読み出し周波数は、タイマをカウントモードに設定し、各パルスTHTLに1を加算し、タイミング割り込みで読み出しさえすれば周波数を算出することができる.
    51で作ったのは周波数計です.タイミング1はカウント機能、タイマー0はタイミング機能、タイミング50 ms、50 ms毎に割り込み、20回割り込み1 s、カウンタの値を読み出し、この値が周波数です.
    uint16_t fre = 0;
    uint8_t extfre=0;
    void main()
    {   
        TMOD = 0x51;  //0101 0001,   1      ,   0      ,       
        TH0 = (65536-50000) / 256; //     
      TL0 = (65536-50000) % 256;
      EA = 1;
      ET0 = ET1 = 1;//     T0,T1 Enable Time
      TR0 = TR1 = 1;//       Time Run
    
        while(1)        
        {
        }
    }
    void T0_time()interrupt 1    //50ms
    {
        static uint8_t count = 0;
    
        TH0=(65536-50000)/256; //      
      TL0=(65536-50000)%256;
    
        if(20 == ++count)//1s
        {
            count = 0;
            fre = extfre << 16 + TH1 << 8 + TL1;
            TH1 = TL1 =0;//      
            extfre = 0;
        }
    }
    void T1_time()interrupt 3 
    {
        if(TF1) 
        {
            extfre++;
        }
    }