jdgcxyprm 发表于 2025-4-6 10:15:21

学习《Ai8051U教学视频》学习心得

感谢官方 免费+包邮 的 Ai8051U 实验箱。
借此实验箱学习一下 Ai8051U 的进阶操作,
在本贴记录一下学习过程。
先来个跑马灯开工仪式:

国芯人工智能 发表于 2025-4-6 10:18:00

学习《Ai8051U教学视频》学习心得

首先,衷心感谢STC官方提供的免费且包邮的Ai8051U实验箱,这为我们深入学习Ai8051U的进阶操作提供了极大的便利。借此机会,我将在此记录我的学习过程,并分享一些初步的心得体会。

1. 实验箱开箱与初步体验

收到实验箱后,首先进行了开箱检查。实验箱内包含了Ai8051U开发板、配套的电源适配器、USB数据线以及详细的使用手册。整体包装精致,配件齐全,体现了STC对用户体验的重视。

2. 跑马灯实验:开工仪式

作为学习的起点,我选择了经典的“跑马灯”实验。这一实验不仅能够帮助我们熟悉Ai8051U的基本操作,还能通过直观的LED灯闪烁效果,增强学习的趣味性。

2.1 实验步骤
1. 硬件连接:将Ai8051U开发板通过USB数据线连接到电脑,确保电源供应正常。
2. 软件环境搭建:安装STC官方提供的开发环境,并配置好编译器与调试工具。
3. 编写代码:根据实验手册,编写简单的跑马灯程序,控制开发板上的LED灯依次点亮和熄灭。
4. 程序下载与调试:将编写好的程序下载到Ai8051U开发板,观察LED灯的运行效果,并进行必要的调试。

2.2 实验结果
通过上述步骤,成功实现了跑马灯效果。LED灯按照预设的顺序依次点亮和熄灭,验证了Ai8051U的基本控制功能。

3. 学习心得

3.1 硬件与软件的协同
Ai8051U实验箱的硬件设计简洁而实用,配合STC官方提供的软件工具,能够快速搭建起开发环境。这种硬件与软件的协同,极大地提高了学习效率。

3.2 编程思维的培养
通过跑马灯实验,我深刻体会到了编程思维的重要性。从逻辑设计到代码实现,每一步都需要严谨的思考和细致的操作。这不仅锻炼了我的编程能力,也增强了我对嵌入式系统的理解。

3.3 进阶学习的展望
跑马灯实验只是Ai8051U学习的起点,接下来我计划深入学习其更高级的功能,如定时器、中断、串口通信等。通过不断实践和探索,我相信能够掌握Ai8051U的更多应用技巧,为未来的项目开发打下坚实的基础。

4. 结语

再次感谢STC官方提供的Ai8051U实验箱,这为我提供了一个宝贵的学习平台。通过跑马灯实验,我不仅熟悉了Ai8051U的基本操作,也激发了我对嵌入式系统学习的热情。期待在接下来的学习中,能够有更多的收获和成长。

后续学习计划:
深入学习Ai8051U的定时器与中断功能
探索串口通信的实现与应用
结合实际项目,进行综合应用开发

希望通过不断的学习与实践,能够将Ai8051U的强大功能发挥到极致,为未来的技术发展贡献自己的力量。

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

jdgcxyprm 发表于 2025-4-6 10:57:08

#include <AI8051U.H>
#include "ai_usb.h"

u8 ucLed = 0xfe;

void Led_Disp(u8 ucLed)
{
        P40 = 0;
        P0 = ucLed;
}

