找回密码
 立即注册
查看: 126|回复: 2

一起学AiCube@Ai8051U 定时器0/1,INT0/INT1,中断组合应用实验打卡

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-06-16 17:25:27
已绑定手机

9

主题

37

回帖

361

积分

版主

积分
361
发表于 2025-6-16 17:25:27 | 显示全部楼层 |阅读模式
1.打开最新下载软件6.95U,打开AiCube,新建项目
截图202506161713043734.jpg
2.设置定时器和中断
截图202506161713495520.jpg
截图202506181711041965.jpg

截图202506161714167246.jpg

截图202506161714395680.jpg

截图202506161715283561.jpg

截图202506161716031171.jpg
3.创建项目成功
截图202506161716424307.jpg
4.生成KEIL项目,编译通过
截图202506181711561697.jpg
5.添加程序,编译通过
截图202506181728574255.jpg
6.测试效果
截图202506161721095707.jpg


完整代码:

//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-06-16) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h"        //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
bit int0_flag = 0; //定义 1 个位变量,INT0 事件位变量标志,记录 INT0 已产生中断
// 供主循环查询 INT0 是否已产生中断,在主循环中处理 INT0 的中断事件任务,不堵塞其他中断
bit int1_flag = 0; //定义 1 个位变量,INT1 事件位变量标志,记录 INT1 已产生中断
// 供主循环查询 INT1 是否已产生中断,在主循环中处理 INT1 的中断事件任务,不堵塞其他中断
bit t0_flag = 0; //定义 1 个位变量,T0 事件位变量标志,记录定时器 0 已产生中断
// 供主循环查询定时器 0 是否已产生中断,在主循环中处理定时器 0 的中断事件任务,不堵塞其他中断
bit t1_flag = 0; //定义 1 个位变量,T1 事件位变量标志,记录定时器 1 已产生中断
// 供主循环查询定时器 1 是否已产生中断,在主循环中处理定时器 1 的中断事件任务,不堵塞其他中断
//<<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>>
    // 在此添加主函数中运行一次的用户代码
    P40 = 0; //打开 LED 灯供电
    //<<AICUBE_USER_MAIN_CODE_END>>
    while (1)
    {
               USBLIB_OUT_Done(); //查询方式处理USB接收的数据
               //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
               // 在此添加主函数中用户主循环代码
                 if(int0_flag) //主循环中查询,INT0 是否已产生中断,是否有需要处理的 INT 0 事件
                {
                        int0_flag = 0; //清 0,INT0 事件位变量标志
                        _nop_(); //用户在此添加需要处理的事件
                        _nop_();
                }
                if(int1_flag) //主循环中查询,INT1 是否已产生中断,是否有需要处理的 INT1 事件
                {
                        int1_flag = 0; //清 0,INT1 事件位变量标志
                        _nop_(); //用户在此添加需要处理的事件
                        _nop_();
                }
                if(t0_flag) //主循环中查询,定时器 0 是否已产生中断,是否有需要处理的定时器 0 事件
                {
                        t0_flag = 0; //清 0,T0 事件位变量标志
                        printf_usb("Timer0!\r\n"); //向电脑 USB-CDC 串口助手输出“Timer0!”字符串,代表主循环在处理 T0 不急的任务
                }
                if(t1_flag) //主循环中查询,定时器 1 是否已产生中断,是否有需要处理的定时器 1 事件
                {
                        t1_flag = 0; //清 0,T1 事件位变量标志
                        printf_usb("Timer1!\r\n"); //向电脑 USB-CDC 串口助手输出“Timer1!”字符串,代表主循环在处理 T1 不急的任务
                }        
               //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
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口为准双向口模式
    PORT3_Init();                       //P3口初始化
    TIMER0_Init();                      //定时器0初始化
    TIMER1_Init();                      //定时器1初始化
    EXTI0_Init();                       //INT0初始化
    EXTI1_Init();                       //INT1初始化
    USBLIB_Init();                      //USB库初始化
        
    //<<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);
}
////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
       //<<AICUBE_USER_TIMER0_ISR_CODE1_BEGIN>>
       // 在此添加中断函数用户代码
        P00 = ~P00; //P00 灯闪烁,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
        //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
        //但时间不要太长,否则会影响其他中断事件的实时响应速度
        t0_flag = 1; // t0_flag 置 1 是通知主循环处理部分 T0 中断事件不需要特急处理的任务
        //置 1,记录定时器 0 已产生中断,供主循环查询判断有无需处理的定时器 0 任务
      //<<AICUBE_USER_TIMER0_ISR_CODE1_END>>
}
////////////////////////////////////////
// 定时器1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER1_ISR(void) interrupt TMR1_VECTOR
{
       //<<AICUBE_USER_TIMER1_ISR_CODE1_BEGIN>>
       // 在此添加中断函数用户代码
       P07 = ~P07; //P07 灯闪烁,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
       //以上程序代表部分需特急处理的中断事件,可在中断服务程序中直接处理
      //但时间不要太长,否则会影响其他中断事件的实时响应速度
      t1_flag = 1; // t1_flag 置 1 是通知主循环处理部分 T1 中断事件不需要特急处理的任务
     //置 1,记录定时器 1 已产生中断,供主循环查询判断有无需处理的定时器 1 任务
    //<<AICUBE_USER_TIMER1_ISR_CODE1_END>>
}

