- UID
- 373967
- 帖子
- 8822
- 主題
- 2609
- 精華
- 0
- 積分
- 994
- 楓幣
- 0
- 威望
- 971
- 存款
- 34510
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 50
- 在線時間
- 452 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-12
|
需要以下零件:
PIC16F628微控制器
LCD顯示屏
3.電流互感器
4.電容
5.電阻
6.電感
7.電位器
8.二極體
9.電解電容
10.繼電器
11.鐵芯繼電器
12.光電耦合器
13.開關
14.連接線
15.麵包板
PIC16F628的連接腳位如下:
Pin Name Function
1 RB0 Input
2 RB1 Input/Output
3 RB2 Input/Output
4 RB3 Input/Output
5 RB4 Input/Output
6 RB5 Input/Output
7 RB6 Input/Output/PGM Data
8 RB7 Input/Output/PGM Clock
9 VSS Ground
10 VDD Power Supply (5V)
11 OSC1 Crystal Oscillator
12 OSC2 Crystal Oscillator
13 RC0 Input/Output
14 RC1 Input/Output
15 RC2 Input/Output
16 RC3 Input/Output
17 RC4 Input/Output
18 RC5 Input/Output/SSP Clock
19 RC6 Input/Output/USART TX/CK
20 RC7 Input/Output/USART RX/DT
這裡提供PIC16F628電度機程式碼
你可以根據自己的需要進行修改和調整。
#include <pic16f628.h>
// LCD模組的定義
#define LCD_RS RB1
#define LCD_EN RB2
#define LCD_DATA PORTC
// 電流互感器的定義
#define CT RB0
// 電度計的變量
float voltage = 0; // 電壓
float current = 0; // 電流
float power = 0; // 功率
float energy = 0; // 電能
float energy_total = 0; // 總電能
// LCD模組初始化
void lcd_init()
{
// 設定輸出模式
TRISB1 = 0;
TRISB2 = 0;
TRISC = 0;
// 初始化LCD
LCD_RS = 0;
LCD_EN = 0;
LCD_DATA = 0x38;
__delay_ms(15);
LCD_EN = 1;
__delay_ms(5);
LCD_EN = 0;
__delay_ms(5);
LCD_DATA = 0x38;
__delay_ms(5);
LCD_EN = 1;
__delay_ms(5);
LCD_EN = 0;
__delay_ms(5);
LCD_DATA = 0x0C;
__delay_ms(5);
LCD_EN = 1;
__delay_ms(5);
LCD_EN = 0;
__delay_ms(5);
LCD_DATA = 0x01;
__delay_ms(5);
LCD_EN = 1;
__delay_ms(5);
LCD_EN = 0;
__delay_ms(5);
LCD_DATA = 0x06;
__delay_ms(5);
LCD_EN = 1;
__delay_ms(5);
LCD_EN = 0;
__delay_ms(5);
}
// LCD模組寫入字元
void lcd_write_char(unsigned char c)
{
LCD_RS = 1;
LCD_EN = 0;
LCD_DATA = c;
LCD_EN = 1;
__delay_us(40);
LCD_EN = 0;
__delay_us(40);
}
// LCD模組寫入命令
void lcd_write_cmd(unsigned char c)
{
LCD_RS = 0;
LCD_EN = 0;
LCD_DATA = c;
LCD_EN = 1;
__delay_us(40);
LCD_EN = 0;
__delay_us(40);
}
// LCD模組顯示字符串
void lcd_write_string(unsigned char *str)
{
while(*str)
{
lcd_write_char(*str++);
}
}
// 讀取ADC值
unsigned int adc_read(unsigned char channel)
{
ADCON0 = ((channel << 2) & 0b00111100) | (ADCON0 & 0b11000011);
__delay_us(20);
GO_nDONE = 1;
while(GO_nDONE);
return (ADRESH << 8) | ADRESL;
}
// 初始化ADC
void adc_init()
{
ADCON0 = 0b00000001;
ADCON1 = 0b00001110;
ADRESH = 0;
ADRESL = 0;
}
// 主函數
void main()
{
// 初始化
lcd_init();
adc_init();
// 主循環
while(1)
{
// 讀取電壓
unsigned int voltage_adc = adc_read(0);
voltage = voltage_adc * 5.0 / 1024.0;
// 讀取電流
unsigned int current_adc = adc_read(1);
current = current_adc * 5.0 / 1024.0;
// 計算功率
power = voltage * current;
// 計算電能
energy += power / 3600.0;
// 計算總電能
energy_total += energy;
// 顯示數據
lcd_write_cmd(0x80);
lcd_write_string("Voltage: ");
lcd_write_string(voltage);
lcd_write_string("V");
lcd_write_cmd(0xC0);
lcd_write_string("Current: ");
lcd_write_string(current);
lcd_write_string("A");
lcd_write_cmd(0x94);
lcd_write_string("Power: ");
lcd_write_string(power
lcd_write_string("W");
lcd_write_cmd(0xD4);
lcd_write_string("Energy: ");
lcd_write_string(energy);
lcd_write_string("Wh");
lcd_write_cmd(0x87);
lcd_write_string("Total: ");
lcd_write_string(energy_total);
lcd_write_string("Wh");
// 延遲一秒
__delay_ms(1000);
}
}
這是電度機程式,使用了PIC16F628微控制器、LCD模組和ADC模組。
需要的零件清單如下:
PIC16F628微控制器
16x2字符LCD模組
10k歐姆電阻器
0.1uF陶瓷電容器
1uF電解電容器
LM35溫度感測器
直流電源
連接腳位如下:
LCD_RS -> PIC16F628 RA2腳
LCD_EN -> PIC16F628 RA3腳
LCD_DATA -> PIC16F628 PORTB腳
ADC模組 -> PIC16F628 PORTA腳
程式碼中有一些基本的函數,例如lcd_init()用於初始化LCD模組,lcd_write_char()和lcd_write_cmd()用於向LCD模組寫入字符和命令,adc_init()用於初始化ADC模組,adc_read()用於讀取ADC值。
在主函數中,首先初始化LCD模組和ADC模組。
然後進入主循環,在循環中讀取電壓和電流值,計算功率和電能,並顯示在LCD模組上。
最後延遲一秒後進入下一輪循環。 |
|