《8051U深度入门到32位51大型实战视频》 写学习心得,送强大的 Ai8051U实验箱
<p><a href="">第一集-序言</a></p><p>在观看完这期关于STC 8051U单片机的深度教程后,我深受启发。这次的学习不仅是对单片机技术的一次深入理解,更是对未来创新项目的一个重要启示。以下是我从中学到的关键点和个人感悟。</p>
<h4>一、技术进步带来的可能性</h4>
<p>AI 8051U相较于之前的32G系列有了显著的进步。 在屏幕显示和视频播放方面,它优化了QSPI Flash芯片读写功能,使得大容量视频播放的质量有了质的飞跃。这一改进意味着我们可以更轻松地实现复杂的图形界面和多媒体应用,为嵌入式系统设计带来了更多的可能性。</p>
<h4>二、实用功能的增强</h4>
<p>除了性能上的提升,8051U还增加了许多实用的功能。 PWM与DMA的无缝结合,以及新增的频谱分析仪功能。这些新特性不仅让开发变得更加便捷,也为开发者提供了更多创造性的空间。尤其是手写计算器的应用演示,展示了如何通过硬件浮点运算单元来处理复杂计算任务,使单片机的应用范围进一步扩大。</p>
<h4>三、兼容性与灵活性</h4>
<p>AI8051U不仅支持现代32位指令集,还能兼容早期的8051指令集。这意味着对于那些已经拥有旧版开发板的用户来说,可以无缝过渡到新版单片机而无需重新设计整个系统架构。这种向后兼容的能力极大地降低了学习成本和技术门槛,促进了新技术的快速普及。</p>
<h4>四、代码学习</h4>
<p>使用PWMA-P1.0输出直接驱动WS2812 三基色彩灯, DMA传输,不占用CPU时间。本例驱动32个灯,接成环状。每个灯有24bit数据,需要24字节的占空比来控制。</p>
<p>鉴于PWM的特点,在发数据前先发一个占空比为0的周期,最后也发一个占空比为0的周期(发送完后连续输出低电平)。</p>
<p>每个灯3个字节,分别对应绿、红、蓝则,MSB先发.<br />
800KHz码率, 数据0(1/4占空比): H=0.3125usL=0.9375us, 数据1(3/4占空比): H=0.9375usL=0.3125us, RESET>=50us.<br />
高电平时间要精确控制在要求的范围内, 低电平时间不需要精确控制, 大于要求的最小值并小于RES的50us即可.<br />
DMA发送时间:@40MHz, 发送字节=24*24+1=577, DMA发送时间720us,32K xdata最多一次驱动1365个灯.</p>
<p>WS2812S的标准时序如下:<br />
TH+TL = 1.25us±150ns, RES>50us<br />
T0H = 0.25us±150ns = 0.10us - 0.40us<br />
T0L = 1.00us±150ns = 0.85us - 1.15us<br />
T1H = 1.00us±150ns = 0.85us - 1.15us<br />
T1L = 0.25us±150ns = 0.10us - 0.40us<br />
两个位数据之间的间隔要小于RES的50us.</p>
<p>PWMA-P1.0方案:<br />
本例使用PWMA-P1.0输出直接驱动WS2812。<br />
用DMA传输, 一个周期传输一个bit数据, 一个周期为1.25us,数据0的占空比为1/4,数据1的占空比为3/4。<br />
本例使用40MHz时钟,周期50T=1.25us,数据1占空比为37T,数据0占空比为12T。</p>
<p>第二集 硬件及工具介绍</p>
<ol>
<li><strong>课程介绍</strong>:
<ul>
<li>这是一堂关于8051单片机深度入门的实战视频课程。</li>
<li>课程强调动手实践,并围绕官方发行的STC 8051实验箱展开。</li>
</ul>
</li>
<li><strong>硬件介绍</strong>:
<ul>
<li>实验箱包含PCB板、短路帽、数据线等组件。</li>
<li>硬件特性包括USB接口(Type A和Type C)、USB转双串口芯片、TF卡插座、示波器输入端子、音频输出、麦克风录音、OLED屏、流水灯、数码管、TFT彩屏、掉电检测电路、红外接收头、矩阵键盘、ADC键盘、主控芯片(AI 8051)、复位键、电源键、QSPI Flash、LCD对比度调节、RTC电池、晶振、温度传感器、蜂鸣器、SP3485通信芯片、存储芯片等。</li>
</ul>
</li>
<li><strong>软件安装与配置</strong>:
<ul>
<li>推荐使用KEIL uVision编程环境进行开发。</li>
<li>需要下载并安装ISP烧录工具用于程序下载到单片机。</li>
<li>添加单片机型号对应的头文件以支持特定的MCU型号。</li>
<li>安装中断向量扩展插件以处理更多的中断。</li>
<li>下载实验箱代码包及使用手册,帮助理解和使用实验箱。</li>
</ul>
</li>
<li><strong>首个实验</strong>:
<ul>
<li>第一个实验是通过P0口实现跑马灯效果,以此验证单片机的基本功能。</li>
<li>演示了如何选择正确的单片机型号、进入下载模式、选择合适的波特率和运行频率,以及成功下载程序后观察到预期的硬件反应。</li>
</ul>
</li>
</ol>
<pre><code>while(1)
{
P00 = 0; //LED On
delay_ms(250);
P00 = 1; //LED Off
P01 = 0; //LED On
delay_ms(250);
P01 = 1; //LED Off
P02 = 0; //LED On
delay_ms(250);
P02 = 1; //LED Off
P03 = 0; //LED On
delay_ms(250);
P03 = 1; //LED Off
P04 = 0; //LED On
delay_ms(250);
P04 = 1; //LED Off
P05 = 0; //LED On
delay_ms(250);
P05 = 1; //LED Off
P06 = 0; //LED On
delay_ms(250);
P06 = 1; //LED Off
P07 = 0; //LED On
delay_ms(250);
P07 = 1; //LED Off
}
</code></pre>
<p>}</p>
<p>第三集 点亮第一颗LED</p>
<p><strong>学习心得:深入探索STC单片机开发</strong></p>
<p>有幸跟随冲哥保姆级教程的引导,通过点灯程序深度入门到实战的视频课程,对STC单片机开发有了更深层次的理解。这趟旅程不仅让我掌握了从8051U到32位系统的编程技巧,还锻炼了我的实践能力。</p>
<p><strong>创建工程与代码编写</strong> 首先,我学会了如何创建一个空的工程,并逐步添加必要的头文件和编写基础代码。这个过程中,我理解了初始化设置的重要性,例如设置端口模式(<code>P0M1</code>, <code>P0M0</code>)以确保正确配置硬件引脚的功能。这些初步的步骤是构建任何嵌入式项目的基础。</p>
<p><strong>点亮第一个LED</strong> 实现的第一个小目标是成功地让板子上的LED灯亮起。这是一个令人兴奋的时刻,它象征着我的代码能够直接控制物理世界中的设备。通过简单的代码段,如将 <code>P40</code>和 <code>P00</code>设为低电平输出0V,我亲眼见证了理论知识转化为实际成果的过程。</p>
<p><strong>硬件连接与原理</strong> 在实践中,我还深入了解了硬件连接的具体细节。电源极性、开关与LED灯泡的正确连接方式,以及它们如何通过编程来控制,都成为了我宝贵的知识点。例如,当 <code>P40</code>输出0V时,意味着该引脚处于低电平状态,从而可以控制连接在其上的LED熄灭或点亮。</p>
<p><strong>代码学习</strong></p>
<p>#include "ai8051u.h" //调用头文件</p>
<p>void main(void)<br />
{<br />
P0M0 = 0; //P0端口(P00-P07)为准双向口<br />
P0M1 = 0;</p>
<pre><code>P4M0 = 0; //P4端口为准双向口
P4M1 = 0;
while(1)
{
P40 = 0; //P40端口输出0V
P00 = 0; //P00端口输出0V
P01 = 0; //P01端口输出0V
}
</code></pre>
<p>}</p>
<p>学习</p>
<p>第四集 USB不停电下载</p>
<h3>理解硬件和软件的关系</h3>
<ul>
<li><strong>硬件抽象层</strong>:通过本课程的学习,我们了解到如何使用库文件来简化对硬件资源(如USB接口)的操作,而不需要深入了解硬件的具体实现细节。</li>
<li><strong>硬件依赖性</strong>:同时,我们也认识到,某些特定的功能(如USB通信)依赖于特定的硬件支持,例如内置USB控制器的单片机。</li>
</ul>
<h3>代码移植技巧</h3>
<ul>
<li><strong>选择正确的库文件</strong>:根据单片机型号选择相匹配的库文件对于确保程序正确运行至关重要。</li>
<li><strong>模块化编程</strong>:将不同的功能分割成独立的模块(如USB初始化、LED控制等),可以提高代码的可读性和维护性,并且方便在不同项目之间复用。</li>
</ul>
<h3>深入理解中断机制</h3>
<ul>
<li><strong>中断 vs 查询</strong>:学习了中断和查询两种不同的事件处理方式,了解了它们各自的优缺点。</li>
<li><strong>总中断使能</strong>:明白了全局中断使能位 <code>EA</code>的作用,它相当于所有中断请求通往CPU的“总开关”。</li>
</ul>
<h3>寄存器级别编程</h3>
<ul>
<li><strong>直接操作寄存器</strong>:掌握了如何直接操作微控制器内部的特殊功能寄存器(SFRs),以实现对硬件资源的精细控制。</li>
<li><strong>二进制逻辑运算</strong>:学会了利用按位逻辑运算符(如 <code>|=</code>)来进行精确的位设置而不影响其他位的状态</li>
</ul>
<h3>代码学习</h3>
<p>#include "stc32g.h"</p>
<p>#include "stc32_stc8_usb.h"</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = "@STCISP#";</p>
<p>void main()<br />
{<br />
P_SW2 |= 0x80;</p>
<pre><code>P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while (1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
}
</code></pre>
<p>}</p>
<p>写的挺好,实验箱拿到了吗</p>
fei2568 发表于 2024-12-9 07:40
写的挺好,实验箱拿到了吗
吃不到葡萄,说葡萄 <p>第五集 C语言基础</p>
<h4><strong>USB-CDC串口与 <code>printf</code>函数</strong>:</h4>
<ul>
<li><code>printf</code>函数被重定向到USB-CDC接口,使得可以通过USB发送格式化的字符串输出。</li>
<li>通过宏定义去掉反斜杠取消注释,启用了库中的 <code>printf</code>功能。</li>
</ul>
<h4><strong>数制转换</strong>:</h4>
<ul>
<li>解释了二进制、十进制、十六进制之间的转换,并提到在某些调试情况下使用十六进制表示法的重要性。</li>
</ul>
<h4><strong>变量类型</strong>:</h4>
<ul>
<li>提到了不同类型的变量(如 <code>char</code>、<code>int</code>、<code>short</code>等)及其对应的位宽和取值范围。</li>
<li>强调了正确选择变量类型以避免溢出错误的重要性。</li>
<li>使用宏定义简化代码中频繁出现的类型声明,例如用 <code>U8</code>代替 <code>unsigned char</code>。</li>
</ul>
<h4><strong>运算符</strong>:</h4>
<ul>
<li>讲解了基本的算术运算符(加、减、乘、除)、取余运算符(%),以及自增/自减运算符(++/--)。</li>
<li>演示了如何利用 <code>printf</code>打印表达式的计算结果,并解释了当想要显示百分号本身时需要连续输入两个百分号。</li>
</ul>
<h4><strong>关系运算符和逻辑运算符</strong>:</h4>
<ul>
<li>解释了关系运算符(==, !=, >, <, >=, <=)用于比较两个值是否相等或一个大于另一个。</li>
<li>介绍了逻辑运算符(&&, ||, !)以及它们在条件语句中的应用,如 <code>if</code>和 <code>else</code>结构来控制程序流。</li>
</ul>
<h4><strong>条件语句</strong>:</h4>
<ul>
<li>展示了如何使用 <code>if-else</code>结构根据条件执行不同的代码块,这在编写具有分支逻辑的程序时非常有用。</li>
<li></li>
</ul>
<h5><strong>代码学习:</strong></h5>
<pre><code>while(1)
{
if (bUsbOutReady) //如果接收到了数据
{
//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
if( X && Y ) //如果条件为真,输出什么
{
printf("条件为真\r\n");
}
</code></pre>
<p>// else<br />
// {<br />
// printf("条件为假\r\n");<br />
// }</p>
<p>// printf("X / Y = %u \r\n",(u16)(X/Y));</p>
<p>// printf("X %% Y = %u \r\n",(u16)(X%Y));</p>
<pre><code> usb_OUT_done(); //
}
</code></pre>
<p>// P40 = 0; //P40端口输出0V<br />
// P00 = 0; //P00端口输出0V<br />
// P02 = 0; //P02端口输出0V<br />
//P01 = 0; //P01端口输出0V<br />
//<br />
}</p>
fei2568 发表于 2024-12-9 07:40
写的挺好,实验箱拿到了吗
还没有呢,在学习中,拿到了和同学们汇报 ,大家一起努力学习!加油!! <p>哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前</p>