djy876 发表于 2025-1-2 14:49:44

用擎天柱学习冲哥的8051U试验箱教程(一)——点亮LED灯|实验箱已寄出

<h1>前言</h1>
<ul>
<li>开始学习STC8051U单片机,由于没有试验箱一直停留在理论中没有前进,前几天佘经理(STC工作人员)说可以免费领取擎天柱用于学习,我就赶紧免费申请了一个。在此感谢一下STC官方考虑的如此周全,这样对我们刚入门的人特别友好,再感谢佘经理的大力支持。</li>
</ul>
<h1>学习前准备</h1>
<ul>
<li>开始之前首先要准备STC官方发布的“单片机在线升级编程调试平台软件(v6.09D),远程现场升级APP发布”软件(软件简称“车规”)。</li>
<li><img src="data/attachment/forum/202501/02/144643qhkhktl3k30ltkly.png" alt="图片1.png" title="图片1.png" /></li>
<li>首先根据芯片型号选择擎天柱的芯片,擎天柱芯片型号在开发版中间的小黑方框上如图擎天柱的芯片为AI8051U-34K64</li>
<li><img src="https://www.stcaimcu.com/data/attachment/forum/202501/02/144714lfyk1efnlz1c1cyl.png" alt="图片2.png" title="图片2.png" /></li>
<li>再选择端口,端口一般是自动选择的不需要手动。但是我的怎么会没有呢?我纠结了一会,问了问佘经理和狗哥,有两个方案,第一就是插上STC官方的烧录器就正常了,第二是在插上擎天柱前按住P32按钮然后再插上端口才能正常。</li>
</ul>
<h1>开始第三课学习</h1>
<ul>
<li>
<p>前期的准备工作准备完毕。开始第三课的代码学习及应用</p>
</li>
<li>
<p>新建工程:1、创建空工程;2、添加头文件;3、输入代码并编译。一共三个步骤是不是很简单?接着学吧!</p>
<ol>
<li>创建空工程根据AI8051U技术手册6.5章(第243页)教程创建,心得不在重复描述。</li>
</ol>
</li>
</ul>
<p>**需要注意的是AI8051U技术手册6.5章6.5.4~6.5.8的设置。**</p>
<ol start="2">
<li>添加头文件根据AI8051U技术手册6.4章(第241页)教程,这里需要注意的是include最好使用#include”文件名”这种格式,避免工程发给被人出现缺失头文件。</li>
<li>输入代码 首先我们需要一个main函数,然后配置IO口,IO口配置详见技术手册13.2章(第474页),根据冲哥的点亮第一个灯的教程怎么写代码都不能点亮擎天柱的灯,后来找原因发现擎天柱的端口与8051U实验箱的端口不一样,擎天柱没有P40的三极管控制端口和擎天柱的端口是P20控制而8051U试验箱端口是P0,根据冲哥的教程改了一下代码就可以正常写入并点亮灯。代码如下:</li>
</ol>
<p>````</p>
<pre><code>   #include &quot;ai8051u.h&quot;                //调用头文件

    //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可

    void main(void)

      {

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

            P2M1 = 0;


            while(1)

            {

                P20 = 0;        //P20端口输出0V

                P21 = 0;        //P21端口输出0V

            }

      }
</code></pre>
<h1>结束语</h1>
<ul>
<li>好了点灯完成,理论与实操还是存在很多问题的,不做一个眼高手低的人,多实践吧同学!!</li>
<li>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=78735"></video>
</li>
</ul>

djy876 发表于 2025-1-3 16:09:22

