找回密码
 立即注册
查看: 351|回复: 1

我在用AI8H8K64U搭配BL0942读取交流电的电压电流,这个代码始终编译错误 (

[复制链接]
已绑定手机

5

主题

14

回帖

60

积分

注册会员

积分
60
发表于 2024-12-18 19:39:47 | 显示全部楼层 |阅读模式
#define ST7735S_TFT_LCD_RESET  P3_6
#define ST7735S_TFT_LCD_RESET_OUT  {P3M1&=~0x40;P3M0|=0x40;}//P3_6推挽输出
#define ST7735S_TFT_LCD_CS  P0_5
#define ST7735S_TFT_LCD_CS_OUT  {P0M1&=~0x20;P0M0|=0x20;}//P0_5推挽输出
#define ST7735S_TFT_LCD_A0  P3_7
#define ST7735S_TFT_LCD_A0_OUT  {P3M1&=~0x80;P3M0|=0x80;}//P3_7推挽输出
#define ST7735S_TFT_LCD_SDA  P3_5
#define ST7735S_TFT_LCD_SDA_OUT  {P3M1&=~0x20;P3M0|=0x20;}//P3_5推挽输出
#define ST7735S_TFT_LCD_SCL  P3_2
#define ST7735S_TFT_LCD_SCL_OUT  {P3M1&=~0x04;P3M0|=0x04;}//P3_2推挽输出
#define TFT_LCD_LCD_W  128
#define TFT_LCD_LCD_H  160
#define ST7735S_draw_line
#define ST7735S_draw_circle
#define ST7735S_draw_triangel
#define ST7735S_show_char
#define ST7735S_draw_bmp16
#define TFT_LCD_DIZI_X  0
#define TFT_LCD_DIZI_Y  0

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "mylib/ST7735S_tftlcd.h"
#include "lib/delay.h"

// 定义相关宏,根据实际情况调整以下参数
#define V_REF 1.218   // 内置参考电压 (V)
#define RL_CURRENT 5     // 采样电阻 (毫欧),这里会影响屏幕显示的电流准确度,改为实际的阻值就好
#define R2_VOLTAGE 1940    // 分压网络电阻 (K欧),确定了屏幕上显示的电压,可适当修改阻值让电压显示的正确范围
#define R1_VOLTAGE 0.51    // 分压网络电阻 (K欧)
#define SERIAL_RX_MAXLEN 23  // 串口接收数据缓冲区的最大长度

// 串口接收数据数组
static char serial_data[SERIAL_RX_MAXLEN];
const byte sendCommandBytes[] = {0X58, 0XAA}; // 发送的命令字节

// 初始化BL0942芯片对应的串口通信(使用STC8H8K64U第2个串行通信UART接口P1.0 (RxD2) 和 P1.1 (TxD2))
void Init_BL0942(void)
{
    // 配置串口相关参数,波特率等,这里需根据实际情况调整
    SCON2 = 0x50;  // 8位数据,可变波特率,允许接收
    TMOD &= 0x0F;
    TMOD |= 0x20;  // 定时器1工作在方式2(8位自动重装)
    TH1 = 0xFD;    // 波特率4800(根据实际晶振频率等可能需要调整)
    TL1 = 0xFD;
    TR1 = 1;       // 启动定时器1
    ES2 = 1;       // 允许串口2中断
    EA = 1;        // 开总中断
}

// 发送命令给BL0942
void sendCommand(void)
{
    for (int i = 0; i < sizeof(sendCommandBytes); i++) {
        S2BUF = sendCommandBytes[i];
        while (!TI2);
        TI2 = 0;
    }
}

// 接收BL0942数据
void receiveData(void)
{
    static uint8_t data_index = 0;
    static bool frame_start = false;

    // 清空数据缓冲区
    if (!frame_start) {
        memset(serial_data, 0, SERIAL_RX_MAXLEN);
    }

    if (RI2)
    {
        char temp_data = S2BUF;
        RI2 = 0;

        if (temp_data == 0x55) // 判断帧头
        {
            frame_start = true;
            data_index = 0;
        }

        if (frame_start && data_index < SERIAL_RX_MAXLEN)
        {
            serial_data[data_index++] = temp_data;

            // 当接收到预期数量的数据时停止接收
            if (data_index >= SERIAL_RX_MAXLEN)
            {
                frame_start = false;

                // 校验和验证
                uint8_t checksum = 0;
                for (uint8_t i = 0; i < SERIAL_RX_MAXLEN - 1; i++) {
                    checksum += serial_data[i];
                }
                checksum = ~checksum & 0xFF;

                if (checksum!= serial_data[SERIAL_RX_MAXLEN - 1]) {
                    // 数据包校验失败,丢弃数据
                    return; // 如果校验失败,直接返回不处理该数据包
                }
                // 校验成功后可以继续处理数据
            }
        }
    }
}

// 获取电流
float getCurrent(void)
{
    uint32_t parm = ((uint32_t)serial_data[3] << 16) | ((uint32_t)serial_data[2] << 8) | serial_data[1];
    float current = (float)parm * V_REF * 1000 / (305978 * RL_CURRENT);  // mA
    return current / 1000; // 将mA转换为A
}

// 获取电压
float getVoltage(void)
{
    uint32_t parm = ((uint32_t)serial_data[6] << 16) | ((uint32_t)serial_data[5] << 8) | serial_data[4];
    float voltage = (float)parm * V_REF * (R2_VOLTAGE + R1_VOLTAGE) / (73989 * R1_VOLTAGE * 1000);
    return voltage;
}

// 显示电压、电流到TFT屏幕
void displayVoltageCurrentAndPower()
{
    float voltage = getVoltage();
    float current = getCurrent();

    tft_ST7735S_clear((TFT_LCD_GBLUE));

    // 设置显示电压的位置等相关属性
    tft_ST7735S_show_font16("电压:",11,11,(TFT_LCD_RED),(TFT_LCD_GBLUE),0);
    char voltage_str[10];
    sprintf(voltage_str, "%.3f V", voltage);
    tft_ST7735S_show_font16(voltage_str, 50, 11, (TFT_LCD_RED),(TFT_LCD_GBLUE),0);

    // 设置显示电流的位置等相关属性
    tft_ST7735S_show_font16("电流:",11,33,(TFT_LCD_BLACK),(TFT_LCD_GBLUE),1);
    char current_str[10];
    sprintf(current_str, "%.3f A", current);
    tft_ST7735S_show_font16(current_str, 50, 33, (TFT_LCD_BLACK),(TFT_LCD_GBLUE),1);
}

// 初始化相关设置
void setup()
{
    twen_board_init();//天问51初始化
    //TFT屏1.8寸ST7735S显示全部正确
    tft_ST7735S_init();//TFT初始化
    tft_ST7735S_direction(2); //设置屏幕方向

    Init_BL0942(); // 初始化BL0942芯片对应的串口通信
}

// 主循环
void loop()
{
    sendCommand(); // 发送指令
    delay(100);    // 等待一段时间让BL0942响应
    receiveData(); // 接收数据

    displayVoltageCurrentAndPower(); // 显示电压、电流

    delay(1000);      // 延迟秒后再次更新数据
}

// 主函数
void main(void)
{
    setup();
    while(1){
        loop();
    }
}







上面的代码编译后出现了下面的错误提示,始终没能修好,发上来请大师们帮忙研究研究

twen/main.c:41:syntax error:token->'sendcommandBytes:column 27

的代码编译后出现了下面的错误提示,始终没能修好,发上来请大师们帮忙研究研究

twen/main.c:41:syntax error:token->'sendcommandBytes:column 27

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-18 20:17:01 | 显示全部楼层
  1. #define sendCommandBytesLenth 2
  2. const byte sendCommandBytes[sendCommandBytesLenth] = {0X58, 0XAA}; // 发送的命令字节
  3. for (int i = 0; i < sendCommandBytesLenth; i++)
  4. {
  5.         S2BUF = sendCommandBytes[i];
  6.         while (!TI2);
  7.         TI2 = 0;
  8. }
复制代码

DebugLab
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:26 , Processed in 0.124453 second(s), 52 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表