冰楓論壇

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

[討論] STC90C52RC 交直流電流電壓監控檢測方案驗證模塊

[複製鏈接]

2609

主題

0

好友

957

積分

高級會員

Rank: 4

UID
373967
帖子
7772
主題
2609
精華
0
積分
957
楓幣
879
威望
936
存款
28000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
419 小時
註冊時間
2023-1-12
最後登入
2024-6-14

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

跳轉到指定樓層
1
發表於 2023-4-9 11:02:31 |只看該作者 |倒序瀏覽
以下是一個基於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的輸出值進行一定的轉換和校準,以保證計算出的電流和電壓值的準確性。
收藏收藏0 推0 噓0


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

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

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

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

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

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

GMT+8, 2024-6-15 14:51

回頂部