找回密码
 立即注册
查看: 182|回复: 16

Ai8051U学习心得

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-07-21 07:05:28
已绑定手机

1

主题

14

回帖

27

积分

新手上路

积分
27
发表于 2026-7-10 22:11:31 | 显示全部楼层 |阅读模式
第二集 KeilAiCube-ISP的安装与配置

1 Keil与AiCube-ISP的下载
Keli 下载: Keil Product Downloads (需要填的信息乱填即可)
AiCube-ISP和Keil 中断拓展插件下载: 深圳国芯人工智能有限公司-工具软件

2 Keil与AiCube-ISP的安装
Keil建议以C251->C51->MDK的顺序安装,安装时选择同一目录如C:\Keil_v5,这时候最新的MDK中的UV4会被保留

选择File->Lincense Management...
截图202607102151044363.jpg

根据你的CID将获取到的New License ID Code (LIC)填在下面,点击Add LIC
截图202607102155568757.jpg

解压AiCube-ISP的压缩包运行AiCube-ISP主程序
芯片型号选择AI8051U-34K64
点击添加型号和头文件到Keil中添加仿真器驱动到Keil中
选择CPU指令模式 32-Bit
截图202607102224299020.jpg

解压Keil 中断拓展插件,运行拓展Keil的C代码中断号.exe
截图202607102205093939.jpg

3 使Keil与AiCube-ISP的界面清晰

打开Keil与AiCube-ISP的exe或快捷方式,点击兼容性选项卡,点击更改高 DPI 设置
截图202607102216244527.jpg

在高DPI缩放替代选项中勾选替代高DPI 缩放行为。缩放执行:并选择系统(增强)
截图202607102219554766.jpg

4 Keil使用提醒
Keil 软件中因含 0xFD 编码的汉字而出现乱码的问题: 关于Keil软件中0xFD问题的说明-深圳国芯人工智能有限公司










回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2026-7-10 22:49:57 | 显示全部楼层
写的好,坚持在一个帖子中发
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2026-07-21 08:34:57

36

主题

162

回帖

1199

积分

版主

积分
1199
发表于 2026-7-11 08:27:36 | 显示全部楼层
要 做到 USB不停电下载
要 尝试 AiCube 图形化自动配置生成程序工具
推荐优先看的:  
printf_usb("Hello World !\r\n")
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html

下载 最新的 AiCube-ISP-V6.96Z 或以上版本软件 !

深圳国芯人工智能有限公司-工具软件

下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !

下载 最新的 Ai8051U 用户手册
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf

下载 最新的 Ai8051U 实验指导书,
AiCube 图形化自动配置生成程序工具使用说明
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf


上面是 小李 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成


上面是 小赵 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-07-21 07:05:28
已绑定手机

1

主题

14

回帖

27

积分

新手上路

积分
27
发表于 2026-7-12 16:01:38 | 显示全部楼层
第三集 点亮第一个LED 擎天柱

1 代码部分
  1. #include "ai8051u.h" //调用头文件
  2. // 注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可
  3. void main(void) {
  4.     P2M0 = 0x00; // P2端口(P20-P27)为准双向口
  5.     P2M1 = 0x00;
  6.     while (1) {
  7.         P20 = 0; // P20端口输出0V
  8.         P21 = 0; // P21端口输出0V
  9.         }
  10. }
复制代码

2 代码学习

在配置 I/O 口中写到P2M0 = 0;P2M1 = 0;的含义是将其设置为准双向口
截图202607121550008803.jpg
P20 = 0;代表P20端口输出0V使P20连接的LED灯亮起
其他的灯以此类推

3 编译下载流程
点击左上角框出的全部编译按钮
确认下方编译结果为".\Objects\demo" - 0 Error(s), 0 Warning(s).
0 Error(s), 0 Warning(s)代表0错误0警告
其中.\Objects\demo是你找编译完的.hex文件的路径
截图202607121518531082.jpg

运行AiCube,点击打开程序文件按钮
根据路径.\Objects\demo找到demo.hex文件并导入
导入的文件的十六进制内容会显示在右边
截图202607121523238603.jpg
截图202607121522176729.jpg

将擎天柱用数据线连接到电脑,观察到左下角标有POWER和VCC的灯都亮起表示有电
先摁下标有P32的按钮不松手,再摁下标有POWER的按钮不松手
先松开标有POWER的按钮,再松开标有P32的按钮
其中标有POWER的按钮就是视频教程里的off按钮
截图202607121532265135.jpg

这时我们观察到扫描串口显示(HID1)USB-Writer
现在可以点击下载/编程按钮,观察到有操作成功 !(2026-07-12 15:39:03)的输出表示程序写入成功
截图202607121540081849.jpg

观察到擎天柱右下角的P20和P21的灯亮起代表程序已经在单片机上正确运行
截图202607121547055265.jpg

4 自己修改代码

4.1 代码

  1. #include "ai8051u.h" //调用头文件
  2. // 注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可
  3. void main(void) {
  4.     P2M0 = 0x00; // P2端口(P20-P27)为准双向口
  5.     P2M1 = 0x00;
  6.     while (1) {
  7.         P20 = 0; // P20端口输出0V
  8.         P21 = 0; // P21端口输出0V
  9.         P22 = 0;
  10.         P23 = 0;
  11.         P24 = 0;
  12.         P25 = 0;
  13.         P26 = 0;
  14.         P27 = 0;
  15.     }
  16. }
复制代码

4.2  效果

截图202607121600412186.jpg








回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-07-21 07:05:28
已绑定手机

1

主题

14

回帖

27

积分

新手上路

积分
27
发表于 2026-7-13 08:33:45 | 显示全部楼层
第四集 USB不停电下载 擎天柱

1 新建项目

打开 Keil 软件,选择菜单项Project->New uVision Project...
截图202607130924266681.jpg

新建项目目录,输入项目名称,并保存
截图202607130926186304.jpg

选择STC MCU Database
选择AI下的Ai8051U 32Bit
截图202607130928153372.jpg