<h1>用擎天柱学习冲哥的8051U试验箱教程(二)——USB不停电下载</h1>
<h2>前言</h2>
<ul>
<li>是不是每次下载都要按一遍P32按钮?如果已经加外壳了是不是就麻烦的很了?别慌!STC给出了解决方案——USB不停电下载</li>
</ul>
<h2>了解USB不停电下载</h2>
<ul>
<li>在了解USB不停电下载前首先要了解一下8051U的USB中断的应用原理,详见下图:<br />
<img src="data/attachment/forum/202501/03/160257pviqte63slsvzwxy.png" alt="微信截图_20250103134148.png" title="微信截图_20250103134148.png" /></li>
<li></li>
</ul>
<p>如果想让USB中断工作首选要关闭EUSB然后再打开EA(总中断开关)才能正常工作。首先我们现在代码中增加EUSB = 1(关闭EUSB中断开关)然后EA = 0 (关闭总中断开关)。</p>
<ul>
<li>解决的USB中断优先问题,我们再解决中断是放到程序中强制执行还是等程序运行结束后执行,这里就用到了查询命令(查询命令是运行结束后执行)或者是中断命令(插入是强制中断)。所以我们需要把stc_usb_cdc_32.LIB库文件给放进来,用stc_usb_cdc_32.LIB还需要用到stc32_stc8_usb.h头文件,两个文件一起放到文件中。</li>
<li>好了基本算设置好了,我们还需要用USB之前最好把USB给初始化,这里给代码添加一句usb_init();</li>
<li>最后重点来了,不想每次下载都按按钮需要对芯片的寄存器中添加一句口令,让ISP识别到,例如口令:天龙盖地虎,回令:小鸡炖蘑菇。哈哈没这么简单!ISP已经给我预设值了口令@STCISP#,如图:<br />
<img src="data/attachment/forum/202501/03/160605yafm4w0n7bbxm1h4.png" alt="微信图片_20250103143926.png" title="微信图片_20250103143926.png" /></li>
</ul>
<p>所以我们先打开寄存器把口令@STCISP#输入进去。根据8051U技术手册4.1.2章(第205页)打开需要用P-SW2寄存器的EAXFR后输入口令@STCISP#。具体详见下面代码:</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()
{
//P_SW2 |= 0x80;
EAXFR = 1;
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 接口配置

EA = 1;
//IE2 |= 0x80;
EUSB = 1;

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

while (1)
{
    if (bUsbOutReady)
    {
      USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

      usb_OUT_done();
    }

        P20 = 0;        //P20端口输出0V
        P21 = 0;        //P21端口输出0V
        P22 = 0;
        P23 = 0;        //P23端口输出0V
        P24 = 1;
        P25 = 0;
        P26 = 0;
}
</code></pre>

djy876 发表于 2025-1-6 17:34:53

<h1>用擎天柱学习冲哥的8051U试验箱教程(三)——C语言基础</h1>
<h2>前言</h2>
<p>-不得不说冲哥还是有先见之名的^v^ ,准备正式进入讲解前先把C语言基础在给巩固一下。好了我们开始学习吧!</p>
<h2>基础</h2>
<p>1、 USB-CDC串口之Printf函数,这个函数是一个代码调试的时候最好用的函数,如果没这个函数调试的时候就去吐血吧!!!,用函数前需要先在stc32_stc8_usb.h头文件中#define PRINTF_HID 前(代码第6行)去掉//</p>
<p>2、 #define为自定义函数名,例如#define YX意识是用define函数,下面代码中凡是出现X的地方都可以用Y代替。</p>
<p>3、 数的进制:2进制、10进制、16进制 ,细节满满文字不好表达一切都在脑子中吧!</p>
<p>4、 数据的基础类型:细节满满文字不好表达一切都在脑子中吧!需要注意的是前面是否加UN,如果有就是正数型</p>
<p>5、 C语言的常用运算符</p>
<ul>
<li>
<p>算数运算符:+、-、*、/、%、++、-</p>
</li>
<li>
<p>关系运算符:==、!=、&gt;、&lt;、&gt;=、&lt;=</p>
</li>
<li>
<p>逻辑运算符:&amp;&amp;、II、!</p>
</li>
<li>
<p>赋值运算符:=、+=、-=、*=、/=、%=、&lt;&lt;=、&gt;&gt;=、&amp;=、^=、I=</p>
</li>
<li>
<p>按位运算符:&amp;、I、^、-、&lt;&lt;、&gt;&gt;</p>
</li>
</ul>
<h2>总结</h2>
<p>-运算符很烧脑,但是又少不了</p>

djy876 发表于 2025-1-7 21:49:46

<h1>用擎天柱学习冲哥的8051U试验箱教程(四)——I/o输出输入(第六集)</h1>
<h2>前言</h2>
<p>什么是GPIO?GPIO通用为输入输出端口,简称引脚。引脚状态只有高电平(1)和低电平(0)。</p>
<h2>学习</h2>
<ul>
<li>引脚的工作模式一共有四种模式,准双向口、推挽输出、高阻输出和开漏输出</li>
<li>直流特性,按VDD3.3V来说,如果开启施密特触发最高电压为1.18V,最低电压0.99v</li>
<li>任务1:按下P32按钮灯亮,松开按钮灯灭</li>
</ul>
<p>//=========================================================================//</p>
<pre><code>        //任务一、按下P32按钮灯亮,松开按钮灯灭


        if (P32==0)                        //检测按钮是否按下

        {

          P21 = 0;        //P20端口输出0V

        }

        else

        {

                P21 = 1;

        }
</code></pre>
<p>//=========================================================================//</p>
<ul>
<li>任务二:按下P32按钮灯灭,松开按钮灯亮(把P32==0改为==1就行了)</li>
</ul>
<p>//=========================================================================//</p>
<pre><code>        //任务二、按下P32按钮灯灭,松开按钮灯亮


        if (P32==1)                        //检测按钮是否按下

        {

          P21 = 0;        //P20端口输出0V

        }

        else

        {

                P21 = 1;

        }
</code></pre>
<p>//=========================================================================//</p>
<ul>
<li>任务三:按一下灯亮,按一下灯灭。</li>
</ul>
<p>任务三相对来说比较复杂一点,首先是需要让电平高低转换,第二防止抖动,还要添加延时。</p>
<p>//=========================================================================//</p>
<pre><code>        //任务三、按一下灯亮,按一下灯灭。




        if (P32==0)                        //检测按钮是否按下

        {

                Delay20us();

                if (P32==0)

       

                        state=!state;

                        P21 = state;        //P20端口输出0V

                        printf(&quot;state:%d\\r\\n&quot;,(int)state);

                while (P32==0);

        }
</code></pre>
<p>//=========================================================================//</p>
<ul>
<li>
<p>课后任务1:按一下P32按钮灯亮,按一下P33安灯灯灭</p>
<pre><code>//=========================================================================//

//课后任务1:按一下P32按钮灯亮,按一下P33安灯灯灭




if (P32==0)                        //检测按钮是否按下

{

        Delay20us();

        if (P32==0)

                P21 = 0;        //P20端口输出0V

        while (P32==0);

}


if (P33==0)                        //检测按钮是否按下

{

        Delay20us();

        if (P33==0)

                P21 = 1;        //P20端口输出0V

        while (P33==0);

}
</code></pre>
</li>
</ul>
<p>//=========================================================================//</p>
<ul>
<li>课后任务2:按一下亮一课灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法),这个有点复杂,需要想想怎做比较好!</li>
</ul>

