找回密码
 立即注册
查看: 67|回复: 8

机缘巧合,跟AI8051U握个手

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-12-16 00:36:41
已绑定手机

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 6 天前 | 显示全部楼层 |阅读模式
我做软件开发做了十几年。

对单片机的认识,2天前还停留在上大学时,偶然听见计算机系的同学的谈话,说起单片机课程,要焊接啊,烧录啊之类的话语中。
前几天随着豆包手机的横空出世,我突然意识到,实实在在的把程序作用于人们的显示生活,才能显示出价值。
豆包手机是帮助人们操作手机APP去完成一些日常,那近几年提出来的“物联网”设想,从今天的部分行业、小范围实现,到以后的多数行业,大范围覆盖,AI+单片机,在这个过程中,是不是大有可为,想象空间无限?
前几天微信读书给我推荐的图书中,恰好就有一本《爱上单片机》。看了个开头,觉得很有趣。心里想,看书太慢了,我为啥不看看视频?
于是上哔哩哔哩一搜,人气最火的是江协科技的《51单片机入门教程》。
看了几集,下载了视频给出的开发工具包,其中有下载工具叫STC-ISP。
打开这个工具,提醒有新版本。我升级了新版本,运行后,看到了本论坛的网址 www.stcaimcu.com
当然,置顶的红字链接,也就进入我的视野。
-----
以上就是我跟AI8051U教学视频的结缘的始末。
今天看了第一集。
说实话,作为一个“纯软”的开发者,对硬件其实是没有什么概念的。看了教程第一集 序言,大体给了我一个轮廓:
AI单片机已经逐步脱离了STC89C52给我的刻板印象,几乎可以把实验板当做一台小型PC看待了。
甚至冒出一个念头,电梯广告设备,是不是完全可以使用这个芯片来设计,因为电梯广告屏幕,基本上就是播放图片和视频,比使用安卓系统来说,成本应该会更低。
第一集只演示了上传、播放图片,按道理视频应该也是可以的吧?
另外讲师有提到,芯片可以控制1000多个LED灯珠,并且不会互相干扰,则让我想到了中山的LED行业。目前LED灯具,也逐渐有了智能化的产品。
好,就说这么多吧,期待明天进入下一集的学习。


AI8051U-3.png
AI8051U-2.png
AI8051U-1.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-12-16 08:29:17

812

主题

1万

回帖

2万

积分

管理员

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

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

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

下载 最新的 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之图形化程序自动生成
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-12-16 00:36:41
已绑定手机

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 5 天前 | 显示全部楼层
Ai8051U 第二课

第二课的学习目的,是把做实验的手脚架搭建好。
1. 介绍PCB版
跟我接除过的江协科技同款的STC8052RC版比较,Ai8051U感觉要先进很多。 表显之一是继承了更多的功能模组,包括 USB Type-c 接口, 耳机输出,麦克风,漏电检测,RTC电池,温度传感器等,结合TF卡插座,可操作空间大了很多。

2. 介绍开发软件
课程教学可谓细致入微,甚至一下基本的电脑知识,也会详细的解说,比如创建快捷方式、软件安装路径、PDF查看工具等,对于已有编程经验、工作经验的学习者来说,可能有点啰嗦,对于刚接除的学生党,一句话的提醒,却实实在在地可以避免很多弯路。
ISP 工具, 例程等,公司网站都在网站上提供了方便地下载页,非常方便。至于 Keil 软件, 由于是有版权地收费软件, 视频里并没有给出具体的下载地址。其实开发商官网 keil.com 是可以免费下载试用的,不过有功能限制,需要付费才能试用全部功能。

3. 往Keil 软件中添加芯片型号
在创建项目时,需要指定单片机型号。国产的芯片,自然不包含在Keil的官方发行版中,因此需要手动添加。手动添加的功能就集成在 ISP 工具里了。(ISP工具时绿色软件,软甲没有“关于我们”的介绍,看来应该是国芯人工智能自己开发的)