在项目目录下新建main.c文件,将代码复制进去
下载USB库文件: 深圳国芯人工智能有限公司-库函数
ai_usb.hSTC-CDC库文件里的stc_usb_cdc_32g.LIB复制到项目中
截图202607130935115390.jpg

右键Source Group 1选择Add Existing Files to Group 'Source Group 1' ...
截图202607130938147074.jpg

main.cstc_usb_cdc_32g.LIB添加进来
截图202607130939125926.jpg

点击Options for Target ...
截图202607130944023487.jpg

按如下演示进行配置
截图202607130946508621.jpg
截图202607130947499084.jpg
截图202607130949224480.jpg

点击编译按钮完成编译

2 代码部分
注意:该代码基于AI8051U.pdf中的3.9.1 范例程序1(查询方式调用 CDC/HID 库函数)修改得到
  1. #include "ai8051u.h"
  2. #include "ai_usb.h"
  3. // 注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,本节课程的其余内容(USB不停电下载)均通用!
  4. void main(void) {
  5.     EAXFR = 1; // 允许访问扩展的特殊寄存器,XFR
  6.     WTST = 0;  // 设置取程序代码等待时间,
  7.                // 赋值为 0 表示不等待,程序以最快速度运行
  8.     CKCON = 0; // 设置访问片内的 xdata 速度,
  9.                // 赋值为 0 表示用最快速度访问,
  10.     P0M1 = 0x00;    P0M0 = 0x00; // 设置 P0 口为准双向口模式
  11.     P1M1 = 0x00;    P1M0 = 0x00; // 设置 P1 口为准双向口模式
  12.     P2M1 = 0x00;    P2M0 = 0x00; // 设置 P2 口为准双向口模式
  13.     P3M1 = 0x00;    P3M0 = 0x00; // 设置 P3 口为准双向口模式
  14.     P4M1 = 0x00;    P4M0 = 0x00; // 设置 P4 口为准双向口模式
  15.     P5M1 = 0x00;    P5M0 = 0x00; // 设置 P5 口为准双向口模式
  16.     P6M1 = 0x00;    P6M0 = 0x00; // 设置 P6 口为准双向口模式
  17.     P7M1 = 0x00;    P7M0 = 0x00; // 设置 P7 口为准双向口模式
  18.     usb_init(); // 调用 USB 初始化函数,不需要立即判断电脑已正确识别到 USB 从设备
  19.     /* USB 型单片机从设备,如需要主动向电脑发送数据,
  20.     在执行 USB_SendData() 函数和 printf_usb() 函数时,
  21.     这两个函数已增加了判断电脑是否已正确识别到 USB 从设备的程序。
  22.     如果电脑要主动发送数据给 USB 从设备,电脑自己会主动判断与 USB 从设备是否已正确连接。*/
  23.     EA = 1; // 总中断允许位打开
  24.     while (1) {
  25.         if (bUsbOutReady)
  26.         // USB 库中有定义 bUsbOutReady 位变量,查询方式必须调用一次“usb_OUT_done()”
  27.         {
  28.             USB_SendData(UsbOutBuffer, OutNumber); // 发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  29.             usb_OUT_done();
  30.             // 当使用查询方式if(bUsbOutReady),查询调用USB库函数时,在数据处理完成后,
  31.             // 必须调用一次“usb_OUT_done();”,这样才能接收下一包数据。
  32.         }
  33.         P20 = 0; // P00端口输出0V
  34.         P22 = 0; // P02端口输出0V
  35.     }
  36. }
复制代码

3 代码学习


EXFAR(P_SW2):使能访问 XFR
截图202607131026144504.jpg

EA:总中断允许控制位
截图202607131031228969.jpg

4 下载流程

收到用户命令后复位到ISP监控程序区中勾选使用默认的内部自定义命令”@STCISP#”下次使用HID接口进行ISP下载每次下载前都先发送自定义命令
截图202607131005434969.jpg

按照原本的操作步骤把程序文件编译完的文件下载到擎天柱中
观察到扫描串口显示(COM7)USB-CDC,CDC

截图202607130836567492.jpg

再次点击下载/编程按钮,观察到在下载期间扫描串口显示(HID1)USB-Writer
USB不停电下载功能实现
截图202607130837058484.jpg

5 擎天柱展示

截图202607130957286661.jpg


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-07-21 07:05:28
已绑定手机

1

主题

14

回帖

27

积分

新手上路

积分
27
发表于 2026-7-13 15:33:01 | 显示全部楼层
第五集 C语言基础 擎天柱

1 项目配置
ai_usb.h
  1. // 使用串口“printf”打印信息需屏蔽以下两个定义
  2. // #define PRINTF_SEGLED         //printf输出重定向到ISP下载软件中的7段数码管
  3. // #define PRINTF_HID // printf输出直接重定向到USB口
  4. #define PRINTF_USB // printf输出直接重定向到USB口
复制代码
取消注释 #define PRINTF_USB #define PRINTF_HID (只需要取消注释一个,两个等价)

2 代码部分
  1. #include "ai8051u.h"
  2. #include "ai_usb.h"
  3. #define u8 unsigned char // 8位无符号变量(0-255)
  4. #define u16 unsigned int // 16位无符号变量(0-65535)
  5. u8 X = 200;
  6. u8 Y = 10;
  7. void main(void) {
  8.     EAXFR = 1;
  9.     WTST = 0;
  10.     CKCON = 0;
  11.     P0M1 = 0x00;  P0M0 = 0x00;
  12.     P1M1 = 0x00;  P1M0 = 0x00;
  13.     P2M1 = 0x00;  P2M0 = 0x00;
  14.     P3M1 = 0x00;  P3M0 = 0x00;
  15.     P4M1 = 0x00;  P4M0 = 0x00;
  16.     P5M1 = 0x00;  P5M0 = 0x00;
  17.     P6M1 = 0x00;  P6M0 = 0x00;
  18.     P7M1 = 0x00;  P7M0 = 0x00;
  19.     usb_init();
  20.     EA = 1;
  21.     while (1) {
  22.         if (bUsbOutReady) {
  23.             // USB_SendData(UsbOutBuffer, OutNumber);
  24.             if (X && Y) // 如果条件为真,输出什么
  25.             {
  26.                 printf("条件为真\r\n");
  27.             } else {
  28.                 printf("条件为假\r\n");
  29.             }
  30.             printf("X / Y = %u \r\n", (u16)(X / Y));
  31.             printf("X %% Y = %u \r\n", (u16)(X % Y));
  32.             printf("X * Y =(u8 %%u) %u \r\n", (u8)(X * Y));
  33.             printf("X * Y =(u16 %%u) %u \r\n", (u16)(X * Y));
  34.             printf("X * Y =(u8 %%u) %u \r\n", (u8)(X * Y));
  35.             printf("X * Y =(u8 %%bu) %bu \r\n", (u8)(X * Y));
  36.             usb_OUT_done();
  37.         }
  38.     }
  39. }
