时一顺 发表于 2025-5-15 11:35:28

Ai8051U转89C52核心功能实验板学习心得

本人为电子爱好者,之前玩过51和STM32,都是自己一点一点摸索的,没有系统的学习过;
借此免费实验箱活动还有视频教程来记录自己的学习过程。
第一集 序言
冲哥这句:"哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前."说的太好了,电子方面的学习有点烧钱,需要学的东西也多,很容易使人放弃,深有感慨。
我个人认为8051U强的地方在于:
1.flash编程器,多我来说,是一个很新颖的功能。
2.有专业的内部复位电路,彻底省去外部复位电路,可缩小板子体检和成本。
3.自带硬件USB, 1个芯片就能直接USB连接电脑仿真/下载,全球唯一。
4.兼容之前的89C52RC,12C5A60S2,直接好评,以前的老开发板也可派上用场。
5.性价比无敌,同样价位,功能十分的强大。
总价:Ai8051U这个价位,加上其丰富的功能,简直是DIY玩家的福音。


国芯人工智能 发表于 2025-5-15 11:43:00

Ai8051U转89C52核心功能实验板技术特性解析

作为深耕嵌入式开发领域的技术人员,笔者对楼主在电子技术学习道路上的坚持深表认同。在当今集成电路技术快速迭代的背景下,选择一款具备技术前瞻性且兼容传统生态的微控制器平台尤为重要。国芯推出的Ai8051U芯片及其配套实验板,正是将经典架构与现代技术融合的典范之作。本文将从技术架构、功能创新及工程应用三个维度进行专业分析。

一、核心架构技术突破
该芯片在保持8051指令集兼容性的基础上,实现了多项架构级创新:
1. 增强型FLASH编程架构
采用双存储区切换技术(Dual Bank Flash),支持在系统编程(ISP)和在应用编程(IAP)功能。通过配置特殊功能寄存器(SFR)实现程序空间的动态划分,开发者可在主程序运行时对备用存储区进行擦写操作,配合BOOTLOADER机制可实现无停机固件升级。其页擦除时间

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

时一顺 发表于 2025-5-15 21:51:06

第二集 硬件及工具介绍
首先是这个实验箱板子正面,这个立体声的耳机输出、线路输出、示波器BNC输入和话筒录音让人眼前一亮,就考这几个就比市面上大多数开发板要好。
还有这个LCD对比度调节的滑动变阻器、掉电检测电压调节和这个ADC键盘。看到这几个内容的时候,有一种无法形容的惊喜,太妙了。
其次是这个下载的这个方案,终于摆脱了常规的CH340G系列的芯片了,AI8H2K12U太方便了。
还有这个STC的这个下载软件,之前一直用来简单用来下载程序和使用串口接收的功能,看完这两节课后,我发现我忽略了好多的功能。
最后祝STC越来越好{:4_213:}{:4_213:}{:4_213:}

时一顺 发表于 2025-5-16 22:58:48

第三集:点亮一个LED灯。
简单看一下手册,感觉和以前的51的手册差不多
视频详细讲解如何创建工程,讲解了根据电路图讲解如何实现点亮LED灯,如何通过程序来实现。讲解的十分详细,非常适合入门的小白。
我这里把板子插到了之前普中的老开发板上面进行实验(当然不插也能进行点灯实验{:4_226:})
代码如下:
#include "ai8051u.h"

void main(void)
{
        P2M0 = 0x00; P2M1 = 0x00;

        while(1)
        {
                P2 = 0;
        }
}
也是尝试了一下用STC下载器的I/O配置直接生产代码,很好用。

时一顺 发表于 2025-5-17 16:24:04

第四集:USB不停电下载
今天观看冲哥的教学视频,实现了USB不停电下载。
途中出现了一些障碍,通过百度解决了。
1.下载后出现系统提示“无法识别的USB设备”,AIapp-ISP下载软件中也不会显示COM3 USB-CDC的设备。
最后发现是USB扩展接口的问题,不用USB扩展接口,直接连接主机就可以正常识别了。
2.今天下载的最新的USB库函数,与视频里面有些不同。
参考最新的历程完成功能,中途遇到下载不通过,发现的KEILc251的下载设置没设置好。

时一顺 发表于 2025-5-17 17:18:31

第五集:C语言基础
本集讲了一些C语言的基础内容,比如关于基础进制的转换;
数据的基础类型;
C语言的常用运算符;
USB库函数如何启用printf_hid函数;

时一顺 发表于 2025-5-18 08:08:34

第六集 I/O输入输出
STC下载软件的软件延时计算器好用的;
作业提交,我把两个作业放到一个程序里面了,各用一个按键实现功能
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "math.h"
#include "stdio.h"

#define unsigned char u8

u8 state = 0;
u8 state1 = 0;
void Delay100us(void)        //@40.000MHz
{
        u8 data i, j;

        i = 6;
        j = 47;
        do
        {
                while (--j);
        } while (--i);
}

