gzs3d 发表于 2026-1-12 14:14:44

【Ai8051U】擎天柱核心板学习心得之奇妙之旅电脑USB声音律动灯

第一节:测试ADC功能,读取USB接口电压。

今天拿到板子,做工很好,上电测试了下,ADC 电压采集测试:
内部 1.19V 基准源采样,ADC 模块计算反推 VCC USB接口供电电压。
串口窗口为 实时电压读数,万用表为 实际电源电压对比值。
采集精度非常高。

关键代码:

// 获取第15通道(内部1.19V参考电压)的ADC值adc_val = Get_ADC_Result(15);// <--- 关键点1:读取内部参考源的ADC值if(adc_val > 0){    // 计算VCC电压 (mV) = 4096 * 1190 / adc_val    // 原理: ADC值 / 4096 = 1.19V / VCC    vcc_mv = (u16)(4096UL * 1190UL / adc_val); // <--- 关键点2:数学换算出电压       }


解释:这里传给 Get_ADC_Result 的参数 15 是关键,它告诉芯片“不要读外部引脚,去读内部那个固定的 1.19V 标准电压”。



gzs3d 发表于 2026-1-16 08:15:39

第七节:USB 声卡与音频律动灯效测试:
舍弃外部 32.768kHz 晶振自动追频,直接使用 Ai8051U 内部高精度振荡器(IRC)锁定 36.864MHz 实现 USB 通信。

心得:
初始化时序的重要性:为了保证 USB 枚举成功,需调整初始化顺序:优先初始化 USB 模块并开启总中断(EA=1),确保电脑先识别到设备,再进行音频芯片(AIC23)的配置,防止外设初始化耗时过长导致 USB 握手超时。


芯Skye 发表于 2026-1-12 14:54:14

要 做到 USB不停电下载;
要 尝试 AiCube 图形化自动配置生成程序工具;
推荐优先看的:
printf_usb("Hello World !\r\n")及
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html

下载 最新的 AiCube-ISP-V6.96O 或以上版本软件 !
深圳国芯人工智能有限公司-工具软件

下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !

下载 最新的 Ai8051U 用户手册
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf

下载 最新的 Ai8051U 实验指导书,
有 AiCube 图形化自动配置生成程序工具使用说明
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf

推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
https://v.stcai.com/sv/1c5eec2-197fcd9b766/1c5eec2-197fcd9b766.mp4
https://v.stcai.com/sv/1fce8086-197cf2b9dd4/1fce8086-197cf2b9dd4.mp4

神农鼎 发表于 2026-1-12 19:45:40

这 已搞定 USB了,把3个 USB实验打卡 和USB虚拟设备做下,送实验箱

神农鼎 发表于 2026-1-12 19:47:35





gzs3d 发表于 2026-1-13 09:15:19

第二节:USB 鼠标按键模拟测试。
IO 口状态扫描,USB HID 协议模拟鼠标左/右键。PC 屏幕光标为 实时点击响应,开发板 P3.2/P3.3 为 物理触发按键。

20.3-STC_USB_鼠标键盘复合例程 修改总结USB 双键鼠标改造:去除键盘复合逻辑,IO 口独立映射。P3.2/P3.3 固定为鼠标左键/右键,无模式切换。附件是修改完成的代码。1. 修改前 vs 修改后 对比
特性修改前 (原例程)修改后 (现在)
设备类型复合设备 (键盘 + 鼠标)纯鼠标模式 (仅保留鼠标功能)
P3.3 功能功能切换开关 (松开=键盘模式 / 按下=鼠标模式)鼠标右键 (独立按键,按下即触发)
P3.2 功能变色龙 (键盘模式下输入"1",鼠标模式下是"左键")鼠标左键 (独立按键,按下即触发)
逻辑复杂度复杂 (需要判断当前是什么模式,再决定发什么数据)简单 (直接读取按键状态 -> 发送鼠标数据)


gzs3d 发表于 2026-1-14 11:08:35

第三节:LED点灯测试:
硬件连接(LED 接 P20-P27,按键接 P3.2,按键接 P3.3)实现了按键控制 LED 逐个点亮的功能。

#include "ai8051u.h"      // 调用芯片头文件
#include "intrins.h"      // 调用_nop_库

// -------------------------------------------------------------
// 全局变量定义
// -------------------------------------------------------------
// 当前点亮的LED数量 (0表示全灭,8表示全亮)
unsigned char led_count = 0;

// -------------------------------------------------------------
// 延时函数
// -------------------------------------------------------------
// 用于按键消抖,保留了您提供的代码逻辑
void Delay_ms(unsigned int ms)
{
    unsigned int i;
    do{
      i = 24000;      // 根据主频调整,假设主频24MHz左右
      while(--i);
    } while(--ms);
}