复制代码

3 代码学习

特别注意
  1. printf("X * Y =(u16 %%u) %u \r\n", (u16)(X * Y));
  2. printf("X * Y =(u8 %%u) %u \r\n", (u8)(X * Y));
复制代码
这种写法的错误在于:printf 函数内部根据格式符决定读取多少字节。%u 会多读一个字节,导致数据“串位”

输出:

  1. X * Y =(u16 %u) 2000
  2. X * Y =(u8 %u) 2000
复制代码
下面的printf的%u仍然读入了16位导致结果为2000

解决方案:

改为使用%bu:
  1. printf("X * Y =(u8 %%bu) %bu \r\n", (u8)(X * Y));
复制代码
借助中间变量:
  1. u8 result = (u8)(X * Y);
  2. printf("X * Y =(u8 %%u) %u \r\n", result);
复制代码

4 代码运行结果

在发送缓冲区输入任意文本
点击发送数据按钮
观察接收缓冲区的输出
截图202607131537218653.jpg
  1. [15:35:50.732]发送→1
  2. [15:35:50.745]接收←条件为真
  3.                     X / Y = 20
  4.                     X % Y = 0
  5.                     X * Y =(u8 %u) 208
  6.                     X * Y =(u16 %u) 2000
  7.                     X * Y =(u8 %u) 2000
  8.                     X * Y =(u8 %bu) 208
复制代码



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-07-21 07:05:28
已绑定手机

1

主题

14

回帖

27

积分

新手上路

积分
27
发表于 2026-7-13 17:08:19 | 显示全部楼层
第六集 IO输入输出 擎天柱

1 Delay函数获取

打开软件延时计算器选项卡
系统频率选择和输入用户程序运行时的IRC频率相同的频率
定时长度选择20毫秒
8051指令集选择STC32/Ai8051U-32Bit
点击复制代码按钮把生成的代码复制到剪贴板
截图202607131621165147.jpg

2 代码部分
  1. #include "ai8051u.h"
  2. #include "ai_usb.h"
  3. #define u8 unsigned char // 8位无符号变量(0-255)
  4. #define u16 unsigned int // 16位无符号变量(0-65535)
  5. u8 state = 0; // 初始状态
  6. void Delay20ms(void) //@24.000MHz
  7. {
  8.     unsigned long edata i;
  9.     _nop_();
  10.     _nop_();
  11.     i = 119998UL;
  12.     while (i)
  13.         i--;
  14. }
  15. void main(void) {
  16.     EAXFR = 1;
  17.     WTST = 0;
  18.     CKCON = 0;
  19.     // clang-format off
  20.     P0M1 = 0x00;  P0M0 = 0x00;
  21.     P1M1 = 0x00;  P1M0 = 0x00;
  22.     P2M1 = 0x00;  P2M0 = 0x00;
  23.     P3M1 = 0x00;  P3M0 = 0x00;
  24.     P4M1 = 0x00;  P4M0 = 0x00;
  25.     P5M1 = 0x00;  P5M0 = 0x00;
  26.     P6M1 = 0x00;  P6M0 = 0x00;
  27.     P7M1 = 0x00;  P7M0 = 0x00;
  28.     // clang-format on
  29.     usb_init();
  30.     EA = 1;
  31.     while (1) {
  32.         if (bUsbOutReady) {
  33.             // USB_SendData(UsbOutBuffer, OutNumber);
  34.             usb_OUT_done();
  35.         }
  36.         // 任务3:按一下灯亮,按一下灯灭
  37.         if (P32 == 0) // 判断P32按钮是否按下
  38.         {
  39.             Delay20ms(); // 延时20ms消抖
  40.             if (P32 == 0) {
  41.                 state = !state; // 变量取反 0 1 0 1 0 1
  42.                 P20 = state;
  43.                 printf("state:%d\r\n", (int)state);
  44.                 while (P32 == 0)
  45.                     ; // 等待P32松开
  46.             }
  47.         }
  48.     }
  49. }
复制代码
  1. // 任务1:按下P32按钮灯亮,松开P32按钮灯灭;
  2. if (P32 == 0) // 判断P32按钮是否按下
  3. {
  4.     P20 = 0;
  5. } else {
  6.     P20 = 1;
  7. }
复制代码
  1. // 任务2:按下P32按钮灯灭,松开P32按钮灯亮;
  2. if (P32 == 1) // 判断P32按钮是否按下
  3. {
  4.     P20 = 0;
  5. } else {
  6.     P20 = 1;
  7. }
复制代码
  1. // 课后任务1:按一下P32按钮灯亮,按一下P33按钮灯灭
  2. if (P32 == 0) // 判断P32按钮是否按下
  3. {
  4.     Delay20ms(); // 延时20ms消抖
  5.     if (P32 == 0) {
  6.         state = 1;
  7.         P20 = state;
  8.         printf("state:%d\r\n", (int)state);
  9.         while (P32 == 0)
  10.             ; // 等待P32松开
  11.     }
  12. }
  13. if (P33 == 0) // 判断P33按钮是否按下
  14. {
  15.     Delay20ms(); // 延时20ms消抖
  16.     if (P33 == 0) {
  17.         state = 0;
  18.         P20 = state;
  19.         printf("state:%d\r\n", (int)state);
  20.         while (P33 == 0)
  21.             ; // 等待P33松开
  22.     }
  23. }
