第一集,序言
Ai8051U单片机的强大功能深深吸引了我这个新手。通过序言,我了解到它能实现屏幕显示、IIS音频录放、手写计算器、
硬件乘除等多样化应用,展现了单片机的无限可能。视频演示更让我直观感受到它的灵活性与实用性,激发了我深入学
习嵌入式开发的热情。这款芯片让我认识到,单片机不仅是电子控制的核心,更是实现智能化创意的重要工具。
第二集,硬件及工具介绍
观看硬件及工具介绍视频后,我对实验箱的丰富功能有了系统性认知,现整理关键硬件模块如下:
1.实验箱采用模块化设计,核心外设包括双模通信接口(USB Link 1D可同时实现程序烧录与在线调试,USB转双串口则兼容串口); 音频系统配备双通道输出(立体线路接口驱动外置音响,3.5mm耳机插孔支持直接监听);显示单元包含两种屏幕(128x64分辨率的OLED模 块用于基础信息显示,TFT彩屏支持动画播放与图形化交互)。 2.在输入控制方面,实验箱提供两种键盘方案:传统矩阵键盘通过8个IO口实现4x2按键扫描,而创新性的ADC键盘仅需1个模拟引脚即可识别16个按键动作, 大幅节省硬件资源。存储系统搭载QSPI/SPI Flash芯片,既可保存程序运行时产生的关键数据(如传感器日志),又能通过TFT屏动态展示读取内容。 特别设计的硬件保护功能令人印象深刻:示波器BNC输入配备红色精密旋钮实现波形参数微调,LCD对比度调节旋钮确保不同光照条件下的可视性,掉电检测 电压调节模块则能在供电异常时触发数据保护机制。这些设计充分体现了该实验平台在教学与实践应用中的专业性与实用性。
第三集,点亮第一个LED灯 通过本次学习,我对Keil开发环境的基本操作有了更深入的理解,成功掌握了代码格式调整技巧。在教材指导下,我完成了 LED灯的基础控制实验,编写了GPIO初始化代码:通过配置P0M1/P0M0和P4M1/P4M0寄存器设置端口工作模式,最终实现P 00引脚驱动LED发光。这个实验让我理解了8051单片机端口模式寄存器的应用场景,同时也熟悉了Keil软件的工程管理、代码 编辑和编译调试流程。动手实践的过程使我对嵌入式开发的硬件配置与软件编写的配合关系有了直观认识。以下是部分代码显示: #include "ai8051u.h"
void main(void)
{
P0M1 = 0x00; P0M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P40 = 0;
while(1)
{
P00 = 0;
}
第四集,USB不停电下载
通过本次学习,我对单片机USB下载功能有了全新认识。实验演示中最让我印象深刻的是USB不停电下载功能——这项技术 实现了真正的"一键下载",无需像传统方式那样手动按键即可自动进入USB writer模式,极大提升了开发效率。学习过程中, 我按照教程从STC官网(www.STCAI.com)获取了专用USB库文件。在代码开发环节,我掌握了几个实用技巧:首先是利用IDE的全局搜索功能,可以快速定位库文件中特定函数的定义位置; 其次是学习如何高效地移植代码——通过查找库函数原型,理解其参数结构后,即可将其精准地应用到主程序文件中。 视频还详细演示了命令参数的配置方法,这些知识对后续开发复杂功能大有裨益。这次学习不仅让我掌握了具体的技术实现, 更重要的是培养了查阅官方资料和复用代码模块的开发思维。
第五集,C语言基础 本阶段学习使我系统性地强化了C语言的核心概念,特别是在格式化输出和数值表示方面有了更深刻的理解。通过研习printf函数的宏定义实现(如#define printf printf_hid), 我掌握了代码替换的底层机制。针对格式化字符串参数fmt的解析,列举了其中部分的常规字符与控制字符
在格式说明符方面,我重新梳理了关键知识点: - 科学计数法输出(%e/%E)与智能格式选择(%g/%G) - 内存地址显示(%p)与特殊转义字符(\b退格、\ddd八进制转义等) - 控制字符的应用场景(\a警报、\f分页等)
数值系统方面,通过实际演算夯实了三种进制的转换方法: ① 二进制四比特分组表示(0000-1111) ② 八进制逢八进一规律(0-7,10-14...) ③ 十六进制0x前缀表示法(0x1-0xF...)
这些基础知识的巩固为后续嵌入式开发中的寄存器操作和调试输出奠定了坚实基础。
第六集,I/O输入输出 通过学习本视频内容,我对GPIO(通用输入输出端口)有了系统的认识。GPIO是单片机的重要外设接口,通过控制引脚电平状态(高/低) 实现信号输入输出,主要包含四种工作模式:准双向口、推挽输出、高阻输入和开漏模式,适用于不同场景需求。同时,我还掌握了电流驱动 的两种方式(拉电流和灌电流)以及按键检测的基本原理。 视频中的三个按键控制LED实验尤其让人印象深刻,通过对比三种任务实现方式,我对GPIO编程有了更深理解: 1. 任务一和任务二分别演示了按键的两种直接控制模式: - 任务一实现"按下即亮",利用判断P32是否为低电平(0)来控制LED - 任务二则恰好相反,检测P32高电平(1)时点亮LED
2. 任务三展示了按键切换模式,通过状态变量state实现按键开/关切换功能: - 使用state = !state实现状态翻转 - 通过while(P32 ==0)消抖,防止按键抖动误判 - 这帮助我理解了实战中按键不灵敏的原因和解决方法 这些实验不仅巩固了GPIO控制原理,更培养了我的实践编程思路。通过对比三种控制逻辑的异同,我学会了如何根据不同需求设计相应的IO控制程序。
第七集,定时中断 本次定时器专题的学习让我深入理解了其核心价值和应用要点: 一、定时器本质与优势 - 定时器作为嵌入式系统的"时钟管家"可实现精准计时功能
- 相比传统delay延时,使用定时器能:
二、STC单片机定时器特性 - 采用24位增强型架构(8位预分频+13位自动重载)
- 需注意8051/80251芯片的0xFD汉字编码兼容性问题
- 掌握了三个核心公式:
- 定时频率 = 系统时钟/(分频系数×计数值)
- 定时时长 = (分频系数×计数值)/系统时钟
- 初值计算 = 65536-(系统时钟×定时需求/分频系数)
三、编程要点把控 - 函数三要素:
- 定义:完整函数体实现
- 声明:需加分号结束
- 调用:参数间逗号分隔
通过例程分析,我更清楚了: - 定时器初始化的寄存器配置流程
- 中断服务程序的编写规范
- 如何利用定时器替代延时函数提升效率
这种理论与实践的结合,使我对嵌入式系统的时间管理有了系统性认知,为后续复杂功能开发打下坚实基础。 特别是对硬件特性(如0xFD问题)的深入理解,避免了很多实际开发中可能踩的坑。
实验1代码和成功图片
- #include "config.h"
- void main(void)
- {
-
- SYS_Init();
- while (1)
- {
- printf_usb("Hello World !\r\n");
- }
- }
-
- 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(0);
- set_usb_ispcmd("@STCISP#");
- }
-
- void USBLIB_WaitConfiged(void)
- {
- while (DeviceState != DEVSTATE_CONFIGURED)
- WDT_Clear();
- }
- void USBLIB_OUT_Done(void)
- {
- if (bUsbOutReady)
- {
- USB_SendData(UsbOutBuffer, OutNumber);
- usb_OUT_done();
- }
- }
复制代码
实验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;
- 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(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();
- }
- }
复制代码
实验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");
- }
复制代码
|