////////////////////////////////////////
// 外部中断INT0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI0_ISR(void) interrupt INT0_VECTOR
{
        //<<AICUBE_USER_EXTI0_ISR_CODE1_BEGIN>>
        // 在此添加中断函数用户代码
        int0_flag = 1; // int0_flag 置 1 是通知主循环处理部分 INT0 中断事件不需要特急处理的任务
        //置 1,记录 INT0 已产生中断,供主循环查询判断有无需处理的 INT0 任务
        if(INT0) //边沿中断,进入后再次判断电平从而判断是什么样的电平
        {
                // P01 = 0; //判断为高电平,则当前为上升沿,点亮 P01 端口上的 LED 灯
                // _nop_(); //可以在这里插入断点进行观察现象
                // P01 = 1; //关闭 LED 灯
                P01 = ~P01; //如果用外部按键触发 INT0,则需另外添加去抖动处理
        }
        else
        {
                // P06 = 0; //判断为低电平,则当前为下降沿,点亮 P06 端口上的 LED 灯
                // _nop_(); //可以在这里插入断点进行观察现象
                // P06 = 1; //关闭 LED 灯
                P06 = ~P06; //如果用外部按键触发 INT0,则需另外添加去抖动处理
        }
    //<<AICUBE_USER_EXTI0_ISR_CODE1_END>>
}

////////////////////////////////////////
// 外部中断INT1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI1_ISR(void) interrupt INT1_VECTOR
{
        //<<AICUBE_USER_EXTI1_ISR_CODE1_BEGIN>>
        // 在此添加中断函数用户代码
        int1_flag = 1; // int1_flag 置 1 是通知主循环处理部分 INT1 中断事件不需要特急处理的任务
        //置 1,记录 INT1 已产生中断,供主循环查询判断有无需处理的 INT1 任务
        // P02= 0; //点亮 P02 端口上的 LED 灯
        // _nop_(); //可以在这里插入断点观察现象
        // P02 = 1; //关闭 LED 灯
        P02 = ~P02; //如果用外部按键触发 INT1,则需另外添加去抖动处理
       //<<AICUBE_USER_EXTI1_ISR_CODE1_END>>
}


////////////////////////////////////////
// P3口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_Init(void)
{
    SetP3nQuasiMode(0xf0);              //设置P3.7,P3.6,P3.5,P3.4为准双向口模式
    SetP3nHighZInputMode(0x0f);         //设置P3.3,P3.2,P3.1,P3.0为高阻输入模式

    EnableP3nPullUp(0x0c);              //使能P3.3,P3.2内部上拉电阻
    DisableP3nPullUp(0xf3);             //关闭P3.7,P3.6,P3.5,P3.4,P3.1,P3.0内部上拉电阻
    DisableP3nPullDown(BIT_ALL);        //关闭P3内部下拉电阻
    DisableP3nSchmitt(BIT_ALL);         //使能P3施密特触发
    SetP3nSlewRateNormal(BIT_ALL);      //设置P3一般翻转速度
    SetP3nDrivingNormal(BIT_ALL);       //设置P3一般驱动能力
    SetP3nDigitalInput(BIT_ALL);        //使能P3数字信号输入功能

    //<<AICUBE_USER_PORT3_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_PORT3_INITIAL_END>>
}