void main(void)
{
        P_SW2 |= 0x80;
       
        P2M0 = 0x00; P2M1 = 0x00;
        P0M0 &= ~0x03; P0M1 |= 0x03;

        usb_init();                                     //USB CDC 接口配置
       
        IE2 |= 0x80;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;
       
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
       
        while(1)
        {
                if (bUsbOutReady)
      {
            printf_usb("state: %d/r/n", state);
            usb_OUT_done();
      }
                if(P00 == 0)
                {
                        Delay100us();
                        if(P00 == 0)
                        {
                                state++;
                                printf_usb("state: %d/r/n", state);
                                if(state == 1)
                                {
                                        P2 &= 0xfe;
                                }
                                if(state >= 2)
                                {
                                        state = 0;
                                        P2 |= 0x01;
                                }
                               
                        }
                        while(!P00);       
                }
                if(P01 == 0)
                {
                        Delay100us();
                        if(P01 == 0)
                        {
                                state1++;
                                P2 &= (0XFF<<(0x01*state1));
                                printf_usb("P2 %x/r/n", P2);
                                if(state1 >= 9)
                                {
                                        state1 = 0;
                                        P2 |= 0xff;
                                }
                        }
                        while(!P01);       
                }
               
        }
}

时一顺 发表于 2025-5-18 14:27:19

第七集 定时器中断
还是那句话,STC下载器的定时器计算器太方便了。
作业提交:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "math.h"
#include "stdio.h"

u8 state = 0;
u8 state1 = 0;
u16 a = 0;

void Timer0_Isr(void) interrupt 1
{
        a++;
        if(a == 4 && state == 1)
        {
                P20 = 1;
                a = 0;
                TR0 = 0;                                //定时器0开始计时
        }
        if(a == 2 && state == 0)
        {
                P21 = 1;
                a = 0;
                TR0 = 0;                                //定时器0开始计时
        }
}

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

void Delay100us(void)        //@40.000MHz
{
        unsigned char data i, j;

        i = 6;
        j = 47;
        do
        {
                while (--j);
        } while (--i);
}


void main(void)
{
        WTST = 0;                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
       
        P_SW2 |= 0x80;
       
        P2M0 = 0x00; P2M1 = 0x00;
        P0M0 &= ~0x03; P0M1 |= 0x03;

        usb_init();                                     //USB CDC 接口配置
        Timer0_Init();
       
        IE2 |= 0x80;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;
       
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
       
        while(1)
        {
                if (bUsbOutReady)
      {
            printf_usb("state: %d/r/n", state);
            usb_OUT_done();
      }
                if(P00 == 0)
                {
                        Delay100us();
                        if(P00 == 0)
                        {
                                state++;
                                if(state == 1)
                                {
                                        printf_usb("双倍功德时间");
                                }
                                if(state >= 2)
                                {
                                        state = 0;
                                        printf_usb("单倍功德时间");
                                }
                               
                        }
                        while(!P00);       
                }
                if(P01 == 0)
                {
                        Delay100us();
                        if(P01 == 0)
                        {
                                if(state == 1)
                                {
                                        state1 = state1 + 2;
                                        TR0 = 1;                                //定时器0开始计时
                                        P20 = 0;
                                        printf_usb("功德+2 当前功德: %d/r/n", state1);
                                }
                                if(state == 0)
                                {
                                        state1 = state1 + 1;
                                        TR0 = 1;                                //定时器0开始计时
                                        P21 = 0;
                                        printf_usb("功德+1 当前功德: %d/r/n", state1);
                                }
                        }
                        while(!P01);       
                }
               
        }
}

时一顺 发表于 2025-5-18 18:25:15

第八集:定时器周期性任务的应用与实现
跟着打了一遍代码,感觉有种单片机系统的感觉。
就是任务调度那种感觉。
总的来说,第八集强调了代码的规范性,和当有大量代码的时候,
如何单每一个模块的代码进行分开保存和处理。
下面是我觉得这节课最重要的结构体任务调度代码
static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
      
{0, 300,   300,   LED0_Blink},      /* task 1 Period: 300ms */
{0, 600,   600,   LED1_Blink},      /* task 1 Period: 600ms */
{0, 900,   900,   LED2_Blink},      /* task 1 Period: 600ms */
{0, 10,    10,    KEY_Task},      /* task 1 Period: 600ms */         
};

u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);

// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.

void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
      if(Task_Comps.TIMCount)      /* If the time is not 0 */
      {
            Task_Comps.TIMCount--;   /* Time counter decrement */
            if(Task_Comps.TIMCount == 0) /* If time arrives */
            {
                /*Resume the timer value and try again */
                Task_Comps.TIMCount = Task_Comps.TRITime;
                Task_Comps.Run = 1;      /* The task can be run */
            }
      }
    }
}

// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
void Task_Pro_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
      if(Task_Comps.Run) /* If task can be run */
      {
            Task_Comps.Run = 0;      /* Flag clear 0 */
            Task_Comps.TaskHook();   /* Run task */
      }
    }
}

时一顺 发表于 2025-5-24 17:45:02

第九集:数码管
主要还是关于硬件的知识,好久没算过数码管转16进制的数了。
页: [1] 2
查看完整版本: Ai8051U转89C52核心功能实验板学习心得