找回密码
 立即注册
查看: 217|回复: 7

AI8051U实验箱的学习心得

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-02-08 23:23:52
已绑定手机

3

主题

33

回帖

127

积分

注册会员

积分
127
发表于 2026-1-10 11:55:40 | 显示全部楼层 |阅读模式
本人为一名在校大学生,电子科学与技术专业,之前玩过STC89C52,跟着江协科技,自己一点一点摸索的,没有系统的学习过;
在学习STC89C52过程中,发现他是8位的MCU,有很大的局限性,非常适合初学者。
在学习完之后,我又了解到AI8051U这款MCU,相比89C52,他有很多优点,STC国产芯片发展迅速。
借着此次机会,跟着B站老师学习AI8051U实验箱的使用,以此了解AI8051U的强大之处。
第一集 序言
哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前
8051U强在哪里?
1.屏幕显示和视频播放(flash编程器)
相比之前的51单片机,刷新更快,足够做一些菜单,视频等操作。
2.IIS录放音
这款芯片可以完成录放音,无需再外接语音模块,相当于集成到了这款芯片上,非常的方便。
3.PWM_DMA
相比之前PWM无法兼容DMA,这块板子可以实现PWM和DMA结合驱动WS2812B灯,UP主借此做了一个基于PWM-DMA的时间显示模块。
最多可以实现1000多个WWS2812灯的显示,并且无任何干扰。
4.频谱分析仪(上位机)
用上位机可以分析环境的频率,并实现快速的刷新。
5.手写计算器
通过触摸屏,可以在上面手写一些简单的计算,像一些加减乘除都是可以完成的,非常的方便,这个功能号称着向AI跨度的一个过程。
6.QSPI,PWM移相,硬件乘除,单精度浮点
Ai8051U-LQFP48  比普通 M0/M3,比 32F103C8T6 强太多的地方:
1,Ai8051U有TFPU@120MHz, 算力比他强, uS级硬件三角函数/浮点运算器;
2,Ai8051U的抗干扰比他强;
3,  Ai8051U的内部复位是专业级的复位电路,彻底省外部复位;
4,  Ai8051U的内部时钟完全满足串口通信要求,4组串口;
5,Ai8051U-LQFP48有 QSPI, i8080/M6800-TFT 接口,32F103C8T6没有;
6,  Ai8051U的PWM支持硬件移相@120MHz
7,Ai8051U是 34K SRAM, DMA 支持 外设直接到外设,P2P
8,Ai8051U是 自带硬件USB, 1个芯片就能直接USB连接电脑仿真/下载,全球唯一

微信图片_20260110115413_241_84.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-02-08 23:23:52
已绑定手机

3

主题

33

回帖

127

积分

注册会员

积分
127
发表于 2026-1-10 14:30:21 | 显示全部楼层
AI8051U实验箱的学习:
第二章:硬件及工具介绍

一:实验箱介绍








在此,需要对“电源按键”进行说明 按住此按键时主控芯片断电,松开此按键时主控芯片会重新上电而进行上电复位。 对于 Ai 单片机,要想进行 ISP 下载,则必须是在 MCU 上电或复位时接收到握手命令才会开 始执行 ISP 程序,所以下载程序到实验箱的正确步骤为: 1、 使用 USB 线将实验箱与电脑进行连接 2、 打开 AIapp-ISP-v6.94R 下载软件 3、 选择单片机型号为“AI8051U-34K64”,打开需要下载的用户程序 4、 实验箱使用硬件 USB 接口下载。进入 USB 下载模式需要先按住实验箱上的 P3.2/ INT0 按键 / 接地,然后按一下 ON/OFF 电源按键 / 断电,接着松开 ON/OFF 电源按键 /上电,最后可松开 P3.2/ INT0 按键。正常情况下就能识别出“STC USB Writer (HID1)” 设备 5、 点击 STC-ISP 下载软件中的“下载 / 编程”按钮 当用户使用硬件 USB 对 AI8051U 芯片进行 ISP 下载时,不支持调节内部 IRC 的频率,但是可 选择出厂时内部预置的多种高精准 IRC 时钟频率(分别是 5.5296M、6M、11.0592M、12M、 18.432M、20M、22.1184M、24M、27M、30M、33.1776M、35M、36.864M、40M、44.2368M、 45.1584M),不同的系列可能不一样,具体以下载软件的频率列表为准。 也就是下载时用户只能从频率下拉列表中选择其中之一,而不支持手动输入其他频率,使用 串口下载则可以输入 4M ~ 45.5M 之间的任意频率。