////////////////////////////////////////
// 定时器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 (13位不自动重载模式)
    TIMER0_DisableGateINT0();           //禁止定时器0门控
    TIMER0_SetIntPriority(0);           //设置中断为最低优先级
    TIMER0_EnableInt();                 //使能定时器0中断
    TIMER0_SetPrescale(T0_PSCR);        //设置定时器0的8位预分频
    TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
    TIMER0_Run();                       //定时器0开始运行

    //<<AICUBE_USER_TIMER0_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_TIMER0_INITIAL_END>>
}

////////////////////////////////////////
// 定时器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 (13位不自动重载模式)
    TIMER1_DisableGateINT1();           //禁止定时器1门控
    TIMER1_SetIntPriority(0);           //设置中断为最低优先级
    TIMER1_EnableInt();                 //使能定时器1中断
    TIMER1_SetPrescale(T1_PSCR);        //设置定时器1的8位预分频
    TIMER1_SetReload16(T1_RELOAD);      //设置定时器1的16位重载值
    TIMER1_Run();                       //定时器1开始运行

    //<<AICUBE_USER_TIMER1_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_TIMER1_INITIAL_END>>
}

////////////////////////////////////////
// 外部中断INT0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI0_Init(void)
{
    INT0_FallingRisingInt();            //设置外部中断为边沿中断 (上升沿+下降沿)
    INT0_SetIntPriority(0);             //设置中断为最低优先级
    INT0_EnableInt();                   //使能外部中断

    //<<AICUBE_USER_EXTI0_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_EXTI0_INITIAL_END>>
}

////////////////////////////////////////
// 外部中断INT1初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void EXTI1_Init(void)
{
    INT1_FallingInt();                  //设置外部中断为下降沿中断
    INT1_SetIntPriority(0);             //设置中断为最低优先级
    INT1_EnableInt();                   //使能外部中断

    //<<AICUBE_USER_EXTI1_INITIAL_BEGIN>>
    // 在此添加用户初始化代码
    //<<AICUBE_USER_EXTI1_INITIAL_END>>
}

////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
    usb_init();                         //初始化USB模块
    USB_SetIntPriority(0);              //设置中断为最低优先级
    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设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
    if (bUsbOutReady)                   //查询是否有接收到USB主机发送数据
    {
        //<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
        // 在此添加中断函数用户代码
        USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
                                        //在此处添加用户处理接收数据的代码
        //<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
        usb_OUT_done();                 //当前包的数据处理完成,通知USB主机可以发送下一包数据
    }
}


回复

使用道具 举报 送花

3

主题

534

回帖

-221

积分

等待验证会员

积分
-221
发表于 2025-6-16 17:33:00 | 显示全部楼层
合作学习之“AiCube@Ai8051U定时器与中断组合应用实验打卡”  

1. 打开最新下载软件  
第一步:打开最新下载软件  
打开 AiCube@Ai8051U 软件并打开 AiCube。  

2. 安装项目  
第二步:安装项目  
在 AiCube 中新建一个项目。  

3. 设置定时器与中断  
第三步:设置定时器与中断  
打开 AI8051U,进入 AI Cube 中的项目管理界面。  
在定时器(INT0)或中断(INT1)模块中设置相应的配置参数。  
根据项目需求,配置定时器的触发条件和中断的处理逻辑。  

4. 创建项目成功标志  
第四步:创建项目成功标志  
在项目成功界面中,添加一个标志变量 bit int0flag = 0;,用于后续查询 INT0 已产生的中断。  

5. 生成KeIL项目  
第五步:生成KeIL项目  
在项目成功界面中,生成并编译KeIL项目。  

6. 编译通过验证  
第六步:验证编译结果  
通过KeIL的编译结果查看项目是否成功编译,确认定时器与中断组合应用正常运行。  

7. 测试效果  
第七步:测试实验效果  
根据项目需求,进行定时器与中断组合应用的测试,验证其功能正确性。  

8. 完整代码示例  
第八步:提供完整代码示例  
以下为完整代码示例:  

