ahcl 发表于 2025-5-14 17:26:17

【实验箱已收到】【AI8051U】学习打卡与心得

【第一集】序言
详细的介绍了AI8051U芯片的功能;最大优点是兼容89C52RC,12C5A60S2
8051U的功能特点:
1。屏幕显示和视频播放
2.IIS录放音
3.PWM_DMA
4.频谱分析仪
5.手写计算器(8051最突出的功能)
6.QSPI,PWM移相,硬件乘除,单精度浮点


现在国产芯片也是越来越强大了



国芯人工智能 发表于 2025-5-14 17:28:00

AI8051U芯片技术解析与应用展望

作为新一代增强型8位微控制器,AI8051U在保持经典架构兼容性的基础上实现了多项技术创新。本技术分析将从架构特性、功能模块及系统级应用三个维度展开论述。

一、核心架构特性
AI8051U采用双核异构架构,在保持与Intel 8051指令集全兼容的基础上,创新性地整合了高速运算协处理器。其时钟频率最高可达48MHz,配合硬件乘除器(单周期32×32位乘法)和单精度浮点运算单元(FPU),使传统架构的运算性能提升达20倍以上。存储系统方面,提供64KB Flash+2KB EEPROM+4KB SRAM的灵活配置,支持在线编程(ISP)和在线调试(OCD)功能。

二、功能模块技术解析
1. 显示控制子系统
集成专用显示控制器,支持最大分辨率800×600的RGB接口输出。通过DMA通道实现显存自动刷新,配合硬件图层混合引擎,可同时处理4层图形叠加。视频解码模块支持H.264 Baseline Profile硬件解码,在12MHz主频下可实现30fps@QVGA视频播放。

2. 音频处理单元
内置I2S数字音频接口,支持最高192kHz/24bit音频流处理。配备专用语音编解码器,支持ADPCM、G.711等编码格式。通过双缓冲DMA架构实现零延迟音频采集与回放,信噪比(SNR)达到92dB。

3. 精密定时系统
16通道增强型PWM控制器支持:
移相控制精度:0.1°
频率分辨率:24位
死区时间可编程范围:0-65535ns
配合事件触发矩阵(ETM),可构建复杂电机控制时序。

4. 频谱分析加速器
硬件FFT协处理器支持1024点复数FFT运算仅需512时钟周期,较软件实现提速300倍以上。提供窗函数硬件加速(Hamming/Hanning/Blackman),动态范围达到96dB。

5. 人机交互创新
手写计算器功能基于专用触控接口实现,包含:
8点电容触控检测
笔迹预测算法(采样率200Hz)
公式识别引擎(支持LaTeX转换)
典型数学运算延迟

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

ahcl 发表于 2025-5-14 18:08:57

【第二集】硬件与工具介绍
介绍了Ai8051试验箱的硬件与硬件的功能;如何安装软件与工具;如何下载程序。
推荐用USB-Link 1D烧录程序。


ahcl 发表于 2025-5-14 19:10:37

【第三集】 点亮第一颗LED
1.新建工程

需要配置的地方


硬件介绍


I/O口配置

。点亮第一个LED是梦到开始,从入门到入土。
张三和李四互殴笑死我了{:4_187:}

代码与实物演示





ahcl 发表于 2025-5-14 19:41:40

【第四集】 USB不停电下载
本集摘要

如何全局搜素

配置寄存器

屏蔽未调用指令

代码粘贴复制,Ctrl+C与Ctrl+V我只能说无解。


代码与实物演示



ahcl 发表于 2025-5-14 20:35:28

【第五集】C语言基础
本集摘要


替换名替换被替换名


Printf的用法


转义说明简介


ASCII码标记一下


变量类型


运算符


这集需要了解C语言,不然听起来会很吃力。


ahcl 发表于 2025-5-14 20:51:45

【第六集】I/O口输入输出

本集摘要



GPIO的定义


GPIO的四种模式

按钮输入检测


按键消抖


生成延时代码

主要要学习GPIO口的模式选择,和按键消抖。



ahcl 发表于 2025-5-14 22:30:25

【第七集】定时中断
以问答的形式引出定时器中断


重点:学会利用ISP软件生成定时函数


定时器需要配置的地方

计算公式


函数的定义声明和调用


这集的内容还是很重要的,慢慢开始变得有点难了,不仅配置的东西越来越多,还要计算。

代码内含《电子功德箱》

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "math.h"
#include "stdio.h"



#define u8 unsigned char
#define u16 unsigned int       
       
