找回密码
 立即注册
查看: 89|回复: 3

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:214
  • 最近打卡:2025-08-11 07:21:48
已绑定手机

136

主题

415

回帖

584

积分

高级会员

积分
584
发表于 2025-7-8 17:02:24 | 显示全部楼层 |阅读模式
#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 随机数,范围 [0,7]
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 随机数,范围 [0,1]
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 随机点亮一个灯,持续时间也是随机的,
《梵高的星空》

回复

使用道具 举报 送花

3

主题

2074

回帖

996

积分

等待验证会员

积分
996
发表于 2025-7-8 17:03:00 | 显示全部楼层
您提供的代码片段中存在一些问题,导致配置文件报错。以下是对该例程的分析与建议:

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

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

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

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

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

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

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:487
  • 最近打卡:2025-08-11 08:59:14
已绑定手机

44

主题

2155

回帖

7497

积分

论坛元老

积分
7497
发表于 2025-7-8 18:19:07 | 显示全部楼层
报什么错?这种问题最好提供完整项目文件才好排查。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:214
  • 最近打卡:2025-08-11 07:21:48
已绑定手机

136

主题

415

回帖

584

积分

高级会员

积分
584
发表于 2025-7-9 07:46:44 | 显示全部楼层
乘风*** 发表于 2025-7-8 18:19
报什么错?这种问题最好提供完整项目文件才好排查。

头文件找不到,如楼上所述
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-11 15:19 , Processed in 0.118776 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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