冰楓論壇

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

[討論] PIC16F886

[複製鏈接]

2609

主題

0

好友

1003

積分

金牌會員

Rank: 6Rank: 6

UID
373967
帖子
9008
主題
2609
精華
0
積分
1003
楓幣
0
威望
980
存款
35891
贊助金額
0
推廣
0
GP
1205
閱讀權限
70
在線時間
460 小時
註冊時間
2023-1-12
最後登入
2024-12-22

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

跳轉到指定樓層
1
發表於 2023-5-2 19:04:20 |只看該作者 |倒序瀏覽
以下是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 秒,這樣可以獲得穩定的顯示效果。

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


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

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

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

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

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

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

GMT+8, 2024-12-22 11:53

回頂部