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

AI8051U心得和三个实验

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-09-06 21:44:18
已绑定手机

1

主题

7

回帖

67

积分

注册会员

积分
67
发表于 2025-9-6 21:44:18 | 显示全部楼层 |阅读模式
第一集

在第一集的学习过程中,我对单片机的应用领域有了全新的认识。作为一名初学者,我被Ai8051U这
款芯片的强大功能深深震撼。这款单片机不仅仅是一个简单的控制芯片,它集成了多项高级功能:


1. 多媒体处理能力:
- 支持LCD/LED显示屏驱动
- 集成IIS音频接口,可实现录音和播放功能


2. 计算功能:
- 内置硬件乘法器/除法器
- 可构建手写计算器等复杂应用


3. 扩展应用:
- 丰富的外设接口(SPI/I2C/USB等)
- 大容量存储支持

截图202509081443418235.jpg
这些特性完全颠覆了我对传统8051单片机的认知,展现出以下几个显著特点:


1. 功能集成度高:在一个芯片内实现了以往需要多个芯片才能完成的功能
2. 应用场景广泛:从简单的IO控制到复杂的多媒体处理都能胜任
3. 学习成本低:保留了8051的易用性特征
4. 性能提升明显:运行速度是传统51单片机的数十倍

这次学习经历不仅拓展了我的技术视野,更激发了我深入探索嵌入式系统的热情。特别是了解到这款芯片还
能支持USB通信、硬件加密等高级功能后,让我对后续的学习充满了期待。这对于刚接触单片机的我来说,无
疑打开了一扇通往嵌入式世界的大门,也让我认识到现代单片机技术的发展已经远超我的想象。

通过视频演示的实际案例,我更加直观地感受到这款芯片的强大之处:
- 彩屏驱动流畅度令人印象深刻
- 音频处理效果清晰稳定
- 计算器应用的响应速度极快


这些都促使我下定决心要系统地学习掌握这款创新型单片机的各项功能。
截图202509081443544280.jpg





第二集
硬件及工具介绍学习总结:


通过系统学习实验箱的硬件组成和配套软件工具,我对这套开发平台的各项功能模块有了全面的认识。实验箱整合
了丰富的外设资源,为单片机学习和项目开发提供了完善的硬件支持,以下是对各功能模块的详细解析:


1. 程序下载与调试模块
   USB Link 1D接口:采用自主知识产权的在线调试工具,支持一键下载/调试功能
   USB转双串口:内置高性能串口转换芯片,完全兼容CH340,波特率最高可达2Mbps


2. 信号测量与调节模块
    示波器BNC输入配备高精度电位器(红色旋钮),可对输入信号进行幅值调节
   -提供专业的信号调理电路,确保测量精度


3. 音频处理模块
   -立体声线路输出:采用专业级音频解码芯片,支持左右声道平衡输出
   耳机音频接口:内置耳机功率放大器,可直接驱动32Ω阻抗耳机


4. 显示系统模块
   -OLED显示屏:128×64分辨率,支持I2C/SPI通信接口
   TFT彩色液晶屏:240×320分辨率,可流畅播放动画视频


5. 电源管理模块
   掉电检测电路配合可调电压比较器(0-5V可调)
   支持断电预警功能,确保关键数据及时存储


6. 输入设备系统
   矩阵键盘:4×2扫描阵列设计,采用行扫描方式检测按键
   ADC按键:基于电阻分压原理,单个ADC通道可检测16个按键


7. 存储系统
   QSPI/SPI FLASH存储器:支持最高80MHz时钟频率,容量可达16MB
   -数据存取速度支持TFT屏实时刷新显示


8. 显示调节功能
    LCD对比度调节采用数字电位器,支持0-100级精细调节
截图202509081444424946.jpg 截图202509081444534058.jpg

这套实验平台通过精心设计的硬件架构,实现了:
完善的开发调试环境(下载+调试+测量)
丰富的人机交互界面(显示+输入+音频)
可靠的存储备份方案
智能的电源管理系统


各个模块之间通过标准接口连接,既可作为独立实验单元使用,也能组合构建复杂应用系统。这种模块化设计极大方便了学习过程中的功能验证和项目开发。
截图202509081445248079.jpg





第三集

通过本次Keil开发环境的系统学习与实践操作,我建立起单片机开发的完整知识框架和实践经验,主要学习成果可以归纳为以下三大方面:


