冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 768|回覆: 0
打印 上一主題 下一主題

[討論] PIC16F877

[複製鏈接]

2609

主題

0

好友

1000

積分

金牌會員

Rank: 6Rank: 6

UID
373967
帖子
8869
主題
2609
精華
0
積分
1000
楓幣
56
威望
977
存款
34822
贊助金額
0
推廣
0
GP
1205
閱讀權限
70
在線時間
455 小時
註冊時間
2023-1-12
最後登入
2024-11-23

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-5-1 14:47:00 |只看該作者 |倒序瀏覽
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);
}
}
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1彩票
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-11-23 16:20

回頂部