找回密码
 立即注册
查看: 52|回复: 18

学习《Ai8051U教学视频》第一集 序言

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 2025-9-29 15:14:47 | 显示全部楼层 |阅读模式
演示案例:
1、屏幕显示图片视频,8080串口,
2、I2S录放音,频率36.864MHz,
3、PWM_DMA,主频40MHz,WS2812点阵屏显示时钟,不过没有校准-。-,可以实现1000+颗2812灯显示,不会干扰,
4、频谱分析仪,需要FFT绘图功能,用到I2S录放音功能
5、手写计算器。
比以前的STC89C52强太多了,主频都快赶上STM32C8T6。

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-09-30 11:14:42

16

主题

131

回帖

1148

积分

版主

积分
1148
发表于 7 天前 | 显示全部楼层
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 5 天前 | 显示全部楼层

《Ai8051U教学视频》第二集 硬件及工具介绍

硬件介绍

Ai8051U实验箱
截图202510021129134076.jpg
硬件介绍
正面
截图202510021130238434.jpg
反面

硬件介绍_2

硬件介绍_2

软件和工具
1安装Keil编程软件
2下载ISP软件
3添加头文件
4下载插件
5下载代码包和手册
下载第一个程序(记得选对RC时钟频率)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 5 天前 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 5 天前 | 显示全部楼层

《Ai8051U教学视频》第三集-点亮第一个LED配套程序

新建工程

1创建空工程
2添加头文件
3输入如下代码,并编译
#include "ai8051u.h"
void main(void){
    while(1){
    }
}
点亮第一个LED

#include "ai8051u.h"
void main(void){
    P0M1 = 0x00;
    P0M0 = 0x00;
    P4M1 = 0x00;
    P4M0 = 0x00;

    P40 = 0;
    while(1){
        P00 = 0;
    }
}


截图202510021605223624.jpg
截图202510021605435295.jpg
回复

使用道具 举报 送花

3

主题

1920

回帖

688

积分

等待验证会员

积分
688
发表于 5 天前 | 显示全部楼层
《Ai8051U教学视频》第三集配套程序解析 —— 新建工程与点亮第一个LED

在本集中,我们学习了如何使用Ai8051U开发平台进行基础工程的创建,并完成了第一个LED点亮的程序编写与编译。本文将对整个流程进行详细解析,帮助初学者更好地理解代码逻辑与硬件控制机制。

一、创建空工程

在进行任何嵌入式开发之前,首先需要创建一个工程框架。在Ai8051U开发环境中,创建空工程是第一步。该步骤的主要目的是为后续的代码编写、编译和烧录建立一个结构清晰的项目环境。通常包括设置工程名称、选择目标芯片型号、配置编译器参数等操作。

二、添加头文件

在嵌入式C语言开发中,头文件(.h文件)扮演着非常重要的角色,它通常包含芯片寄存器定义、函数声明、宏定义等内容。对于Ai8051U系列芯片,"ai8051uh.h"是其标准头文件,包含了所有与硬件相关的寄存器映射和初始化配置信息。添加该头文件后,我们就可以在代码中直接使用芯片的寄存器和相关功能。

三、基础代码结构与编译

初始代码如下:

include "ai8051uh.h"

void main(void){
    while(1){
    }
}

这段代码是嵌入式程序的最基本结构。main函数是程序的入口点,while(1)表示一个无限循环,用于保持程序持续运行。此时程序并未实现任何功能,仅用于验证工程是否能够成功编译。

四、点亮第一个LED

在完成基本工程搭建后,我们进入了本集的核心内容:点亮第一个LED。LED的控制本质上是通过改变GPIO(通用输入输出)引脚的电平状态来实现的。在Ai8051U中,我们通过配置端口模式寄存器(PnM1和PnM0)来设置引脚为输出模式,然后通过设置引脚电平(高或低)来控制LED的亮灭。

完整代码如下:

include "ai8051uh.h"

void main(void){
    P0M1 = 0x00;
    P0M0 = 0x00;
    P4M1 = 0x00;
    P4M0 = 0x00;

    P40 = 0;
    while(1){
        P00 = 0;
    }
}

代码解析:

1. 端口模式配置:
P0M1 = 0x00;  
P0M0 = 0x00;  
P4M1 = 0x00;  
P4M0 = 0x00;

Ai8051U的每个I/O端口都具有多种工作模式,包括高阻输入、推挽输出、开漏输出等。通过设置PnM1和PnM0寄存器可以配置对应端口的工作模式。此处将P0和P4端口的模式寄存器均设置为0x00,表示将这些端口设置为标准推挽输出模式,适用于驱动LED等负载。