复制代码
  1. // 课后任务2:按一下亮一颗灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法)
  2. if (P32 == 0) // 判断P32按钮是否按下
  3. {
  4.     Delay20ms(); // 延时20ms消抖
  5.     if (P32 == 0) {
  6.         if (state < 255) {
  7.             state = state * 2 + 1;
  8.         } else {
  9.             state = 0;
  10.         }
  11.         P2 = ~state;
  12.         printf("state:%d\r\n", (int)state);
  13.         while (P32 == 0)
  14.             ; // 等待P32松开
  15.     }
  16. }
复制代码

3 代码学习

GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,
通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。

截图202607131634204793.jpg

4 运行结果

课后任务1
截图202607131713462891.jpg

课后任务2
截图202607131712205805.jpg


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-07-21 07:05:28
已绑定手机

1

主题

14

回帖

27

积分

新手上路

积分
27
发表于 2026-7-14 09:49:38 | 显示全部楼层
第七集 定时器中断 擎天柱

1 定时器中断函数获取

打开AiCube软件的定时器计算器选项卡
时钟频率选择和输入用户程序运行时的IRC频率一致
定时长度选择3秒
选择定时器选择定时器0(通用)
定时器模式选择24位自动重载
定时器时钟选择12T(FOSC/12)
勾选使能定时器中断
点击复制代码按钮
截图202607140827591442.jpg

2 代码部分
  1. #include "ai8051u.h"
  2. #include "ai_usb.h"
  3. #define u8 unsigned char // 8位无符号变量(0-255)
  4. #define u16 unsigned int // 16位无符号变量(0-65535)
  5. u8 state = 0;     // 初始状态
  6. u8 Run_State = 0; // 运行状态
  7. void Delay20ms(void); //@24.000MHz
  8. void Timer0_Init(void); // 3秒@24.000MHz
  9. void main(void) {
  10.     int count = 1; // 按键计数变量
  11.     EAXFR = 1;
  12.     WTST = 0;
  13.     CKCON = 0;
  14.     // clang-format off
  15.     P0M1 = 0x00;  P0M0 = 0x00;
  16.     P1M1 = 0x00;  P1M0 = 0x00;
  17.     P2M1 = 0x00;  P2M0 = 0x00;
  18.     P3M1 = 0x00;  P3M0 = 0x00;
  19.     P4M1 = 0x00;  P4M0 = 0x00;
  20.     P5M1 = 0x00;  P5M0 = 0x00;
  21.     P6M1 = 0x00;  P6M0 = 0x00;
  22.     P7M1 = 0x00;  P7M0 = 0x00;
  23.     // clang-format on
  24.     usb_init();
  25.     Timer0_Init(); // 定时器初始化
  26.     EA = 1;
  27.     while (1) {
  28.         if (bUsbOutReady) {
  29.             // USB_SendData(UsbOutBuffer, OutNumber);
  30.             usb_OUT_done();
  31.         }
  32.         // 任务1:
  33.         if (P32 == 0) // 判断P32按钮是否按下
  34.         {
  35.             Delay20ms(); // 延时20ms消抖
  36.             if (P32 == 0) {
  37.                 printf("按键按下次数\xfd:%d 次\r\n", (int)count);
  38.                 count++;
  39.                 while (P32 == 0)
  40.                     ; // 等待P32松开
  41.             }
  42.         }
  43.     }
  44. }
  45. void Delay20ms(void) //@24.000MHz
  46. {
  47.     unsigned long edata i;
  48.     _nop_();
  49.     _nop_();
  50.     i = 119998UL;
  51.     while (i)
  52.         i--;
  53. }
  54. void Timer0_Init(void) // 3秒@24.000MHz
  55. {
  56.     TM0PS = 0x63; // 设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  57.     AUXR &= 0x7F; // 定时器时钟12T模式
  58.     TMOD &= 0xF0; // 设置定时器模式
  59.     TL0 = 0xA0;   // 设置定时初始值
  60.     TH0 = 0x15;   // 设置定时初始值
  61.     TF0 = 0;      // 清除TF0标志
  62.     TR0 = 1;      // 定时器0开始计时
  63.     ET0 = 1;      // 使能定时器0中断
  64. }
  65. void Timer0_Isr(void) interrupt 1 // 3秒执行一次
  66. {
  67.     state = !state;
  68.     P20 = state;
  69.     P21 = !state;
  70. }
复制代码
  1. // 任务2:灯按一下点亮三秒后熄灭。
  2. if (P32 == 0) // 判断P32按钮是否按下
  3. {
  4.     Delay20ms(); // 延时20ms消抖
  5.     if (P32 == 0) {
  6.         P20 = 0;
  7.         Timer0_Init();
  8.         while (P32 == 0)
  9.             ; // 等待P32松开
  10.     }
  11. }
  12. void Timer0_Isr(void) interrupt 1 // 3秒执行一次
  13. {
  14.     P20 = 1;
  15.     TR0 = 0; // 定时器0关闭计时
  16. }
复制代码
  1. // 任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
  2. if (P32 == 0) // 判断P32按钮是否按下
  3. {
  4.     Delay20ms(); // 延时20ms消抖
  5.     if (P32 == 0) {
  6.         Run_State = !Run_State; // 运行状态取反
  7.         if (Run_State == 1) // 运行
  8.         {
  9.             Timer0_Init();
  10.         } else {
  11.             TR0 = 0; // 关闭定时器
  12.             P20 = 1;
  13.             P21 = 1;
  14.         }
  15.         while (P32 == 0)
  16.             ; // 等待P32松开
  17.     }
  18. }
  19. void Timer0_Init(void) // 500毫秒@24.000MHz
  20. {
  21.     TM0PS = 0x0F; // 设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  22.     AUXR &= 0x7F; // 定时器时钟12T模式
  23.     TMOD &= 0xF0; // 设置定时器模式
  24.     TL0 = 0xDC;   // 设置定时初始值
  25.     TH0 = 0x0B;   // 设置定时初始值
  26.     TF0 = 0;      // 清除TF0标志
  27.     TR0 = 1;      // 定时器0开始计时
  28.     ET0 = 1;      // 使能定时器0中断
  29. }
  30. void Timer0_Isr(void) interrupt 1 // 500毫秒执行一次
  31. {
  32.     state = !state;
  33.     P20 = state;
  34.     P21 = !state;
  35. }
