找回密码
 立即注册
楼主: tomggg刚

嵌入式工程师学习进化之AI8051第一集

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-19 16:46:49
已绑定手机

1

主题

11

回帖

33

积分

新手上路

积分
33
发表于 2025-9-19 17:31:45 | 显示全部楼层
  还有就是 在这个图形化配置的时候,引脚的复用,也很方便,比传统的STM32 方便很多, 可以图形化配置,可以代码一句话 就可以改变引脚功能的复用
截图202509191731036808.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-19 16:46:49
已绑定手机

1

主题

11

回帖

33

积分

新手上路

积分
33
发表于 2025-9-19 17:34:33 | 显示全部楼层
【Ai8051U学习打卡】- 打通“任督二脉”

今日成果: 成功将Ai8051U配置为USB-CDC设备,实现像Arduino一样的串口打印功能,无需外部CH340芯片!

开发过程与代码:

核心认知: Ai8051U的强大之处在于原生USB功能。首先要正确配置时钟(内部IRC 24MHz或外部晶振)。

代码关键:

c
#include "Ai8051U.h"
#include "usb_cdc.h"

void sys_init() {
    USBCLK = 0x00;       // 设置USB时钟源为内部IRC24M
    USBCON = 0x90;       // 使能USB功能

    CDC_Init();          // 初始化USB-CDC功能
    EA = 1;             // 开总中断
    while (!CDC_ConfigReady()); // 等待电脑识别设备
}

void main() {
    sys_init();
    DelayMs(1000);

    while (1) {
        CDC_Printf("Hello, Ai-Maker! Count: %d\n", count++);
        DelayMs(1000);
    }
}
踩坑记录:

问题: 电脑无法识别USB设备。

解决: 检查了原理图,发现USB的D+线需要通过一个1.5K电阻上拉到3.3V。确认实验箱电路正确,然后检查代码中USBCLK和USBCON的配置值是否正确。

学习感悟: 以前用传统STC89C51必须外接串口模块,现在一颗MCU直接搞定,太方便了!USB-CDC将是后续调试和通信的主力。

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-19 16:46:49
已绑定手机

1

主题

11

回帖

33

积分

新手上路

积分
33
发表于 2025-9-19 17:34:56 | 显示全部楼层
【Ai8051U学习打卡】- 让屏幕“动”起来

今日成果: 驱动0.96寸OLED屏幕,并实时显示ADC电位器的电压值,做出了一个简易的“电压表”。

开发过程与代码:

硬件连接: OLED使用I2C接口(SDA-P3.0, SCL-P3.1),电位器接到P1.0(ADC通道0)。

代码关键:

c
#include "oled.h"
#include "adc.h"

void main() {
u16 adc_value;
float voltage;

OLED_Init();
ADC_Init(0); // 初始化ADC,选择通道0

OLED_ShowString(0, 0, "Ai8051U ADC Test");
OLED_ShowString(0, 2, "Voltage:");

while (1) {
    adc_value = ADC_Read(0); // 读取通道0的ADC值(12位)
    voltage = (adc_value / 4095.0) * 3.3; // 将ADC值转换为电压值(假设Vref=3.3V)

    OLED_ShowNum(60, 2, (u16)(voltage * 1000), 4); // 显示毫伏值
    OLED_ShowString(100, 2, "mV");
    DelayMs(200);
    }
}
踩坑记录:

问题: ADC读数跳动很大,不稳定。

解决: 采用了软件滤波算法。连续采样10次,然后取平均值,读数瞬间稳定了!

c
// 简单的平均值滤波函数
u16 ADC_Read_Average(u8 ch, u8 times) {
    u32 sum = 0;
    for (u8 i=0; i<times; i++) {
        sum += ADC_Read(ch);
    }
    return (sum / times);
}
学习感悟: 掌握了I2C通信和ADC采集两大核心技能。软件滤波是实际工程中必不可少的技巧,光读一次数据是不可靠的。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-19 16:46:49
已绑定手机

1

主题

11

回帖

33

积分

新手上路

积分
33
发表于 2025-9-19 17:35:28 | 显示全部楼层
【Ai8051U学习打卡】- 优雅地呼吸

今日成果: 利用Ai8051U增强型PWM模块,实现了LED的平滑呼吸灯效果,完全由硬件控制,CPU占用率为0!

开发过程与代码:

硬件连接: LED连接在P2.0(PWM输出引脚)。

代码关键: Ai8051U的PWM配置稍复杂,但功能强大。

c
#include "pwm.h"

void PWM_Init(void) {
    P_SW2 |= 0x80;      // 开启扩展寄存器访问权限

    PWMCKS = 0x00;      // PWM时钟为系统时钟
    PWMC = 0xFF;        // 设置PWM周期 (255+1)
    PWM2T1 = 0x00;      // 设置PWM2第1次翻转时间(低电平时间起点)
    PWM2T2 = 0x80;      // 设置PWM2第2次翻转时间(高电平时间起点,即占空比)
    PWMCR = 0x80;       // 使能PWM2输出
    P_SW2 &= ~0x80;     // 关闭扩展寄存器访问权限
}

void main() {
    u16 i;
    PWM_Init();

    while (1) {
        // 呼吸灯效果:逐渐变亮
        for (i=0; i<256; i++) {
            PWM2T2 = i; // 改变占空比
            DelayMs(5);
        }
        // 呼吸灯效果:逐渐变暗
        for (i=255; i>0; i--) {
            PWM2T2 = i;
            DelayMs(5);
        }
    }
}
踩坑记录:

问题: PWM输出没反应,LED不亮。

解决: 忘记配置引脚模式为推挽输出!Ai8051U的IO口模式需要设置P2M1和P2M0寄存器。将P2.0设置为推挽输出后P2M1 = 0x00; P2M0 = 0x01;,问题解决。

学习感悟: 硬件PWM真的太强大了,波形精准且不消耗CPU资源。这为以后控制电机舵机、驱动LED灯带打下了坚实基础。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 10:22 , Processed in 0.112651 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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