二:软件介绍



以上是我们需要安装的软件,关于软件的安装,网上有很多教程,这里就不再赘述了。但是要提醒大家一点,安装keil 251时,不要忘记破解,否则无法正常使用,其次,不要忘记添加ai8051的型号。



三 下载程序到实验箱
首先使用 USB 线将实验箱与电脑正确连接,然后打开 AIapp-ISP-v6.94R 或以上版本。



在上面的界面中,下面几点需要注意: 1、 单片机型号选择“AI8051U-34K64”。 2、 实验箱 使用硬件 USB 接口下载。进入 USB 下载模式需要先按住实验箱上的 P3.2/INT0 按键(P32 接地),然后按一下 ON/OFF 电源按键 / 断电,接着松开 ON/OFF 电源按键 / 上电,最后可松开。 P3.2/INT0 按键。正常情况下就能识别出“(HID1) USB Writer”设备。 点击界面中的“打开程序文件”按钮,在出现的打开程序代码文件的对话框中选择需要 下载的文件。






下载成功,会出现如下画面:



最简下载电路及步骤参考如下:
硬件 USB 直接下载用户程序步骤: 1. 按下 P3.2 短接 GND 按键 2. 按一下电源按键断电再上电,或复位 3. 点击下载软件中的“下载 / 编程”按钮 4. 下载成功

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-02-08 23:23:52
已绑定手机

3

主题

33

回帖

127

积分

注册会员

积分
127
发表于 2026-1-10 14:32:00 | 显示全部楼层
AI8051U实验箱的学习:
第三集:点亮一个LED灯

众所周知,学习单片机必须是从点灯开始,可以说当你成功点亮一个LED灯的时候,才代表着正式进入嵌入式的学习,那么,今天让我们跟随大佬的脚步走进AI8051U的点灯。
首先,第一步:在Keil上创建新工程并添加头文件,帖子最后我会放我的操作视频。
先来跟着大佬学习



有人觉得编程好难,但我相信,哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前,
跟着UP主一步步来,相信大家肯定没有问题。


#include <AI8051U.H>


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

敲好代码之后,我们需要进行一些基本配置 方便我们使用。



这些配置可以让我们使用Keil更加得心应手。


//#include "ai8051u.h"                //调用头文件
#include <AI8051U.H>

//注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可
void main(void)
{
        P2M0 = 0;                //P2端口(P20-P27)为准双向口
        P2M1 = 0;
      
        while(1)
        {
                P20 = 0;        //P20端口输出0V
                P21 = 0;        //P21端口输出0V
        }
}

这里说明一些,UP主是用的自己的代码,而#include <AI8051U.H>是你在添加AI8051U之后可以直接使用的,我认为更加的方便,右键即可添加,并且这里是点亮的P20和P21引脚的灯,和UP主有所不同。

在写完代码之后,我们只需将所写的Hex文件烧录到实验箱就可以成功点亮第一个LED灯。


由于我这里没有实验箱,就给大家放UP主点亮的灯吧。

最后附上我自己敲的视频,谢谢大家。

E__代码包(擎天柱版本)_代码包(擎天柱版本)_03.点亮第一个LED_demo.uvproj - μVi.zip

5.57 MB, 下载次数: 0

演示视频

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-02-08 23:23:52
已绑定手机

3

主题

33

回帖

127

积分

注册会员

积分
127
发表于 2026-1-10 15:07:58 | 显示全部楼层
AI8051U实验箱的学习:

第四集:USB不停电下载
截图202601101456481582.jpg

由上节我们知道,当我们使用USB下载时,每次都需要按电源按键,才能烧录程序,非常麻烦,这节UP主通过配置一系列寄存器,实现了不停电下载,非常方便。

截图202601101457005432.jpg 截图202601101457129842.jpg

