我在用AI8H8K64U搭配BL0942读取交流电的电压电流,这个代码始终编译错误 (
<pre><code>#define ST7735S_TFT_LCD_RESETP3_6#define ST7735S_TFT_LCD_RESET_OUT{P3M1&=~0x40;P3M0|=0x40;}//P3_6推挽输出
#define ST7735S_TFT_LCD_CSP0_5
#define ST7735S_TFT_LCD_CS_OUT{P0M1&=~0x20;P0M0|=0x20;}//P0_5推挽输出
#define ST7735S_TFT_LCD_A0P3_7
#define ST7735S_TFT_LCD_A0_OUT{P3M1&=~0x80;P3M0|=0x80;}//P3_7推挽输出
#define ST7735S_TFT_LCD_SDAP3_5
#define ST7735S_TFT_LCD_SDA_OUT{P3M1&=~0x20;P3M0|=0x20;}//P3_5推挽输出
#define ST7735S_TFT_LCD_SCLP3_2
#define ST7735S_TFT_LCD_SCL_OUT{P3M1&=~0x04;P3M0|=0x04;}//P3_2推挽输出
#define TFT_LCD_LCD_W128
#define TFT_LCD_LCD_H160
#define ST7735S_draw_line
#define ST7735S_draw_circle
#define ST7735S_draw_triangel
#define ST7735S_show_char
#define ST7735S_draw_bmp16
#define TFT_LCD_DIZI_X0
#define TFT_LCD_DIZI_Y0
#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;
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;
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 = 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;
}
checksum = ~checksum & 0xFF;
if (checksum!= serial_data) {
// 数据包校验失败,丢弃数据
return; // 如果校验失败,直接返回不处理该数据包
}
// 校验成功后可以继续处理数据
}
}
}
}
// 获取电流
float getCurrent(void)
{
uint32_t parm = ((uint32_t)serial_data << 16) | ((uint32_t)serial_data << 8) | serial_data;
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 << 16) | ((uint32_t)serial_data << 8) | serial_data;
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;
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;
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
</code></pre>
<p>的代码编译后出现了下面的错误提示,始终没能修好,发上来请大师们帮忙研究研究</p>
<p>twen/main.c:41:syntax error:token->'sendcommandBytes:column 27</p>
#define sendCommandBytesLenth 2
const byte sendCommandBytes = {0X58, 0XAA}; // 发送的命令字节
for (int i = 0; i < sendCommandBytesLenth; i++)
{
S2BUF = sendCommandBytes;
while (!TI2);
TI2 = 0;
}
页:
[1]