liwenjun 发表于 2025-1-18 08:24:40

学习打卡 - Ai8051U深度入门

<h2>通过擎天柱核心板学习Ai8051U视频的记录和体会</h2>
<p>近期正在学习51单片机,已初步看完了内部结构。打算作些仿真实验,上网找datasheet,来到了本站。</p>
<p>有些年头没接触51单片机了,没想到近几年来,STC的51系列单片机发展如此神速,性能和功能扩展可谓有翻天覆地的提升。</p>
<p>感谢唐经理赠送的擎天柱核心板。</p>
<p><img src="data/attachment/forum/202501/23/160503qkaw6hxajdjtx681.png" alt="qtz.png" title="qtz.png" /></p>
<p>以下记录我通过这块核心板学习Ai8051U的过程和体会</p>
<ul>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第一集 序言</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第二集 硬件及工具介绍</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第三集 点亮第一个LED</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第四集 USB不停电下载</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第五集 C语言基础</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第六集 IO输入输出</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第七集 定时器和中断</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第八集 定时器周期性调用任务</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第九集 数码管</li>
<li class="vditor-task vditor-task--done"><input checked="" disabled="" type="checkbox" /> 第十集 虚拟键盘Led和数码管</li>
<li class="vditor-task"><input disabled="" type="checkbox" /> 第十一集 矩阵按键</li>
<li class="vditor-task"><input disabled="" type="checkbox" /> 第十二集 复位系统</li>
<li class="vditor-task"><input disabled="" type="checkbox" /> 第十三集 外部中断</li>
<li class="vditor-task"><input disabled="" type="checkbox" /> 第十四集 IO中断</li>
<li class="vditor-task"><input disabled="" type="checkbox" /> 第十五集</li>
<li class="vditor-task"><input disabled="" type="checkbox" /> ...</li>
</ul>

liwenjun 发表于 2025-1-18 10:20:47

<h2>第一集 序言</h2>
<p>终于看完了第一集,给我的感觉是<strong>震撼</strong>,完全<strong>颠覆</strong>了我对传统8051单片机的认知。</p>
<p>视频中介绍了AI8051u<strong>突出</strong>的6个特点:</p>
<pre><code>屏幕显示和视频播放(flash编程器)
IIS录放音
PWM_DMA
频谱分析仪(上位机)
手写计算器
QSPI,PWM移相,硬件乘除,单精度浮点
</code></pre>
<p>并通过视频<strong>真实</strong>展现!</p>
<p>另外还介绍了一些硬件参数和指标,目前我还不是太了解。</p>
<p><img src="data/attachment/forum/202501/18/101834ycf1funcub1mc1ub.png" alt="ch01-001.png" title="ch01-001.png" /></p>
<p>相信通过<strong>继续学习</strong>,应该能掌握。</p>
<p>以上,是本集的学习总结。</p>

liwenjun 发表于 2025-1-18 11:16:43

<h2>第二集 硬件及工具介绍</h2>
<p>看完本集,主要是Ai8051U实验箱硬件部分的介绍。</p>
<p>实验箱的硬件配置非常丰富,做工也非常精巧:</p>
<p><img src="data/attachment/forum/202501/18/111541aggm2g1ovmff2ggg.png" alt="ch02-001.png" title="ch02-001.png" /></p>
<p><img src="data/attachment/forum/202501/18/111550me0z720akciv77ka.png" alt="ch02-002.png" title="ch02-002.png" /></p>
<p>开发工具是 <code>keil C251</code>,这个需要重新学习,之前用的是 <code>keil C51</code>。</p>
<p>以上,是第二集的学习总结。</p>

liwenjun 发表于 2025-1-18 12:20:14

<h2>第三集 点亮第一个LED</h2>
<p>根据上一集的介绍安装开发环境:</p>
<ul>
<li>keil C251,</li>
<li>AIapp-ISP-v6.95E,当前已是v6.95E版本了!</li>
</ul>
<p>编译如下实验C代码:</p>
<pre><code class="language-c">#include &quot;ai8051u.h&quot;

void main(void)
{
        P2M0 = 0;                //P2端口(P20-P27)为准双向口
        P2M1 = 0;

        while(1)
        {
                P20 = 0;        //P20端口输出0V
                P21 = 0;        //P21端口输出0V
        }
}
</code></pre>
<p>F7顺利编译通过。</p>
<p>下载程序时有些周折。我用的Win7未发现串口。后按P3.2+Power按键,连接成功。</p>
<p><img src="data/attachment/forum/202501/23/172605lr4hrehsgn9q4g9z.png" alt="ch03-001.png" title="ch03-001.png" /></p>
<p>运行效果如下:</p>
<p><img src="data/attachment/forum/202501/23/161505aizr57od3r483w9w.png" alt="qtz01.png" title="qtz01.png" /></p>
<p>以上是第三集的学习总结。</p>

