香河英茂工作室 发表于 2025-7-8 17:02:24

有个AI8051U擎天柱的x[0,7],y[0,1]的随机数生成例程,可是配置文件报错,大佬kan'kan'

#include "config.h"
#include "task.h"
#include "io.h"
#include "tim.h"
#include "18b20.h"
#include "adc.h"

// 如果 ADC_COMMAND 未定义,则手动定义它
#ifndef ADC_COMMAND
#define ADC_COMMAND 0x80 // 根据硬件手册设置正确的命令值
#endif

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

// 延时函数,用于产生约3秒的延时
void Delay3000ms(void) // @24.000MHz
{
    unsigned long i;
    _nop_(); // 空操作,防止优化
    _nop_();
    i = 17999998UL;
    while (i--);
}

// 生成 x 随机数,范围
unsigned char generateX() {
    unsigned char adcValue;
    unsigned char randomNum;

    // 启动 ADC 转换
    P1 = ADC_COMMAND;
    // 等待 ADC 转换完成(根据具体硬件调整延时)
    _nop_(); _nop_(); _nop_(); _nop_();

    // 读取 ADC 数据
    adcValue = P1;

    // 取低 3 位作为随机数(0-7)
    randomNum = adcValue & 0x07;

    return randomNum;
}

// 生成 y 随机数,范围
unsigned char generateY() {
    unsigned char adcValue;
    unsigned char randomNum;

    // 启动 ADC 转换
    P1 = ADC_COMMAND;
    // 等待 ADC 转换完成(根据具体硬件调整延时)
    _nop_(); _nop_(); _nop_(); _nop_();

    // 读取 ADC 数据
    adcValue = P1;

    // 取最高位作为随机数(0或1)
    randomNum = (adcValue >> 7) & 0x01;

    return randomNum;
}

void main(void) {
    unsigned char x, y;

    // 系统初始化
    Sys_init();
    usb_init();
    Timer0_Init();
    Init_595();
    Timer1_Init();
    ADC_Init();

    // 使能全局中断
    EA = 1; // IE |= 0x80;

    // 设置 P40 为低电平
    P40 = 0;

    // 等待 USB 配置完成
    while (DeviceState != DEVSTATE_CONFIGURED);

    // 主循环
    while (1) {
      // 如果接收到 USB 数据
      if (bUsbOutReady) {
            // USB_SendData(UsbOutBuffer, OutNumber); // 发送数据缓冲区,长度(测试时原样返回接收的数据)
            usb_OUT_done(); // 处理 USB 输出完成
      }

      // 执行任务回调函数
      Task_Pro_Handler_Callback();

      // 生成并显示 x 和 y 随机数
      x = generateX();
      y = generateY();
      SEG_Show_U32(ADC_KEY_READ(ADC_Read(0))); // 根据需要修改显示内容
    }
}

// 定时器 0 中断服务程序(每1毫秒执行一次)
void Timer0_Isr(void) interrupt 1 {
    // 系统定时处理
    Task_Marks_Handler_Callback();
}


要实现的是 擎天柱,P2.0~P2.7 随机点亮一个灯,持续时间也是随机的,
《梵高的星空》

国芯人工智能 发表于 2025-7-8 17:03:00

您提供的代码片段中存在一些问题,导致配置文件报错。以下是对该例程的分析与建议:

1. 头文件引用问题
   您在代码中使用了 #include "configh"、#include "taskh" 等头文件,但这些文件可能未正确包含或路径不正确。请确认这些头文件是否存在于项目目录中,并确保编译器能够正确找到它们。

2. ADCCOMMAND 未定义警告
   虽然您已经添加了 #ifndef ADCCOMMAND 的判断,但在某些编译环境下,若未显式定义该宏,可能会引发警告。建议在项目配置中明确设置 ADCCOMMAND 的值,或在代码中直接定义,如:
   c
   #define ADCCOMMAND 0x80

3. P1 寄存器使用问题
   在代码中,您通过 P1 = ADCCOMMAND; 向 P1 写入数据,但 ADC 转换通常需要特定的引脚配置。请确保 P1 引脚已正确配置为 ADC 输入模式,否则可能导致读取错误。

4. ADC 数据读取逻辑
   代码中使用 adcValue = P1; 读取 ADC 数据,但 ADC 结果通常存储在特定寄存器中(如 ADCH、ADCL),而非 P1。请根据芯片手册确认正确的读取方式,例如:
   c
   adcValue = ADCH; // 假设 ADC 高位字节存储在 ADCH

5. 随机数生成逻辑
   当前代码中,generateX() 函数仅读取一次 ADC 值,无法有效生成随机数。建议结合多次 ADC 采样或使用定时器/计数器等外部因素,提高随机性。例如:
   c
   unsigned char generateX() {
       unsigned char adcValue;
       // 多次采样并取模
       for (int i = 0; i < 8; i++) {
         P1 = ADCCOMMAND;
         nop(); nop();
         adcValue = ADCH;
       }
       return adcValue % 8; // 生成 范围内的随机数
   }

6. 延时函数问题
   Delay3000ms() 函数基于 i = 17999998UL; 实现延时,但具体延时时间依赖于系统时钟频率。若系统时钟非 24MHz,请调整延时参数以确保准确性。

7. 全局变量初始化
   USERDEVICEDESC 和 USERPRODUCTDESC 被赋值为 NULL,但 C 语言中 NULL 通常用于指针,建议使用空字符串或适当初始化:
   c
   char USERDEVICEDESC[] = "";
   char USERPRODUCTDESC[] = "";

8. 代码完整性
   您的代码片段在 adcValue = P1; 处中断,需补充完整函数逻辑,并确保所有变量和函数声明正确无误。

综上所述,建议您检查头文件路径、ADC 配置、寄存器读写方式及延时函数,并根据芯片手册调整代码。若仍存在问题,可提供完整代码及报错信息以便进一步排查。

[本文内容由国芯人工智能辅助生成,仅供参考]

乘风飞扬 发表于 2025-7-8 18:19:07

报什么错?这种问题最好提供完整项目文件才好排查。

香河英茂工作室 发表于 2025-7-9 07:46:44

乘风飞扬 发表于 2025-7-8 18:19
报什么错?这种问题最好提供完整项目文件才好排查。

头文件找不到,如楼上所述
页: [1]
查看完整版本: 有个AI8051U擎天柱的x[0,7],y[0,1]的随机数生成例程,可是配置文件报错,大佬kan'kan'