首先,我们在isp上完成上述配置。
接下来在stc官网下载USB库文件。
截图202601101457256253.jpg

截图202601101457355134.jpg

截图202601101457438607.jpg
截图202601101457553811.jpg

通过将官网所给的文件移植到我们的点灯文件中就可以实现掉电不丢失。
截图202601101458033426.jpg
但是需要注意二者的密码必须配对,否则无法完成该任务。


截图202601101458319033.jpg

我们在跟着UP主敲完代码之后会出现一些为57的警告,这时我们需要进行一些配置来完成,如上图,在这之后,我们就可以完成不停电下载,这里有寄存器配置,说实话,没太看懂,但是会抄,能用就行,下面就是成功案列。
截图202601101458397090.jpg 截图202601101458174231.jpg

我也是新手,有很多都是跟着博主打一遍代码,具体缘由并没有理解,希望在后续学习能够完善,也欢迎各位来交流心得,谢谢大家!


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-02-08 23:23:52
已绑定手机

3

主题

33

回帖

127

积分

注册会员

积分
127
发表于 2026-1-10 15:26:10 | 显示全部楼层
AI8051U实验箱的学习:
第五集:C语言基础

截图202601101514424199.jpg
1. C 语言 USB-CDC 串口之 printf 函数的实现
这部分是嵌入式开发的实用技能—— 把 C 语言的printf(打印)功能,映射到 USB-CDC 虚拟串口上,让单片机可以通过 USB 给电脑发送调试信息,是嵌入式开发中 “调试输出” 的常用方法。

2. 数的进制:2 进制、10 进制、16 进制
这是编程的基础概念:

  • 2 进制:计算机底层存储数据的方式(只有 0/1);
  • 10 进制:日常计数方式;
  • 16 进制:编程中常用(比如表示寄存器地址、硬件数据),因为 1 位 16 进制 = 4 位 2 进制,写起来更简洁。

3. 数据的基本类型
指 C 语言里的char、int、float等类型 —— 它们决定了数据的存储大小(比如char占 1 字节、int占 4 字节)和取值范围(比如unsigned char能存 0~255),嵌入式开发中要根据硬件资源选合适的类型。

4. C 语言常用运算符
比如算术运算符(+、-、*、/)、关系运算符(>、<、==)、位运算符(&、|、<<、>>)等 —— 位运算符在嵌入式里很常用(比如操作硬件寄存器的某几个位)。

截图202601101519539364.jpg
这张图片是我总结的二级制和十六进制的转换,对后面配置寄存器或许有帮助,并理解其中含义。


截图202601101514523390.jpg

要理解**C语言中USB-CDC串口的printf函数实现**,得先搞清楚3个核心问题:`printf`的工作逻辑、USB-CDC串口的本质,以及如何把两者“对接”起来。下面分步骤详细拆解:一、先搞懂:printf是怎么工作的?`printf`是C语言标准库(`<stdio.h>`)的函数,它的核心逻辑是:1. 把你要输出的内容(数字、字符串、变量)

按照格式(`%d`/`%X`/`%f`)转换成**字符流**;2. 调用`putchar`函数,把字符流**逐个发送**出去;3. `putchar`默认是输出到“标准输出设备”(比如电脑的控制台),但在嵌入式中,我们可以**重定义putchar**,
让它把字符发送到**USB-CDC串口**。二、USB-CDC串口是什么?USB-CDC(USB Communication Device Class)是一种USB设备类,它的作用是把单片机的USB接口**模拟成一个“虚拟串口”**——电脑识别后会出现一个“COM口”,就像传统的RS232串口一样,可以收发字符。对AI8051U这类单片机来说,USB-CDC串口的硬件层是USB接口,但软件层的通信逻辑和传统UART串口是兼容的(都基于“发送/接收字符”的方式)。三、实现步骤:把printf“绑定”到USB-CDC串口核心思路是:**重定义C标准库的`putchar`函数**,让它把字符发送到USB-CDC串口;