liwenjun 发表于 2025-1-18 12:33:21

<h2>第四集 USB不停电下载</h2>
<p>查资料才明白:USB-HID和USB-CDC的概念。</p>
<p><strong>USB-HID</strong>(Human Interface Device)是一种人机交互设备,通常用于连接键盘、鼠标、游戏控制器等外设。</p>
<p><strong>USB-CDC</strong>(Communication Device Class)是一种通信设备类,用于模拟提供虚拟 COM 端口 UART 接口的串行端口。</p>
<p>STC单片机U后缀的代表都有USB接口。</p>
<p>推荐使用 USB-CDC 模式。</p>
<p><img src="data/attachment/forum/202501/20/124912uxtlxpk3k3k83opk.png" alt="ch04-001.PNG" title="ch04-001.PNG" /></p>
<p>上代码</p>
<pre><code>#include &quot;ai8051u.h&quot;                        //调用头文件
#include &quot;stc32_stc8_usb.h&quot;                //调用头文件

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = &quot;@STCISP#&quot;;

void main(void)
{
    P_SW2 |= 0x80;                //B7位写1,使能访问XFR

    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;                                        //IE |= 0X80;

        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置

        while(1)
        {
       
      if (bUsbOutReady)
      {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)         
            usb_OUT_done();
      }
       
                P20 = 0;                                        //P00端口输出0V
                P22 = 0;                                        //P02端口输出0V        }
}
</code></pre>
<p>看看isp串口的变化</p>
<p><img src="data/attachment/forum/202501/23/181121tcmmu8ydiumvhzkd.png" alt="ch04-002.png" title="ch04-002.png" /></p>
<p>以上是第四集的学习体会。</p>

liwenjun 发表于 2025-1-20 12:51:02

<h2>第五集 C语言基础</h2>
<p>较之汇编,C语言对人类阅读更加友好,同时也兼顾了性能,可直接操作底层硬件。</p>
<p>本集讲解了通过重定向USB-CDC串口之printf函数,替代的标准库中的实现,可为后续的开发调试提供定制。</p>
<p><img src="data/attachment/forum/202501/20/131226kj16u9znvdb902mu.png" alt="ch05-001.PNG" title="ch05-001.PNG" /></p>
<p>代码</p>
<pre><code class="language-C">#define PRINTF_HID            //printf输出直接重定向到USB HID接口

int printf_hid (const char *fmt, ...);

#if defined PRINTF_SEGLED
#define printfSEG7_ShowString
#elif defined PRINTF_HID
#define printfprintf_hid        //#define替换名被替换名
#endif
</code></pre>
<p>演示代码</p>
<pre><code class="language-C">#include &quot;ai8051u.h&quot;                        //调用头文件
#include &quot;stc32_stc8_usb.h&quot;                //调用头文件
...
void main(void)
{
...
        while(1)
        {

      if (bUsbOutReady)                                                        //如果接收到了数据
      {
                        if( X &amp;&amp; Y )        //如果条件为真,输出什么
                        {
                                printf(&quot;条件为真\r\n&quot;);
                        }

            usb_OUT_done();                                                        //
      }
      }
}
</code></pre>
<p>运行效果</p>
<p><img src="data/attachment/forum/202501/23/183953gp6b5jhpzbw5zpys.png" alt="ch05-002.png" title="ch05-002.png" /></p>
<p>后面讲到的数据的基本类型、数的进制、C语言常用运算符等内容。与标准C无差异。</p>
<p>以上是本集的学习体会。</p>

liwenjun 发表于 2025-1-20 13:30:54

<h2>第六集 IO输入输出</h2>
<p>从这一集开始终于进入实操了。</p>
<p>Ai8051U 提供了多达 P0 ~ P7 共8组IO端口,比我之前所了解的 P0 ~ P3 足足多了一倍。</p>
<p><img src="data/attachment/forum/202501/20/132413a08dpaudh75d8ch0.png" alt="ch06-001.PNG" title="ch06-001.PNG" /></p>
<p>GPIO 在准双向模式下,灌电流可达20mA,驱动能力足够强劲!</p>
<p>通过读取端口电平,高电平对应逻辑1,低电平对应逻辑0,可以判断示例中的按键状态。</p>
<p><img src="data/attachment/forum/202501/20/132938yjcia39jlad4r4a6.png" alt="ch06-002.PNG" title="ch06-002.PNG" /></p>
<p>在实际应用的,还需要对物理按键进行去抖动处理,提高实用性。</p>
<p><img src="data/attachment/forum/202501/20/133029rd2saw7fdtzm55tm.png" alt="ch06-003.PNG" title="ch06-003.PNG" /></p>
<p>范例代码</p>
<pre><code class="language-C">//任务3:按一下灯亮,按一下灯灭
    if( P32 == 0 )
        {
                Delay20ms();                                                        //延时20ms消抖
                if( P32 == 0 )
                {
                        state = !state;                                                //变量取反 0 1 0 1 0 1
                        P20 = state;
                        printf(&quot;state:%d\r\n&quot;,(int)state);
                       
                        while( P32 == 0 );                                        //等待P32松开
                }
        }
