洪嵐峰 發表於 2023-5-1 14:47:00

PIC16F877

PIC16F877微控制器製作電池保護板程式碼:

所需材料:

PIC16F877微控制器
電路板
兩個 N 晶體管(例如IRF4905或IRF3205)
兩個脆弱斷路器或保險絲
一個輸入保險絲座
一個12V輸入接口
一個12V輸出接口
一個LED指示燈
電阻器:220歐姆、10K歐姆
連接線、焊錫等工具

  詳細連接方式:
     - 連接 PIC16F877 的 VDD 和 VSS 到電路板的正負極。
     - 電池正極連接到輸入保險絲座,再從保險絲座的另一端連接到晶體管 Q1 的源極,Q1 的漏極連接到輸出接口。
     - 電池負極連接到輸出接口,輸出接口的另一端連接到晶體管 Q2 的源極,Q2 的漏極連接到 GND。
     - 將 PIC16F877 的 RA0 連接到 LED,LED 的負極再連接到 GND。
     - 將 PIC16F877 的 RB0 連接到輸入保險絲座,RB1 連接到晶體管 Q1 的閘極,RB2 連接到晶體管 Q2 的閘極。
     - 將 PIC16F877 的 RA4 連接到脆弱斷路器或保險絲,RA5 連接到電阻器 R1,電阻器的另一端連接到 LED 的正極,電阻器的中間端連接到 GND。
     - 將 PIC16F877 的 RC5 連接到脆弱斷路器或保險絲,RC2 連接到電阻器 R2,電阻器的另一端連接到 GND。
     - 將 PIC16F877 的 RB7 連接到輸出接口,RD0 連接到 PGD/RD0,RD1 連接到 PGC/RD1。
     

PIC16F877 電池保護板程式碼:


// 定義輸出接口引腳
#define OUT_PIN0 RB0
#define OUT_PIN1 RB1

// 定義斷路器引腳
#define BREAKER_PIN RD0
#define BREAKER_PORT PORTD

// 定義保險絲引腳
#define FUSE_PIN RD1
#define FUSE_PORT PORTD

// 定義晶體管閘極引腳
#define Q1_GATE_PIN RD2
#define Q1_GATE_PORT PORTD
#define Q2_GATE_PIN RD3
#define Q2_GATE_PORT PORTD

// 定義 LED 引腳
#define LED_PIN RB2
#define LED_PORT PORTB
#define LED_BLINK_FREQ 5 // LED 閃爍頻率

// 定義 ADC 輸入通道
#define ADC_CHANNEL 0

// 定義最大和最小安全電壓
#define MAX_VOLTAGE 1350 // 13.5V
#define MIN_VOLTAGE 900 // 9V

// 函數:初始化
void init() {
    // 設置斷路器、保險絲、晶體管閘極和 LED 引腳為輸出模式
    TRISD &= ~(1 << BREAKER_PIN);
    TRISD &= ~(1 << FUSE_PIN);
    TRISD &= ~(1 << Q1_GATE_PIN);
    TRISD &= ~(1 << Q2_GATE_PIN);
    TRISB &= ~(1 << LED_PIN);
   
    // 設置輸出接口引腳為輸入模式
    TRISB |= (1 << OUT_PIN0);
    TRISB |= (1 << OUT_PIN1);
   
    // 初始化 ADC
    ADC_Init();
}

// 主程序
void main() {
    uint16_t voltage; // 定義變量,存儲讀取的電池電壓值
   
    init(); // 初始化
   
    while (1) {
        // 讀取電池電壓
        voltage = ADC_Read(ADC_CHANNEL);  // 讀取 ADC0 的電壓值
        
        // 判斷電壓是否在安全範圍內
        if (voltage > MAX_VOLTAGE || voltage < MIN_VOLTAGE) {
            // 電壓超出安全範圍,斷開斷路器、斷開輸出接口、關閉保險絲
            BREAKER_PORT &= ~(1 << BREAKER_PIN);
            OUTPUT_PORT &= ~(1 << OUTPUT_PIN);
            FUSE_PORT &= ~(1 << FUSE_PIN);
            
            // LED 燈閃爍表示異常狀態
            for (int i = 0; i < LED_BLINK_FREQ; i++) {
                LED_PORT ^= 0x01;
                delay_ms(10);
            }
        } else {
            // 電壓在安全範圍內,關閉斷路器和保險絲
            BREAKER_PORT |= (1 << BREAKER_PIN);
            FUSE_PORT |= (1 << FUSE_PIN);

        // 開啟輸出接口
        OUTPUT_PORT |= (1 << OUTPUT_PIN);
        
        // 控制晶體管閘極,實現電池保護功能
        if (OUT_PIN0 == 0 && OUT_PIN1 == 0) {
            Q1_GATE_PORT &= ~(1 << Q1_GATE_PIN);
            Q2_GATE_PORT &= ~(1 << Q2_GATE_PIN);
        } else if (OUT_PIN0 == 1 && OUT_PIN1 == 0) {
            Q1_GATE_PORT |= (1 << Q1_GATE_PIN);
            Q2_GATE_PORT &= ~(1 << Q2_GATE_PIN);
        } else if (OUT_PIN0 == 0 && OUT_PIN1 == 1) {
            Q1_GATE_PORT &= ~(1 << Q1_GATE_PIN);
            Q2_GATE_PORT |= (1 << Q2_GATE_PIN);
        } else {
            Q1_GATE_PORT |= (1 << Q1_GATE_PIN);
            Q2_GATE_PORT |= (1 << Q2_GATE_PIN);
        }
        
        // LED 燈維持亮燈狀態
        LED_PORT = 1;
    }
   
    // 延時 100ms,等待 ADC 轉換
    delay_ms(100);
}
}
頁: [1]
查看完整版本: PIC16F877