u8 state = 0;
u16 flag = 0;
u16 count =0;
u8 bontten_State=0;

/*void Timer0_Init(void)                //3秒@24.000MHz
{
        TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x3F;                                //设置定时初始值
        TH0 = 0x01;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

void Timer0_Init(void)                //500毫秒@24.000MHz
{
        TM0PS = 0x0F;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xDC;                                //设置定时初始值
        TH0 = 0x0B;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}*/

void Timer0_1sInit(void)                //1秒@24.000MHz
{
        TM0PS = 0x1E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xFC;                                //设置定时初始值
        TH0 = 0x03;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

void Timer1_2sInit(void)                //2秒@24.000MHz
{
        TM0PS = 0x3D;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xFC;                                //设置定时初始值
        TH0 = 0x03;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}




void Delay20ms(void)        //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}



void main()
{
    WTST = 0;
        EAXFR = 1;
        CKCON = 0;
       
   
    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;
   
        P40=0;
       
    usb_init();                                     //USB CDC 接口配置
//Timer0_Init();
   
    EA = 1;

    while (1)
    {
      if (bUsbOutReady)
      {
//            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            printf_usb("1. Read Num:%d\n", OutNumber);
            printf_usb("2. Read Num:%d\n", OutNumber);
            printf_usb("3. Read Num:%d\n", OutNumber);
            printf_usb("4. Read Num:%d\n", OutNumber);
            
            usb_OUT_done();
      }
          /*任务1:
                if(P32 == 0)
                {
                        Delay20ms();
                        if(P32 == 0)
                        {
                        while(P32 == 0);
                        printf("按键按下次数\XFD:%d次\r\n",count++);
                       
                               
                        }
                }
             //任务2:灯按一下点亮三秒后熄灭。
                if(P32 == 0)
                {
                        Delay20ms();
                if(P32 == 0)
                {
                        P00 = 0;
                        Timer0_Init();
                        while(P32 == 0);
                }
               
                }
             //任务3:救护车灯控制器;按下报警按钮红蓝交替闪烁(LED0和LED1表示红灯和蓝灯),再按一下报警按钮,红蓝灯停止。
                        if (P32 == 0)
                        {
                                Delay20ms();
                                if (P32 == 0)
                                {
                                        Run_State = !Run_State;
                                        if (Run_State == 1 )
                                        {
                                          Timer0_Init();
                                               
                                        }
                                        else
                                        {
                                                TR0 = 0;
                                                P00 = 1;
                                          P01 = 1;
                                        }
                                        while (P32 == 0);
                                }*/
                          /*电子功德箱:
                                1.按下按钮1,串口显示“双倍功德时间”,再次按下显示“单倍功德时间”;
                                2.按下按钮2,双倍功德时间显示“功德+2 当前功德XXX”;
                                3.按下按钮3,单倍功德时间显示“功德+1 当前功德XXX”;
                                4.功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
                                5.功德+2时,LED点亮2秒后熄灭表示功德成功点亮;
                                */
                                if (P32 == 0)
                                {
                                        Delay20ms();
                                        if (P32 == 0)
                                        {
                                                bontten_State = !bontten_State;
                                                if( bontten_State == 1)
                                                {
                                                        printf("双倍功德时间");
                                                }
                                                else
                                                {
                                                        printf("单倍功德时间");
                                                }
                                                while(P32 == 0);
                                               
                                        }
                                }
                                if (P33 == 0)
                                {
                                        Delay20ms();
                                        if (P33 == 0)
                                        {
                                                if(bontten_State ==1)
                                                {
                                                        flag= flag+2;
                                                        P00 = 0;
                                                        Timer1_2sInit();               
                                                printf("功德+2 当前功德%d",flag);
                                                }
                                                else
                                                {
                                                        flag= flag+1;
                                                        P00 = 0;
                                                        Timer0_1sInit();
                                                printf("功德+1 当前功德%d",flag);       
                                                }
                                                while(P33 == 0);
                                        }
                                }
                               
                               
                        }
        }




void Timer0_1sIsr(void) interrupt 1
{
    P00 = 1;
        TR0 = 0;
}

void Timer1_2sIsr(void) interrupt 3
{
    P00 = 1;
        TR0 = 0;
}






ahcl 发表于 2025-5-22 22:50:02

【第八集】 定时器周期性任务调度









这节课的周期性任务调度有点难,以后再补上。{:huaixiao:}


页: [1]
查看完整版本: 【实验箱已收到】【AI8051U】学习打卡与心得