同时初始化USB-CDC串口的硬件,确保字符能正常传输到电脑。步骤1:初始化USB-CDC串口硬件AI8051U的USB-CDC串口依赖硬件配置(比如波特率、数据位、停止位),需要先初始化串口的工作模式:```c#include <REGX51.H>  // AI8051U的寄存器定义头文件// 初始化USB-CDC串口(以9600波特率为例,主频12MHz)void USB_CDC_UART_Init(void) {    // 1. 配置定时器1(8051串口的波特率由定时器1产生)    TMOD |= 0x20;  // 定时器1工作在模式2(8位自动重装),用|=避免修改其他位    TH1 = 0xFD;    // 12MHz主频下,9600波特率对应的定时器初值    TL1 = 0xFD;    // 模式2下,TL1溢出后会自动重装TH1的值    TR1 = 1;       // 启动定时器1    // 2. 配置串口模式    SCON = 0x50;   // 串口工作在模式1(8位数据位,1位停止位),允许接收(REN=1)    // 3. 开启中断(可选,若需要串口接收中断则开启)    EA = 1;        // 开总中断    ES = 1;        // 开串口中断}```步骤2:重定义putchar函数(核心!)C语言标准库中,`printf`最终会调用`putchar`函数来输出**单个字符**。因此,我们只需要**替换`putchar`的实现**,让它把字符发送到USB-CDC串口即可。以AI8051U为例,串口的发送逻辑是:把字符写入`SBUF`寄存器,等待发送完成(标志位`TI`置1):```c// 重定向putchar,让printf的输出通过USB-CDC串口发送char putchar(char c)
{    SBUF = c;      // 把要发送的字符写入串口数据寄存器SBUF    while(!TI);    // 等待发送完成:TI是串口发送完成标志位,发送成功后硬件自动置1    TI = 0;        // 手动清除发送标志位,准备下一次发送    return c;      // 按C标准库要求返回发送的字符}``` 步骤3:测试printf是否生效初始化串口后,直接调用`printf`即可输出内容到USB-CDC串口(电脑端打开串口调试助手,选择对应的COM口、波特率9600):```cvoid main(void) {    unsigned int count = 0;    USB_CDC_UART_Init();
// 先初始化USB-CDC串口    while(1) {        // 用printf输出不同格式的数据        printf("计数(十进制):%d,十六进制:%X,字符串:Hello AI8051U!\r\n", count, count);        count++;        if(count > 100) count = 0;                // 简单延时(实际项目建议用定时器)        unsigned int i, j;        for(i=0; i<1000; i++)            for(j=0; j<110; j++);    }}``` 四、关键细节:为什么这样就能实现?1. **printf的底层依赖**:C标准库的`printf`是“封装好的工具”,它会自动把你输入的`%d`/`%X`等格式转换成对应的字符
(比如数字`10`转成字符`'1'`和`'0'`),然后逐个调用`putchar`发送;2. **USB-CDC的“虚拟”本质**:虽然硬件是USB接口,但AI8051U的USB-CDC驱动已经把它模拟成了“UART串口”,
所以软件层面的操作(写`SBUF`、读`TI`)和传统串口完全一致;3. **重定义的合法性**:C语言允许用户“重定义标准库函数”(只要函数名、参数、返回值和标准一致),编译器会优先使用用户定义的版本。 五、常见问题及解决1. **串口乱码**:   - 波特率不匹配:检查定时器初值是否和单片机主频对应(比如12MHz对应9600波特率的初值是`0xFD`,11.0592MHz对应`0xFA`);
   - 串口模式配置错误:确保`SCON`设置为`0x50`(模式1);2. **printf没输出**:   - 没初始化串口:必须先调用`USB_CDC_UART_Init()`;   - 没重定义`putchar`:确保`putchar`的函数名、参数、返回值正确;3. **浮点型输出异常**:   - 8051内核默认不支持浮点型的`printf`(标准库的`printf`浮点版体积大),若需要输出浮点型,建议先转成整数(比如`25.5`转成`255`,输出时除以10)。以上就是我的学习心得。
我觉得在学单片机之前,我们应该学习好c语言,之后这样我们才能更好的上手单片机,进行代码编写,高效的学习,谢谢大家!




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-02-08 23:23:52
已绑定手机

3

主题

33

回帖

127

积分

注册会员

