找回密码
 立即注册
查看: 150|回复: 0

Ai8051U 心得体会和实验

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

1

主题

0

回帖

15

积分

新手上路

积分
15
发表于 2025-9-27 18:11:11 | 显示全部楼层 |阅读模式
第一集

在初次接触单片机的学习过程中,第一集的序言介绍让我对这项技术产生了全新的认识。通过系统性的讲解,
我了解到看似简单的单片机竟然能够实现如此丰富多彩的功能应用,这完全颠覆了我之前对单片机的刻板印象。
特别是关于Ai8051U这款单片机的功能介绍,让我这个刚踏入单片机领域的新手感到既惊讶又兴奋。


视频中详细展示的多种应用场景令我印象深刻,其中实现屏幕显示功能让我联想到智能设备的交互界面,IIS录放音
功能展现了音频处理的可能性,手写计算机的实现更是将数学运算可视化,而硬件乘除等运算功能的介绍则凸显了其
在高速计算方面的优势。这些生动实例不仅让我直观地理解了单片机的强大功能,更在我的脑海中描绘出一幅广阔的应用场景图景。


作为初学者,这样系统而丰富的介绍内容让我对单片机产生了前所未有的浓厚兴趣。视频中每个功能模块的讲解都像打开了
一扇新的大门,引导着我深入思考如何将这些技术应用到实际项目中。这种由浅入深的启蒙方式,不仅让我快速建立起对单
片机的基本认知,更激发了我持续学习的动力和热情。

截图202509271723159081.jpg 截图202509271723235195.jpg 截图202509271723327748.jpg








第二集
在认真观看和学习硬件及工具介绍的视频内容后,我对实验箱的硬件配置和软件功能有了更加全面的认识。下面我将以系统化的方式详细介绍各功能模块的具体作用和实际应用场景:


1. USB Link 1D接口模块
作为烧录调试的核心部件,这个接口模块为代码下载和程序调试提供了便捷的通道。与传统的烧录方式相比,它具有更高的稳定性和更快的传输速度,大大提升了开发效率。


2. USB转双串口功能
该功能模块兼容市面上常见的CH340芯片,其双通道设计使得串口通信实验得以实现更为复杂的交互应用。在实际应用中,可以同时连接两个设备进行数据传输,为串口协议的深入学习提供了硬件基础。


3. 示波器BNC输入接口
配备红色调节器的示波器输入接口为用户提供了灵活的波形观测手段。通过细致的调节旋钮,可以精准地分析和测量各种信号的波形特性,这对于电路调试和信号分析至关重要。


4. 音频输出系统
实验箱配备了专业的立体线路输出和耳机输出双接口系统。高质量的音源输出可以接驳专业音响设备或直接使用耳机监听,为音频相关实验和应用开发提供了完善的硬件支持。


5. 显示部分
(1)OLED显示屏:具备高对比度、快速响应的特点,适用于需要低功耗和精准显示的场合;
(2)TFT彩屏:全彩显示能力使其可以呈现丰富的视觉内容,包括动画播放等多媒体应用。


6. 关键扩展功能
(1)掉电检测机制:通过电压调节器实时监控电源状态,在意外断电前完成关键数据的保存工作;
(2)矩阵键盘:采用8个I/O引脚控制4×2矩阵,实现多按键输入功能;
(3)ADC键盘系统:创新的单引脚控制16个按键的设计,极大节省了I/O资源。


7. 存储与显示组件
(1)QSPI/SPI Flash存储单元:大容量非易失性存储器,可存储程序代码或用户数据,并支持通过TFT屏进行内容展示;
(2)LCD对比度调节功能:精准的对比度控制确保在各种环境光线条件下都能获得最佳的显示效果。
截图202509271726179404.jpg 截图202509271726314423.jpg
这些精心设计的硬件模块不仅展现了实验箱强大的功能扩展性,更为开发者提供了丰富的实践平台。每个功能模块的配置都经过精心考量,确保了整体系统的稳定性和易用性。
在实际开发过程中,这些功能模块可以根据项目需求进行组合应用,为创意实现提供无限可能。
看了上述视频,我还找到一个安装kile软件(C51)的链接,如下:
链接:https://pan.baidu.com/s/135O6AJXWfr5iU3R2S5vF7A?pwd=yqq6
提取码:yqq6