2. LED控制逻辑:
P40 = 0;

此行代码用于设置P4.0引脚为低电平。在部分开发板设计中,LED的一端接电源,另一端连接到单片机IO口,此时将IO口置低电平即可点亮LED(共阳极接法)。此行代码可能是为了初始化某个特定功能或复位某个外设,具体需结合硬件原理图确认。
while(1){ P00 = 0; }

主循环中持续将P0.0引脚置为低电平,从而点亮连接在P0.0上的LED。由于循环是无限的,LED将持续保持点亮状态。

五、总结与建议

本集内容通过实践的方式引导初学者完成从工程创建到硬件控制的全过程,是嵌入式开发入门的重要一步。建议在实践过程中注意以下几点:

1. 硬件连接确认:确保LED的接法与代码逻辑一致,例如共阳极或共阴极接法,否则可能导致LED无法点亮。
2. 引脚复用功能:部分引脚可能具有复用功能(如ADC、PWM等),在使用前应确认引脚未被其他功能占用。
3. 编译与烧录:使用Ai8051U配套的开发工具完成编译、链接与烧录操作,确保程序正确下载到芯片中。
4. 调试建议:可使用示波器或逻辑分析仪观察引脚电平变化,辅助排查问题。

后续我们将继续深入讲解GPIO的更多功能、中断机制、定时器使用等内容,敬请期待!

—— 国芯人工智能 教学支持团队

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 4 天前 | 显示全部楼层

《Ai8051U教学视频》第四集 USB不停电下载配套程序

USB不停电下载

1实验对比演示
2下载所需文件(USB库文件)
3移植关键部分到工程
3.1添加头文件
3.2USB初始化函数(stc_usb_cdc_32.lib+stc32_stc8_usb.h库实现)
3.3命令参数
3.4打卡P_SW2寄存器和IE2寄存器
移植关键部分到工程

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


char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

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();
        }
               
                P40 = 0;        //P40端口输出0V
                P00 = 0;        //P00端口输出0V
                P02 = 0;        //P02端口输出0V
                //P01 = 0;        //P01端口输出0V
                //
        }
}

回复

使用道具 举报 送花

3

主题

1920

回帖

688

积分

等待验证会员

积分
688
发表于 4 天前 | 显示全部楼层
大家好,欢迎继续关注《Ai8051U教学视频》系列内容。本集我们将重点讲解“USB不停电下载配套程序”的实现方法,包括实验演示、所需文件、以及代码移植的关键步骤。

一、实验对比演示

在开始讲解之前,我们先通过一个实验对比来说明“USB不停电下载”的意义。

传统方式中,单片机在下载程序时需要断电重启,以触发下载模式。这种方式虽然简单,但在某些应用场景中(如工业控制、智能仪表等)并不友好,尤其是在设备运行过程中需要远程更新程序时,断电下载会导致系统中断、数据丢失等问题。

而“USB不停电下载”则可以在不中断主程序运行的情况下,通过USB接口实现程序更新。它依赖于USB主机与设备之间的协议通信,以及单片机内部的ISP(在系统编程)机制。

本实验中,我们通过一个简单的LED闪烁程序,演示在不中断LED运行的情况下,通过USB进行程序更新,验证了“不停电下载”的可行性与稳定性。

二、下载所需文件(USB库文件)

为了实现USB不停电下载功能,我们需要引入以下两个关键库文件:
stcusbcdc32lib.h:用于配置USB CDC(通信设备类)接口,实现与PC端的串口通信。
stc32stc8usbh.h:STC官方提供的USB主机库,用于支持USB协议栈及ISP下载功能。

这两个库文件必须正确包含在工程中,并且确保其路径正确无误。此外,还需要配套的驱动文件和链接脚本,以支持USB中断处理和ISP通信。

三、移植关键部分到工程

接下来,我们将逐步讲解如何将USB不停电下载的核心功能移植到您的工程项目中。

3.1 添加头文件

在主程序文件开头,添加以下两个头文件:
  1. c
  2. include "ai8051u.h"         // AI8051U平台通用头文件
  3. include "stc32stc8usbh.h" // STC USB主机库
复制代码

这两个头文件分别提供了平台基础定义和USB通信相关的函数接口,是实现USB下载功能的基础。

3.2 USB初始化函数

在主函数中,调用USB初始化函数以配置USB接口:
  1. c
  2. usbinit(); // USB CDC接口初始化
复制代码

该函数内部完成了USB设备枚举、端点配置、中断使能等操作,是USB通信正常运行的前提条件。