积分
127
发表于 2026-1-10 15:33:21 | 显示全部楼层

AI8051U实验箱的学习心得

AI8051U实验箱的学习:
第六集:IO口输入输出
一、准备验证工作。
拷贝上节课04自动生成代码AiCube,连接擎天柱到电脑上。由于上节课烧录到擎天柱的代码包含打开USB-CDC功能,打开烧录工具会多一个串口,我这里显示是(COM6USB-CDC(如下图)。鼠标点击菜单“调试仿真接口”找到并鼠标左键点击打开“擎天柱-LED-DIP404)”,再鼠标左键点击“调试仿真接口”菜单“接口协议及帮助”,鼠标左键点击打开“DIP40封装LED接口”,学习功能1-4
二、验证DIP40各功能指令。
1. 功能1控制DIP40的指定管脚输出低电平
字节数
1
2
3
4
5
6
7
命令格式:
4CH
45H
44H
28H
O2H
00H
Px
命令注解
命令头
后面有效数据长度
固定为00H
端口的状态数据
   px的注解一览表
px
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
px位解析
固定为0
管脚的组,作为高字节
管脚的位,作为低字节
计算时注意:Bit6Bit5Bit4Bit3作为一个字节计算
示例1末位px解析表
px
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
03H
0
0
0
0
0
0
1
1
px位解析
固定为0
值为0指定P0端口
值为3指定P0端口第3管脚
示例2末位px解析表
px
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
25H
0
0
1
0
0
1
0
1
px位解析
固定为0
值为4指定P4端口
值为5指定P4端口第5管脚
组:Bit6Bit5Bit4Bit3二进制值:0 1 0 0换算十六进制值为4
位:Bit2Bit1Bit0二进制值:1 0 1换算十六进制值为5
验证:设置点亮P5.7
P5.7
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
2FH
0
0
1
0
1
1
1
1
固定为0
值为5指定P5端口
值为7指定P5端口第7管脚
STC工程师封装了LED40_ClrBit函数,在ai_usb.h中申明,函数有两个参数,第一个参数是指定端口,第二个参数指定端口引脚
LED40_ClrBit(0, 3);    //设置P0.3口输出低电平
LED40_ClrBit(4, 5);    //设置P4.5口输出低电平
2. 功能2控制DIP40的指定管脚输出高电平
控制命令除了px的bit7:固定为1外,其他的跟上面“控制DIP40的指定管脚输出低电平”一模一样,STC工程师封装函数名LED40_SetBit,可直接调用。
LED40_SetBit(4, 5);    //设置P4.5口输出高电平
3. 功能3控制DIP40的各个管脚上LED的状态
字节数
1
2
3
4
5
6
7
命令格式:
4CH
45H
44H
28H
O2H
x1
Px
命令注解
命令头
后面有效数据长度
屏蔽位
端口的状态数据
6字节x1
x1位数
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
x1位解析
固定为0
P5
P4
P3
P2
P1
P0
验证命令结论:最好单独设置每个端口,一次设置多个端口有异常。比如:在CDC/HID串口助手发送HEX格式数据4CH 45H 44H 28H 02H 3FH 00HDIP40LED全部亮了,再发送4CH 45H 44H 28H 02H 3FH FFH
只有P0端口熄灭,其他等依然亮着(如下图)。但是,STC工程师封装函数名LED40_SetPort,可直接调用。
LED40_SetPort(0, 0x55);    //设置P0口输出55H

