tanyl88 发表于 2024-12-5 17:43:57

学习《Ai8051U教学视频》发表七集 以上学习心得,送强大的 Ai8051U实验箱

学习《Ai8051U教学视频》发表七集 以上学习心得,送强大的 Ai8051U实验箱

tanyl88 发表于 2024-12-6 16:33:56

!(data/attachment/forum/202412/06/163044da2u2gsl6ndaivlu.png "image.png")


第一集 序言8051U深度入门到32位 51大型实战视频

哪怕梦想让我们拼的遍体麟伤,这次我们也要勇往直前;

Ai8051U,USB 型 1T 8051,支持32位和8位指令集, RMB2.3
管脚兼容天王级别的:  89C52RC,  12C5A60S2
要兼容 8位8051指令集,  可以用 Keil C51/IAR/SDCC 编译器
===就相当于更强大的 8H8K64U
要兼容 32位8051指令集,可以用 Keil C251 编译器,双核兼容设计
===就相当于更强大的 32G12K128, 32G8K64
34K SRAM(2K edata, 32K xdata), 64K Flash
TFPU@120MHz, 硬件浮点/硬件三角函数 运算器
DMA支持PWM, DMA支持外设直接到外设, P2P
120MHz-PWM支持硬件移相,16位PWM; 真12位ADC
USB, 4组串口,12位ADC, 轨到轨比较器
QSPI, SPI, I2S, I2C,  TFT-i8080/M6800 接口
PDIP40,LQFP44,LQFP48

STC的51单片机越来越强大了;进入Ai的阶段。

tanyl88 发表于 2024-12-6 16:56:07

!(data/attachment/forum/202412/06/163533qq2ho43ztvqthbx2.png "image.png")

第二集-Ai8051U视频教程硬件及工具介绍配套程序

Ai8051U 实验箱 使用说明: 一、Ai8051U实验箱外观;二、Ai8051U实验箱布局;三、下载程序到Ai8051U实验箱;四、新建 Keil 项目;五、使用 USB Link1D 仿真Ai8051U实验箱1、USB Link1D 工具连接方式。


案例:

AI8051U为主控芯片的程序P0口来演示跑马灯,输出低驱动。

下载时, 选择时钟 24MHZ (可自行修改频率).

******************************************/

#include "AI8051U.h"
#include "stdio.h"
#include "intrins.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define MAIN_Fosc      24000000UL

//==========================================================================

/*************本地常量声明    **************/

/*************IO口定义    **************/

/*************本地变量声明    **************/

/*************本地函数声明    **************/

voiddelay_ms(u8 ms);

/****************外部函数声明和外部变量声明 *****************/

/******************** 主函数 **************************/
void main(void)
{
P_SW2 |= 0x80; //扩展寄存器(XFR)访问使能

```
P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
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;   //设置为准双向口

P40 = 0;                //LED Power On

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
}
```

}

//========================================================================
// 函数: voiddelay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:

//========================================================================
voiddelay_ms(u8 ms)
{
u16 i;
do{
i = MAIN_Fosc / 10000;
while(--i);
}while(--ms);
}

Ai8051U功能强大,兼容性强。

tanyl88 发表于 2024-12-6 17:24:07

!(data/attachment/forum/202412/06/172102js7tt269o656i9i5.png "image.png")


第三集 点亮第一颗LED

哪怕梦想让我们拼的遍体麟伤,这次我们也要勇往直前

一、新建工程:

1、创建空工程(参考手册6.5章节)

2、添加头文件(利用ISP软件,结合手册6.4章节)

3、输入代码,并编译;


程序代码:

#include "ai8051u.h"                //调用头文件

void main(void)
{
P0M0 = 0;                //P0端口(P00-P07)为准双向口
P0M1 = 0;

```
P4M0 = 0;                //P4端口为准双向口
P4M1 = 0;

while(1)
{
        P40 = 0;        //P40端口输出0V
        P00 = 0;        //P00端口输出0V
        P01 = 0;        //P01端口输出0V
}
```

}

!(data/attachment/forum/202412/06/172317qzlkyv6fpitxjk1c.png "image.png")

重新深入学习强大的AI8051!

tanyl88 发表于 2024-12-8 00:34:28