djy876 发表于 2025-1-8 16:18:08

<h1>用擎天柱学习冲哥的8051U试验箱教程(五)——定时器中断(第七集)</h1>
<h2>前言</h2>
<p>什么是定时器中断?在单片机编程中,定时器中断是一种重要的中断类型,它允许程序在特定时间间隔执行特定任务。51单片机定时器模式为24位,时钟为T1和T12,它们可以通过寄存器配置来实现定时功能。</p>
<h2>学习</h2>
<h4><strong>-</strong> 定时器中断的意义</h4>
<p>最初学习定时器时,我遇到一个问题:如何让LED每三秒闪烁一次,同时还能响应按键操作?起初,我采用了简单的Delay方式来实现LED闪烁。然而,这种方法有一个很大的缺点,即程序在延时过程中处于“忙等待”状态,导致系统无法响应按键操作。后来我了解到,这正是单片机单核特性的限制。在这种情况下,引入定时器中断便成为了最佳解决方案。</p>
<p>定时器中断的最大优势在于,它能在固定时间内触发一个中断,打断主程序执行其他任务。这样,主程序可以在等待的同时,处理其他任务,大大提升了系统的响应速度和多任务能力。</p>
<h4><strong>-</strong> <strong>定时器的配置和使用</strong></h4>
<p>学习定时器配置时,我发现一个非常实用的工具:ISP软件中的定时器计算器。通过它可以快速计算出定时器的初值,大大简化了参数配置过程。</p>
<h5><strong>配置流程总结:</strong></h5>
<p>1、确定系统时钟频率,这是计算定时器参数的基础。</p>
<p>2、选择定时器模式,8051提供四种定时器模式,通常选择Mode 1(16位自动重载)。</p>
<p>3、计算初值,根据系统需求计算出TH和TL寄存器的初始值,确保定时器在规定时间内溢出</p>
<p>4、使能中断,开启ET0和EA位,确保定时器溢出时触发中断。</p>
<p>5、编写中断服务函数,在中断函数中加入LED翻转或其他任务的逻辑。</p>
<p>6、通过这些步骤,我成功编写了一个定时器驱动LED闪烁的程序,也进一步加深了对寄存器配置和中断服务函数的理解。</p>
<h4><strong>-</strong> <strong>Keil乱码问题的解决</strong></h4>
<p>在编码过程中,我也遇到了一个小插曲:在Keil中打印汉字时,控制台输出乱码。通过查资料发现,可以通过在字符串中加入“\xFD”编码,或修改Keil的二进制文件来解决。最终我选择了直接在字符串中添加**\xFD**的方法,更加简单且稳定。</p>
<p>示例:</p>
<p>printf(&quot;数ý\xfd学&quot;);  // 显示“数学”<br />
<img src="data/attachment/forum/202501/08/161800k0f3ygm0e96p8zjf.png" alt="image.png" title="image.png" /></p>
<h1><strong>##</strong> <strong>结束语</strong></h1>
<p>中断有点烧脑,配置相对复杂但是有挑战性,我会以往的克服艰难学习。</p>