4. 功能4 控制DIP40的各个管脚上LED的状态
命令格式: 4CH 45H 44H 28H x1 x2 px ...
字节数
1
2
3
4
5
6
7
命令格式:
4CH
45H
44H
28H
x1
X2
Px
命令注解
命令头
后面有效数据长度
屏蔽位
端口的状态数据
第五字节x1指定后面有效数长度
第六字节x2指定P0P5端口的屏蔽位,哪位值等于1就指定对应端口,比如Bit0值等1时指定P0端口。
X2
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
X2位解析
固定为0不用
P5
P4
P3
P2
P1
P0
验证指令:让DIP40LED全熄灭,可在CDC/HID串口助手发送HEX格式数据
4CH 45H 44H 28H 07H 3FH FFH FFH FFH FFH FFH FFH
DIP40LED全亮,可在CDC/HID串口助手发送HEX格式数据
4CH 45H 44H 28H 07H 3FH 00H 00H 00H 00H 00H 00H
STC工程师封装函数名LED40_SendData,可直接调用,函数有两个参数,第一个参数设置数组,第二参数指定数组长度。数组第一个值是x2指定P0P5端口的屏蔽位,数组第二个值是指定端口状态。
三、调用第三功能,让DIP40LED与擎天柱同步显示
任务函数
static TASK_COMPONENTS Task_Comps[]=
{
//状态  计数  周期  函数
{0, 2000, 2000, Test_Demo}
};
测试函数
void Test_Demo(void)
{
P2 = t_display[display_index];
LED40_SetPort(2, t_display[display_index]);
if(++display_index >= 40)  display_index = 0;
}






回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-02-08 23:23:52
已绑定手机

3

主题

33

回帖

127

积分

注册会员