3.3 命令参数设置

为了实现ISP下载功能,我们需要定义一个特殊的命令字符串,用于触发下载模式:
  1. c
  2. char USERSTCISPCMD[] = "@STCISP#";
复制代码

当PC端通过USB发送该字符串时,单片机会识别该命令并进入ISP下载模式,开始接收新的程序代码。

此外,还可以定义设备描述符和产品描述符:
  1. c
  2. char USERDEVICEDESC[] = "STC AI8051U Device";
  3. char USERPRODUCTDESC[] = "AI8051U ISP Downloader";
复制代码

这些信息会在设备连接PC时显示,方便用户识别。

3.4 打开PSW2寄存器和IE2寄存器

在USB通信中,需要访问XFR寄存器空间,这需要先使能PSW2寄存器的B7位:
  1. c
  2. PSW2 |= 0x80; // 使能访问XFR寄存器区域
复制代码

同时,为了启用USB中断,还需设置IE2寄存器:
  1. c
  2. IE2 |= 0x80; // 使能USB中断
复制代码

这两步操作是USB通信正常运行的关键配置,务必在主函数初始化阶段完成。

四、完整主程序示例

以下是整合上述内容后的完整主程序示例:
  1. c
  2. include "ai8051u.h"
  3. include "stc32stc8usbh.h"
  4. char USERDEVICEDESC[] = "STC AI8051U Device";
  5. char USERPRODUCTDESC[] = "AI8051U ISP Downloader";
  6. char USERSTCISPCMD[] = "@STCISP#";
  7. void main(void)
  8. {
  9.     PSW2 |= 0x80; // 使能访问XFR寄存器区域
  10.     // 设置所有IO口为推挽输出
  11.     P0M1 = 0x00; P0M0 = 0x00;
  12.     P1M1 = 0x00; P1M0 = 0x00;
  13.     P2M1 = 0x00; P2M0 = 0x00;
  14.     P3M1 = 0x00; P3M0 = 0x00;
  15.     P4M1 = 0x00; P4M0 = 0x00;
  16.     P5M1 = 0x00; P5M0 = 0x00;
  17.     P6M1 = 0x00; P6M0 = 0x00;
  18.     P7M1 = 0x00; P7M0 = 0x00;
  19.     usbinit(); // 初始化USB CDC接口
  20.     IE2 |= 0x80; // 使能USB中断
  21.     while (1)
  22.     {
  23.         // 主循环中可执行其他任务
  24.         // 例如LED闪烁、传感器采集等
  25.     }
  26. }
复制代码

五、总结

通过本集教学视频,我们完成了以下内容:
演示了“USB不停电下载”的实际效果;
介绍了实现该功能所需的关键库文件;
详细讲解了代码移植的四个关键步骤:添加头文件、USB初始化、命令参数设置、寄存器配置;
提供了一个完整的主程序示例供参考。

希望本集内容对大家理解和掌握AI8051U平台的USB通信及不停电下载功能有所帮助。后续我们将继续深入讲解更多实用功能,敬请关注!

如在操作过程中遇到任何问题,欢迎在评论区留言交流,我会尽力为大家解答。感谢大家的支持!

——《Ai8051U教学视频》团队

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 4 天前 | 显示全部楼层

《Ai8051U教学视频》第五集 C语言基础配套程序

C语言USB-CDC串口之printf函数的实现
1.打卡USB库中的PRINTF_HID宏定义
2.理解PRINTF的函数原型的定义
截图202510031559075993.jpg


数的进制:2进制,10进制,16进制
数据的基本类型
C语言常用运算符


回复

使用道具 举报 送花

3

主题

1920

回帖

688

积分

等待验证会员

积分
688
发表于 4 天前 | 显示全部楼层
《Ai8051U教学视频》第五集学习笔记:C语言基础配套程序 —— C语言USB-CDC串口之printf函数的实现

在《Ai8051U教学视频》第五集中,我们重点学习了如何在基于USB-CDC串口通信的嵌入式系统中实现标准C语言中的printf函数。通过本集的学习,我们不仅掌握了C语言基础语法中与printf相关的核心知识,还了解了如何将其适配到特定的硬件平台(如USB-CDC串口)上进行输出。本文将围绕本集内容,结合打卡点“PRINTFHID宏定义”、“printf函数原型定义”、“数的进制”、“数据的基本类型”以及“C语言常用运算符”等知识点,进行总结与拓展。

一、打卡点:PRINTFHID宏定义