<p><img src="data/attachment/forum/202412/08/002806pbqb8p680zlph1h8.png" alt="image.png" title="image.png" />AI051U深度入门到32位 51大型实战视频:第四集 AI051UUSB不停电下载</p>
<p>哪怕梦想让我们拼的遍体麟伤,这次我们也要勇往直前;</p>
<p>1.程序实验对比演示<br />
2.程序下载所需文件(STC官网-软件工具-库函数-USB库文件)<br />
3.程序移植关键部分到工程:<br />
3.1程序 添加头文件<br />
3.2 USB初始化函数(lib+.h库实现)<br />
3.3 命令参数<br />
3.4 打开P_SW2寄存器和IE2寄存器.</p>
<p>例程笔记:</p>
<p>#include &quot;ai8051u.h&quot;                        //调用头文件</p>
<p>#include &quot;stc32_stc8_usb.h&quot;                //调用头文件</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;</p>
<p>void main(void)<br />
{<br />
P_SW2 |= 0x80;                //B7位写1,使能访问XFR</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;                                                                                        //IE |= 0X80;

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

while(1)
{

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

        P40 = 0;        //P40端口输出0V
        P00 = 0;        //P00端口输出0V
        P02 = 0;        //P02端口输出0V
        //P01 = 0;        //P01端口输出0V
        //
}
</code></pre>
<p>}</p>
<p>AI051UUSB不停电下载还是比较实用的。</p>

tanyl88 发表于 2024-12-8 01:36:10

