第一集
这段学习经历让我对单片机的广阔应用领域有了崭新认知。在序言视频中,我惊喜地发现像Ai8051U这样的单片机竟能实现LCD显示、音频处理、
计算器功能以及硬件级运算等多样化应用,远超我原先对单片机的想象。作为初学者,这些强大的功能演示瞬间点燃了我的学习热情,特别是了
解到它支持IIS音频接口和硬件乘除运算等高级特性时,更让我对嵌入式开发的无限可能性充满期待。这堂课不仅拓展了我的技术视野,更让我看
到了从零开始学习单片机的巨大潜力。
第二集
这次硬件与工具介绍的学习让我对整个实验系统的功能架构有了系统性的认识。实验箱集成了丰富的硬件模块和接口资源:从基础的USB Link 1D
下载调试接口、双串口通信模块,到实用的音频输出接口(线路输出和耳机接口),再到显示模块(OLED和TFT彩屏可支持动画播放)。特别值
得注意的是那些提升开发效率的设计细节,如示波器的波形调节旋钮、LCD对比度调节功能,以及两种键盘方案——矩阵键盘的8引脚控制和ADC
键盘单脚控制16键的巧妙设计。安全机制方面,掉电检测电压调节功能能有效保障关键数据的断电存储。扩展存储则通过QSPI/SPI FLASH实现,
配合显示屏可构建完整的数据存取显示系统。视频还提供了开发环境搭建的实用资源。这些硬件资源的系统整合,为后续各类嵌入式实验提供了
全面的基础支持。
第三集
这一次的学习让我对单片机开发的整体流程有了清晰的认知。视频教程详细演示了如何在Keil开发环境中进行项目配置和代码格式调整,我跟随操 作手册也成功完成了基础开发环境的设置工作。通过LED点灯实验这个经典的入门案例,我掌握了几个关键知识点:首先是如何在Keil中规范代码 格式、运用工程管理功能;其次是理解了IO口的基本配置方法,即在主函数初始化时先设置P0和P4端口的工作模式(通过P0M1/P0M0和P4M1/P4 M0寄存器设定为准双向口模式),然后再操作具体端口电平(P40和P00)来控制LED的亮灭。 在实际编程练习中,我发现以下几点尤为关键:头文件的正确引用、寄存器的初始化顺序、while循环的必要性以及代码注释的重要性。这段简单的L ED控制代码虽然简短,却涵盖了单片机开发的基础要素——端口配置、电平控制和循环执行逻辑。通过学习这个案例,我不仅成功点亮了LED,更 重要的是理解了GPIO的基本操作原理,这将为后续更复杂的嵌入式开发奠定坚实基础。
第四集 本次视频学习让我深入理解了USB不停电下载技术的工作原理和实际应用。与传统下载方式相比,该技术突破性地实现了免按键自动进入USB下载模式, 极大简化了程序烧录流程。我通过访问STC官网(www.STCAI.com)成功获取了关键的USB库文件资源包。在开发实践中,掌握了以下关键技能:首先是通过全局搜索功能快速定位函数定义位置,这对代码导航和函数调用跟踪特别实用。具体操作是:在main文件中找到目标函数后,跳转到其所在的 库文件进行查看,随后将函数声明结构复制到主程序中使用。这种开发技巧大大提升了代码复用效率。其次,视频详细演示了各种命令参数的使用方法,包括USB下载相关的配置参数和调试选项。这些看似细微的设置实则对程序下载的稳定性和成功率有着 重要影响。通过对比实验,我发现使用不同参数组合时,系统对错误处理的响应方式存在明显差异。这项技术的掌握,不仅使开发调试过程更加流畅,也为后续实现设备固件空中升级(OTA)等高级功能打下基础。整个学习过程让我真切体会到,嵌入式开 发中硬件调试工具的智能化发展对提升工作效率的重要意义。
第五集 本阶段的学习让我对C语言的底层机制有了更深入的理解,特别是关于标准输入输出函数的实现原理与使用方法。通过视频讲解,我掌握了预处理指令#define 的应用技巧,理解了printf的重定义机制——即通过"#define printf printf_hid"这样的宏定义可以将标准printf函数替换为特定的输出函数(如HID模式的printf), 这种技术在嵌入式系统开发中非常实用。 更进一步地,我系统地梳理了printf函数的格式控制符详解: 1. 格式化字符串(fmt参数)包含两种元素: - 普通字符:原样输出的文本内容 - 格式说明符:以%开头的特殊标记,用于控制变量输出格式 2. 特殊格式说明符的具体应用场景: - %e/%E:科学计数法输出浮点数(如3.14e+05) - %g/%G:智能选择浮点数的输出形式(自动切换普通/科学计数法) - %p: 指针地址输出(常用于调试内存问题) 3. 转义字符的深入理解: - 控制字符:如\b(退格)、\a(警报声)、\f(打印机换页) - 八进制转义:\ddd形式(如\101表示'A') - 特殊空白符:如\t(制表符)、\v(垂直制表符) 同时,我对不同进制系统及其相互转换进行了系统性复习: - 二进制系统:基于2的幂次表示(如0011表示3) - 八进制系统:每3位二进制对应1位八进制(如12对应二进制的001010) - 十六进制系统:前加0x前缀,广泛用于内存地址表示(如0x1F表示31) 这些基础知识对于后续开发单片机程序中的调试信息输出、数据格式转换等任务至关重要。
第六集 这次学习让我对通用输入输出端口(GPIO)的工作原理和应用场景有了全面认知。GPIO(General Purpose Input/Output)是单片机与外部设备交互的重要接口, 通过控制引脚的高低电平(通常0V为低电平,3.3V/5V为高电平)实现信号传输。根据使用场景的不同,GPIO可配置为四种工作模式: 1. 准双向口模式:默认状态,既能输入也能输出 2. 推挽输出模式:提供强驱动能力,可输出高低电平 3. 高阻输入模式:专门用于信号采集 4. 开漏模式:常用于总线通信(如I2C) 通过实例分析,我深入理解了电流特性中的关键概念: - 拉电流(Sourcing Current):当IO口输出高电平时,电流从芯片流出 - 灌电流(Sinking Current):当IO口输出低电平时,电流流入芯片 在按键检测实践环节,通过三个典型任务的代码对比,掌握了不同交互逻辑的实现方法: 【任务1】即时响应模式 采用直接控制方式,当检测到P32引脚为低电平(按键按下)时立即点亮LED(P00置低),松开时熄灭。这种模式实时性好,但容易受抖动影响。
【任务2】反向控制模式 逻辑与任务1相反,利用P32高电平触发LED点亮。这种设计常见于带自锁功能的开关电路。
【任务3】状态切换模式 通过"state=!state"实现状态翻转,配合while循环消除抖动。关键点在于: - 采用状态变量记录当前LED状态 - while循环实现按键释放检测 - 非阻塞式设计避免程序卡死 实验中还特别分析了按键不灵敏的常见原因: 1. 硬件方面:接触不良、消抖电容缺失 2. 软件问题:检测延时不足、未做去抖动处理 3. 配置错误:IO口模式设置不当
这些实践让我深刻认识到,GPIO应用需要考虑电气特性(如上拉/下拉电阻)、机械特性(如按键行程)和软件策略(如消抖算法)的协同配合。
第七集 通过学习定时中断相关知识,我对单片机定时器系统有了更深入的理解。定时器作为单片机的重要功能模块,主要承担两大核心作用:首先是作为精确的时间 基准,可以实现周期性任务调度;其次是优化程序执行效率,通过中断机制替代传统的延时等待方式。 具体来说,定时器的工作原理和优势体现在: 1. 精确定时功能: - 可配置为周期性触发中断 - 实现毫秒/微秒级定时控制 - 适用于需要严格时序的场合(如PWM生成)
2. 系统性能优化: - 避免使用阻塞式延时(如delay()) - 提高CPU利用率 - 支持多任务并行处理
视频中展示的STC单片机采用24位复合定时器结构,包括: - 8位预分频器(TMOPS):用于时钟分频 - 13位自动重装载寄存器:决定定时周期 - 总计形成(2^8)*(2^13)=2^21=24位定时范围
对于频率和时间的计算关系: 定时周期计算公式: T = (TMOPS+1)×(65536-[TH0,TL1])×T0 其中: - T0为时钟周期(1/Sysclk) - [TH0,TL1]为16位定时初值 - 最大定时时长可达数秒级
乱码问题的技术背景: 在8051架构中,0xFD字节编码存在特殊限制: - 汉字内码若包含0xFD会引发显示异常 - 解决方案包括: * 使用转义字符\XFD替代 * 修改编译器编码设置 * 选用兼容性更好的字库
关于函数的使用规范: 1. 函数定义三要素: - 返回值类型(void/int等) - 函数名(符合命名规范) - 参数列表(需明确类型)
2. 声明与调用的注意事项: - 声明位置:头文件或使用前 - 调用语法:函数名(实参列表) - 参数传递:值传递/指针传递
本次学习不仅掌握了定时器配置的具体方法(包括初值计算、模式设置等),还理解了中断机制如何提升系统实时性的底层原理,这些知识对开发高效可靠的嵌入式 系统至关重要。
实验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;
- 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");
- }
-
复制代码
|