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]