문제

8051 마이크로 컨트롤러를위한 카메라 감시 시스템을 구현하는이 문제를 해결해야합니다.

이들은 사양입니다 :

  1. 각 카메라는 이동 센서와 관련이 있으며, 움직임을 감지 할 때 마다이 카메라의 기록은 등록되고 저장 될 수 있습니다. 센서가 5 초 이상 움직이는 모든 움직임을 캡처하지 않으면이 카메라는 더 이상 기록되지 않습니다.

  2. 카메라가 없으면 비디오 레코더가 "일시 중지"여야합니다.

  3. 둘 이상의 카메라가 켜져있는 경우 멀티플렉서 (MUX)를 사용하여 카메라 신호를 3 초 동안 기록하도록 카메라 신호를 선택해야합니다. 이렇게하면 모든 활성 카메라가 3 초 동안 기록되어야합니다. 하나의 카메라 만 활성화되어 있으면 신호가 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;
        }
    
    
    }
    
    .

도움이 되었습니까?

해결책

생성 된 어셈블리 코드를 볼 수 있도록 생성 된 어셈블리 코드를 살펴볼 수 있습니다.변수 또는 결합 작업을 재사용하여 여기에서 몇 가지를 면도 할 수 있습니다.결과 코드는 꽤 또는 유지 보수가되지 않습니다. 그러나 그것은 당신의 컷오프 아래에 당신을 얻을 수 있습니다.

다른 팁

Sensor1, 2,3,4 (seren) 대신 스위치 케이스가 도움이 될 수 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top