PIC16f877a ile MT8870D kullanımı

Başlatan Samet_33, 20 Haziran 2024, 12:55:11

Samet_33

merhaba ben MT8870D kullanarak uzaktan röle aç kapa devresi yapmak istiyorum yazılımı yazdım fakat çalışıp çalışmayacağına değir emin olamadım bir kontrol edebilrimisinz

#include <xc.h>

// Konfigürasyon Bitleri
#pragma config FOSC = HS     // Yüksek Hızlı Osilatör
#pragma config WDTE = OFF    // Watchdog Timer devre dışı
#pragma config PWRTE = OFF   // Power-up Timer devre dışı
#pragma config BOREN = ON    // Brown-out Reset etkin
#pragma config LVP = OFF     // Low Voltage Programming devre dışı
#pragma config CPD = OFF     // Veri Bellek Kopya Koruması devre dışı
#pragma config WRT = OFF     // Flash Program Belleği Yazma Koruması devre dışı
#pragma config CP = OFF      // Flash Program Belleği Kopya Koruması devre dışı

#define _XTAL_FREQ 20000000  // 20 MHz Kristal Osilatör

// Röle Kontrol Fonksiyonları
void relay_on(unsigned char relay_num) {
    PORTD |= (1 << relay_num);
}

void relay_off(unsigned char relay_num) {
    PORTD &= ~(1 << relay_num);
}

void main(void) {
    // Giriş ve Çıkışları Ayarla
    TRISB = 0x1F;  // RB0, RB1, RB2, RB3 ve RB4 giriş (MT8870D)
    TRISD = 0x00;  // Port D çıkış (Röleler)
    PORTD = 0x00;  // Başlangıçta tüm röleler kapalı
    
    unsigned char dtmf_code;
    
    while (1) {
        if (PORTBbits.RB4) {  // StD (Data Geçerlilik) kontrolü
            dtmf_code = PORTB & 0x0F;  // DTMF kodunu oku (D0-D3)
            
            switch (dtmf_code) {
                case 0x01:  // #1
                    relay_on(0);
                    break;
                case 0x02:  // #2
                    relay_on(1);
                    break;
                case 0x03:  // #3
                    relay_on(2);
                    break;
                case 0x04:  // #4
                    relay_on(3);
                    break;
                case 0x05:  // #5
                    relay_on(4);
                    break;
                case 0x06:  // #6
                    relay_on(5);
                    break;
                case 0x07:  // #7
                    relay_on(6);
                    break;
                case 0x08:  // #8
                    relay_on(7);
                    break;
                case 0x0E:  // *1
                    relay_off(0);
                    break;
                case 0x0F:  // *2
                    relay_off(1);
                    break;
                case 0x10:  // *3
                    relay_off(2);
                    break;
                case 0x11:  // *4
                    relay_off(3);
                    break;
                case 0x12:  // *5
                    relay_off(4);
                    break;
                case 0x13:  // *6
                    relay_off(5);
                    break;
                case 0x14:  // *7
                    relay_off(6);
                    break;
                case 0x15:  // *8
                    relay_off(7);
                    break;
                default:
                    break;
            }
            
            while (PORTBbits.RB4);  // StD'nin düşmesini bekle
        }
    }
}