今日成果: 成功将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将是后续调试和通信的主力。
【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采集两大核心技能。软件滤波是实际工程中必不可少的技巧,光读一次数据是不可靠的。 【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灯带打下了坚实基础。
页:
1
[2]