积分
127
发表于 2026-1-10 15:36:07 | 显示全部楼层
第七节 学用调试仿真接口7段数码管,温习浮点数存储
本节课主要任务是用擎天柱配合烧录工具cdc/hid串口助手,调用7段数码管接口,温习IEEE754标准
一、准备验证工作。
拷贝上节课代码,连接擎天柱到电脑上,打开烧录工具,鼠标点击菜单“调试仿真接口”找到并鼠标左键点击打开“接口协议及帮助”,再鼠标左键点击“调试仿真接口”菜单“接口协议及帮助”,鼠标左键点击打开“7段数码管接口”,学习功能3和功能4
二、学用7段数码管接口功能4指令。
在数码管上直接显示所给的段码命令格式:
STC工程师封装函数名SEG7_ShowCode,可直接调用,函数只有一个参数,是装载数码管8个段状态值的数组。本节课直接调用,配合擎天柱让虚拟数码管显示流动数字。
1. 定义变量。在task.c文件中定义一个变量和一个数组:
u8 NixieTube_index = 0;
u8 NixieTube_code[8];
2. 在task.c文件中定义一个任务回调函数:
void Show_NixieTube(void)
    {
     NixieTube_code[0] = t_display[NixieTube_index];
      if(NixieTube_index + 1 > 9)
         {
             NixieTube_code[1] = t_display[NixieTube_index-9];
         }
          else
          {
                NixieTube_code[1] = t_display[NixieTube_index+1];
            }
           if(NixieTube_index + 2 > 9)
           {
               NixieTube_code[2] = t_display[NixieTube_index-8];
           }
            else
          {
                NixieTube_code[2] = t_display[NixieTube_index+2];
             }
           if(NixieTube_index + 3 > 9)
            {
                NixieTube_code[3] = t_display[NixieTube_index-7];
            }
           else
            {
               NixieTube_code[3] = t_display[NixieTube_index+3];
           }
           if(NixieTube_index + 4 > 9)
          {
             NixieTube_code[4] = t_display[NixieTube_index-6];
            }
            else
            {
                 NixieTube_code[4] = t_display[NixieTube_index+4];
            }
           if(NixieTube_index + 5 > 9)
          {
              NixieTube_code[5] = t_display[NixieTube_index-5];
            }
             else
             {
                   NixieTube_code[5] = t_display[NixieTube_index+5];
             }
             if(NixieTube_index + 6 > 9)
            {
                NixieTube_code[6] = t_display[NixieTube_index-4];
           }
          else
          {
              NixieTube_code[6] = t_display[NixieTube_index+6];
            }
          if(NixieTube_index + 7 > 9)
          {
           NixieTube_code[7] = t_display[NixieTube_index-3];
           }
         else
        {
            NixieTube_code[7] = t_display[NixieTube_index+7];
         }
           SEG7_ShowCode(NixieTube_code);
            if(++NixieTube_index >9)  NixieTube_index = 0;
}
3. task.c文件中TASK_COMPONENTS Task_Comps函数内添加一行任务代码:{0, 5000, 5000, Show_NixieTube}
4. 在task.h文件中申明一下任务回调函数
void Show_NixieTube(void);
5. 编译烧录到擎天柱,打开烧录工具CDC/HID串口助手和虚拟数码管,欣赏流水数字。
三、温习浮点数存储
虚拟数码管功能3使用说明提到了IEEE754格式,有同学问为何3.14159存储数据是40H  49H  0FH  D0H
1.单精度浮点数IEEE 754标准存储概述。
单精度浮点数在计算机内存中的表示遵循 IEEE 754标准,使用 32位(4字节) 来表示,这32位被划分为三个部分:
A、符号位 (Sign): 最高位(第31位),1位。0表示正数,1表示负数。
B、指数位 (Exponent): 中间8位(第30位到第23位)。为了能表示负指数,引入了偏移码,其实际值 =无符号整数值-127。
C、尾数位 (Fraction/Significand): 最低23位(第22位到第0位)。存储的是小数部分,整数部分的1被隐含,称为“隐含的1”。
2.转换计算
40H  49H  0FH  D0H
第一步:用计算器程序员模式将上述十六进制转换为完整的32位二进制:
0100 0000 0100 1001 0000 1111 1101 0000
第二步:划分IEEE 754的三个部分
符号位 S (第31位): 0 (正数)
指数位 Exp (第30-23位): 1000 0000
尾数位 Frac (第22-0位): 1001 0010 0001 1111 1010 000
第三步:计算指数
将指数位Exp: 1000 0000 转换为十进制:128
减去偏移量 127:128 - 127 = 1
实际指数 E = 1
第四步:还原完整的尾数
规范化形式的二进制科学计数法有一个隐含的1,将隐含的1和23位尾数位组合起来,完整的尾数
M =1.10010010000111111010000
第五步:计算十进制数值
计算原理: 数值 = (符号) * (完整尾数M的十进制值) * (2 ^ 指数E)
计算完整尾数 M 的十进制值:
整数部分: 1 = 1
小数部分:
1st digit: 1 * (1/2) = 0.5
2nd digit: 0 * (1/4) = 0
3rd digit: 0 * (1/8) = 0
4th digit: 1 * (1/16) = 0.0625
5th digit: 0 * (1/32) = 0
6th digit: 0 * (1/64) = 0
7th digit: 1 * (1/128) = 0.0078125
8th digit: 0 * (1/256) = 0
9th digit: 0 * (1/512) = 0
10th digit: 0 * (1/1024) = 0
11th digit: 0 * (1/2048) = 0
12th digit: 1 * (1/4096) = 0.000244140625
13th digit: 1 * (1/8192) = 0.0001220703125
14th digit: 1 * (1/16384) = 0.00006103515625
15th digit: 1 * (1/32768) = 0.000030517578125
16th digit: 1 * (1/65536) = 0.0000152587890625
17th digit: 0 * (1/131072) =0.00000762939453125
18th digit: 1 * (1/262144) = 0
19th digit: 1 * (1/524288) =0.0000019073486328125
20th digit: 0 * (1/1048576) = 0
21th digit: 1 * (1/2097152) = 0
22th digit: 0 * (1/4194304) = 0
22th digit: 0 * (1/8388608) = 0
将上述所有值相加
1+0.5+0.0625+0.0078125+0.000244140625+0.0001220703125+0.00006103515625+0.000030517578125+0.0000152587890625+0.00000762939453125+0.0000019073486328125=1.5707950592041015625
1.5707950592041015625×2=3.141590118408203125

回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2026-02-07 11:52:53
已绑定手机

14

主题

125

回帖

924

积分

版主

积分
924
发表于 2026-1-12 08:41:45 | 显示全部楼层
要 做到 USB不停电下载
要 尝试 AiCube 图形化自动配置生成程序工具
推荐优先看的:  
printf_usb("Hello World !\r\n")
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html

下载 最新的 AiCube-ISP-V6.96O 或以上版本软件 !

深圳国芯人工智能有限公司-工具软件

下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !

下载 最新的 Ai8051U 用户手册
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf

下载 最新的 Ai8051U 实验指导书,
AiCube 图形化自动配置生成程序工具使用说明
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf


推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接



回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-12 18:02 , Processed in 0.118398 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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