<p><img src="data/attachment/forum/202412/08/012641kmdije3x0caamd1x.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/012743f2tjk14jkffrykuj.png" alt="image.png" title="image.png" /></p>
<p>AI051U深度入门到32位 51大型实战视频:第五集C语言基础</p>
<p>一、摘要:</p>
<p>1.C语言 USB-CDC串口之printf函数的实现<br />
2.数的进制:2进制、10进制、16进制<br />
3.数据的基本类型<br />
4.C语言常用运算符</p>
<p>二、C语言 USB-CDC串口之printf函数的实现</p>
<p>1.打开USB库中的PRINTF_HID宏定义(去掉//)<br />
2.理解PRINTF的函数原型的定义<br />
#define printfprintf_hid<br />
int printf_hid (const char *fmt, ...);</p>
<p>参数fmt -- 是格式控制字符串,包含了两种类型的对象:普通字符和转换说明 。</p>
<p>普通字符:在输出时,普通字符将原样不动地复制到标准输出。<br />
printf(&quot;8051U深度入门到32位51大型实战视频\r\n&quot;);</p>
<p>转换说明:不直接输出,用于控制 printf 中参数的转换和打印。每个转换说明都由一个百分号字符(%)开始,以转换说明符结束,从而说明输出数据的类型、宽度、精度等。<br />
printf(&quot;8051U深度入门到32位51大型实战视频,%s\r\n&quot;,&quot;加油&quot;);</p>
<p>转换说明简介:<br />
1.类型:根据不同的 fmt 字符串,函数可能需要一系列的附加参数,每个<br />
参数包含了一个要被插入的值,替换了 fmt 参数中指定的每个 % 标签。<br />
关于附加参数,既可以是变量,也可以是常量。</p>
<p>2.位置:printf()函数的普通字符和转换说明放在&quot; &quot;双引号内,附加参数<br />
放在双引号外,每个附加参数之间用逗号隔开。</p>
<p>3.数量:printf() 的附加参数与转换说明符是⼀⼀对应关系,如果有 n 个转<br />
换说明符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的转<br />
换说明符,printf() 可能会输出内存中的任意值。</p>
<p><img src="data/attachment/forum/202412/08/013323obn8zkcbk1lc5zcb.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/013432dq2mmq8zz2mp77p5.png" alt="image.png" title="image.png" /></p>
<p>C语言基础极为重要,基础必须记熟。</p>

tanyl88 发表于 2024-12-8 10:58:09

<p><img src="data/attachment/forum/202412/08/104057g5sv6165ppvzh6em.png" alt="image.png" title="image.png" /></p>
<p>Ai8051U视频教程第六集-IO输入输出</p>
<p>一、GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。</p>
<p>单片机输出高电平就是输出VCC电压,输出低电平就是输出GND的电压;高电平就是指接近于电源正极电压的电平;也叫逻辑“1”;</p>
<p><img src="data/attachment/forum/202412/08/104632b1fa10w0wtm8ttyq.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/104700ajvvdugvwj0vjv7e.png" alt="image.png" title="image.png" /></p>
<p>二、按键抖动:</p>
<p><img src="data/attachment/forum/202412/08/105345tyngr7r8mzb78y16.png" alt="1.PNG" title="1.PNG" /></p>
<p>例程代码:</p>
<p>#include &quot;ai8051u.h&quot;                        //调用头文件</p>
<p>#include &quot;stc32_stc8_usb.h&quot;                //调用头文件<br />
#include &quot;intrins.h&quot;                        //d调用头文件</p>
<p>#define u8unsigned char                //8位无符号变量(0-255)<br />
#define u16 unsigned int                //16位无符号变量(0-65535)</p>
<p>u8 state = 0;                                        //初始状态</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;</p>
<p>void Delay20ms(void)        //@24.000MHzDelay20ms();<br />
{<br />
unsigned long edata i;</p>
<pre><code>_nop_();
_nop_();
i = 119998UL;
while (i) i--;
</code></pre>
<p>}</p>
<p>void main(void)<br />
{<br />
WTST = 0;                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快<br />
EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能<br />
CKCON = 0;                                                                                 //提高访问XRAM速度</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;                                                                                        //IE |= 0X80;

P40 = 0;

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

while(1)
{

    if (bUsbOutReady)                                                        //如果接收到了数据
    {
      //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
      
      usb_OUT_done();                                                        //
    }

</code></pre>
<p>//                //任务1:按下P32按钮灯亮,松开P32按钮灯灭;<br />
//                if( P32 == 0 )                                                                //判断P32按钮是否按下<br />
//                {<br />
//                        P00 = 0;<br />
//                }<br />
//                else<br />
//                {<br />
//                        P00 = 1;<br />
//                }<br />
//</p>
<p>//                //任务2:按下P32按钮灯灭,松开P32按钮灯亮;<br />
//                if( P32 == 1 )                                                                //判断P32按钮是否按下<br />
//                {<br />
//                        P00 = 0;<br />
//                }<br />
//                else<br />
//                {<br />
//                        P00 = 1;<br />
//                }</p>
<pre><code>        //任务3:按一下灯亮,按一下灯灭
        if( P32 == 0 )                                                                //判断P32按钮是否按下
        {
                Delay20ms();                                                        //延时20ms消抖
                if( P32 == 0 )
                {
                        state = !state;                                                //变量取反 0 1 0 1 0 1
                        P00 = state;
                        printf(&quot;state:%d\r\n&quot;,(int)state);
               
                        while( P32 == 0 );                                        //等待P32松开
               
                }
        }


}
</code></pre>
<p>}</p>
<p>这些都是硬件的基础,必须搞懂。</p>

tanyl88 发表于 2024-12-8 13:39:19

<p><img src="data/attachment/forum/202412/08/132645k66y41451po6dkqj.png" alt="image.png" title="image.png" /></p>
<p>AI051U深度入门到32位 51大型实战视频:第七集 AI051U定时器中断</p>
<p>哪怕梦想让我们拼的遍体麟伤,这次我们也要勇往直前!</p>
<p>一、1.定时器的介绍</p>
<p>定时器作用:<br/>
(1) 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作<br/>
(2) 替代长时间的Delay,提高程序的运行效率和处理速度(可以打断主循环)<br/>
2.定时器的应用</p>
<p>任务1:LED灯三秒取反一次,这期间任意时刻按下按钮,串口打印按键次数。</p>
<p><img src="data/attachment/forum/202412/08/133230kno9xxz4yli99skn.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/133243r9uzuiidskid4kqm.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/133319dqq41fj4majqgaga.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/133344zhm6mi4ttjjiurjt.png" alt="image.png" title="image.png" /></p>
<p>3.函数的定义、声明、调用</p>
<p><img src="data/attachment/forum/202412/08/133429b1i1tr1vfvrv6cvr.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/133752uyac5tsml0yyqcun.png" alt="22.PNG" title="22.PNG" /></p>
<p>老师讲得非常好,讲的易懂。</p>
<p>例程:</p>
<p>#include &#34;ai8051u.h&#34;                        //调用头文件<br/>
#include &#34;stc32_stc8_usb.h&#34;                //调用头文件<br/>
#include &#34;intrins.h&#34;                        //d调用头文件</p>
<p>#define u8unsigned char                //8位无符号变量(0-255)<br/>
#define u16 unsigned int                //16位无符号变量(0-65535)</p>
<p>u8 state = 0;                                        //初始状态<br/>
u8 Run_State = 0;                                //运行状态</p>
<p>char *USER_DEVICEDESC = NULL;<br/>
char *USER_PRODUCTDESC = NULL;<br/>
char *USER_STCISPCMD = &#34;@STCISP#&#34;;</p>
<p>void Delay20ms(void)        //@24.000MHzDelay20ms();<br/>
{<br/>
unsigned long edata i;</p>
<pre><code>_nop_();
_nop_();
i = 119998UL;
while (i) i--;
</code></pre>
<p>}<br/>
void Timer0_Init(void);                //3秒@24.000MHz                //函数声明</p>
<p>void main(void)<br/>
{<br/>
int count=1;                                                                        //按键计数变量</p>
<pre><code>WTST = 0;                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
CKCON = 0;                                                                                 //提高访问XRAM速度
<p><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;</code></p>
<p><code>usb_init();                                     //USB CDC 接口配置</code></p>
<p><code>IE2 |= 0x80;                                    //使能USB中断 </code></p>
<p>code</p>
<p><code>code</code></p>
<p><code>code</code></p>
<p><code>code</code></p>
<pre><code>code
</code></pre>
<p><code>code</code></p>
<p>code</p>
<p><code>code</code></p>
<p>code</p>

tanyl88 发表于 2024-12-8 20:25:28

<p><img src="data/attachment/forum/202412/08/190215j9zvpele7v962d7w.png" alt="image.png" title="image.png" /></p>
<p>AI051U深度入门到32位 51大型实战视频:第八集 AI051UUSB定时器周期性调度任务</p>
<p>哪怕梦想让我们拼的遍体麟伤,这次我们也要勇往直前!</p>
<p>一、</p>
<p>1.周期性任务介绍</p>
<p><img src="data/attachment/forum/202412/08/190623sle2ucez2u0rttcr.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/190706zaiknocvnc4ssna9.png" alt="image.png" title="image.png" /></p>
<p>2.文件的创建(.c和.h)</p>
<p><img src="data/attachment/forum/202412/08/192005nvubkv1alja1lab4.png" alt="image.png" title="image.png" /></p>
<p>3.结构体的介绍</p>
<p><img src="data/attachment/forum/202412/08/192526c7bq7bsaeab7jgp9.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/193358tx2dci2nz3vicxxg.png" alt="image.png" title="image.png" /></p>
<p>4.结构体数组的周期性任务调度</p>
<p><img src="data/attachment/forum/202412/08/201159jx0mdsmrogkqgixa.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/08/202422izxxahh9ss0xoso5.png" alt="image.png" title="image.png" /></p>
<p>例子:</p>
<p>include &quot;config.h&quot;<br />
#include &quot;task.h&quot;<br />
#include &quot;io.h&quot;</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;</p>
<p>void main(void)<br />
{<br />
Sys_init();                                                                                //系统初始化<br />
usb_init();                                     //USB CDC 接口配置</p>
<pre><code>IE2 |= 0x80;                                    //使能USB中断
Timer0_Init();                                                                        //定时器初始化
EA = 1;                                                                                        //IE |= 0X80;

P40 = 0;

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

while(1)
{

    if (bUsbOutReady)                                                        //如果接收到了数据
    {
      //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
       
      usb_OUT_done();                                                        //
    }
        Task_Pro_Handler_Callback();                                //执行功能函数

}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1                //1MS执行一次<br />
{</p>
<pre><code>Task_Marks_Handler_Callback();                                        //系统计时
</code></pre>
<p>}</p>
<p>讲的太好,继续学习</p>

tanyl88 发表于 2024-12-9 21:12:12

<p>AI051U深度入门到32位 51大型实战视频:第八集补充!</p>
<p>注:<br/>
第8集在7分23秒用ISP软件的定时器计算器生成定时时间的时候,<br/>
千万记得把使能定时器中断选项的勾勾给勾上!<br/>
千万记得把使能定时器中断选项的勾勾勾上!<br/>
千万记得把使能定时器中断选项的勾勾勾上!<br/>
常见错误:<br/>
1.关键词/变量函数名称的大小写错误或者漏了一个字符,P00写出p00,u8写成U8等等;<br/>
2.大括号缺了半个;(大括号上下一定要对齐,就不容易遗漏)<br/>
3.符号的中英文错误;<br/>
4.语句结尾没加分号;<br/>
5.变量/函数定义之后没有声明/重复定义;<br/>
6.#include在调用头文件时后面要先加一个空格,在+引号头文件名称</p>
页: [1] 2
查看完整版本: 学习《Ai8051U教学视频》发表七集 以上学习心得,送强大的 Ai8051U实验箱