// -------------------------------------------------------------
// 主函数
// -------------------------------------------------------------
void main(void)
{
    // 1. 系统初始化
    EAXFR = 1;          // 使能扩展寄存器访问
    WTST = 0;         // 设置程序执行速度为最快
    CKCON = 0;          // 设置外部数据访问速度为最快
   
    // 2. 端口模式配置
    // P2端口 (LED): 准双向口模式 (00),灌电流能力强,可直接驱动LED
    P2M0 = 0x00;
    P2M1 = 0x00;
   
    // P3端口 (按键): 准双向口模式 (00),默认为弱上拉,适合读取外部按键
    P3M0 = 0x00;
    P3M1 = 0x00;

    // 初始化:P2口全部输出高电平(1),LED全灭
    P2 = 0xFF;         

    while(1)
    {
      // -----------------------------------------------------
      // 逻辑A: 检测 P3.2 按键 (增加点亮)
      // -----------------------------------------------------
      if (P32 == 0)         // 检测按键是否被按下 (低电平有效)
      {
            Delay_ms(20);       // 延时20ms进行消抖
            if (P32 == 0)       // 再次确认按键状态
            {
                if (led_count < 8)// 如果没满8个,计数加1
                {
                  led_count++;
                }
                while(P32 == 0); // 等待按键松开,防止长按连续触发
            }
      }

      // -----------------------------------------------------
      // 逻辑B: 检测 P3.3 按键 (逐个熄灭)
      // -----------------------------------------------------
      if (P33 == 0)         // 检测按键是否被按下
      {
            Delay_ms(20);       // 消抖
            if (P33 == 0)
            {
                if (led_count > 0)// 如果还有灯亮着,计数减1
                {
                  led_count--;
                }
                while(P33 == 0); // 等待按键松开
            }
      }

      // -----------------------------------------------------
      // 逻辑C: 根据 led_count 更新 P2 口状态
      // -----------------------------------------------------
      // 算法解释:
      // 1. (1 << led_count) - 1:生成低位全为1的掩码。
      //    例如 count=3 -> 1000 - 1 = 0111 (二进制)
      // 2. 取反 (~):因为LED是低电平(0)点亮,所以要对掩码取反。
      //    ~0111 = 1111 1000 (即 P2.0, P2.1, P2.2 输出0/亮)
      
      if (led_count == 0)
      {
            P2 = 0xFF;// 0个灯亮 -> 全部输出1 (全灭)
      }
      else
      {
            P2 = ~((1 << led_count) - 1);
      }
    }
}

gzs3d 发表于 2026-1-15 10:29:11

第四节:软件 PWM 随机测试:
Ai8051U 萤火虫仿生灯效: 定时器中断驱动 8 路软件 PWM,配合随机数状态机算法与“导演”调度逻辑。开发板表现为 LED 随机位置交替渐亮渐灭,视觉效果为 模拟夏夜萤火虫的非线性呼吸律动与生物游离感。

gzs3d 发表于 2026-1-15 10:54:26

第五节:USB 不停电下载与 P2 口 LED 控制测试:

引用 USB-CDC 库实现串口通信,利用 @STCISP# 指令实现无需断电的 ISP 自动下载功能。代码中初始化 USB 并开启中断,等待枚举成功后,主循环内实现串口数据回环(收发验证),同时控制 P2.0 与 P2.2 端口输出低电平,点亮对应 LED 灯。

学习心得:
关于头文件: 代码引用了 ai8051u.h 和 stc32_stc8_usb.h,这是实现 USB 功能的基础,不需要像以前玩 89C52 那样自己写繁琐的底层寄存器,STC 提供的库函数极大地简化了开发。
关键设置: 注意到 P_SW2 |= 0x80; 这句代码非常关键,必须将 B7 位置 1 才能访问扩展的特殊功能寄存器(XFR),否则后续的端口配置可能无效。
下载体验: 相比传统的串口下载需要反复手动开关电,这段代码实现的 USB 模式配合 USER_STCISPCMD 字符串,可以直接在 USB 连接状态下完成程序更新,开发效率提升非常明显。
端口控制: 擎天柱板子的 LED 在 P2 口,代码中直接操作 P20 = 0 和 P22 = 0 即可点亮,逻辑简单直观。

gzs3d 发表于 2026-1-15 11:22:44

第六节:USB 虚拟设备交互与显示测试:


利用 USB-CDC 协议模拟串口通信,配合 STC-ISP 软件自带的“虚拟键盘”发送控制指令。MCU 接收键值后解析执行,实现远程控制开发板上的 OLED/LCD 刷新、LED 亮灭及屏幕滚动特效。串口窗口(虚拟数码管)为 实时接收的重定向 printf 数据(如浮点数 3.1415、长整型数值),硬件现象为 屏幕随虚拟按键指令进行翻页、反相、镜像显示,且长按 P3.2 可免断电进入 ISP 下载模式。
学习心得与代码分析:
printf 重定向的神奇之处: 代码中定义了 #define PRINTF_SEGLED,这非常方便。以往 printf 只能在串口助手看字符,现在可以直接把数据(比如代码中的 0x1234abcd 或 3.1415)直接映射到 STC-ISP 软件界面的虚拟数码管上显示,调试数据更加直观。交互逻辑解析: 程序主体是一个巨大的 Switch-Case 结构,配合 usb_OUT_done()。它展示了 Ai8051U 处理 USB 中断的高效性——只有当 bUsbOutReady 为真(收到数据)时才处理,不占用主循环资源。
按键 1-3: 验证了不同数据类型(Hex, Long, Float)的传输。
按键 Q-Z: 集中展示了对 OLED 屏幕的底层控制,特别是 OLED12864_ScrollUp 这种硬件滚动指令,比用软件死循环刷屏要流畅且省 CPU。
实用的复位技巧: KeyResetScan 函数展示了如何在项目中预留“后门”。通过长按 P3.2 触发 IAP_CONTR = 0x60,实现了在 USB 模式下无需拔插线就能重新烧录,这个功能在调试阶段能极大地保护 USB 接口和开发板。





页: [1]
查看完整版本: 【Ai8051U】擎天柱核心板学习心得之奇妙之旅电脑USB声音律动灯