复制代码
  1. // 电子功德箱:
  2. // 1.按下按钮1,串口显示“双倍功德时间”,再次按下显示“单倍功德时间”;
  3. // 2.按下按键2,双倍功德时间下串口显示“功德+2 当前功德:xxx”;
  4. // 3.按下按键2,单倍功德时间下串口显示“功德+1 当前功德:xxx”;
  5. // 4.功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
  6. // 5.功德+2时,LED点亮2秒后熄灭表示功德成功点亮
  7. #include "ai8051u.h"
  8. #include "ai_usb.h"
  9. #define u8 unsigned char // 8位无符号变量(0-255)
  10. #define u16 unsigned int // 16位无符号变量(0-65535)
  11. u16 GD = 0;
  12. u8 GD_multiple = 1;
  13. u8 LED_time_count = 0;
  14. void Delay20ms(void); //@24.000MHz
  15. void Timer0_Init(void); // 3秒@24.000MHz
  16. void main(void) {
  17.     EAXFR = 1;
  18.     WTST = 0;
  19.     CKCON = 0;
  20.     // clang-format off
  21.     P0M1 = 0x00;  P0M0 = 0x00;
  22.     P1M1 = 0x00;  P1M0 = 0x00;
  23.     P2M1 = 0x00;  P2M0 = 0x00;
  24.     P3M1 = 0x00;  P3M0 = 0x00;
  25.     P4M1 = 0x00;  P4M0 = 0x00;
  26.     P5M1 = 0x00;  P5M0 = 0x00;
  27.     P6M1 = 0x00;  P6M0 = 0x00;
  28.     P7M1 = 0x00;  P7M0 = 0x00;
  29.     // clang-format on
  30.     usb_init();
  31.     // Timer0_Init(); // 定时器初始化
  32.     EA = 1;
  33.     while (1) {
  34.         if (bUsbOutReady) {
  35.             // USB_SendData(UsbOutBuffer, OutNumber);
  36.             usb_OUT_done();
  37.         }
  38.         if (P32 == 0) // 判断P32按钮是否按下
  39.         {
  40.             Delay20ms(); // 延时20ms消抖
  41.             if (P32 == 0) {
  42.                 if (GD_multiple == 1) {
  43.                     GD_multiple = 2;
  44.                     printf("双倍功德时间");
  45.                 } else {
  46.                     GD_multiple = 1;
  47.                     printf("单倍功德时间");
  48.                 }
  49.                 while (P32 == 0)
  50.                     ; // 等待P32松开
  51.             }
  52.         }
  53.         if (P33 == 0) // 判断P32按钮是否按下
  54.         {
  55.             Delay20ms(); // 延时20ms消抖
  56.             if (P33 == 0) {
  57.                 if (GD_multiple == 1) {
  58.                     GD++;
  59.                     printf("功德+1 当前功德:%u", GD);
  60.                 } else {
  61.                     GD += 2;
  62.                     printf("功德+2 当前功德:%u", GD);
  63.                 }
  64.                 P20 = 0; // 点亮P20
  65.                 Timer0_Init();
  66.                 while (P33 == 0)
  67.                     ; // 等待P33松开
  68.             }
  69.         }
  70.     }
  71. }
  72. void Delay20ms(void) //@24.000MHz
  73. {
  74.     unsigned long edata i;
  75.     _nop_();
  76.     _nop_();
  77.     i = 119998UL;
  78.     while (i)
  79.         i--;
  80. }
  81. void Timer0_Init(void) // 1秒@24.000MHz
  82. {
  83.     TM0PS = 0x1F; // 设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  84.     AUXR &= 0x7F; // 定时器时钟12T模式
  85.     TMOD &= 0xF0; // 设置定时器模式
  86.     TL0 = 0xDC;   // 设置定时初始值
  87.     TH0 = 0x0B;   // 设置定时初始值
  88.     TF0 = 0;      // 清除TF0标志
  89.     TR0 = 1;      // 定时器0开始计时
  90.     ET0 = 1;      // 使能定时器0中断
  91. }
  92. void Timer0_Isr(void) interrupt 1 // 1秒执行一次
  93. {
  94.     if (GD_multiple == 2 && LED_time_count == 0) {
  95.         LED_time_count++;
  96.     } else {
  97.         P20 = 1; // 关闭P20
  98.         LED_time_count = 0;
  99.         TR0 = 0; // 定时器0停止计时
  100.     }
  101. }
复制代码

3 代码学习

本代码中的“数”字涉及Keil的0xFD问题
关于Keil软件中0xFD问题的说明-深圳国芯人工智能有限公司

定时器的配置和时长计算

定时器
截图202607140839075443.jpg

TM0PS
截图202607140840405098.jpg

AUXR
截图202607140847306837.jpg

TMOD
截图202607140853093900.jpg

TL0, TH0
截图202607140849561805.jpg

TF0, TR0
截图202607140903335532.jpg

ET0
截图202607140908335436.jpg

定时器计算公式
截图202607140912336297.jpg

4 运行结果

电子功德箱
截图202607141014239966.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-07-21 07:05:28
已绑定手机

1

主题

14

回帖

27

积分

新手上路

积分
27
发表于 2026-7-14 11:53:54 | 显示全部楼层
第八集 定时器周期性调度任务 擎天柱