djy876 发表于 2025-1-13 10:52:17

<h1>更新到第七集了——实验箱到了</h1>
<p>学习到了第七集了马上要学习数码管了,但是擎天柱不具备数码管,所以就向SCT厂家佘经理申请了试验箱,厂家很爽快的帮我申请了,在此感谢佘经理,仅两天就收到实验箱的还是顺丰快递,为STC的服务点赞。贴出收到的实验箱。</p>
<p><img src="data/attachment/forum/202501/13/105103feag9hl4kug68bh7.jpg" alt="7500095b7bd17d80a394b5726bed5e1.jpg" title="7500095b7bd17d80a394b5726bed5e1.jpg" /></p>
<p><img src="data/attachment/forum/202501/13/105107xe926jqwi33g6p9g.jpg" alt="9869e9edf0443a369a4f363fbb90281.jpg" title="9869e9edf0443a369a4f363fbb90281.jpg" /></p>
<p><img src="data/attachment/forum/202501/13/105110dlk9bt9tqi0r3ocd.jpg" alt="94ef5474ed70cbe2df7b63e866be040.jpg" title="94ef5474ed70cbe2df7b63e866be040.jpg" /></p>
<p><img src="data/attachment/forum/202501/13/105112ekj78d4dhnjhkmah.jpg" alt="a1c6d4c0387f9bc92c4b492c504207a.jpg" title="a1c6d4c0387f9bc92c4b492c504207a.jpg" /></p>
页: [1]
查看完整版本: 用擎天柱学习冲哥的8051U试验箱教程(一)——点亮LED灯|实验箱已寄出