找回密码
 立即注册
查看: 208|回复: 1

AI8051U心得体会和实验示例

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-11 17:25:30
已绑定手机

1

主题

0

回帖

15

积分

新手上路

积分
15
发表于 2025-9-11 17:25:30 | 显示全部楼层 |阅读模式
第一集
作为一名初学单片机的入门者,通过第一集序言的系统学习,我对单片机的强大功能和应用前景有了全新的认识。
特别是了解到Ai8051U这款增强型51单片机的卓越性能后,我对嵌入式开发产生了极大的兴趣和学习动力。


从视频教学中学到的重要知识点包括:
1. Ai8051U的核心优势
    强大的多媒体处理能力:
      支持液晶屏幕驱动和显示控制
      集成I2S音频接口,可实现高质量的录音和播放功能
    卓越的计算性能:
      内置硬件乘除法器
      可编程逻辑阵列(PLA)加速
   丰富的应用场景:
      手写式计算器开发
      各种智能硬件控制
2. 学习心得
    作为新手,第一次了解到传统8051单片机的功能可以如此强大
   Ai8051U扩展的外设接口和计算能力完全颠覆了我对单片机的认知
    视频展示的实际应用案例让我直观感受到:
      单片机的无限可能性
      软硬件结合的独特魅力
      嵌入式开发的广阔前景
3. 学习感受
   这款芯片的多功能性让我产生了强烈的学习欲望:
    渴望深入了解各个外设接口的工作原理
    期待掌握如何在单一芯片上实现多媒体处理
    对将来的智能硬件开发充满憧憬


这次入门学习让我意识到,现代单片机不再是简单的控制芯片,而是集成了丰富功能的微型计算机系统。Ai8051U
展现的性能特点和多样化的应用场景,为我的单片机学习之旅打开了全新的大门,也为我指明了未来的学习方向。

截图202509111331232277.jpg 截图202509111331344655.jpg


第二集
在观看完硬件及工具介绍的视频后,我对实验箱的硬件架构和软件支持有了系统性的认识。
下面我将详细介绍实验箱上各个功能模块的用途和技术特点:


1. 编程与调试接口
    USB Link 1D:这是STC官方提供的专业烧录调试工具,具有以下特性:
      支持高速下载(相比传统串口下载速度更快)
      提供在线调试功能(可设置断点、单步执行)
      兼容STC全系列单片机


2. 通信接口
    USB转双串口模块:
      采用专用USB转UART芯片
      双通道设计可同时进行两个串口实验
      完全兼容常见CH340模块的功能
      支持多种波特率调节(1200bps-115200bps)


3. 测试测量功能
   示波器BNC接口:
     配有高精度红色调节旋钮
      用于信号波形观察和参数测量
      可调节垂直灵敏度和水平时基


4. 音频输出系统
    立体声线路输出:
      采用标准3.5mm音频接口
     支持连接有源音响设备
      具备噪声抑制功能
   -耳机输出接口:
      内置耳机驱动放大器
      可直接连接32Ω-300Ω耳机
      具有过载保护设计


5. 显示系统
    OLED显示屏:128x64分辨率,支持I2C/SPI接口
   -TFT彩屏:240x320分辨率,16位色深,支持动画播放


6. 电源管理
   掉电检测电路:可调节触发电压阈值,用于数据保护


7. 输入设备
   矩阵键盘:4x4阵列设计,GPIO复用技术
   ADC按键:单线检测16个按键,节省IO资源


8. 存储系统
    QSPI/SPI FLASH:NOR Flash存储芯片,容量4MB-16MB


9. 显示调节
   LCD对比度调节:数字电位器控制VDDA电压
这些硬件模块构成了一套完整的嵌入式开发平台,为学习各种外设应用提供了便利的实验条件。
截图202509111336424968.jpg



第三集
通过本集的系统学习,我在Keil开发环境的配置和使用方法上获得了实质性的进步。不仅按照技术手册的指导
完成了开发环境的初始化设置,包括项目创建、文件组织、代码格式规范等基础工作,还通过LED点灯的实践
操作对单片机开发有了更深入的认识。


在Keil软件的学习过程中,我逐步掌握了其关键功能的操作方式,包括:
代码编辑器的使用技巧(如代码补全、格式化等)
项目工程结构的配置与管理
编译、调试功能的基础应用