截图202509271726402029.jpg 截图202509271726467690.jpg




第三集
在观看Ai8051U开发板第三集“点亮一个LED灯”的学习内容后,我对该开发板的基本编程方法有了更进一步的认识。通过查阅相关的技术手册
,我对代码的格式进行了适当的调整和完善,这不仅让代码看起来更加规范,也提高了后期调试和维护的效率。同时,我也深入地了解了Keil软件
的一些使用技巧和基本功能,比如如何创建和管理项目、如何进行代码编译和下载,以及如何利用调试工具对程序运行情况进行监测。


在本集学习过程中,我特别关注了如何通过编程来点亮LED灯的相关知识。通过实践操作,我体会到编写底层控制程序时,需要注意很多细节,比如
端口的配置、引脚的功能设置以及电平的控制等。这些经验让我更加明白了硬件与软件之间的紧密联系,以及如何通过正确的配置实现对开发板外设的控制。
以下是代码示例:
#include "ai8051u.h"
void main(void)
{
   P0M1 = 0x00; P0M0 = 0x00;
   P4M1 = 0x00; P4M0 = 0x00;

  P40 = 0;

  while(1)
  {
     P00 = 0;
  }
}
截图202509271742338321.jpg 截图202509271742396728.jpg
在实现点亮LED灯的过程中,我了解到,不同的端口需要根据其功能进行相应的模式设置,这样才能确保LED能够正常工作。通过本节内容的学习,
我掌握了如何设置P0和P4端口的工作模式,从而为后续的LED控制打下了坚实的基础。同时,我也在实践中尝试写了一些相关的控制代码,并利用
Keil软件进行调试和验证,进一步巩固了我的学习成果。通过这些学习和实践,我对单片机编程的兴趣也日益浓厚,对未来的学习充满了期待。

截图202509271742549089.jpg 截图202509271742494329.jpg




第四集
通过观看本集关于“USB不停电下载”的实验演示,我了解到这一技术可以极大地简化开发板的编程流程。以往在使用USB下载功能时,
通常需要先通过按键触发进入下载模式,才能使用USB Writer进行程序烧录;而通过本集的学习,我掌握了如何实现“USB不停电下载”
功能,这意味着在开发过程中,无需手动按动按键,即可直接通过USB连接进入下载状态,显著提升了操作的便捷性和效率。


此外,在本集视频中,我还学习了如何从STC官网(www.stc.com)获取所需的USB相关库文件,这对于后续开发和功能扩展非常关键。
同时,我也了解到在使用这些库文件时,可以通过全局搜索功能,快速在amin文件中定位需要调用的函数,并将其跳转到对应的库文件
中进行查找和使用。这一过程不仅帮助我更好地理解了代码的组织结构,也让我掌握了如何合理利用第三方库文件来优化程序设计和提高开发效率。
以下是截屏的一些部分代码:
截图202509271746558514.jpg 截图202509271746476030.jpg 截图202509271747078755.jpg 截图202509271747285501.jpg


在实际操作中,我学会了如何将库文件中的函数结构复制并应用到主程序(main文件)中,从而实现功能的整合与调用。通过这种方式,
我可以更加灵活地进行程序编写,而无需从头开始实现所有功能,大大节省了开发时间。同时,我还认识到了一些编程中常用的命令参数
及其作用,为进一步掌握USB下载等高级功能打下了良好的基础。通过这一集的学习,我对开发板的编程方式有了更全面的理解,也增强了
自己动手实践的信心和能力。






第五集
通过观看Ai8051U开发板第五集“C语言基础”的教学视频,我对C语言的基本概念和常用函数有了进一步的巩固和理解。
在这一集中,重点讲解了`printf`函数的使用及其原型定义,同时也介绍了如何通过`#define`预处理指令来替换函数名,
从而适应开发板特定的库函数调用方式。例如,原本的`printf`函数在开发板中可能被定义为`printf_hid`函数,因此需要
通过`#define printf printf_hid`的方式,将标准的`printf`替换为开发板所支持的函数,确保代码能够正常编译和运行。