4. 添加 Keil 的C代码中断号。
这个看了视频我暂时不能理解有什么用,应该是Keil 工具的拓展功能。看视频时直接修改软件中的可执行文件 C51.exe ,感觉有点危险,担心破坏软件可用的,可以先把这个文件先备份一下。

5. 烧录程序前的参数选择。
视频有个口误,在介绍通过按钮添加串口时,把“右下角”说成了“左下角”, 不过因为有视频操作示范,不会对学习者造成困扰。另外选择CPU位数,这是因为 Ai8051U兼容了8位的模式,因此需要选择,就像64位的CPU安装了操作系统,其实也可以执行32位的应用程序一样。
选择时间频率就比较简单的,这个在STC8052RC这个老款的MCU中,也是需要手动选择的。

下面是学习的关键截图。

3.png
4.png
5.png
6.png
ScreenShot_2025-12-12_182348_922.png
ScreenShot_2025-12-12_211000_377.png
ScreenShot_2025-12-12_211911_022.png
ScreenShot_2025-12-12_212039_137.png
ScreenShot_2025-12-12_212122_694.png
ScreenShot_2025-12-12_212247_016.png
ScreenShot_2025-12-12_212437_331.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-12-16 00:36:41
已绑定手机

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 4 天前 | 显示全部楼层
AI8051U 第三课

今天继续学习第三课,视频看了3次,还是有些地方没有理解透彻。

1. 主讲说上节课我们下载过芯片手册,打开芯片手册,发现与官网下载的芯片手册(芯片规格书)有所不同。估计是官网的手册更新了。

2. 提到手册,上节课还同时下载了《芯片实验指导书》 、 《实验箱使用说明》、《实验箱原理图》这几个文件。 视频中引用的8个LED原理图,就来源于《实验箱原理图》。

3. IO口模式设置,这是与 STC89052RC 不同之处, 我的理解是 STC89052RC 默认就是准双向口模式,因此省去了这一步。

4. 中文乱码的问题,问过了DeepSeek,其实单片机源码是支持使用utf8格式的,因此在 Keil 软件配置中,我直接使用 utf8 编码格式,方便将DeepSeek 中的代码复制到 Keil 编辑器。

5. 本节课,还有一个比较分解的问题,为什么 P40 打开后, 还要打开 P00  , 才能点亮 LED?P40 是 8 颗 LED 的总开关, P00 - P07 是各颗 LED 的独立开关? 如果是这样的, 是否还有 P30 , P20 等,控制其他的模块总开关? (也许查阅实验箱的原理图能找到答案)

课程的难度跨度有点大, 简单的比如源码的缩进也教, 复杂的例如I/O口的工作模式, 要通过查阅芯片手册,才能理解其真实含义, 因此学习者需要花较多课外时间去理顺知识点。

课程相关截图如下:

IO口工作模式原理.png
IO口配置工具.png
tab缩进数量设置,编码格式.png
电量2个LED.png
官网手册.png
将源文件添加到 Source Group.png
接口模式设置疏忽的代码.png
生成Hex 文件设置.png
实验箱原理图.png
手册书签6与官网下载不同.png
头文件大小写是否敏感.png
头文件优先级.png
项目设置.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-12-16 00:36:41
已绑定手机

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 3 天前 | 显示全部楼层
Ai8051U 学习第四课: USB不停电下载

记得在 89C52 的实验板中, 使用 ISP 通过串口下载程序, 也是需要重新打开主板电源,才能下载程序。
在上一课教学中,需要按住 P32 按键,再按下电源按钮,这样电脑才能识别出 HID1 USB 接口。 手册中有交代, 这个 P32 按键,在下载程序后, 可以另做他用。

下面说说第三课主要学习心得。

1. 通过 stcui.com 下载库文件, 视频中除了源码下载,还有一个“例程下载”, 而现在官网已经更新,将例程合并到源码压缩包中了。

2. Windows 的多文件选择操作, 其实有比1视频更简单的做法, 先按 ctrl + a 全选所有文件(夹),然后按住 ctrl , 用鼠标点击不需要复制的那个文件, 这样就选中了所有需要的文件(夹)了。