void Delay1ms(void)        //@40.000MHz
{
        unsigned long edata i;

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

void delay(u16 xms)
{
        u16 i;
        for(i = xms; i > 0; i--)
        {
                Delay1ms();
        }
}
void main()
{
        EAXFR = 1;
        WTST = 0;
        CKCON = 0;
       
        P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;
       
        usb_init();
        EA = 1;
       
        while(1)
        {
                if(bUsbOutReady)
                {
                        usb_OUT_done();
                }
                Led_Disp(ucLed);
                ucLed = _crol_(ucLed,1);
                delay(1000);
        }

}

jdgcxyprm 发表于 2025-4-6 10:59:19

学习心得:
1 硬件与软件的协同
Ai8051U实验箱的硬件设计简洁而实用,配合STC官方提供的软件工具,能够快速搭建起开发环境。这种硬件与软件的协同,极大地提高了学习效率。
2 编程思维的培养
通过跑马灯实验,我深刻体会到了编程思维的重要性。从逻辑设计到代码实现,每一步都需要严谨的思考和细致的操作。这不仅锻炼了我的编程能力,也增强了我对嵌入式系统的理解。
3 进阶学习的展望
跑马灯实验只是Ai8051U学习的起点,接下来我计划深入学习其更高级的功能,如定时器、中断、串口通信等。通过不断实践和探索,我相信能够掌握Ai8051U的更多应用技巧,为未来的项目开发打下坚实的基础。

jdgcxyprm 发表于 2025-4-6 12:13:57

第六课练习程序#include <AI8051U.H>
#include "ai_usb.h"

u8 ucLed[] = {0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
u8 Key_Num = 0;

void Led_Disp(u8 ucLed)
{
        P40 = 0;
        P0 = ucLed;
}

//void Delay1ms(void)        //@40.000MHz
//{
//        unsigned long edata i;

//        _nop_();
//        _nop_();
//        _nop_();
//        i = 9998UL;
//        while (i) i--;
//}

//void delay(u16 xms)
//{
//        u16 i;
//        for(i = xms; i > 0; i--)
//        {
//                Delay1ms();
//        }
//}
void main()
{
        EAXFR = 1;
        WTST = 0;
        CKCON = 0;
       
        P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;
       
        usb_init();
        EA = 1;
       
        while(1)
        {
                if(bUsbOutReady)
                {
                        usb_OUT_done();
                }
//        任务1:按下P32按钮灯亮,松开P32按钮灯灭;
//                if(P32 == 0)
//                {
//                        Led_Disp(0x00);
//                }
//                else
//                {
//                        Led_Disp(0xff);
//                }
//        任务2:按下P32按钮灯灭,松开P32按钮灯亮;
//                if(P32 == 0)
//                {
//                        Led_Disp(0xff);
//                }
//                else
//                {
//                        Led_Disp(0x00);
//                }
               
//        课后小练1:按一下灯亮,按一下灯灭;
//                if(P32 == 0)
//                {
//                        delay(20);
//                        if(P32 == 0)
//                        {
//                                while(P32 == 0);
//                                ucLed = ~ucLed;
//                        }               
//                }
//                Led_Disp(ucLed);
//        课后任务2:按一下亮一颗灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法)
                if(P32 == 0)
                {
                        delay(20);
                        if(P32 == 0)
                        {
                                while(P32 == 0);
                                if(++Key_Num > 8)Key_Num = 0;
                                Led_Disp(ucLed);
                        }               
                }
               
        }

}

jdgcxyprm 发表于 2025-4-6 12:36:37

第7课定时器程序,主要完成LED三秒取反一次,期间任意按下按钮,串口打印次数#include <AI8051U.H>
#include "ai_usb.h"

#define u8 unsigned char
#define u16 unsigned int
       
u8 state = 0x00;
u8 Key_Count = 0;



void Led_Disp(u8 ucLed)
{
        P40 = 0;
        P0 = ucLed;
}

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

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

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

void main()
{
        EAXFR = 1;
        WTST = 0;
        CKCON = 0;
       
        P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;
       
        usb_init();
        Timer0_Init();
        EA = 1;
       
        while(1)
        {
                if(bUsbOutReady)
                {
                        usb_OUT_done();
                }
                if(P32 == 0)
                {
                        Delay20ms();
                        if(P32 == 0)
                        {
                                while(P32 == 0);
                                Key_Count++;
                                printf_usb("按键次数\xfd %d",(int)Key_Count);
                        }
                }
       
        }

}

void Timer0_Isr(void) interrupt 1
{
        state = ~state;
        Led_Disp(state);
}

jdgcxyprm 发表于 2025-4-12 17:34:02

为什么使用AiCube框架生成的CDC无法实现不掉电下载呢

jdgcxyprm 发表于 2025-4-19 09:25:08

今天学习了RTC,非常棒////////////////////////////////////////
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-04-19) 创建文件
////////////////////////////////////////

#include "config.h"                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件

bit t0_flag = 0;
bit t1_flag = 0;
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    SYS_Init();

        P40 = 0;
    while (1)
    {
      if(t0_flag)
                {
                        t0_flag = 0;
                        printf_usb("Timer0!\r\n");
                }
                if(t1_flag)
                {
                        t1_flag = 0;
                        printf_usb("Timer1!\r\n");
                }
                USBLIB_OUT_Done();            //查询方式处理USB接收的数据
    }
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    P0M0 = 0x00; P0M1 = 0x00;         //初始化P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;         //初始化P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;         //初始化P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;         //初始化P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;         //初始化P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;         //初始化P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;         //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;         //初始化P7口为准双向口模式

    TIMER0_Init();                      //定时器0初始化
    TIMER1_Init();                      //定时器1初始化
    USBLIB_Init();                      //USB库初始化

    EnableGlobalInt();                  //使能全局中断
}

