1

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

仕様は次のとおりです。

  1. 各カメラは動きセンサーに関連付けられており、動きを検出するたびに、このカメラの記録が登録および保存されるカメラの1つになります。センサーが5秒を超えて動きをキャプチャしない場合、このカメラはそれ以上記録されません。

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

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

これは、以下のコードですでに達成しています。そして今やらなければならないことは、コンパイラーの最適化なしでコードのサイズを最適化することです。コードは今では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;
    }


}
4

2 に答える 2

1

おそらく、最後の数バイトを絞り出すために、このために生成されたアセンブリコードを確認する必要があります。変数を再利用したり、操作を組み合わせたりすることで、あちこちでいくつかを削ることができるでしょう。結果として得られるコードは、きれいではないか、保守可能ではありませんが、カットオフを下回る可能性があります。

于 2012-05-22T04:05:56.123 に答える
0

if(sensor1,2,3,4)の代わりにswitchケースが役立つと思います。

于 2012-05-21T22:01:50.200 に答える