而通过基础的LED点亮实验,我理解到单片机开发中几个重要的编程要点:
1. GPIO端口初始化:在使用I/O口之前,必须通过设置相应的模式寄存器(PxM1和PxM0)来定义其工作模式,
本例采用的是准双向接口模式(P0M1=0x00,P0M0=0x00)。
2. 主程序架构要求:必须在`main`函数中构建一个无限循环(如`while(1)`),确保程序持续执行而不会意外退出。
3. 电平控制逻辑:控制LED亮灭时,需要理解硬件电路设计(如LED阳极接VCC,阴极接GPIO,此时低电平点亮LED)。
4.以下是代码部分示例:
#include "ai8051u.h"
void main(void)
{
   P0M1 = 0x00; P0M0 = 0x00;
   P4M1 = 0x00; P4M0 = 0x00;

  P40 = 0;

  while(1)
  {
     P00 = 0;
  }
}
截图202509111641153898.jpg 截图202509111641225680.jpg
这次实践不仅让我熟悉了Keil的开发流程,也让我对单片机硬件和软件的结合有了更直观的认识,为后续更复杂的外设开发奠
定了坚实的基础。



第四集
通过本集的视频学习与实践演示,我对STC单片机的USB不停电下载功能有了深入的理解和实践经验。该功能相较于传统的ISP
下载方式具有显著的便捷性优势,现将学习内容和收获详细总结如下:


一、USB不停电下载功能的优势及其实现原理
1. 功能特点:
    传统方式:需要手动按压电源开关才能进入下载模式
    USB不停电下载:完全省去物理按键操作
    显著提高开发效率,特别适合反复调试的场景


2. 实现机制:
    利用芯片内置的USB BootLoader功能
    通过特定时序实现自动识别下载请求
    软件握手协议替代物理按键触发


二、开发资源获取与配置实践
1. 官方资源获取:
    登录STC官网(www.STCAI.com)
    下载专用的USB开发库文件包
    获取最新版的驱动程序和说明文档


2. 开发环境搭建:
    将USB库文件正确集成到Keil工程中
    配置编译器选项支持USB功能
    设置正确的链接参数


三、代码管理与开发技巧提升
1. 函数查找与应用技巧:
    熟练使用"Go to Definition"功能进行全局搜索
    在库文件中精准定位目标函数定义
    分析函数原型和调用方式
    合理地将库函数整合到主程序框架中


2. 命令行参数应用:
    掌握基本调试命令行语法
   学会使用关键参数配置下载选项
    理解参数与功能实现的对应关系


四、学习心得与实际应用价值
1. 该方法的应用价值:
    大幅简化开发调试流程
    提高产品量产效率
    支持更灵活的远程升级方案


2. 个人学习收获:
    深入理解了USB协议在单片机开发中的应用
    掌握了STC特有的开发模式
    提升了代码组织和项目管理能力
截图202509111649265382.jpg
本次学习不仅让我掌握了这项实用的下载技术,更重要的是理解了现代单片机开发中软件配置与硬件功能的
有机结合方式,这些经验将对我后续的项目开发产生深远影响。
截图202509111649125231.jpg     截图202509111649355124.jpg

第五集

通过本集的系统性学习,我对C语言的核心概念进行了深度梳理,并掌握了若干重要的编程技巧。现将学习内容和心得体会整理如下:


一、宏定义的深入理解与实践应用
1. printf函数的宏定义机制:
  通过预处理指令 #define printf printf_hid
  实现了标准输出函数的自定义重定向
  这种技术广泛应用于:
    嵌入式系统的输入输出重定向
    调试信息的定制输出
    多平台兼容性处理


2. 宏定义的语法规范:
  基本格式: #define 替换目标 替换内容
  替换范围:预处理阶段完成全文本替换
  注意事项:避免产生命名冲突和副作用
截图202509111656088117.jpg


二、格式化输出函数的参数解析
1. 格式控制字符串(fmt)的组成:
  普通字符:原样输出的文本内容
  格式说明符:以%开头的特殊标记
  转义序列:以\开头的特殊字符


2. 重要的格式说明符:
  科学计数法表示:
    %e:小写指数形式(如3.1415e+00)
    %E:大写指数形式(如3.1415E+00)
  智能格式选择:
    %g:自动选择%f或%e的简明表示
    %G:自动选择%f或%E的简明表示
  指针输出:
    %p:以十六进制显示内存地址


3. 特殊转义字符详解:
  控制字符:
    \b:回退一格(Backspace)
    \a:发出警示音(Alert)
    \f:换页符(Form feed)
  数值表示:
    \ddd:1-3位八进制ASCII码
    \xhh:1-2位十六进制ASCII码
截图202509111656249848.jpg


三、进制系统的理论巩固与实际应用
1. 二进制系统:
  基数:2
  表示方法:前缀0b(如0b1010)
  应用场景:位运算、硬件寄存器配置


