开启《8051U深度入门到32位51大型实战教学》学习
**在此贴记录学习心得...**<p><strong>学完《8051U深度入门到32位51大型实战教学视频》第一集,才真的是了解了Ai8051U的强大!</strong></p>
<p>表现在:</p>
<ol>
<li><strong>屏幕显示和视频播放(flash 编程器)</strong>:具备强大的屏幕显示与视频播放功能,依托于 flash 编程器实现高效稳定的运行。</li>
<li><strong>IlS 录放音</strong>:支持 IlS 录放音功能,满足多种音频处理需求。</li>
<li><strong>PWM DMA</strong>:PWM 与 DMA 协同工作,优化系统性能。</li>
<li><strong>频谱分析仪(上位机)</strong>:配备频谱分析仪,通过上位机实现对信号的精准分析。</li>
<li><strong>手写计算器</strong>:具备手写计算器功能,方便快捷进行数据运算。</li>
<li><strong>QSPI,PWM 移相,硬件乘除,单精度浮点</strong>:支持 QSPI 接口,具备 PWM 移相功能,拥有硬件乘除及单精度浮点运算能力,提升数据处理速度和精度。</li>
</ol>
第二集
介绍了硬件工具和开发软件
这里介绍了 ~~超级强大的 Ai8051U实验箱~~
开发软件 keil C251 + stc-isp
第三集 点亮第一个Led
在上一讲中,按冲哥讲解的,安装好了Kail C251软件包和补丁。
在这一讲中,用keil创建新工程选择Ai8051U芯片。
手头上暂时没有实体硬件实验板,先下载了擎天柱的示例代码
通过使能P2口为准双向口,置P20为0低电平,即可点亮led
第四集 USB不停电下载
本讲实现了开发板不停电下载,非常实用。提高了开发效率。
要实现这个功能,就需要调用官方提供的usb库。要将这个库加入项目中。
因为Ai8051U单片机支持32位模式,选
择这个USB库的时候对应将32位的文件(stc_usb_cdc_32.lib)考入项目文件夹。
记得加上头文件。
在代码中调用库函数 usb_init() 就可设置USB端口。
此后,ISP的串口模式变成了 USB-CDC
第五集 C语言基础
这一集带我们回顾了标准C语言的基础知识。重点讲解了51单片机的C语言特点。通过将STC-USB库实现的printf函数替换标准C的同名函数,可以直接与上位机通信,方便调试及与单片机交互。
在上一集上下载使用了STC-USB库,该库中提供了一个 printf_hid 函数,可以通过USB与上位机的ISP软件通信,输出单片机信息。
在头文件是这样定义的:
在主模块代码中调用 printf 就可以向上位机发送信息, 见示例代码
第六集 I/O输入输出
本集简要介绍了GPIO,1高电平、0低电平的概念。
并通过将按键接入IO端口进行了讲解。https://www.stcaimcu.com/data/attachment/forum/202502/03/134655vv24jd88aodnyj23.png见上图,按键按下时,接地为低电平,端口读回0, 释放按键,端口被拉高电平,读回1。通过读取端口电平,高电平对应逻辑1,低电平对应逻辑0,可以判断示例中的按键状态。
本集讲解了3个任务,通过按键的按下或释放,来点灭Led
任务1:按下P32按钮灯亮,松开P32按钮灯灭;任务2:按下P32按钮灯灭,松开P32按钮灯亮;任务3:按一下灯亮,按一下灯灭
代码片断如下
<h2>第七集 定时器</h2>
<p>在本集一开篇,冲哥就举了一个非常形象的例子来解释为什么要使用定时器。</p>
<p><img src="data/attachment/forum/202502/06/110244av74ww5v7cxcu7xs.png" alt="image.png" title="image.png" /></p>
<p>因为STC MCU是单核的,同一时间只能执行一个事情,没有特殊情况不能被打断。而在实际生活中,有许多事情是要并行处理的,所以这里就要引入一个特殊的情况,定时器中断。实现在做一件事情的同时,可被另一件更紧急的事情中断先去处理,完毕后又回到原事情来接着处理。</p>
<p>在本集中,冲哥通过抛出一个任务:</p>
<p>让LED每三秒重复闪烁一下,这三秒期间允许按下按键并且能及时反应。这怎么办呢?就需要引入定时器来解决:</p>
<p>主循环判断按键是否按下,另外开启定时器0,让它每3秒中断一次来闪烁Led。</p>
<p>上代码片断:</p>
<p><img src="data/attachment/forum/202502/06/113017zvq6utjq1db86gxv.png" alt="image.png" title="image.png" /></p>
<h2><a href="https://www.stcaimcu.com/forum.php?mod=attachment&aid=NjgyNjl8NGM2MDk4ZDR8MTczODU4MjM3MnwzNjY5N3wxMTkwMg%3D%3D">第八集-定时器周期性调度任务</a></h2>
<p>本集接续上集,讲解如何在实际项目中应用定时器解决问题。</p>
<p>目标是周期性执行3个任务。如下:</p>
<ul>
<li>任务1:用一个定时器实现,LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次。</li>
<li>任务2:数组点亮LED,实现流水灯。</li>
<li>任务3:按键1按一下,LED通过数组移动一下等。</li>
</ul>
<p>这三个任务并行执行,在时间序列上存在交叉重叠,完成这个任务就必须把定时器派上用场。</p>
<p>因为任务多了,代码量也上了。如果全部写在一个主文件上,行数太多,逻辑不清,难以维护。</p>
<p>冲哥在这一集讲解了代码分拆,多文件管理。非常值得学习,在以后的项目应用中多是这种情况。</p>
<p>代码按功能进行了拆分:</p>
<ol>
<li>主模块 main.c 主要执行主循环</li>
<li>定时器的配置等工作拆分到了 config.c</li>
<li>Led显示和按键处理拆分到了 io.c</li>
<li>任务的处理给了 task.c</li>
</ol>
<p>本讲重点讲解了多任务的执行,核心就在任务的安排中,task.c 代码片断,这是一个结构数组</p>
<pre><code>static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
{0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms */
{0, 600, 600, LED1_Blink}, /* task 1 Period: 600ms */
{0, 900, 900, LED2_Blink}, /* task 1 Period: 600ms */
{0, 10, 10, KEY_Task}, /* task 1 Period: 600ms */
};
</code></pre>
<p>主模块通过任务回调来循环执行任务数组</p>
<p><img src="data/attachment/forum/202502/06/114601dg8qtdqg8hi7zz5l.png" alt="image.png" title="image.png" /></p>
<h2><strong>第九集</strong> 数码管</h2>
<p>数码管是我们日常最常用的显示器件。</p>
<p>LED数码管由8个发光二极管构成,通过不同的组合可用来显示数字0~9、字符A~F和小数点“.”。</p>
<p>最大的收获就是学到了原来还可以通过AIapp-ISP虚拟仿真数码管和LED灯的显示。太好了!</p>
<p>来看看效果:</p>
<p><img src="data/attachment/forum/202502/03/195442djv8nckzgrvrf5f5.png" alt="捕获.PNG" title="捕获.PNG" /></p>
<p>这里调用了STC-USB库函数 SEG7_Showcode()</p>
<p><img src="data/attachment/forum/202502/03/195546fqslnndqnlsbdund.png" alt="image.png" /></p>
页:
[1]
2