1 代码部分
不同延时闪烁
  1. #include "ai8051u.h"
  2. #include "ai_usb.h"
  3. #define u8 unsigned char // 8位无符号变量(0-255)
  4. #define u16 unsigned int // 16位无符号变量(0-65535)
  5. u8 State[8] = {0};
  6. u16 Count_ms[8] = {0};
  7. void Delay20ms(void); //@24.000MHz
  8. void Timer0_Init(void); // 3秒@24.000MHz
  9. void main(void) {
  10.     u8 i1;
  11.     EAXFR = 1;
  12.     WTST = 0;
  13.     CKCON = 0;
  14.     // clang-format off
  15.     P0M1 = 0x00;  P0M0 = 0x00;
  16.     P1M1 = 0x00;  P1M0 = 0x00;
  17.     P2M1 = 0x00;  P2M0 = 0x00;
  18.     P3M1 = 0x00;  P3M0 = 0x00;
  19.     P4M1 = 0x00;  P4M0 = 0x00;
  20.     P5M1 = 0x00;  P5M0 = 0x00;
  21.     P6M1 = 0x00;  P6M0 = 0x00;
  22.     P7M1 = 0x00;  P7M0 = 0x00;
  23.     // clang-format on
  24.     usb_init();
  25.     Timer0_Init(); // 定时器初始化
  26.     EA = 1;
  27.     while (1) {
  28.         if (bUsbOutReady) {
  29.             // USB_SendData(UsbOutBuffer, OutNumber);
  30.             usb_OUT_done();
  31.         }
  32.         for (i1 = 0; i1 < 8; ++i1) {
  33.             if (Count_ms[i1] > (i1 + 1) * 100) {
  34.                 Count_ms[i1] = 0;
  35.                 State[i1] = !State[i1];
  36.                 if (State[i1]) {
  37.                     P2 &= ~(1 << i1);
  38.                 } else {
  39.                     P2 |= (1 << i1);
  40.                 }
  41.             }
  42.         }
  43.     }
  44. }
  45. void Delay20ms(void) //@24.000MHz
  46. {
  47.     unsigned long edata i;
  48.     _nop_();
  49.     _nop_();
  50.     i = 119998UL;
  51.     while (i)
  52.         i--;
  53. }
  54. void Timer0_Init(void) // 1毫秒@24.000MHz
  55. {
  56.     TM0PS = 0x00; // 设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  57.     AUXR &= 0x7F; // 定时器时钟12T模式
  58.     TMOD &= 0xF0; // 设置定时器模式
  59.     TL0 = 0x30;   // 设置定时初始值
  60.     TH0 = 0xF8;   // 设置定时初始值
  61.     TF0 = 0;      // 清除TF0标志
  62.     TR0 = 1;      // 定时器0开始计时
  63.     ET0 = 1;      // 使能定时器0中断
  64. }
  65. void Timer0_Isr(void) interrupt 1 // 1毫秒执行一次
  66. {
  67.     u8 i;
  68.     for (i = 0; i < 8; ++i) {
  69.         Count_ms[i]++;
  70.     }
  71. }
复制代码

流水灯+按键计数(不冲突)
  1. #include "ai8051u.h"
  2. #include "ai_usb.h"
  3. #define u8 unsigned char // 8位无符号变量(0-255)
  4. #define u16 unsigned int // 16位无符号变量(0-65535)
  5. u8 State[8] = {0};
  6. u16 Count_ms[10] = {0};
  7. void Delay20ms(void); //@24.000MHz
  8. void Timer0_Init(void); // 3秒@24.000MHz
  9. void main(void) {
  10.     u8 LED = 0;
  11.     u8 Key = 0;
  12.     u16 num = 0;
  13.     EAXFR = 1;
  14.     WTST = 0;
  15.     CKCON = 0;
  16.     // clang-format off
  17.     P0M1 = 0x00;  P0M0 = 0x00;
  18.     P1M1 = 0x00;  P1M0 = 0x00;
  19.     P2M1 = 0x00;  P2M0 = 0x00;
  20.     P3M1 = 0x00;  P3M0 = 0x00;
  21.     P4M1 = 0x00;  P4M0 = 0x00;
  22.     P5M1 = 0x00;  P5M0 = 0x00;
  23.     P6M1 = 0x00;  P6M0 = 0x00;
  24.     P7M1 = 0x00;  P7M0 = 0x00;
  25.     // clang-format on
  26.     usb_init();
  27.     Timer0_Init(); // 定时器初始化
  28.     EA = 1;
  29.     while (1) {
  30.         if (bUsbOutReady) {
  31.             // USB_SendData(UsbOutBuffer, OutNumber);
  32.             usb_OUT_done();
  33.         }
  34.         if (Count_ms[0] > 100) {
  35.             Count_ms[0] = 0;
  36.             P2 = ~(1 << LED);
  37.             LED = (LED + 1) % 8;
  38.         }
  39.         if (Count_ms[1] > 10) {
  40.             Count_ms[1] = 0;
  41.             if (P32 == 0) {
  42.                 Key++;
  43.                 if (Key == 5) {
  44.                     num++;
  45.                     printf("按键按下 计数\xfd:%u", num);
  46.                 }
  47.             } else {
  48.                 Key = 0;
  49.             }
  50.         }
  51.     }
  52. }
  53. void Delay20ms(void) //@24.000MHz
  54. {
  55.     unsigned long edata i;
  56.     _nop_();
  57.     _nop_();
  58.     i = 119998UL;
  59.     while (i)
  60.         i--;
  61. }
  62. void Timer0_Init(void) // 1毫秒@24.000MHz
  63. {
  64.     TM0PS = 0x00; // 设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  65.     AUXR &= 0x7F; // 定时器时钟12T模式
  66.     TMOD &= 0xF0; // 设置定时器模式
  67.     TL0 = 0x30;   // 设置定时初始值
  68.     TH0 = 0xF8;   // 设置定时初始值
  69.     TF0 = 0;      // 清除TF0标志
  70.     TR0 = 1;      // 定时器0开始计时
  71.     ET0 = 1;      // 使能定时器0中断
  72. }
  73. void Timer0_Isr(void) interrupt 1 // 1毫秒执行一次
  74. {
  75.     u8 i;
  76.     for (i = 0; i < 2; ++i) {
  77.         Count_ms[i]++;
  78.     }
  79. }
复制代码

代码拆分为多文件