2. 八进制系统:
  基数:8
  表示方法:前缀0(如0123)
  典型应用:Unix文件权限管理


3. 十六进制系统:
  基数:16
  表示方法:前缀0x(如0x1A3F)
  使用优势:
    简化二进制表示(1位十六进制对应4位二进制)
    内存地址的标准表示方式


四、进制转换的实用技巧
1. 二进制与其他进制的互转:
  二转八:3位一组
  二转十六:4位一组
2. 十进制转其他进制:
  整数部分:除基取余法
  小数部分:乘基取整法


五、学习总结与进阶方向
1. 核心收获:
  巩固了C语言的底层输出机制
  掌握了格式化字符串的灵活运用
  理清了不同进制系统的特点与联系


2. 后续学习建议:
  深入理解可变参数函数的实现原理
  实践自定义printf函数的开发
  研究不同进制在嵌入式开发中的典型应用场景


截图202509111656471096.jpg
这些基础知识的系统梳理,为我后续深入学习嵌入式开发奠定了坚实的基础,特别是在调试信息输出、
内存管理等方面提供了理论支撑和实践指导。


第六集


通过本视频的系统学习,我对GPIO(General Purpose Input/Output)通用输入输出端口的核心概念及应用方法有了清晰的认识,
现将重点内容及收获总结如下:


一、GPIO基本概念与工作模式
1. GPIO本质理解
   GPIO是微控制器上的可编程引脚,通过输出高低电平(0/1)来实现对外设的控制或状态读取。每个GPIO引脚都可以独立配置为
输入或输出模式,是嵌入式系统与外部硬件交互的重要接口。


2. 四种工作模式详解
   准双向口:默认模式,可输入输出,内部弱上拉
   推挽输出:强驱动能力,可输出高/低电平
   高阻输入:仅用于输入,阻抗高,抗干扰强
   开漏模式:需外接上拉电阻,支持线与逻辑


3. 电流特性认知
   重点学习了拉电流(输出高电平时的电流输出)和灌电流(输出低电平时的电流吸收)的区别,这关系到外设驱动能力和功耗设计。


二、按键检测与任务实践的深入理解
通过三个典型任务的对比分析,掌握了按键控制LED的不同实现逻辑:


1. 任务1:实时响应模式
    按键按下(P32=0)时立即点亮LED(P00=0)
    按键松开后LED熄灭
    体现了GPIO输入的**即时状态检测**原理
  代码部分示例如下:
if(P32 == 0)
{
    P00 = 0;
}
else
{
   P00 == 1;
}

截图202509111705571981.jpg
2. 任务2:反向控制逻辑
    采用**松开亮、按下灭**的反向控制策略
    通过判断P32==1触发动作
    展示了同一硬件可通过逻辑取反实现不同功能
  部分示例如下:
if(P32 == 1)
{
    P00 = 0;
}
else
{
   P00 == 1;
}
截图202509111706081298.jpg


3. 任务3:状态切换模式
    通过`state = !state`实现每次按下切换LED状态
    `while(P32==0)`用于消抖和防止连续触发
    深入理解了:
     ✓ 状态变量的应用场景
     ✓ while循环阻塞在按键检测中的作用
     ✓ 实际开发中机械抖动对检测的影响
     部分示例如下:
