romeo 发表于 2026-1-14 16:35:47

完成AI8051U AIcube实验三以及不掉电下载,芯片进步太快了,8051非常强大,好用!
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2026-01-14) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>


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


//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>


//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>




////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}

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

    //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
    // 在此添加用户预初始化代码
    //<<AICUBE_USER_PREINITIAL_CODE_END>>

    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口为准双向口模式

    PORT4_Init();                     //P4口初始化
    delay_ms(1);
    USBLIB_Init();                      //USB库初始化
    delay_ms(1);

    //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_INITIAL_CODE_END>>

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

////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
    do
    {
      NOP(34);                        //(MAIN_Fosc + 500000) / 1000000 - 6
    } while (--us);
}


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

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

////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
    SetP4nInitLevelHigh(PIN_ALL);       //设置P4初始化电平
    SetP4nQuasiMode(PIN_7 | PIN_5 | PIN_4 | PIN_3 | PIN_2 | PIN_1 | PIN_0); //设置P4.7,P4.5,P4.4,P4.3,P4.2,P4.1,P4.0为准双向口模式
    SetP4nPushPullMode(PIN_6);          //设置P4.6为推挽输出模式

    DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
    DisableP4nPullDown(PIN_ALL);      //关闭P4内部下拉电阻
    DisableP4nSchmitt(PIN_ALL);         //使能P4施密特触发
    SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
    SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
    SetP4nDigitalInput(PIN_ALL);      //使能P4数字信号输入功能

    //<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT4_INITIAL_END>>
}

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

    //<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
       
    //<<AICUBE_USER_USBLIB_INITIAL_END>>
}

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
      WDT_Clear();                  //清看门狗定时器 (防止硬件自动使能看门狗)
}

////////////////////////////////////////
// USB设备接收数据中断回调程序
// 入口参数: 无
// 函数返回: 无
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Callback(void)
{
    //<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
   // USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
    // 在此处添加用户处理接收数据的代码
           if (UsbOutBuffer == 6)
      printf_usb("Hello World !\r\n");        //接收到数据6后打印“Hello World !”
    else if (UsbOutBuffer == 7)
      printf_usb("China !\r\n");                //接收到数据7后打印“China !”

    //<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
}



//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>

romeo 发表于 2026-1-14 16:37:17

补充楼上!

romeo 发表于 2026-1-14 16:37:18

补充楼上!

romeo 发表于 2026-1-14 21:52:56

补充学习第一、二集的心得,学习和使用 AI8051U 单片机,让我深刻感受到了它在硬件和工具方面的强大之处。硬件上,1T 内核带来的性能提升和丰富的外设资源,使得 AI8051U 能够胜任各种复杂的应用场景;工具上,Keil C51 和 STC-ISP 等开发工具的便捷性和高效性,极大地提高了开发效率。同时,AI8051U 还具有成本低、功耗低、抗干扰性强等优点,是一款非常适合初学者和项目开发的单片机。通过对 AI8051U 的学习,我不仅掌握了单片机的基本原理和开发方法,还提高了自己的实践能力和解决问题的能力,为今后的学习和工作打下了坚实的基础。

romeo 发表于 2026-1-14 21:58:34

学习了第四集不掉电下载,USB不停电下载,太方便了今后不用每次都去麻烦的操作,以下是简单的示范
#include <AI8051U.H>
#include "ai_usb.h"

sbit k3 = P3^2;
sbit k4 = P3^3;
sbit led0 = P2^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();
        EA = 1;
       
       
        while(1)
        {
                if(k3 == 0)
                {
                led0 = 0;
                }
                else{
                led0 = 1;
                }
        }

}

romeo 发表于 2026-1-14 22:09:37

学习了第五集完这门 C 语言基础课程后,我又一次深刻感受到了这门语言的魅力与强大。它不仅是计算机科学的基石,更是通往编程世界的必经之路。虽然已经在学校学过了,但无疑又是一次深刻的理解,又有了新的收获。以下是我对课程内容的学习感悟和具体收获。比如如何根据数据的性质和用途选择合适的数据类型,如 int、float、char 等。理解了不同数据类型在内存中占用的空间大小和取值范围,这对于编写高效的程序至关重要。#include <stdio.h>