</code></pre>
<p>运行效果</p>
<p><img src="data/attachment/forum/202501/23/190628cnd9xbq0p0fjfbfq.png" alt="ch06-003.png" title="ch06-003.png" /></p>
<p>以上是第六集的学习体会。</p>

liwenjun 发表于 2025-1-20 17:48:47

<h2>第七集 定时器和中断</h2>
<p>本集开始学习51单片机内部最重要的功能之一:定时器。</p>
<p>在实际应用中,经常会碰到需要延时的应用,如时钟等。如果采用软件延时(也就是让单片机执行空指令,消耗一定时钟周期来等待)的话,将增加CPU开销,降低CPU的工作效率,并会使其他操作响应延缓。这时,片内定时器就能发挥作用了。</p>
<p>翻阅数据手册,可知 Ai8051U 片内有6个定时器。</p>
<p><img src="data/attachment/forum/202501/20/174752gsxwoss8tzlx2ljh.png" alt="ch07-001.PNG" title="ch07-001.PNG" /></p>
<p>定时器的本质就是从设定值数到溢出之后置位一次标志位,如果使能ET0就可以进入中断!</p>
<p>片内定时器可实现精准的定时,这里涉及到时时长的计算,见下图:</p>
<p><img src="data/attachment/forum/202501/20/175823fvgmctrjcyt73x8d.png" alt="ch07-002.PNG" title="ch07-002.PNG" /></p>
<p>范例代码</p>
<pre><code class="language-C">if( P32 == 0 )                                                                //判断P32按钮是否按下
        {
                Delay20ms();                                                        //延时20ms消抖
                if( P32 == 0 )
                {
                        Run_State = !Run_State;                                //运行状态取反
                        if( Run_State==1 )                                        //运行
                        {
                                Timer0_Init();
                        }
                        else
                        {
                                TR0 = 0;                                                //关闭定时器
                                P20 = 1;
                                P21 = 1;
                        }
                        while( P32 == 0 );                                        //等待P32松开
                }
        }

}
</code></pre>
<p>运行效果</p>
<p><img src="data/attachment/forum/202501/23/191709lb5e47555g7iuo5u.gif" alt="ch07-001.gif" title="ch07-001.gif" /></p>
<p>以上是本集的学习体会。</p>

liwenjun 发表于 2025-1-20 19:50:37

<h2>第八集 定时器周期性调用任务</h2>
<p>这一讲干货满满!将定时器周期性任务调度讲得非常透彻。</p>
<p><img src="data/attachment/forum/202501/20/194317tm61newaa5b3ba1s.png" alt="ch08-001.PNG" title="ch08-001.PNG" /></p>
<p>随着任务复杂性提高,代码量快速增长。本章还示范给出了如何合理组织代码的宝贵经验。</p>
<p>之前的演示,所有代码都放在一个文件中。本集讲解的任务比较复杂,如果还是在一个文件中写所有代码,逻辑就不够清晰了。重新组织代码如下</p>
<pre><code>main.c
|-&gt; io.c
|-&gt; task.c
|-&gt; config.c
</code></pre>
<p><img src="data/attachment/forum/202501/23/195407w093980gc09pmc65.png" alt="Calls-main-c.png" title="Calls-main-c.png" /></p>
<p>定时器部分的代码与上一集区别不大,主要是任务更加复杂多样了。</p>
<p>运行效果</p>
<p><img src="data/attachment/forum/202501/23/192439x1dniyi50i0v40l0.gif" alt="ch08-001.gif" title="ch08-001.gif" /></p>
<p>以上是本集的学习心得。</p>

liwenjun 发表于 2025-1-21 11:23:04

<h2>第九集 数码管</h2>
<p>数码管是常用的显示输出方式,特别是在工业仪表方面。</p>
<p>多位数码管最常采用动态显示方式。</p>
<p><img src="data/attachment/forum/202501/21/112038fvle5mzyyexm65me.png" alt="ch09-001.PNG" title="ch09-001.PNG" /></p>
<p>在本集中,对数码管的进行了全面的讲解。</p>
<p>开发工具还提供了虚拟显示功能,太棒了!使用擎天柱核心板也可以显示字符了,方便调试和学习了。</p>
<p>受擎天柱核心板限制,无板载数码管。使用虚拟显示,也可显示数码了!</p>
<p>运行效果</p>
<p><img src="data/attachment/forum/202501/23/205410ypen84zrqig8ebdb.gif" alt="ch09-001.gif" title="ch09-001.gif" /></p>
<p>以上是本集的学习心得。</p>
页: [1] 2
查看完整版本: 学习打卡 - Ai8051U深度入门