f((P32 = =0 )
{
   state = !state;
   P00 = state;
  while(P32 == 0);
}
截图202509111706212109.jpg
三、常见问题与解决思路
视频中特别分析了按键不灵敏的可能原因:
硬件层面:接触不良、上拉电阻阻值不当
软件层面:
  ✓ 未添加消抖处理(硬件消抖或软件延时)
  ✓ 检测逻辑错误(如电平判断反向)
  ✓ 引脚模式配置不当(应设置为输入模式)


四、学习收获与扩展思考
1. 关键技能提升
    GPIO配置的完整工作流程(模式选择→电平控制)
    状态机思维在按键检测中的应用
    通过对比实验理解不同控制逻辑的实现差异


2. 实际应用建议
    复杂场景建议引入定时器消抖
    多按键系统可采用扫描检测或中断驱动
    输出负载需注意驱动电流匹配(参考数据手册)


本次学习使我建立起GPIO从理论到实践的系统认知,特别是通过不同任务的代码对比,深刻体会到硬件控制逻辑的灵活性。
这些基础知识的掌握为后续学习PWM、中断等进阶功能奠定了重要基础。
截图202509111707558221.jpg 截图202509111708049323.jpg



第七集
一、定时器的核心功能与应用价值
1. 定时器的本质作用
作为微控制器的时序管理核心,定时器本质上是一个**可编程的计数器系统**
主要实现两大关键功能:
  (1)精确的时间基准生成(从微秒到小时的计时)
  (2)周期性任务触发(替代低效的延时等待)


2. 定时器的架构特点
F特别注意学到的STC特有24位结构:
8位预分频器(TMOPS):扩展计时范围
13位自动重装载值:实现连续计时
3位工作模式选择位
这种复合结构在保持精度的同时大幅扩展了定时范围


二、定时器的工程应用优势
1.*相对于delay的革新性改进
消除阻塞等待,提升CPU利用率(实测效率提升可达80%以上)
实现多任务并行处理(如同时处理按键扫描和显示刷新)
保证时序精度(不受中断影响)


2. 实际应用场景
实时时钟RTC的底层实现
电机控制的PWM波形生成
通信协议的时序管理(如UART波特率)


三、定时参数计算详解
1. 核心计算公式
通过视频重点掌握的工程计算方法:
定时周期T = (TMOPS+1)×(65536-[TH0,TL1])×时钟周期
寄存器装填值 = 65536 - (目标时间×系统时钟)/(分频系数×时钟周期)



四、汉字编码的特殊问题
1.0xFD编码隐患
历史遗留问题:8051指令集与GB2312编码冲突
具体表现:包含0xFD的汉字(如"数"、"据"等)会引发乱码
解决方案:使用\XFD转义或统一采用UTF-8编码


五、函数处理规范
1. 函数三要素的工程实践
定义规范:
  ```
  返回值类型 函数名(参数列表) {
      // 功能实现
      // 必须包含return语句(void除外)
  }
  ```
声明要点:
   在.h头文件中使用extern声明
   或者在使用前进行原型声明
   注意参数列表要完整(包括类型)


2. 调用注意事项
参数传递必须严格匹配类型
警惕隐式类型转换风险
-对于指针参数,需明确const修饰意图
截图202509111717353118.jpg
六、学习心得
通过本视频的实践学习,建立了定时器开发的完整知识体系:
1. 掌握了从理论计算到寄存器配置的全流程
2. 理解了RTOS底层时基的实现原理
3. 培养了精准时序的工程思维
这些知识对后续学习PWM、输入捕获等高级功能奠定了坚实基础。建议下一步可以结合示波器实际观测定时器产生的波形,加深直观理解。
截图202509111717188079.jpg 截图202509111717497072.jpg



实验1
  1. #include "config.h"                  
  2. void main(void)
  3. {
  4.    
  5.     SYS_Init();
  6.     while (1)
  7.     {
  8.         
  9.                           printf_usb("Hello World !\r\n");
  10.         
  11.     }
  12. }
  13. void SYS_Init(void)
  14. {
  15.     EnableAccessXFR();
  16.     IAP_SetTimeBase();                  
  17.     P0M0 = 0x00; P0M1 = 0x00;           
  18.     P1M0 = 0x00; P1M1 = 0x00;         
  19.     P2M0 = 0x00; P2M1 = 0x00;         
  20.     P3M0 = 0x00; P3M1 = 0x00;           
  21.     P4M0 = 0x00; P4M1 = 0x00;         
  22.     P5M0 = 0x00; P5M1 = 0x00;           
  23.     P6M0 = 0x00; P6M1 = 0x00;           
  24.     P7M0 = 0x00; P7M1 = 0x00;         
  25.     delay_ms(1);
  26.     USBLIB_Init();                     
  27.     delay_ms(1);
  28.         
  29.     EnableGlobalInt();                 
  30. }
  31. void delay_us(uint16_t us)
  32. {
  33.     do
  34.     {
  35.         NOP(14);                       
  36.     } while (--us);
  37. }
  38. void delay_ms(uint16_t ms)
  39. {
  40.     uint16_t i;
  41.     do
  42.     {
  43.         i = MAIN_Fosc / 10000;
  44.         while (--i);
  45.     } while (--ms);
  46. }
  47. void USBLIB_Init(void)
  48. {
  49.     usb_init();                        
  50.     USB_SetIntPriority(0);              
  51.     set_usb_ispcmd("@STCISP#");         
  52. }
  53. void USBLIB_WaitConfiged(void)
  54. {
  55.     while (DeviceState != DEVSTATE_CONFIGURED)
  56.         WDT_Clear();                    
  57. }
  58. void USBLIB_OUT_Done(void)
  59. {
  60.     if (bUsbOutReady)                  
  61.     {
  62.         USB_SendData(UsbOutBuffer, OutNumber);
  63.       
  64.         usb_OUT_done();                 
  65.     }
  66. }
复制代码
截图202509111722532462.jpg



实验2
  1. #include "config.h"                    
  2. void main(void)
  3. {
  4.    
  5.     SYS_Init();
  6.     while (1)
  7.     {
  8.         USBLIB_OUT_Done();            
  9.     }
  10. }
  11. void SYS_Init(void)
  12. {
  13.     EnableAccessXFR();                  
  14.     IAP_SetTimeBase();                  
  15.     P0M0 = 0x00; P0M1 = 0x00;           
  16.     P1M0 = 0x00; P1M1 = 0x00;        
  17.     P2M0 = 0x00; P2M1 = 0x00;        
  18.     P3M0 = 0x00; P3M1 = 0x00;      
  19.     P4M0 = 0x00; P4M1 = 0x00;        
  20.     P5M0 = 0x00; P5M1 = 0x00;        
  21.     P7M0 = 0x00; P7M1 = 0x00;         
  22.     delay_ms(1);
  23.     USBLIB_Init();                     
  24.     delay_ms(1);
  25.   
  26.     EnableGlobalInt();               
  27. }
  28. void delay_us(uint16_t us)
  29. {
  30.     do
  31.     {
  32.         NOP(14);                        
  33.     } while (--us);
  34. }
  35. void delay_ms(uint16_t ms)
  36. {
  37.     uint16_t i;
  38.     do
  39.     {
  40.         i = MAIN_Fosc / 10000;
  41.         while (--i);
  42.     } while (--ms);
  43. }
  44. void USBLIB_Init(void)
  45. {
  46.     usb_init();                        
  47.     USB_SetIntPriority(0);            
  48.     set_usb_ispcmd("@STCISP#");      
  49. }
  50. void USBLIB_WaitConfiged(void)
  51. {
  52.     while (DeviceState != DEVSTATE_CONFIGURED)
  53.         WDT_Clear();                  
  54. }
  55. void USBLIB_OUT_Done(void)
  56. {
  57.     if (bUsbOutReady)                  
  58.     {
  59.       
  60.                         if (UsbOutBuffer[0] == 6)
  61.                                         printf_usb("Hello World !\r\n");
  62.                         else if (UsbOutBuffer[0] == 7)
  63.                                         printf_usb("China !\r\n");
  64.         usb_OUT_done();               
  65.     }
  66. }
复制代码
截图202509111723594723.jpg





实验3
  • #include "config.h"                     
  • void main(void)
  • {
  •     SYS_Init();
  •     while (1)
  •     {
  •     }
  • }
  • void SYS_Init(void)
  • {
  •     EnableAccessXFR();
  •     IAP_SetTimeBase();
  •     P0M0 = 0x00; P0M1 = 0x00;
  •     P1M0 = 0x00; P1M1 = 0x00;
  •     P2M0 = 0x00; P2M1 = 0x00;
  •     P3M0 = 0x00; P3M1 = 0x00;
  •     P4M0 = 0x00; P4M1 = 0x00;
  •     P5M0 = 0x00; P5M1 = 0x00;
  •     P6M0 = 0x00; P6M1 = 0x00;
  •     P7M0 = 0x00; P7M1 = 0x00;
  •     delay_ms(1);
  •     USBLIB_Init();
  •     delay_ms(1);
  •     EnableGlobalInt();
  • }
  • void delay_us(uint16_t us)
  • {
  •     do
  •     {
  •         NOP(14);
  •     } while (--us);
  • }
  • void delay_ms(uint16_t ms)
  • {
  •     uint16_t i;
  •     do
  •     {
  •         i = MAIN_Fosc / 10000;
  •         while (--i);
  •     } while (--ms);
  • }
  • void USBLIB_Init(void)
  • {
  •     usb_init();
  •     USB_SetIntPriority(3);
  •     set_usb_OUT_callback(USBLIB_OUT_Callback);
  •     set_usb_ispcmd("@STCISP#");
  • }
  • void USBLIB_WaitConfiged(void)
  • {
  •     while (DeviceState != DEVSTATE_CONFIGURED)
  •         WDT_Clear();
  • }
  • void USBLIB_OUT_Callback(void)
  • {
  •                 if (UsbOutBuffer[0] == 6)
  •         printf_usb("Hello World !\r\n");
  •     else if (UsbOutBuffer[0] == 7)
  •         printf_usb("China !\r\n");
  • }



截图202509111724587765.jpg



回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:196
  • 最近打卡:2025-10-03 10:52:21

784

主题

1万

回帖

1万

积分

管理员

积分
19414
发表于 2025-9-11 19:42:00 | 显示全部楼层
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接


上面是 小李 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成


上面是 小赵 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-3 13:00 , Processed in 0.132461 second(s), 55 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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