通过这一操作,我不仅了解了宏定义的基本用法,也认识到在嵌入式开发中,对函数调用方式进行适配是非常重要的一步。
同时,视频还详细解释了`printf`函数中的参数`fmt`(格式控制字符串)的作用,它用于控制输出的格式,
包括普通字符和格式化替换说明符两种类型。这使得我对字符串格式化有了更系统的认识,也为后续在开发板上进行更复杂的调试和信息输出打下了基础。


此外,本集还回顾了一些经常用到的字符及其特殊含义,比如`%e`和`%E`用于以指数形式输出浮点数,
`%g`和`%G`则根据数值大小自动选择最合适的输出格式,`%p`用于输出指针地址等。同时,还学习了转义字符的使用,
例如`\b`表示退格符,用于删除前一个字符;`\ddd`用来表示一个、两个或三个八进制数字,可以用于输出特定的ASCII字符;
`\a`是警告音符,用于发出系统提示音;`\f`则是换页符,常用于控制输出格式等。这些细节不仅丰富了我的C语言知识,
也让我更加体会到字符处理在调试和程序运行中的重要作用。


在本视频中,我还复习了二进制、八进制和十六进制之间的转换方法,对这些不同进制表示在嵌入式系统中的应用理解更加深入。
例如,二进制的表示方式如`0000`、`0001`、`0011`等,帮助我更好地理解位操作和寄存器配置;
八进制的数字如`1`、`2`、`3`、`10`、`11`、`12`、`13`、`14`等,是许多嵌入式系统中常用的表示方式,尤其在地址和数据处理方面;
而十六进制的表示,如`0x1`、`0x2`等,则广泛应用于硬件编程和调试中,更加简洁地表达二进制数据。
截图202509271750427192.jpg 截图202509271750503720.jpg


通过本集的学习,我不仅加深了对C语言基础知识的理解,还掌握了在嵌入式开发中如何灵活运用这些语言特性,
为今后编写更复杂、更高效的代码提供了坚实的基础。同时,这些知识也帮助我更好地理解开发板的工作原理和编程逻辑
,提高了我在实际项目中的动手能力和问题解决能力。
截图202509271752465461.jpg 截图202509271752595492.jpg



第六集

通过观看Ai8051U开发板第六集“I/O输入输出”的教学视频,我对GPIO(通用输入输出)这一概念有了更加清晰和深入的理解。
GPIO是一种可以配置为输入或输出的引脚资源,通过控制其高低电平来实现对硬件的交互操作。在这一集中,老师详细讲解了GPIO的四种常见工作模式:
准双向口、推挽输出、高阻输入以及开漏模式。这些模式决定了GPIO在不同应用场景下的行为特性,例如是否能够驱动外部设备、是否具有拉高或拉低的能力等。
通过对这四种模式的了解,我认识到在进行电路设计和程序编写时,合理选择GPIO的工作模式是非常关键的一环,能够确保系统稳定运行和外部设备正确连接。


视频中还介绍了与I/O操作相关的一些重要概念,例如拉电流和灌电流。拉电流指的是当GPIO输出高电平时,外部电路从开发板获取电流;而灌电流则是指当GPIO输出低电平时,
外部电路向开发板输入电流。这两种电流特性直接影响了外部电路的设计和GPIO驱动能力的选择。此外,还学习了如何检测按键输入的状态,这对于实现人机交互功能至关重要。
通过按键检测的讲解,我理解了如何判断按键是否按下,并根据不同的状态进行相应的逻辑处理。


本集还通过三个任务代码的演示,进一步展示了按键输入的多样处理方式。
在任务1中,当按键按下时LED灯亮,松开后LED灯灭,这种简单的按键响应逻辑让我掌握了基本的按键检测思路。
任务1:按下灯亮,松开灯灭
if(P32 == 0)
{
    P00 = 0;
}
else
{
   P00 == 1;
}

截图202509271758402197.jpg



任务2的逻辑则相反,松开按键时LED灯亮,按下时LED灯灭,这说明了在不同的应用场景下,按键的状态判断需要根据实际需求进行灵活编程。
任务2:松开灯亮,按下灯灭

if(P32 == 1)
{
    P00 = 0;
}
else
{
   P00 == 1;
}

截图202509271758504928.jpg