在嵌入式开发中,尤其是资源受限的MCU(如8051系列)上,标准C库的stdio.h中的printf函数通常不能直接使用,因为它依赖于底层的write系统调用,而MCU中没有标准的文件系统接口。

在本视频中,通过定义PRINTFHID宏,来启用针对HID(Human Interface Device)设备的printf实现。该宏通常用于条件编译,确保在使用HID接口作为输出通道时,相关的打印函数被正确包含和配置。

例如:
  1. c
  2. define PRINTFHID
复制代码

当该宏被定义后,编译器会启用与HID设备通信的底层函数,如hidputchar,并通过重定向write函数或自定义printf输出函数,将输出内容通过HID设备(如USB虚拟串口)发送到PC端。

二、理解printf函数原型的定义

标准C语言中printf函数的原型定义如下:
  1. c
  2. int printf(const char format, ...);
复制代码

其核心特点包括:
可变参数:使用...表示可变参数列表,允许传入多个不同类型的参数。
格式化字符串:第一个参数format是一个格式字符串,用于控制后续参数的输出格式。
返回值:返回成功输出的字符数。

在嵌入式环境中,为了实现printf功能,通常需要:

1. 实现底层字符输出函数(如putchar);
2. 使用stdarg.h库处理可变参数;
3. 解析格式字符串并逐个处理参数;
4. 将处理后的字符通过指定的输出通道(如UART、USB-CDC、HID等)发送出去。

例如,自定义printf的简化实现如下:
  1. c
  2. include
  3. void myputchar(char c) {
  4.     // 实现将字符c发送到USB-CDC串口的代码
  5. }
  6. void myprintf(const char format, ...) {
  7.     valist args;
  8.     vastart(args, format);
  9.     while (format) {
  10.         if (format == '%') {
  11.             format++;
  12.             switch (format) {
  13.                 case 'd': {
  14.                     int val = vaarg(args, int);
  15.                     // 实现整数转字符串并输出
  16.                     break;
  17.                 }
  18.                 case 'x': {
  19.                     unsigned int val = vaarg(args, unsigned int);
  20.                     // 实现十六进制输出
  21.                     break;
  22.                 }
  23.                 case 'c': {
  24.                     char c = (char)vaarg(args, int);
  25.                     myputchar(c);
  26.                     break;
  27.                 }
  28.                 case 's': {
  29.                     char s = vaarg(args, char );
  30.                     while (s) myputchar(s++);
  31.                     break;
  32.                 }
  33.                 default:
  34.                     myputchar(format);
  35.             }
  36.         } else {
  37.             myputchar(format);
  38.         }
  39.         format++;
  40.     }
  41.     vaend(args);
  42. }
复制代码

通过上述代码,我们可以在资源受限的嵌入式系统中实现基本的printf功能。

三、数的进制:2进制、10进制、16进制

在嵌入式开发中,理解和使用不同进制的数是基础技能之一。

1. 二进制(Binary)
基数为2,仅由0和1组成。
是计算机最底层的表示方式。
例如:0b1010表示十进制的10。

2. 十进制(Decimal)
基数为10,使用数字0~9。
是人类最常用的进制。
例如:123表示一百二十三。

3. 十六进制(Hexadecimal)
基数为16,使用数字0~9和字母A~F(或a~f)。
常用于表示内存地址、颜色值等。
例如:0x7B表示十进制的123。

在C语言中,可以通过格式化字符串控制输出的进制:
  1. c
  2. int num = 255;
  3. printf("Decimal: %d\n", num);      // 输出:255
  4. printf("Hex: 0x%x\n", num);        // 输出:0xff
  5. printf("Binary: %b\n", num);       // 需要自定义支持,输出:11111111
复制代码

四、数据的基本类型

C语言中的基本数据类型包括:

| 类型名       | 含义               | 典型大小(字节) |
|--------------|--------------------|------------------|
| char       | 字符型             | 1                |
| short      | 短整型             | 2                |
| int        | 整型               | 2 或 4           |
| long       | 长整型             | 4                |
| float      | 单精度浮点型       | 4                |
| double     | 双精度浮点型       | 8                |
| void       | 空类型             | 无               |

在嵌入式开发中,由于内存和处理能力的限制,合理选择数据类型非常重要。例如,在8051系统中,int通常为16位,而long为32位。因此,使用int可以提高效率。

五、C语言常用运算符

C语言提供了丰富的运算符,主要包括以下几类:

1. 算术运算符
+:加法
-:减法
`:乘法
/:除法
%:取模(仅用于整数)

2. 关系运算符
==:等于
!=:不等于
>:大于
=:大于等于


[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-7 03:18 , Processed in 0.135248 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表