```cpp
// 完整代码:  
// 斜杠写法:  
// 斜杠写法:  
// 斜杠写法:  
// 斜杠写法:  
// 斜杠写法:  
// 斜杠写法:  
// 斜杠写法:  
// 斜杠写法:  

// 斜杠写法:  
// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:  

// 斜杠写法:

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

534

回帖

-221

积分

等待验证会员

积分
-221
发表于 2025-6-16 17:33:00 | 显示全部楼层
AI Cube 和中断组合应用实验报告

实验目的
本次实验旨在学习如何使用AIcube和Keil进行中断组合应用的设置与编译,理解中断的配置和处理机制。实验将通过创建一个包含定时器和中断的组合应用,掌握定时器的配置方法以及中断的处理逻辑。

工具和软件
1. AI Cube:用于定时器和中断的配置和设置。
2. Keil:用于程序的编译和调试。
3. AI Cube 和Keil:主要工具,用于本实验的完成。

实验步骤

1. 打开最新软件
打开AIcube并新建一个项目。

2. 设置定时器和中断
1. 打开AIcube并打开设置。
2. 确保定时器和中断功能被启用。
3. 设置定时器的类型(如定时器1)和中断类型(如中断1)。
4. 定时器和中断的配置完成后,点击“确定”保存。

3. 创建项目成功标志
1. 确保项目在AIcube中成功运行。
2. 保存项目完成信息。

4. 生成Keil项目并添加程序
1. 打开AIcube并打开“项目生成”功能。
2. 选择“新项目”并指定项目名称和描述。
3. 确保项目中包含所需程序。
4. 生成Keil项目文件。

5. 编译并测试
1. 打开Keil并加载生成的项目文件。
2. 编译程序,确保程序能够正确运行。
3. 测试程序的功能,观察运行结果。

6. 测试效果
1. 通过视频验证程序的运行效果。
2. 检查程序的响应时间、错误处理以及中断的响应。

注意事项
设备配置:确保AIcube和Keil的设备配置正确,包括电源、电源管理器等。
定时器和中断配置:定时器和中断的配置必须正确,否则会影响程序的运行。
测试结果:测试结果应与预期一致,若有异常,需检查程序或配置。

完整代码
  1. keil
  2. // 完整代码:完整代码
  3. //
  4. // 料题:mainc
  5. // 装件:mainc
  6. // 声明:文件Version: V10
  7. KEILproject mainc
  8.   // 定时器1是否已启动
  9.   bit int0flag = 0;
  10.   // 定时器1的中断状态
  11.   bit int0中断 = 0;
  12.   // 定时器1的中断处理函数
  13.   function functionint0() : void {
  14.     // 检查定时器1是否已启动
  15.     if (int0flag != 0) {
  16.       // 配置中断处理函数
  17.       functionint0 interrupt
  18.         {
  19.           // 检查中断是否处理
  20.           if (int0中断 != 0) {
  21.             // 处理中断
  22.             int0flag = 0;
  23.             int0中断 = 0;
  24.           }
  25.         };
  26.       }
  27.     }
  28.   }
  29.   // 编译主程序
  30.   compile
  31.   // 路径
  32.   path / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / coroutine:
复制代码
// 1. 选择以下选项中适合的动画风格。
选项:
A. 恒定型
B. 变体型
C. 传统型
D. 未来型
答案:D

  1. markdown
  2. 答案:D. 未来型
  3. 在设计AI Cube 和中断组合应用时,未来型设计通常具有以下特点:
  4. 1. 动态和创新:未来型设计注重技术的前沿性和创新性,能够适应现代技术发展,结合最新的技术趋势和行业需求。
  5.    
  6. 2. 开放性设计:未来型设计更加注重灵活性和可定制性,用户可以根据需求进行调整和优化,适用于多种场景和用户群体。
  7. 3. 用户体验:未来型设计通常更注重用户界面友好和交互流畅,能够在用户阅读和使用时更加便捷。
  8. 4. 技术领先:未来型设计结合先进的技术,如AI、区块链、云技术等,提供更高效、可靠和可靠的解决方案。
  9. 综上所述,选择D. 未来型是最合适的选项,因为它能够满足现代技术对用户体验和功能需求的需求,提供更优的解决方案。
复制代码

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-28 23:50 , Processed in 1.559562 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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