- UID
- 373967
- 帖子
- 9013
- 主題
- 2609
- 精華
- 0
- 積分
- 1004
- 楓幣
- 0
- 威望
- 981
- 存款
- 35926
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 460 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-23
|
以下是一個基於STC90C52RC單片機的交直流電流電壓監控檢測方案驗證模塊的電路連接和程式碼示例:
電路連接
使用ACS712電流感測模塊和ZMPT101B電壓感測模塊分別檢測交流和直流電流電壓。
將ACS712和ZMPT101B的OUT引腳分別接到P1口的0和1引腳上,並且使用一個電容將引腳變化平滑。
使用LCD1602液晶屏顯示檢測到的電流電壓數值,並且將液晶屏的RS、RW和E引腳分別接到P2口的0、1和2引腳上,將液晶屏的D0-D7引腳分別接到P3口的0-7引腳上。
程式碼
#include <STC12C5A60S2.H>
#include <intrins.h>
#define LCD_DataBus P3
sbit RS = P2^0; //液晶顯示器命令/數據選擇信號端口
sbit RW = P2^1; //液晶顯示器讀/寫選擇信號端口
sbit EN = P2^2; //液晶顯示器使能信號端口
sbit ACSSig = P1^0; //ACS712電流感測模塊信號輸出端口
sbit ZMPTSig = P1^1; //ZMPT101B電壓感測模塊信號輸出端口
float voltage, current;
unsigned char str1[16], str2[16];
void init()
{
TMOD = 0x21;
TH0 = 0xf8;
TL0 = 0x2c;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 114; j++);
}
}
void write_com(unsigned char com)
{
RS = 0;
RW = 0;
EN = 1;
LCD_DataBus = com;
_nop_();
_nop_();
EN = 0;
}
void write_data(unsigned char dat)
{
RS = 1;
RW = 0;
EN = 1;
LCD_DataBus = dat;
_nop_();
_nop_();
EN = 0;
}
void write_str(unsigned char x, unsigned char y, unsigned char *str)
{
unsigned char i;
if(y == 0) write_com(0x80 + x);
if(y == 1) write_com(0x80 + 0x40 + xfor(i = 0; str[i] != '\0'; i++)
{
write_data(str[i]);
}
}
void main()
{
init();
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_str(0, 0, "Voltage:");
write_str(0, 1, "Current:");
while(1)
{
voltage = ((float)ADCRH * 256 + ADCRL) / 1024 * 220;
current = ((float)ADCSRH * 256 + ADCSRL) / 1024 * 5 / 0.066;
sprintf(str1, "%5.2fV ", voltage);
sprintf(str2, "%5.2fA ", current);
write_str(9, 0, str1);
write_str(9, 1, str2);
delay_ms(1000);
}
}
void timer0() interrupt 1
{
TH0 = 0xf8;
TL0 = 0x2c;
ADC_CONTR = 0x80;
while(!ADC_CONTR & 0x20);
}```
上述程式碼會不斷地檢測ACS712和ZMPT101B模塊的輸出值,並根據公式計算出對應的電流和電壓值,最後在LCD1602液晶屏上顯示出來。
其中,ADC_CONTR是單片機內置的ADC模塊的控制寄存器,用於控制ADC的啟動和停止。
在每個定時器中斷中,單片機會重新設置定時器的初值,然後啟動ADC模塊進行數值檢測,並等待ADC完成檢測後再計算出電流和電壓值。
由於單片機的ADC精度比較低,因此在程式碼中需要對ADC的輸出值進行一定的轉換和校準,以保證計算出的電流和電壓值的準確性。 |
|