冰楓論壇

標題: PIC16F886 [打印本頁]

作者: 洪嵐峰    時間: 2023-5-2 19:04
標題: PIC16F886
以下是PIC16F886所需的零件清單、腳位圖和程式碼。

所需零件清單:
PIC16F886 單晶片微控制器
USB-A 母座
INA219 電流傳感器模塊
LCD 顯示屏(16x2)
10kΩ 電阻(2個)
0.1μF 陶瓷電容(2個)
4.7μF 電解電容
杜邦線若干
連結腳位:

以下是PIC16F886晶片與其他零件之間的連接方式:

LCD 顯示屏的RS、RW、E、D4、D5、D6、D7分別與PIC16F886的RB0、RB1、RB2、RB4、RB5、RB6、RB7腳位相連接。
INA219的SCL、SDA分別與PIC16F886的RC3、RC4腳位相連接。
USB-A 母座的VCC、D+、D-分別與PIC16F886的VCC、RB3、RB2腳位相連接。
INA219的GND、VCC、VIN分別與PIC16F886的GND、VCC、RA0腳位相連接。
LCD 顯示屏的K接地。
程式碼:
以下是製作USB電壓電流顯示器所需的程式碼:


#include <16F886.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#define LCD_ENABLE_PIN  PIN_B2
#define LCD_RS_PIN      PIN_B0
#define LCD_RW_PIN      PIN_B1
#define LCD_DATA4       PIN_B4
#define LCD_DATA5       PIN_B5
#define LCD_DATA6       PIN_B6
#define LCD_DATA7       PIN_B7

unsigned int16 voltage_mV;
unsigned int16 current_mA;

void i2c_init();
void read_ina219();
unsigned int16 i2c_read_word(unsigned char address);

void lcd_init() {
    output_low(LCD_RS_PIN);
    output_low(LCD_RW_PIN);
    output_low(LCD_ENABLE_PIN);
    delay_ms(15);
    lcd_write(0b00110000, 0);
    delay_ms(5);
    lcd_write(0b00110000, 0);
    delay_us(100);
    lcd_write(0b00110000, 0);
    delay_us(40);
    lcd_write(0b00111000, 0);
    lcd_write(0b00001111, 0);
    lcd_write(0b00000001, 0);
    lcd_write(0b00000110, 0);
}

void lcd_write(unsigned char data, unsigned char is_data) {
output_bit(LCD_RS_PIN, is_data);
output_low(LCD_RW_PIN);
delay_us(1);
output_high(LCD_ENABLE_PIN);
output_b(data);
delay_us(1);
output_low(LCD_ENABLE_PIN);
delay_us(40);
}

void main() {
setup_adc_ports(NO_ANALOGS);
setup_spi(FALSE);
i2c_init();
lcd_init();
while (TRUE) {
read_ina219();
printf(lcd_putc, "\fVoltage: %4lu.%03uV\nCurrent: %4lu.%03umA", voltage_mV/1000, voltage_mV%1000, current_mA/1000, current_mA%1000);
delay_ms(1000);
}
}

void i2c_init() {
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, FAST=100000, FORCE_HW)
}

void read_ina219() {
unsigned int16 ina219_reg, ina219_val;
i2c_start();
i2c_write(0x40<<1);
i2c_write(0x04);
i2c_stop();
delay_ms(1);
ina219_reg = 0x02;
ina219_val = i2c_read_word((0x40<<1)|0x01);
voltage_mV = ina219_val*4;
ina219_reg = 0x04;
ina219_val = i2c_read_word((0x40<<1)|0x01);
current_mA = ina219_val;
}

unsigned int16 i2c_read_word(unsigned char address) {
unsigned int16 word_value;
i2c_start();
i2c_write(address);
i2c_stop();
i2c_start();
i2c_write(address+1);
word_value = (i2c_read() << 8);
word_value |= i2c_read(0);
i2c_stop();
return word_value;
}



程式碼中使用了 INA219 電流傳感器模塊和LCD顯示屏來顯示USB電壓和電流數據。
程式採用了I2C通信協議來讀取INA219的數據,並且使用了LCD 顯示屏庫來輸出數據。
你可以使用 MPLAB X IDE 來編譯和燒錄程式碼到你的PIC16F886 微控制器中。
程式的原理是在每個循環中,讀取 INA219 模塊的數據,然後輸出到 LCD 顯示屏上,並延遲 1 秒,這樣可以獲得穩定的顯示效果。

連接電路時,請注意使用適當的電阻和電容,以保護電子元件免受過電流或過電壓的損害。




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