main.c
  1. #include "config.h"
  2. #include "io.h"
  3. #include "task.h"
  4. void main(void) {
  5.     Sys_init();
  6.     usb_init();
  7.     Timer0_Init(); // 定时器初始化
  8.     EA = 1;
  9.     while (1) {
  10.         if (bUsbOutReady) {
  11.             // USB_SendData(UsbOutBuffer, OutNumber);
  12.             usb_OUT_done();
  13.         }
  14.         Task_Pro_Handler_Callback();
  15.     }
  16. }
  17. void Timer0_Isr(void) interrupt 1 // 1毫秒执行一次
  18. {
  19.     Task_Marks_Handler_Callback();
  20. }
复制代码

config.h

  1. #ifndef __CONFIG_H
  2. #define __CONFIG_H
  3. #include "ai8051u.h" //调用头文件
  4. #include "ai_usb.h"  //调用头文件
  5. #include "intrins.h" //d调用头文件
  6. #define u8 unsigned char // 8位无符号变量(0-255)
  7. #define u16 unsigned int // 16位无符号变量(0-65535)
  8. void Sys_init(void);    // 函数声明
  9. void Timer0_Init(void); // 1毫秒@24.000MHz
  10. #endif
复制代码

config.c

  1. #include "config.h"
  2. void Sys_init(void) {
  3.     EAXFR = 1; // 扩展寄存器(XFR)访问使能
  4.     WTST = 0;  // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  5.     CKCON = 0; // 提高访问XRAM速度
  6.     // clang-format off
  7.     P0M1 = 0x00;   P0M0 = 0x00;
  8.     P1M1 = 0x00;   P1M0 = 0x00;
  9.     P2M1 = 0x00;   P2M0 = 0x00;
  10.     P3M1 = 0x00;   P3M0 = 0x00;
  11.     P4M1 = 0x00;   P4M0 = 0x00;
  12.     P5M1 = 0x00;   P5M0 = 0x00;
  13.     P6M1 = 0x00;   P6M0 = 0x00;
  14.     P7M1 = 0x00;   P7M0 = 0x00;
  15.     // clang-format on
  16. }
  17. void Timer0_Init(void) // 1毫秒@24.000MHz
  18. {
  19.     TM0PS = 0x00; // 设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  20.     AUXR &= 0x7F; // 定时器时钟12T模式
  21.     TMOD &= 0xF0; // 设置定时器模式
  22.     TL0 = 0x30;   // 设置定时初始值
  23.     TH0 = 0xF8;   // 设置定时初始值
  24.     TF0 = 0;      // 清除TF0标志
  25.     TR0 = 1;      // 定时器0开始计时
  26.     ET0 = 1;      // 使能定时器0中断
  27. }
复制代码

task.h
  1. #ifndef __TASK_H
  2. #define __TASK_H
  3. #include "config.h" //调用头文件
  4. typedef struct
  5. {
  6.     u8 Run;                 // 任务状态:Run/Stop
  7.     u16 TIMCount;           // 定时计数器
  8.     u16 TRITime;            // 重载计数器
  9.     void (*TaskHook)(void); // 任务函数
  10. } TASK_COMPONENTS;
  11. void Task_Marks_Handler_Callback(void);
  12. void Task_Pro_Handler_Callback(void);
  13. #endif
复制代码

