第一集
作为一名初学单片机的入门者,通过第一集序言的系统学习,我对单片机的强大功能和应用前景有了全新的认识。
特别是了解到Ai8051U这款增强型51单片机的卓越性能后,我对嵌入式开发产生了极大的兴趣和学习动力。
从视频教学中学到的重要知识点包括:
1. Ai8051U的核心优势
强大的多媒体处理能力:
支持液晶屏幕驱动和显示控制
集成I2S音频接口,可实现高质量的录音和播放功能
卓越的计算性能:
内置硬件乘除法器
可编程逻辑阵列(PLA)加速
丰富的应用场景:
手写式计算器开发
各种智能硬件控制
2. 学习心得
作为新手,第一次了解到传统8051单片机的功能可以如此强大
Ai8051U扩展的外设接口和计算能力完全颠覆了我对单片机的认知
视频展示的实际应用案例让我直观感受到:
单片机的无限可能性
软硬件结合的独特魅力
嵌入式开发的广阔前景
3. 学习感受
这款芯片的多功能性让我产生了强烈的学习欲望:
渴望深入了解各个外设接口的工作原理
期待掌握如何在单一芯片上实现多媒体处理
对将来的智能硬件开发充满憧憬
这次入门学习让我意识到,现代单片机不再是简单的控制芯片,而是集成了丰富功能的微型计算机系统。Ai8051U
展现的性能特点和多样化的应用场景,为我的单片机学习之旅打开了全新的大门,也为我指明了未来的学习方向。
第二集
在观看完硬件及工具介绍的视频后,我对实验箱的硬件架构和软件支持有了系统性的认识。
下面我将详细介绍实验箱上各个功能模块的用途和技术特点:
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电压
这些硬件模块构成了一套完整的嵌入式开发平台,为学习各种外设应用提供了便利的实验条件。
第三集
通过本集的系统学习,我在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;
}
}
这次实践不仅让我熟悉了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特有的开发模式
提升了代码组织和项目管理能力
本次学习不仅让我掌握了这项实用的下载技术,更重要的是理解了现代单片机开发中软件配置与硬件功能的
有机结合方式,这些经验将对我后续的项目开发产生深远影响。
第五集
通过本集的系统性学习,我对C语言的核心概念进行了深度梳理,并掌握了若干重要的编程技巧。现将学习内容和心得体会整理如下:
一、宏定义的深入理解与实践应用
1. printf函数的宏定义机制:
通过预处理指令 #define printf printf_hid
实现了标准输出函数的自定义重定向
这种技术广泛应用于:
嵌入式系统的输入输出重定向
调试信息的定制输出
多平台兼容性处理
2. 宏定义的语法规范:
基本格式: #define 替换目标 替换内容
替换范围:预处理阶段完成全文本替换
注意事项:避免产生命名冲突和副作用
二、格式化输出函数的参数解析
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码
三、进制系统的理论巩固与实际应用
1. 二进制系统:
基数:2
表示方法:前缀0b(如0b1010)
应用场景:位运算、硬件寄存器配置
2. 八进制系统:
基数:8
表示方法:前缀0(如0123)
典型应用:Unix文件权限管理
3. 十六进制系统:
基数:16
表示方法:前缀0x(如0x1A3F)
使用优势:
简化二进制表示(1位十六进制对应4位二进制)
内存地址的标准表示方式
四、进制转换的实用技巧
1. 二进制与其他进制的互转:
二转八:3位一组
二转十六:4位一组
2. 十进制转其他进制:
整数部分:除基取余法
小数部分:乘基取整法
五、学习总结与进阶方向
1. 核心收获:
巩固了C语言的底层输出机制
掌握了格式化字符串的灵活运用
理清了不同进制系统的特点与联系
2. 后续学习建议:
深入理解可变参数函数的实现原理
实践自定义printf函数的开发
研究不同进制在嵌入式开发中的典型应用场景
这些基础知识的系统梳理,为我后续深入学习嵌入式开发奠定了坚实的基础,特别是在调试信息输出、
内存管理等方面提供了理论支撑和实践指导。
第六集
通过本视频的系统学习,我对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;
}
2. 任务2:反向控制逻辑
采用**松开亮、按下灭**的反向控制策略
通过判断P32==1触发动作
展示了同一硬件可通过逻辑取反实现不同功能
部分示例如下:
if(P32 == 1)
{
P00 = 0;
}
else
{
P00 == 1;
}
3. 任务3:状态切换模式
通过`state = !state`实现每次按下切换LED状态
`while(P32==0)`用于消抖和防止连续触发
深入理解了:
✓ 状态变量的应用场景
✓ while循环阻塞在按键检测中的作用
✓ 实际开发中机械抖动对检测的影响
部分示例如下:
f((P32 = =0 )
{
state = !state;
P00 = state;
while(P32 == 0);
}
三、常见问题与解决思路
视频中特别分析了按键不灵敏的可能原因:
硬件层面:接触不良、上拉电阻阻值不当
软件层面:
✓ 未添加消抖处理(硬件消抖或软件延时)
✓ 检测逻辑错误(如电平判断反向)
✓ 引脚模式配置不当(应设置为输入模式)
四、学习收获与扩展思考
1. 关键技能提升
GPIO配置的完整工作流程(模式选择→电平控制)
状态机思维在按键检测中的应用
通过对比实验理解不同控制逻辑的实现差异
2. 实际应用建议
复杂场景建议引入定时器消抖
多按键系统可采用扫描检测或中断驱动
输出负载需注意驱动电流匹配(参考数据手册)
本次学习使我建立起GPIO从理论到实践的系统认知,特别是通过不同任务的代码对比,深刻体会到硬件控制逻辑的灵活性。
这些基础知识的掌握为后续学习PWM、中断等进阶功能奠定了重要基础。
第七集
一、定时器的核心功能与应用价值
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修饰意图
六、学习心得
通过本视频的实践学习,建立了定时器开发的完整知识体系:
1. 掌握了从理论计算到寄存器配置的全流程
2. 理解了RTOS底层时基的实现原理
3. 培养了精准时序的工程思维
这些知识对后续学习PWM、输入捕获等高级功能奠定了坚实基础。建议下一步可以结合示波器实际观测定时器产生的波形,加深直观理解。
实验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");
- }
|