int main() {
    // 定义不同类型的变量
    int age = 25;          // 整型变量,存储年龄
    float height = 1.75f;// 浮点型变量,存储身高,注意后缀f
    char initial = 'J';    // 字符型变量,存储姓名首字母

    // 使用printf函数输出变量的值
    printf("年龄: %d\n", age);
    printf("身高: %.2f米\n", height); // %.2f表示保留两位小数
    printf("姓名首字母: %c\n", initial);

    return 0;
}
又比如C 语言丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、赋值运算符等。理解了运算符的优先级和结合性,这对于正确构建表达式至关重要。#include <stdio.h>

int main() {
    int a = 10, b = 3;

    // 算术运算
    printf("a + b = %d\n", a + b);
    printf("a - b = %d\n", a - b);
    printf("a * b = %d\n", a * b);
    printf("a / b = %d\n", a / b); // 整数除法,结果为3
    printf("a %% b = %d\n", a % b); // 取余运算,结果为1

    // 关系运算和逻辑运算
    int is_greater = (a > b);
    int is_equal = (a == b);
    int logical_and = (a > 5) && (b < 5); // 逻辑与
    int logical_or = (a > 15) || (b < 5); // 逻辑或

    printf("a > b 吗? %d\n", is_greater); // 1表示真,0表示假
    printf("a == b 吗? %d\n", is_equal);
    printf("(a > 5) && (b < 5) = %d\n", logical_and);
    printf("(a > 15) || (b < 5) = %d\n", logical_or);

    return 0;
}

romeo 发表于 2026-1-14 22:19:54

学习了第六集I/O口输入输出,AI8051U 单片机 I/O 口输入输出的过程,是我从 “理论认知” 走向 “实践应用” 的关键一步。通过课程学习与项目实践,我不仅掌握了 I/O 口的配置方法、工作模式、时序控制等核心技能,更深入理解了 AI8051U 的硬件特性与嵌入式开发的底层逻辑。从引脚复用、驱动能力、抗干扰设计到与外设的协同工作,每一个知识点都在实践中得到了验证与深化。#include "ai8051u.h"                        //调用头文件
#include "stc32_stc8_usb.h"                //调用头文件
#include "intrins.h"                        //d调用头文件

#define u8unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)       
       
u8 state = 0;                                        //初始状态

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

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

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


void main(void)
{
    WTST = 0;                                                                                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
    CKCON = 0;                                                                                 //提高访问XRAM速度
       
    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;
       
        P40 = 0;
       
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
       
        while(1)
        {
               
      if (bUsbOutReady)                                                        //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();                                                        //
      }
               
//                //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
//                if( P32 == 0 )                                                                //判断P32按钮是否按下
//                {
//                        P00 = 0;
//                }
//                else
//                {
//                        P00 = 1;
//                }
//               
               
               
//                //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
//                if( P32 == 1 )                                                                //判断P32按钮是否按下
//                {
//                        P00 = 0;
//                }
//                else
//                {
//                        P00 = 1;
//                }
               
                //任务3:按一下灯亮,按一下灯灭
                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P32 == 0 )
                        {
                                state = !state;                                                //变量取反 0 1 0 1 0 1
                                P00 = state;
                                printf("state:%d\r\n",(int)state);
                               
                                while( P32 == 0 );                                        //等待P32松开
                               
                        }
                }
       
               
        }
}AI8051U 的 I/O 口就像一把 “钥匙”,为我打开了嵌入式系统与外部世界交互的大门 —— 它让我明白,嵌入式开发不是孤立的代码编写,而是硬件与软件的深度融合。未来在拓展宠物喂食器的蓝牙远程控制、重量检测等功能时,我也将基于本次所学的 I/O 口操作逻辑,结合 AI8051U 的串口、ADC 等外设,继续探索 “硬件配置→软件实现→功能拓展” 的全流程开发,在实践中不断提升自己的嵌入式系统设计能力。
页: 1 [2]
查看完整版本: 定时器中断 | 集中在这个帖子打卡