一、开发环境建设方面
1. 按照STC官方开发手册的指引,完成了从零开始的开发环境配置
2. 掌握了工程项目的创建流程和管理方法
3. 规范了代码编辑的格式标准,包括缩进、注释、命名等编程规范
4. 熟悉了必要的开发工具链配置,确保编译-下载-调试流程的顺畅


二、开发工具掌握方面
1. 系统认识了Keil uVision IDE的功能架构:
   - 源码编辑器的高效使用方法
   - 工程管理器的组织结构
   - 编译器和链接器的配置选项
   - 调试器的断点设置和变量监视功能
2. 掌握了常见编译错误的排查方法
3. 学会了利用开发环境内置的资源管理器查找功能


三、核心编程实践方面
通过LED控制实验,我深入理解了:
1. GPIO配置的关键技术要点:
   - 模式寄存器(PxM1/PxM0)的位操作原理
   - 准双向/推挽/高阻/开漏四种模式的选择依据
   - 端口数据寄存器的读写操作方法
2. 完整的开发流程:
   (1)硬件初始化(端口模式配置)
   (2)主程序架构设计(while(1)主循环)
   (3)功能逻辑实现(电平控制)
   (4)系统优化调试(延时处理等)
3. 硬件关联注意事项:
   - 电路设计中上下拉电阻的配置要求
   - LED驱动电流的计算方法
   - 电平匹配的电气特性考量
4.以下是示例代码:
#include "ai8051u.h"
void main(void)
{
   P0M1 = 0x00; P0M0 = 0x00;
   P4M1 = 0x00; P4M0 = 0x00;

  P40 = 0;

  while(1)
  {
     P00 = 0;
  }
}
这次系统的学习经历使我不仅掌握了工具的使用方法,更重要的是建立了"开发环境配置→工程管理→
代码编写→硬件调试"的完整开发思维模式。通过LED项目的实际操作,我深刻体会到软件配置与硬件电路的协同设计重要性,
这在调试过程中遇到的端口初始化失败、LED亮度异常等问题上得到充分验证。这些经验的积累为我后续学习更复杂的外设开发和中断系统奠定了坚实基础。
截图202509081446124152.jpg 截图202509081446284439.jpg







第四集

通过学习本集关于USB不停电下载的教程,我掌握了STC单片机更高效的编程方法。主要收获包括以下几点:


1. USB下载功能优化:
实现了无需手动按下载键的智能下载功能
通过软件配置自动进入USB Writer下载模式
简化了开发调试流程,提升工作效率


2. 开发资源获取:
从STC官网(www.STCAI.com)获取了完整的USB开发库
学习了官方资源的查找和下载方法


3. 代码开发技巧:
掌握了在项目中进行全局搜索的操作方法
学会从库文件快速定位所需函数定义
实践了库函数的调用和移植流程
(具体操作为:在main文件中跳转到库文件→查找目标函数→复制函数定义→应用到项目中)


4. 命令参数应用:
学习了烧录软件各种参数的实际作用
理解了各配置选项对下载过程的影响


这套改进后的下载方案相比传统方式具有明显优势,使得开发过程更加便捷高效。通过本课程,我不仅掌握了实用技术,
更重要的是学会了如何有效利用官方资源来解决问题,这对后续的深入学习很有帮助。
截图202509081450427151.jpg 截图202509081450508113.jpg



第五集
通过本集内容的学习,我在以下几个方面对C语言有了更深的理解:


1. printf函数原理
   -学习了宏定义的基本用法:
     `#define printf printf_hid` // 将标准的printf重定向为USB HID输出
   理解了格式字符串(fmt)的组成:
     普通字符:原样输出的文本
     格式说明符:%开头的转换规范
截图202509081453119032.jpg

2. 格式说明符详解
   掌握了以下常用的格式控制符:
   科学计数法:%e/%E(如1.23e+005)
   智能输出:%g/%G(自动选择最短表示)
   指针地址:%p(0x开头的十六进制)
截图202509081454329236.jpg
3. 特殊转义字符
   复习了以下重要转义序列:
   控制字符:\b(退格)、\a(蜂鸣报警)
   特殊表示:\ddd(八进制ASCII码)
   格式化:\f(打印机换页)
截图202509081458437662.jpg