3. 视频演示中,实际并没有复制到 AI8051U.h 头文件,但是编译依然可以顺利通过,我猜测是 Keil 在别的路径找到了这个头文件。

4. 演示代码中, 定义了三个 char 命令参数, 但实际上程序中并没有使用, 很好奇是在哪里用到了这些参数?

5. 介绍了内部自定义命令的配置。 同样的, 这个自定义命令在后续的程序中并没有直接调用。

6. 中断使能寄存器 符号 IE ,程序中改变其 B7 位的值,使用的是直接使用 B7 位的名称 EA 并直接复制的方式: EA = 1
同样的, 修改 P_SW2(功能脚切换控制) 的B7 位 和 IE2(中断使能寄存器2) 的 B7 位的值, 则使用或等于(|=)操作符, 为何不使用相同的方式, 直接使用  EAXFR = 1 , 和  EUSB = 1 ?

7. 由于 P_SW2 寄存器同时控制8个位,直接操作这个变量的话, 需要使用或等于(|=)操作符来改变指定的1位或多位,避免改变其他位的值。

下面是部分视频截图和手册截图,便于与学习心得互相印证。


例程与视频中有一些差异.png
取消指定警告代码.png
实验指导书中介绍的USB-ISP下载方法.png
下载库函数.png
下载头文件 32bit.png
学会查看芯片手册:功能脚切换寄存器.png
源码配置与ISP自定义命令对应.png
中断使能寄存器 2.png
中断使能寄存器 B7 位名称 EA.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-12-16 00:36:41
已绑定手机

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 前天 20:44 | 显示全部楼层
AI8051U 学习,第五课: C语言基础知识

C语言说起来还是我的入门语言。 在学校时,由于我不是计算机专业的,为了日后工作有竞争力,于是捡了一本同学的《C语言程序设计——谭浩强》学习了一个月,算是从此入门了编程。

视频教程确实把C语言基础基本上都说到了。

1. 通过 ISP 下载工具与 USB 口实现调试功能。  这个挺神奇的, 刚接触这一课的时候, 我还在想, printf 是输入字符串信息的, 这些信息能显示到哪里呢? 单片机上的液晶屏吗? 看了本视频才知道, 是我误入歧途了。

实际上是通过 ISP 工具与 USB 口搭建起一个双向通讯的通道, 既可以通过 ISP 向单片机发送数据, 也能接收到单片机返回的信息, 并且可以持续保持这样的一来一回的通讯模式。

这个通讯模式在最终发布单片机程序时应该是不需要的, 只需要保留执行正常单片机功能的程序即可。

2. printf 应该放在哪里才有效? 应该放在 bUsbOutReady 这个状态检测变量的判断语句中。  这个状态变量在开始接收数据前自动设置为 “真”, 数据接收完毕后自动设置为 “假”,如果不放在这个判断中, 直接放在死循环里,将会导致数据过载而宕机。

3. printf 命令参数, 格式字符, 转移符。  其中 % 作为格式字符的标识, 按道理说, 要输出它, 应该使用转移符才对。 我认为应该这样输出: \% , 实际上它这样输出: %%

4. 介绍常用变量类型及长度。实际上,只有双精度 double 占用了 8 个字节, 也就是 64 位。

5. 做 printf 实验时, 我特别想知道如何获取USB端接收到的数据。 因为这让我想起 Java 语言课程中, 函数的 args 调用。 在本课程的教学中, 也可以通过在 ISP 中输入不同的字符串作为参数, 演示各种运算符的运算结果。后来我问了 Deepseek, 它告诉我答案,不过还没有实际调试。

6. 位运算符的理解。 其他的都比较好理解, 唯有“异或”和“位移”,比较容易混淆。我强行安排了符合自己风格的口诀,帮助记忆。

下面是学习过程的截图和相应的思考。