////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
      i = MAIN_Fosc / 6000;
      while (--i);
    } while (--ms);
}

////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
        P00 = ~P00;
        t0_flag = 1;
}

////////////////////////////////////////
// 定时器1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER1_ISR(void) interrupt TMR1_VECTOR
{
       
        P07 = ~P07;
        t1_flag = 1;
}


////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
    usb_init();                         //初始化USB模块
    USB_SetIntPriority(0);            //设置中断为最低优先级
    set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
}

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
}

////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
    if (bUsbOutReady)                   //查询是否有接收到USB主机发送数据
    {
      USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
      usb_OUT_done();               //当前包的数据处理完成,通知USB主机可以发送下一包数据
    }
}

////////////////////////////////////////
// 定时器0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_Init(void)
{
#define T0_PSCR         102
#define T0_RELOAD       (65536 - (float)SYSCLK / 12 / (T0_PSCR + 1) * 2 / 1)

    TIMER0_TimerMode();               //设置定时器0为定时模式
    TIMER0_12TMode();                   //设置定时器0为12T模式
    TIMER0_Mode0();                     //设置定时器0为模式0 (16位自动重载模式)
    TIMER0_DisableGateINT0();         //禁止定时器0门控
    TIMER0_SetIntPriority(0);         //设置中断为最低优先级
    TIMER0_EnableInt();               //使能定时器0中断
    TIMER0_SetPrescale(T0_PSCR);      //设置定时器0的8位预分频
    TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
    TIMER0_Run();                     //定时器0开始运行
}

////////////////////////////////////////
// 定时器1初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER1_Init(void)
{
#define T1_PSCR         25
#define T1_RELOAD       (65536 - (float)SYSCLK / 12 / (T1_PSCR + 1) * 500 / 1000)

    TIMER1_TimerMode();               //设置定时器1为定时模式
    TIMER1_12TMode();                   //设置定时器1为12T模式
    TIMER1_Mode0();                     //设置定时器1为模式0 (16位自动重载模式)
    TIMER1_DisableGateINT1();         //禁止定时器1门控
    TIMER1_SetIntPriority(0);         //设置中断为最低优先级
    TIMER1_EnableInt();               //使能定时器1中断
    TIMER1_SetPrescale(T1_PSCR);      //设置定时器1的8位预分频
    TIMER1_SetReload16(T1_RELOAD);      //设置定时器1的16位重载值
    TIMER1_Run();                     //定时器1开始运行
}


jdgcxyprm 发表于 2025-4-19 09:26:10

页: [1]
查看完整版本: 学习《Ai8051U教学视频》学习心得