4. 进制转换
   通过实例巩固了数制系统:
    二进制:每4位一组(0000~1111)
    八进制:0前缀(0~7,10~14)
    十六进制:0x前缀(0x00~0xFF)
截图202509081458503017.jpg

5. 实践应用
    掌握了通过宏替换实现printf重定向的技术
    理解了格式字符串的解析原理
    能够正确使用各种进制表示数值


这些知识点的系统学习,使我不仅能正确使用格式化输出函数,更理解了其底层实现机制,为后续开发调试奠定了坚实基础。







第六集
通过对本课程的学习,我掌握了以下关键知识点:


1. GPIO基本概念
   通用输入输出端口,通过高低电平控制
   支持四种工作模式:准双向口/推挽输出/高阻输入/开漏模式


2. 电流特性
    理解了拉电流和灌电流的区别
    掌握了按键输入检测原理


3. 按键控制实验
   完成了三个典型任务:
    任务1:按下点亮,松开熄灭(直接控制)部分代码示例如下:
if(P32 == 0)
{
    P00 = 0;
}
else
{
   P00 == 1;
}
截图202509081501207434.jpg 截图202509081501282002.jpg
    任务2:松开点亮,按下熄灭(反向控制)部分代码示例,如下:

f(P32 == 1)
{
    P00 = 0;
}
else
{
   P00 == 1;
}
截图202509081501368126.jpg
    任务3:按键切换状态(带状态记忆),部分代码示例,如下:
if((P32 = =0 )
{
   state = !state;
   P00 = state;
  while(P32 == 0);
}
截图202509081501455520.jpg
4. 程序优化
    学习了while循环消除按键抖动的方法
    理解了导致按键不灵敏的常见原因


这些实验让我掌握了GPIO的基本应用方法,为后续更复杂的控制逻辑打下了基础。特别是任务3的状态切换实现,让我对按键编程有了更深理解。
截图202509081459252178.jpg




第七集
通过本次关于定时中断的课程学习,我获得了以下重要知识:

1. 定时器核心功能
    实现精准定时功能,可替代低效的delay延时
    提升程序运行效率(通过24位定时器,含8位预分频+13位自动重装载)
    支持周期性任务调度

2. 编程实践要点
    掌握了定时器配置方法及示例代码应用
    理解了8051系列芯片中0xFD特殊码的处理(需使用\XFD替代)
    学会了定时参数的计算方法:
      定时频率 = 系统时钟/(分频系数×计数值)
      定时时间 = (分频系数×计数值)/系统时钟
   即:定时频率 = Sysclk(HZ)/[(TOMPS+1)(65536-[TH0,TL1])*T]
          定时时间 = [(TOMPS+1)(65536-[TH0,TL1])*T]/Sysclk(HZ)
         [TH0,TL1] = 65536-[Sysclk*定时时间/T*(TMOPS+1)]
  如下图所示:
截图202509081508221022.jpg

3. 函数使用规范
    定义:完整实现功能(含返回值、参数及功能逻辑)
    声明:需在头文件或调用前声明(注意以分号结尾)
    调用:正确传递参数(多参数用逗号分隔)

这些知识让我能够更好地利用定时器优化程序结构,避免使用阻塞式延时,同时理解了函数的标准使用方法。
特别是关于定时器参数的计算公式和特殊编码处理的经验,对实际开发具有重要指导意义。
截图202509081507561042.jpg 截图202509081508346669.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. }
复制代码
截图202509062139031135.jpg


实验2
#include "config.h"                    
void main(void)
{
   
    SYS_Init();

    while (1)
    {
        USBLIB_OUT_Done();            
    }
}


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;        
    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(0);            
    set_usb_ispcmd("@STCISP#");      

}


void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED)
        WDT_Clear();                  
}


void USBLIB_OUT_Done(void)
{
    if (bUsbOutReady)                  
    {
      
                        if (UsbOutBuffer[0] == 6)
                                        printf_usb("Hello World !\r\n");
                        else if (UsbOutBuffer[0] == 7)
                                        printf_usb("China !\r\n");
        usb_OUT_done();               
    }
}

截图202509062142002748.jpg


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










截图202509081454437467.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2025-10-10 14:30:18

16

主题

133

回帖

1170

积分

版主

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

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 10:30 , Processed in 0.138225 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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