task.c
  1. #include "task.h"
  2. #include "io.h"
  3. static TASK_COMPONENTS Task_Comps[] =
  4.     {
  5.         // 状态  计数  周期  函数
  6.         {0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms */
  7.         {0, 600, 600, LED1_Blink}, /* task 1 Period: 600ms */
  8.         {0, 900, 900, LED2_Blink}, /* task 1 Period: 600ms */
  9.         {0, 10, 10, KEY_Task},     /* task 1 Period: 600ms */
  10. };
  11. u8 Tasks_Max = sizeof(Task_Comps) / sizeof(Task_Comps[0]);
  12. //========================================================================
  13. // 函数: Task_Handler_Callback
  14. // 描述: 任务标记回调函数.
  15. // 参数: None.
  16. // 返回: None.
  17. // 版本: V1.0, 2012-10-22
  18. //========================================================================
  19. void Task_Marks_Handler_Callback(void) {
  20.     u8 i;
  21.     for (i = 0; i < Tasks_Max; i++) {
  22.         if (Task_Comps[i].TIMCount) /* If the time is not 0 */
  23.         {
  24.             Task_Comps[i].TIMCount--;        /* Time counter decrement */
  25.             if (Task_Comps[i].TIMCount == 0) /* If time arrives */
  26.             {
  27.                 /*Resume the timer value and try again */
  28.                 Task_Comps[i].TIMCount = Task_Comps[i].TRITime;
  29.                 Task_Comps[i].Run = 1; /* The task can be run */
  30.             }
  31.         }
  32.     }
  33. }
  34. //========================================================================
  35. // 函数: Task_Pro_Handler_Callback
  36. // 描述: 任务处理回调函数.
  37. // 参数: None.
  38. // 返回: None.
  39. // 版本: V1.0, 2012-10-22
  40. //========================================================================
  41. void Task_Pro_Handler_Callback(void) {
  42.     u8 i;
  43.     for (i = 0; i < Tasks_Max; i++) {
  44.         if (Task_Comps[i].Run) /* If task can be run */
  45.         {
  46.             Task_Comps[i].Run = 0;    /* Flag clear 0 */
  47.             Task_Comps[i].TaskHook(); /* Run task */
  48.         }
  49.     }
  50. }
复制代码

io.h
  1. #ifndef __IO_H
  2. #define __IO_H
  3. #include "config.h" //调用头文件
  4. void LED0_Blink(void);
  5. void LED1_Blink(void);
  6. void LED2_Blink(void);
  7. void KEY_Task(void);
  8. #endif
复制代码

io.c

  1. #include "io.h"
  2. u8 State1 = 0; // LED1初始状态
  3. u8 State2 = 0; // LED2初始状态
  4. u8 State3 = 0; // LED3初始状态
  5. u16 Key_Vol[3]; // 按键按下持续时间
  6. void LED0_Blink(void) {
  7.     State1 = !State1;
  8.     P20 = State1;
  9. }
  10. void LED1_Blink(void) {
  11.     State2 = !State2;
  12.     P21 = State2;
  13. }
  14. void LED2_Blink(void) {
  15.     State3 = !State3;
  16.     P22 = State3;
  17. }
  18. void KEY_Task(void) {
  19.     if (P32 == 0) {
  20.         Key_Vol[0]++;
  21.         if (Key_Vol[0] == 5) {
  22.             // 按键按下的任务
  23.             printf("按键单击\r\n");
  24.         }
  25.     } else {
  26.         Key_Vol[0] = 0;
  27.     }
  28. }
复制代码

2 代码学习

按键不冲突写法
  1. void KEY_Task(void) {
  2.     if (P32 == 0) {
  3.         Key_Vol[0]++;
  4.         if (Key_Vol[0] == 5) {
  5.             // 按键按下的任务
  6.             printf("按键单击\r\n");
  7.         }
  8.     } else {
  9.         Key_Vol[0] = 0;
  10.     }
  11. }
复制代码




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-07-21 07:05:28
已绑定手机

1

主题

14

回帖

27

积分

新手上路

积分
27
发表于 2026-7-14 14:41:22 | 显示全部楼层
第九集 数码管 擎天柱

1 代码编写

1.1 虚拟数码管显示段码获取

点击AiCube工具栏的工具->字库生成工具
截图202607141422086322.jpg

点击字库生成工具的LED数码管字库
截图202607141423528911.jpg

数码管类型选择8段数码管
在设计数码管字模的选项中勾选需要显示的字符
点击确定
截图202607141425593754.jpg

复制字库生成工具下面展示的段码
截图202607141428316251.jpg

1.2 获取调试仿真接口的使用说明

点击AiCube工具栏的调试仿真接口->接口协议及帮助
截图202607141431513353.jpg

本实验需要用到的接口使用说明
截图202607141433586626.jpg
截图202607141435053928.jpg

2 代码部分

io.h
  1. #ifndef __IO_H
  2. #define __IO_H
  3. #include "config.h" //调用头文件
  4. // #define 引脚名称  PXX的端口
  5. #define HC595_SER P34
  6. #define HC595_RCK P35
  7. #define HC595_SCK P32
  8. //---------------------------------595控制函数---------------------------------
  9. void TIMECOUNT_Task(void);
  10. void PLED_40(void);
  11. void SEG_PC(void);
  12. #endif
复制代码

io.c
  1. #include "io.h"
  2. u8 SEG_NUM[] =
  3.     {
  4.         0x3F, /*'0', 0*/
  5.         0x06, /*'1', 1*/
  6.         0x5B, /*'2', 2*/
  7.         0x4F, /*'3', 3*/
  8.         0x66, /*'4', 4*/
  9.         0x6D, /*'5', 5*/
  10.         0x7D, /*'6', 6*/
  11.         0x07, /*'7', 7*/
  12.         0x7F, /*'8', 8*/
  13.         0x6F, /*'9', 9*/
  14.         0x77, /*'A', 10*/
  15.         0x7C, /*'B', 11*/
  16.         0x39, /*'C', 12*/
  17.         0x5E, /*'D', 13*/
  18.         0x79, /*'E', 14*/
  19.         0x71, /*'F', 15*/
  20.         0x40, /*'-', 16*/
  21.         0x00, /*' ', 17*/
  22.         0x80, /*'.', 18*/
  23. };
  24. u8 T_NUM[8] = {0X01, 0X02, 0X04, 0X08, 0X10, 0X20, 0X40, 0X80};
  25. u8 shi = 0;
  26. u8 fen = 0;
  27. u8 miao = 0;
  28. void TIMECOUNT_Task(void) {
  29.     miao++;
  30.     if (miao > 59) {
  31.         miao = 0;
  32.         fen++;
  33.         if (fen > 59) {
  34.             fen = 0;
  35.             shi++;
  36.             if (shi > 23)
  37.                 shi = 0;
  38.         }
  39.     }
  40. }
  41. u8 state_now = 0;
  42. void PLED_40(void) {
  43.     u8 cod[8];
  44.     cod[0] = 0x0f;              // 表示开启P0-P3
  45.     cod[1] = 0X01;              // P0端口
  46.     cod[2] = 0X01;              // P1
  47.     cod[3] = ~T_NUM[state_now]; // P2
  48.     cod[4] = 0X01;              // P3
  49.     LED40_SendData(cod, 5);
  50.     P2 = ~T_NUM[state_now];
  51.     state_now++;
  52.     if (state_now > 7)
  53.         state_now = 0;
  54. }
  55. void SEG_PC(void) {
  56.     u8 cod[8];
  57.     cod[0] = SEG_NUM[shi / 10]; // 小时的十位数的数码管段码
  58.     cod[1] = SEG_NUM[shi % 10];
  59.     cod[2] = SEG_NUM[16]; // 数码管刷段码和位码
  60.     cod[3] = SEG_NUM[fen / 10]; // 分钟
  61.     cod[4] = SEG_NUM[fen % 10];
  62.     cod[5] = SEG_NUM[16]; // 数码管刷段码和位码
  63.     cod[6] = SEG_NUM[miao / 10]; // 分钟
  64.     cod[7] = SEG_NUM[miao % 10];
  65.     SEG7_ShowCode(cod);
  66. }
复制代码

task.c/Task_Comps[]
  1. static TASK_COMPONENTS Task_Comps[] = {
  2.     // 状态  计数  周期  函数
  3.     {0, 1000, 1000, TIMECOUNT_Task}, /* task 1 Period: 1000ms */
  4.     {0, 1000, 1000, PLED_40},        /* task 2 Period: 1000ms */
  5.     {0, 1000, 1000, SEG_PC},         /* task 3 Period: 1000ms */
  6. };
复制代码

3 查看运行结果

点击AiCube工具栏的调试仿真接口->8段数码管调试仿真接口->擎天柱-LED-DIP40
截图202607141438329622.jpg
截图202607141440436150.jpg

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-22 07:49 , Processed in 0.095849 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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