質問

だから、私はこの挑戦をしなければなりません。これは、8051マイクロコントローラのためのカメラ監視システムを実装することです。

これらは仕様です:

  1. 各カメラは移動センサに関連しており、動きを検出するたびに、このカメラの記録が登録されて保存されるものの一つになる。センサーが5秒以上動きを捉えない場合、このカメラはもう記録されません。

  2. カメラがない場合は、ビデオレコーダーが「一時停止」にしている必要があります。

  3. 複数のカメラがONの場合、マルチプレクサ(MUX)を使用してカメラの信号を選択して3秒間記録されます。このようにして、すべてのアクティブなカメラを3秒間記録する必要があります。 1つのカメラがアクティブになっている場合、それはMUXの唯一のものです。

  4. これはすでに以下のコードで達成されています。そして今やらなければならないのは、コンパイラの最適化なしでコードのサイズを最適化することです。コードは198バイトですが、私は180バイトを下回りました。

    それは可能ですか?私はすでに#defineの計算をしようとしましたが、コンパイラはすでに私のためにそれを最適化しています。

    #include <REG51F.h>
    
    #define TIMEOUT 50
    #define TIMEOUT_REC 30
    
    #define FrClk 12000000
    #define FreqTimer0_emHz 10
    #define VALOR_TH0 ((65536 - (FrClk /(12 * FreqTimer0_emHz ))) >> 8)
    #define VALOR_TL0 ((65536 - (FrClk /(12 * FreqTimer0_emHz ))) & 0xFF)
    
    
    data bit PAUSE_INT;
    data bit PAUSE_TMP;
    sbit PAUSE = P0^0;
    sbit SENSOR1 = P0^1;
    sbit SENSOR2 = P0^2;
    sbit SENSOR3 = P0^3;
    sbit SENSOR4 = P0^4;
    sbit MUX0 = P0^5;
    sbit MUX1 = P0^6;
    
    data unsigned char CAM[4];
    data unsigned char REC;
    data unsigned char index;
    data unsigned char count;
    
    void timer0_int (void) interrupt 1 using 2 {
        for (index = 0; index < 4; index++)
            if(CAM[index])
            CAM[index]--;
    
        if (!PAUSE_INT && REC)
            REC--;
        else
        { 
             REC = TIMEOUT_REC;
             index = (index + 1) & 0x03;
             for (count = 0; !CAM[index] && count < 4; index = (index + 1) & 0x03, count++);
    
             MUX0 = index & 0x1;
             MUX1 = index & 0x2;
    
    
             PAUSE_INT = 0;
        }   
    }
    
    int main(void)
    {
    
        PAUSE_TMP = 1;
        PAUSE_INT = 0;
    
        index = 0;
    
        //timer0_init
        EA = 1;
        TR0 = 0;              
        TMOD = (TMOD & 0xF0) | 0x01;  
        TH0 = VALOR_TH0;  
        TL0 = VALOR_TL0;
        ET0 = 1;     
        TR0 = 1;     
    
        while(1) {
    
            if (SENSOR1)
            {
                    CAM[0] = TIMEOUT;
            }
    
            if (SENSOR2)
            {
                    CAM[1] = TIMEOUT;
            }
    
            if (SENSOR3)
            {
                    CAM[2] = TIMEOUT;
            }
    
            if (SENSOR4)
            {
                    CAM[3] = TIMEOUT;
            }
    
            if (CAM[0] || CAM[1] || CAM[2] || CAM[3])
            {
                    if (PAUSE_TMP)
                            PAUSE_INT = 1;
                    PAUSE_TMP = 0;
            }
            else {
                    PAUSE_TMP = 1;
            }
    
                PAUSE = PAUSE_TMP;
        }
    
    
    }
    
    .

役に立ちましたか?

解決

最後の数バイトをそのうちのどちらのバイトを書き出すために、これに対して生成されたアセンブリコードを調べる必要があります。これは、ここでいくつかを剃ることが可能です。可変または組み合わせ操作を再利用することができます。結果のコードはきれいか保守的ではありません - しかしそれはあなたのカットオフの下にあなたを手に入れるかもしれません。

他のヒント

if(Sensor1,2,3,4)の代わりにスイッチケースがあると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top