CDC HID串口助手.png
PRINTF 放置的位置.png
printf 格式转换符.png
printf 转义符.png
百分号转义符.png
变量类型.png
打开USB库中的PRINTF_HID宏定义.png
打开不停电下载选项.png
定义关键词别名.png
放置位置 3.png
浮点数.png
浮点数和双精度数的取值范围.png
接收 ISP 发送过来的数据.png
生成com口的原因?.png
位运算.png
位运算解释.png
指针运算符 取址运算符.png
转义符.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-12-16 00:36:41
已绑定手机

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 昨天 10:20 | 显示全部楼层
课外练习: 制作流水灯

代码如下:

  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,本节课程的其余内容(USB不停电下载)均通用!
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7. unsigned int pos = 8;
  8. void Delay(unsigned int ms)        //@24.000MHz
  9. {
  10.         unsigned char data i, j;
  11.                 while(ms--){
  12.                         i = 24;
  13.                         j = 85;
  14.                         do
  15.                         {
  16.                                 while (--j);
  17.                         } while (--i);
  18.                 }
  19. }
  20. void main(void)
  21. {
  22.     P_SW2 |= 0x80;                //B7位写1,使能访问XFR
  23.         
  24.     P0M1 = 0x00;   P0M0 = 0x00;
  25.     P1M1 = 0x00;   P1M0 = 0x00;
  26.     P2M1 = 0x00;   P2M0 = 0x00;
  27.     P3M1 = 0x00;   P3M0 = 0x00;
  28.     P4M1 = 0x00;   P4M0 = 0x00;
  29.     P5M1 = 0x00;   P5M0 = 0x00;
  30.     P6M1 = 0x00;   P6M0 = 0x00;
  31.     P7M1 = 0x00;   P7M0 = 0x00;
  32.         
  33.         usb_init();                                     //USB CDC 接口配置
  34.     IE2 |= 0x80;                                    //使能USB中断
  35.     EA = 1;                                                                                        //IE |= 0X80;
  36.         
  37.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  38.         
  39.         P2 = 0xFE;
  40.         while(1)
  41.         {
  42.                
  43.                                                         while(pos > 1){
  44.                                                                
  45.                                                                 pos-- ;
  46.                                                                 Delay(100);                                // 1111 1110  ->  取反 0000 0001 ->  左移 1 位 0000 0010 -> 取反 1111 1101
  47.                                                                
  48.                                                                 // 7 : 1111 1101
  49.                                                                 // 6 : 1111 1011
  50.                                                                 // 5 : 1111 0111
  51.                                                                 // 4 : 1110 1111
  52.                                                                 // 3 : 1101 1111
  53.                                                                 // 2 : 1011 1111
  54.                                                                 // 1 : 0111 1111
  55.                                                                
  56.                                                                 P2 = ~(~P2 << 1);  // 最后一次 0111 1111
  57.                                                         }
  58.                                                         
  59.                                                         if(pos <= 1){
  60.                                                                 P2 = 0xFE;
  61.                                                                 pos = 8;
  62.                                                         }
  63.                
  64.         if (bUsbOutReady)
  65.         {
  66.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  67.             
  68.                                           // printf("Hello World, %s \r\n", "擎天柱");
  69.                                        
  70.                                         printf("P2: %X , %d \r\n", P2, pos);
  71.                                        
  72.             usb_OUT_done();
  73.         }
  74.                
  75. //                P20 = 0;                                        //P00端口输出0V
  76. //                P22 = 0;                                        //P02端口输出0V
  77.         }
  78. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-12-16 00:36:41
已绑定手机

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 昨天 14:11 | 显示全部楼层
AI8051U 第六课: I/O 输入输出


昨晚尝试使用 Keil 创建项目, 发现无法找到设备型号 AI8051U 32bits ,并且打开下载回来的项目, 编译按钮和配置按钮都是灰色的。最后才弄清楚,原来我没有安装 Keil C251的缘故。下载安装后就正常了。

下面是第六课的学习记录。

1. 第六课验证了我的想法。 前面使用 P_SW2 |= 0x80 的写法, 可以使用 EAXFR = 1 代替。

2. 讲了 I/O 口的四种工作模式。 初步理解是某些场景需要不同的电流, 所以需要用到对应的模式。 目前我们只用到 准双向。 这一块知识还需要在后续学习中去检验。

3. 课程着重讲了按钮的抖动和处理, 并介绍了处理抖动的方法。 这个由于以前使用 89C52RC 时有过了解, 理解起来没有障碍。

4. 重点完成了两个练习。代码和效果如下。

练习(1) : 按一下 P32 灯亮 / 灯灭

  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,本节课程的其余内容(USB不停电下载)均通用!
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7. bit state = 0;
  8. void Delay(unsigned int ms)        //@24.000MHz
  9. {
  10.         unsigned char data i, j;
  11.                 while(ms--){
  12.                         i = 24;
  13.                         j = 85;
  14.                         do
  15.                         {
  16.                                 while (--j);
  17.                         } while (--i);
  18.                 }
  19. }
  20. void main(void)
  21. {
  22.     //P_SW2 |= 0x80;                //B7位写1,使能访问XFR  等同于  EAFXR = 1;
  23.         WTST = 0;
  24.         EAXFR = 1;
  25.         CKCON = 0;
  26.         
  27.         
  28.     P0M1 = 0x00;   P0M0 = 0x00;
  29.     P1M1 = 0x00;   P1M0 = 0x00;
  30.     P2M1 = 0x00;   P2M0 = 0x00;
  31.     P3M1 = 0x00;   P3M0 = 0x00;
  32.     P4M1 = 0x00;   P4M0 = 0x00;
  33.     P5M1 = 0x00;   P5M0 = 0x00;
  34.     P6M1 = 0x00;   P6M0 = 0x00;
  35.     P7M1 = 0x00;   P7M0 = 0x00;
  36.         
  37.         usb_init();                                     //USB CDC 接口配置
  38.     IE2 |= 0x80;                                    //使能USB中断
  39.     EA = 1;                                                                                        //IE |= 0X80;
  40.         
  41.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  42.         
  43.         // P2 = 0xFE;
  44.         P20 = 0;
  45.         while(1)
  46.         {
  47.                
  48.                 if(P33 == 0){
  49.                         
  50.                         Delay(20);
  51.                         while(P33 == 0);
  52.                         Delay(20);
  53.                         
  54.                         state = !state;
  55.                         P20 = state;
  56.                         
  57.                         printf("state = %d \r\n", (unsigned int)state);
  58.                         
  59.                 }
  60.                
  61.                
  62.                
  63.         if (bUsbOutReady)
  64.         {
  65.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  66.             
  67.                                        
  68.             usb_OUT_done();
  69.         }
  70.         }
  71. }
复制代码



练习(2) : 按一下 P32 亮一颗灯,直到全部点亮。

  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,本节课程的其余内容(USB不停电下载)均通用!
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7. unsigned int state = 0xFF;
  8. void Delay(unsigned int ms)        //@24.000MHz
  9. {
  10.         unsigned char data i, j;
  11.                 while(ms--){
  12.                         i = 24;
  13.                         j = 85;
  14.                         do
  15.                         {
  16.                                 while (--j);
  17.                         } while (--i);
  18.                 }
  19. }
  20. void main(void)
  21. {
  22.     //P_SW2 |= 0x80;                //B7位写1,使能访问XFR  等同于  EAFXR = 1;
  23.         WTST = 0;
  24.         EAXFR = 1;
  25.         CKCON = 0;
  26.         
  27.         
  28.     P0M1 = 0x00;   P0M0 = 0x00;
  29.     P1M1 = 0x00;   P1M0 = 0x00;
  30.     P2M1 = 0x00;   P2M0 = 0x00;
  31.     P3M1 = 0x00;   P3M0 = 0x00;
  32.     P4M1 = 0x00;   P4M0 = 0x00;
  33.     P5M1 = 0x00;   P5M0 = 0x00;
  34.     P6M1 = 0x00;   P6M0 = 0x00;
  35.     P7M1 = 0x00;   P7M0 = 0x00;
  36.         
  37.         usb_init();                                     //USB CDC 接口配置
  38.     IE2 |= 0x80;                                    //使能USB中断
  39.     EA = 1;                                                                                        //IE |= 0X80;
  40.         
  41.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  42.         
  43.         // P2 = 0xFE;
  44.         // P2 = FF;
  45.         while(1)
  46.         {
  47.                
  48.                 if(P33 == 0){
  49.                         
  50.                         Delay(20);
  51.                         while(P33 == 0);
  52.                         Delay(20);
  53.                         
  54.                         // 按一次, 右移1位,直到等于 0
  55.                         if(state > 0){
  56.                                 state = state >> 1;
  57.                                 P2 = state;
  58.                         }
  59.                         
  60.                         printf("state = %d \r\n", (unsigned int)state);
  61.                         
  62.                 }
  63.                
  64.                
  65.                
  66.         if (bUsbOutReady)
  67.         {
  68.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  69.             
  70.                                        
  71.             usb_OUT_done();
  72.         }
  73.         }
  74. }
复制代码




EAXFR 设置 与 IE2 设置.png
IO口模式和电流.png
P_SW2 B7 配置的两种方法通用.png
按键抖动.png
按钮 与 io 口默认高电平.png
初始化参数配置.png
电平电压有效区间.png
工作电压.png
作业.png
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-12-16 00:36:41
已绑定手机

1

主题

7

回帖

29

积分

新手上路

积分
29
发表于 昨天 21:31 | 显示全部楼层
第七课:定时器中断


1. 定时器初始化、中断回调函数,可以通过ISP工具生成。我们要理解的是生成参数的含义,以便更好的使用。原理说实话,比较费解。

2. 函数声明、函数定义。 C语言程序一般来说是从上往下一行一行执行的。因此在main()函数中调用的函数,要在它的前面声明或者定义好。

3. 教学视频中的第一个例子,按下按钮后亮灯,3秒后熄灭。由于在中断函数中关闭了定时器,下一次按钮被按下,就不会3秒后熄灭了。

4. 打印中文的 xfd 问题,有一组中文字符,在输出时会乱码,需要使用 \xFD 修复。

5. 完成作业。我觉得单倍功德量一颗灯,双倍功德亮2颗灯更加直观,所以作业也这么做了。

作业源码:

  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. #include "stdlib.h"
  4. //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,本节课程的其余内容(USB不停电下载)均通用!
  5. char *USER_DEVICEDESC = NULL;
  6. char *USER_PRODUCTDESC = NULL;
  7. char *USER_STCISPCMD = "@STCISP#";
  8. unsigned int gd = 0;        // 功德总数
  9. unsigned char gdx = 1;        // 单次功德点数
  10. void Delay(unsigned int ms)        //@24.000MHz
  11. {
  12.         unsigned char data i, j;
  13.                 while(ms--){
  14.                         i = 24;
  15.                         j = 85;
  16.                         do
  17.                         {
  18.                                 while (--j);
  19.                         } while (--i);
  20.                 }
  21. }
  22. void Timer0_Init(void)                //1秒@24.000MHz
  23. {
  24.         TM0PS = 0x1E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  25.         AUXR &= 0x7F;                        //定时器时钟12T模式
  26.         TMOD &= 0xF0;                        //设置定时器模式
  27.         TL0 = 0xFC;                                //设置定时初始值
  28.         TH0 = 0x03;                                //设置定时初始值
  29.         TF0 = 0;                                //清除TF0标志
  30.         TR0 = 1;                                //定时器0开始计时
  31.         ET0 = 1;                                //使能定时器0中断
  32. }
  33. void Timer1_Init(void)                //2秒@24.000MHz
  34. {
  35.         TM1PS = 0x3D;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  36.         AUXR &= 0xBF;                        //定时器时钟12T模式
  37.         TMOD &= 0x0F;                        //设置定时器模式
  38.         TL1 = 0xFC;                                //设置定时初始值
  39.         TH1 = 0x03;                                //设置定时初始值
  40.         TF1 = 0;                                //清除TF1标志
  41.         TR1 = 1;                                //定时器1开始计时
  42.         ET1 = 1;                                //使能定时器1中断
  43. }
  44. void main(void)
  45. {
  46.     //P_SW2 |= 0x80;                //B7位写1,使能访问XFR  等同于  EAFXR = 1;
  47.         WTST = 0;
  48.         EAXFR = 1;
  49.         CKCON = 0;
  50.         
  51.     P0M1 = 0x00;   P0M0 = 0x00;
  52.     P1M1 = 0x00;   P1M0 = 0x00;
  53.     P2M1 = 0x00;   P2M0 = 0x00;
  54.     P3M1 = 0x00;   P3M0 = 0x00;
  55.     P4M1 = 0x00;   P4M0 = 0x00;
  56.     P5M1 = 0x00;   P5M0 = 0x00;
  57.     P6M1 = 0x00;   P6M0 = 0x00;
  58.     P7M1 = 0x00;   P7M0 = 0x00;
  59.         
  60.         usb_init();                                     //USB CDC 接口配置
  61.     IE2 |= 0x80;                                    //使能USB中断
  62.     EA = 1;                                                                                        //IE |= 0X80;
  63.         
  64.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  65.         while(1)
  66.         {
  67.                
  68.                 if(P33 == 0){
  69.                         
  70.                         Delay(20);
  71.                         while(P33 == 0);
  72.                         Delay(20);
  73.                         
  74.                         // 每次按下,都切换功德点数
  75.                         gdx = gdx == 1 ? 2 : 1;
  76.                         
  77.                         //printf("gdx = %d \r\n", (int)gdx);
  78.                         
  79.                         switch((unsigned int)gdx){
  80.                                 case 1:
  81.                                         printf("单倍功德时间\r\n");
  82.                                         break;
  83.                                 case 2:
  84.                                         printf("双倍功德时间\r\n");
  85.                                         break;
  86.                         }
  87.                         
  88.                 }
  89.                
  90.                 if(P32 == 0){
  91.                         
  92.                         Delay(20);
  93.                         while(P32 == 0);
  94.                         Delay(20);
  95.                         
  96.                         gd += gdx;
  97.                         printf("功德+%d 当前功德:%d \r\n",gdx,gd);
  98.                         
  99.                         switch((unsigned int)gdx){
  100.                                 case 1:
  101.                                         // 单倍功德,点亮1颗灯
  102.                                         P20 = 0;
  103.                                         Timer0_Init();
  104.                                         break;
  105.                                 case 2:
  106.                                         // 2倍功德,点亮2颗灯,更直观
  107.                                         P20 = 0;
  108.                                         P21 = 0;
  109.                                         Timer1_Init();
  110.                                         break;
  111.                         }
  112.                         
  113.                 }
  114.                
  115.         if (bUsbOutReady)
  116.         {
  117.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  118.             
  119.                                        
  120.             usb_OUT_done();
  121.         }
  122.         }
  123. }
  124. void Timer0_Isr(void) interrupt 1
  125. {
  126.         // 关闭 P20
  127.         P20 = 1;
  128.         TR0 = 0;
  129.         
  130. }
  131. void Timer1_Isr(void) interrupt 3
  132. {
  133.         // 关闭 P20
  134.         P20 = 1;
  135.         P21 = 1;
  136.         TR1 = 0;
  137. }
复制代码
作业操作视频:



学习关键截图


xdf 中文字符表.png
打印中文的 xfd 问题.png
电子木鱼(功德箱).png
定时器初始化.png
定时器的重装载和分频.png
定时器的作用.png
定时器配置.png
定时器生成器.png
定时器时间计算公式.png
关闭计时器.png
函数定义.png
函数声明与定义.png
课后小练.png
亮灯3秒后熄灭不可重复操作:中断函数被关闭后没有重开.png
需要多个定时实例.png
循环启用和关闭中断函数.png
中断函数的本质是定时任务.png
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-17 07:44 , Processed in 0.131347 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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