任务3则更进一步,展示了如何实现“按一下灯亮,再按一下灯灭”的功能,这需要通过状态变量的切换来控制LED的切换状态,同时配合一个延时函数,防止按键抖动导致误触发。
任务3:按一下灯亮,按一下灯灭
if((P32 = =0 )
{
   state = !state;
   P00 = state;
  while(P32 == 0);
}

截图202509271759129430.jpg


在任务3的代码逻辑中,我还更加深入地理解了`while`循环在按键检测中的使用方法,以及它如何帮助我们处理按键的按压和释放过程。同时,视频中也解释了为什么有些时候按键不灵敏,
通常是因为按键自身的机械特性导致的“抖动”现象,通过在程序中加入适当的延时和状态判断,能够有效解决这一问题。这些知识不仅提升了我对I/O操作的理解,也让我在实际开发中能够
更好地应对类似的硬件交互问题,增强了我的逻辑思维和调试能力。






第七集
通过观看关于定时中断的视频讲解,我对定时器在嵌入式系统中的作用有了更加全面和深入的认识。定时器是一种非常重要的硬件资源,能够用于精确的时间控制和系统时序管理。它不仅可以实现软件计时,还能在程序中定期执行某些操作,例如控制周期性任务、延时控制、或是与其他外设进行同步。相比于传统的软件延时方法,定时器以其高精度和低资源占用的特点,在提高程序运行效率和响应速度方面具有明显优势。


在这一集中,视频中详细讲解了定时器的一些基本概念和使用方式,特别是针对8051系列单片机的定时器特性。例如,视频中提到的8051和80251型号单片机中存在一个特殊的问题,
即系统默认无法显示包含0xFD编码的汉字,因此在使用中文显示时,容易出现乱码现象。为了解决这个问题,视频中建议在代码中使用`\x`转义方式来表示特定的字符,例如`\xFD`,
以避免由于字符编码问题导致的显示错误。


此外,视频中还演示了如何通过定时器相关寄存器来设置定时频率,从而精确控制定时器的触发时间和周期。定时频率的计算公式为:
定时频率 = 系统时钟频率 (Sysclk, Hz) / [(定时器模式系数 + 1) × (65536 − [TH0, TL0]) × 定时器周期时间(T)];
而定时时间的计算则是:
定时时间 = [(定时器模式系数 + 1) × (65536 − [TH0, TL0]) × T] / 系统时钟频率 (Sysclk, Hz)。
其中,[TH0, TL0]代表定时器初值的设置,根据所需的定时时间进行计算调整。视频中还给出了一个公式用于求解[TH0, TL0]的值:
[TH0, TL0] = 65536 − [Sysclk × 定时时间 / T × (定时器模式系数 + 1)]。
这些公式和计算方式帮助我更好地理解定时器的配置和使用原则,为后续进行更加复杂的定时任务打下了坚实的基础。
截图202509271802143322.jpg 截图202509271802393988.jpg
视频中还特别介绍了函数的定义、声明与调用,帮助我更加清晰地掌握C语言中函数的基本结构。函数的定义是指编写一个函数的具体实现过程,
包括函数的返回值类型、函数名、参数列表以及函数体中的具体操作;声明则是指在使用函数之前,提前告知编译器该函数的存在及其参数类型,
通常是放在头文件中或在调用函数之前进行声明;调用则是指在程序中实际使用该函数,通过函数名加上括号,并在括号内传入相应的参数来执
行函数的功能。这些知识对于在程序中组织代码结构、提高代码的可读性和可维护性具有重要意义。


通过学习视频中的示例代码,我进一步掌握了如何在实际项目中使用定时器,理解了定时器的工作原理和实际应用中的注意事项。同时,关于函数定义、
声明和调用的讲解,也让我在编写和调用函数时更加规范和严谨。这些内容不仅增强了我的理论基础,也提升了我在实际编程中对代码结构和功
能实现的控制能力,为后续开发更加复杂的嵌入式程序做好了充分准备。

截图202509271803204113.jpg 截图202509271803296176.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. }
复制代码
截图202509271806102456.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. }
复制代码
截图202509271808112450.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. }
复制代码
截图202509271810321954.jpg



回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 05:39 , Processed in 0.125657 second(s), 50 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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