洪嵐峰 發表於 2023-5-1 15:21:35

PIC18F1320

對於製作PIC18F1320電池保護板
需要以下零件:

PIC18F1320微控制器
16 MHz晶振
22pF陶瓷電容 x2
10uF電解電容
1N4007二極管
2N3904 NPN晶體管
2N3906 PNP晶體管
1k歐姆電阻 x2
2.2k歐姆電阻
10k歐姆電阻
LED
蜂鳴器
2x3母頭排針
2x3公頭排針
電池夾 x2

接下來是PIC18F1320的腳位連結:

RA0 - 不使用
RA1 - 不使用
RA2 - 不使用
RA3 - 不使用
RA4 - 不使用
RA5 - 不使用
RE0 - 不使用
RE1 - 不使用
RE2 - 不使用
VSS - 地
VDD - 正電源
RC0 - LED
RC1 - 不使用
RC2 - 蜂鳴器
RC3 - 不使用
RC4 - 不使用
RC5 - 不使用
RB0 - 不使用
RB1 - 不使用
RB2 - 不使用
RB3 - 不使用
RB4 - 不使用
RB5 - 不使用
RB6 - 1k歐姆電阻
RB7 - 2N3906 PNP晶體管
RB8 - 1N4007二極管
RB9 - 10k歐姆電阻
RB10 - 2.2k歐姆電阻
RB11 - 10uF電解電容
RB12 - 2N3904 NPN晶體管
RB13 - 22pF陶瓷電容
RB14 - 16 MHz晶振
RB15 - 22pF陶瓷電容

下面是完整的程式碼:

#include <xc.h>
#include <pic18f1320.h>

// 定義控制LED的腳位
#define LED_PIN RC0

// 定義控制蜂鳴器的腳位
#define BUZZER_PIN RC2

// 定義控制放電開關的腳位
#define DISCHARGE_PIN RB6

// 定義控制充電開關的腳位
#define CHARGE_PIN RB8

// 定義ADC通道
#define ADC_CHANNEL 0

// 定義最大電壓值
#define

#define MAX_VOLTAGE 1300

// 定義ADC最大值
#define ADC_MAX 1023

void main() {
// 設置I/O方向
TRISC0 = 0; // LED輸出
TRISC2 = 0; // 蜂鳴器輸出
TRISB6 = 0; // 放電開關輸出
TRISB8 = 0; // 充電開關輸出

// 初始化ADC
ADCON0bits.ADON = 1; // 啟用ADC
ADCON0bits.CHS = ADC_CHANNEL; // 選擇通道
ADCON1bits.PCFG = 0b1100; // 設置所有類比通道為類比輸入
ADCON2bits.ACQT = 0b111; // 設置取樣時間為20個時鐘週期
ADCON2bits.ADCS = 0b110; // 設置時鐘分頻為64
ADCON2bits.ADFM = 1; // 設置結果為右對齊

// 初始化定時器
T0CONbits.T08BIT = 0; // 設置為16位計時器
T0CONbits.T0CS = 0; // 設置時鐘源為內部
T0CONbits.PSA = 0; // 啟用計時器時鐘分頻器
T0CONbits.T0PS = 0b111; // 設置時鐘分頻為256
TMR0H = 0; // 設置計時器初值
TMR0L = 0;
T0CONbits.TMR0ON = 1; // 啟用計時器

// 啟用中斷
INTCONbits.PEIE = 1; // 啟用外部中斷
INTCONbits.GIE = 1; // 啟用全域中斷

while (1) {
    // 讀取電壓值
    ADCON0bits.GO = 1; // 啟動ADC轉換
    while (ADCON0bits.GO); // 等待轉換完成
    unsigned int voltage = (unsigned int)ADRESH << 8 | ADRESL;

    // 計算電壓值
    unsigned int adc_max_voltage = MAX_VOLTAGE * ADC_MAX / 5000;
    unsigned int actual_voltage = voltage * 5000 / ADC_MAX;
    unsigned int battery_voltage = actual_voltage * MAX_VOLTAGE / adc_max_voltage;

    // 控制LED
    if (battery_voltage >= 1200) {
        LED_PIN = 1;
    } else {
        LED_PIN = 0;
    }

    // 控制蜂鳴器
    if (battery_voltage <= 1100) {
        BUZZER_PIN = 1;
    } else {
        BUZZER_PIN = 0;
    }

    // 控制放電開關
    if (battery_voltage >= 1300) {
        DISCHARGE

        DISCHARGE_PIN = 1;
    } else {
        DISCHARGE_PIN = 0;
    }

    // 控制充電開關
    if (battery_voltage <= 1100) {
        CHARGE_PIN = 1;
    } else {
        CHARGE_PIN = 0;
    }

    // 等待一段時間
    delay(1000);
}
}

// ADC轉換通道
#define ADC_CHANNEL 0b000

// LED輸出引腳
#define LED_PIN RC0

// 蜂鳴器輸出引腳
#define BUZZER_PIN RC2

// 放電開關輸出引腳
#define DISCHARGE_PIN RB6

// 充電開關輸出引腳
#define CHARGE_PIN RB8

// 延時函數
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 1000; j++);
}
}

// 外部中斷處理函數
void interrupt isr(void) {
if (TMR0IF) {
TMR0IF = 0;
TMR0H = 0;
TMR0L = 0;
}
}






以上是PIC18F1320製作電池保護板的範例程式碼,需要注意以下幾點:

該程式碼僅供參考,具體的硬體接線和元件選擇需要根據實際需求進行調整。

該程式碼使用了ADC模塊進行電壓檢測,並將檢測到的電壓值轉換為實際電壓值進行計算。

該程式碼控制了LED、蜂鳴器、放電開關和充電開關的輸出,以實現對電池的保護功能。

程式中使用了延時函數來實現等待一段時間的功能。

程式中使用了定時器中斷來實現定時清零計數器的功能。
頁: [1]
查看完整版本: PIC18F1320