找回密码
 立即注册
查看: 119|回复: 9

《8051U深度入门到32位51大型实战视频》学习心得 ||实验箱已邮寄

[复制链接]
已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
发表于 2026-8-31 10:29:59 | 显示全部楼层 |阅读模式
碎碎念: 因为想拥有自己的开发工具箱,所以开始打开学习了,同时感谢宏晶官方给了我们能白嫖的机会,嘻嘻,感恩🙏
PS: 之前用了宏晶STC做毕设


第一集 序言       学习心得

通过第一集的学习,我知道了AI8051U相较于STC32G强了,在第一集里老师演示了"屏幕显示和视频播放"、"IIS录放音"、"PWM_DMA"、"频谱分析仪(上位机)"和"手写计算器"。
"屏幕显示和视频播放":这个演示让我知道了,AI8051U的刷新率很高,或许肉眼看到的还更不一样。至少从老师的摄像头上这刷新率以及不低了。同时让我知道了STC-ISP有个很方便写入Flash的功能(之前不知道)
"IIS录放音":这个演示让我知道了AI8051U支持录放音,从视频里听的声音来看,音质还是挺不错的。其实我好奇这个录音支持录多长时间。
"PWM_DMA":这个演示虽然是展示的时钟显示,但是理论上应该是可以控制电机转速的(指的是支持PWM调速的电机)
"频谱分析仪(上位机)":这个演示是通过STC-ISP上的频谱分析功能和实验箱的声音采集展示的,EMMMM,对这个了解不深,不知道说啥,以及可以具体运用在哪方面,哈哈哈。
"手写计算器":EMMM,这个很有意思,这个标志着8051U进入AI时代,但是我好奇这个手写计算器的图像识别模型是直接能存放进8051U里面吗?(看了论坛的那个帖子,没有找到答案,因为我没有去训练那个模型,所以不确定,之后训练了就知道了)
看了原理图,似乎确实不用额外的存储模块。   我通过把手写计算器帖主发的那个项目build成hex(记得安装论坛的那个中继扩展)后且用stc-isp打开程序文件,发现是可以的。也就是说无需额外的存储模块!强,真的太强了!
看8051U的Flash有64K。


板子上按P33+POWER重新上电。

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!                        实验箱已经收到了                           !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
感谢官方!!!感恩!!!🙏🙏🙏
截图202609170918327633.jpg





截图202609011527276100.jpg
截图202609011535377658.jpg
回复

使用道具 举报 送花

36

主题

240

回帖

1457

积分

版主

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

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

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

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

使用道具 举报 送花

已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
 楼主| 发表于 2026-9-1 15:50:52 | 显示全部楼层
第二集  硬件及工具介绍  学习心得

本集,老师介绍了实验箱PCB板正面与背面上的各个元器件。不得不说,这个实验箱确实能做不少实验或者说能实现不少功能,哈哈哈。
视频下半段老师"手把手"教中继拓展插件如何安装、STC-ISP软件部分功能使用、实验箱手册下载以及如何在实验箱上烧录程序。

板子正面:




板子背面:

回复

使用道具 举报 送花

已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
 楼主| 发表于 2026-9-2 16:19:46 | 显示全部楼层
第三集  点亮第一颗LED    学习心得


这集真的很适合新手看,老师"手把手"教怎么新建项目、新建代码文件、如何把代码文件添加进项目中等等。
我因为在学校学过,所以这集也就是学学 学校没教的。
比如:
1.学到了比较快速添加文件进项目中的技巧,就是双击"Source Group"然后就打开添加窗口了,我之前学校都是右键"Source Group"然后点击"Select exiting...."这样添加的。
2.学到了如何改Tab Size的大小(就是按下Tab键,缩进多少个空格)。




下面是我的点亮第一颗LED视频,嘻嘻(#^.^#)


1543888279.mp4

606.75 KB, 下载次数: 0

回复

使用道具 举报 送花

已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
 楼主| 发表于 2026-9-8 09:39:24 | 显示全部楼层
第四集   USB不停电下载


基于上集,每次下载代码都需要按一下按钮这种不方便的操作,该集就是教如何解决这个问题的。可以到达每次点击下载代码都不需要按按钮了。老师手把手教如何使用USB库,同时讲解了代码的意思。基础的知识都讲,比如或运算。
PS:不过我之前下载是冷启动来着,有这么个方式下载,很方便呐!
截图202609080930162617.jpg
回复

使用道具 举报 送花

已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
 楼主| 发表于 2026-9-9 09:12:50 | 显示全部楼层
第五集   C语言基础


看这集之前我已经学过了C语言,所以这集就是查漏补缺了。
想要添加64位变量,需要在程序头添加申明:#pragma float64
截图202609090912467419.jpg
回复

使用道具 举报 送花

已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
 楼主| 发表于 2026-9-10 09:04:05 | 显示全部楼层
第六集   I/O输入输出


截图202609100837462714.jpg

截图202609100840425314.jpg
该图片上提到的灌电流和拉电流,我是第一次知道其的概念QWQ
灌电流:电流从外部流入芯片引脚
拉电流:电流从芯片引脚流出到外部

代码层面上消除按键抖动。
截图202609100855493143.jpg

本集还学到了如何快速获取一串delay函数,嘿嘿(*^▽^*)当然,这也得力于STC-ISP


PS:收到实验箱了,在这集记得别忘记把stc32_stc8_usb.h文件里这行代码注释取消掉,不然无法像老师那样串口通信了QWQ(别问我怎么知道的,问就是通过多种排除,突然意识到是stc32_stc8_usb.h这个文件的问题)
截图202609200903066561.jpg

于是:


回复

使用道具 举报 送花

已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
 楼主| 发表于 2026-9-14 16:15:46 | 显示全部楼层
第七集   定时器中断


虽然但是我知道中断是咋回事。但是不得不承认老师采用的案列让大家去理解什么是中继,十分通俗。思考“为什么?如何结果”,引出"中断"(解决方式)。
截图202609141612468669.jpg
截图202609141613565491.jpg
截图202609141615426590.jpg


课后小练:
截图202609200910468040.jpg
代码:
  1. #include "AI8051U.h"
  2. #include "stc32_stc8_usb.h"
  3. #include "intrins.h"
  4. int mode = 0;                // 0 双倍功德时间   1 单倍功德时间
  5. char *USER_DEVICEDESC = NULL;
  6. char *USER_PRODUCTDESC = NULL;
  7. char *USER_STCISPCMD = "@STCISP#";
  8. void Delay_ms(int num)        //@24.000MHz
  9. {
  10.         unsigned long edata i;
  11.         _nop_();
  12.         _nop_();
  13.         i = (5998 * num);
  14.         while (i) i--;
  15. }
  16. void Timer0_Init1(void)                //1秒@24.000MHz
  17. {
  18.         TM0PS = 0x1F;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  19.         AUXR &= 0x7F;                        //定时器时钟12T模式
  20.         TMOD &= 0xF0;                        //设置定时器模式
  21.         TL0 = 0xDC;                                //设置定时初始值
  22.         TH0 = 0x0B;                                //设置定时初始值
  23.         TF0 = 0;                                //清除TF0标志
  24.         TR0 = 1;                                //定时器0开始计时
  25.         ET0 = 1;                                //使能定时器0中断
  26. }
  27. void Timer0_Init2(void)                //2秒@24.000MHz
  28. {
  29.         TM0PS = 0x3F;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  30.         AUXR &= 0x7F;                        //定时器时钟12T模式
  31.         TMOD &= 0xF0;                        //设置定时器模式
  32.         TL0 = 0xDC;                                //设置定时初始值
  33.         TH0 = 0x0B;                                //设置定时初始值
  34.         TF0 = 0;                                //清除TF0标志
  35.         TR0 = 1;                                //定时器0开始计时
  36.         ET0 = 1;                                //使能定时器0中断
  37. }
  38. void main(void) {
  39.         int index = 0;
  40.        
  41.         P_SW2 |= 0x80;                        // 使能访问XFR
  42.         WTST = 0;
  43.         EAXFR = 1;
  44.         CKCON = 0;
  45.        
  46.         P0M0 = 0x00; P0M1 = 0x00;
  47.         P1M0 = 0x00; P1M1 = 0x00;
  48.         P2M0 = 0x00; P2M1 = 0x00;
  49.         P3M0 = 0x00; P3M1 = 0x00;
  50.         P4M0 = 0x00; P4M1 = 0x00;
  51.         P5M0 = 0x00; P5M1 = 0x00;
  52.         P6M0 = 0x00; P6M1 = 0x00;
  53.         P7M0 = 0x00; P7M1 = 0x00;
  54.        
  55.         usb_init();
  56.        
  57.         IE2 |= 0x80;                        // 使能USB中断
  58.         EA = 1;
  59.        
  60.         while(DeviceState != DEVSTATE_CONFIGURED);                // 等待USB完成配置
  61.        
  62.         P40 = 0;
  63.        
  64.         while(1) {
  65.                 if (bUsbOutReady) {
  66.                         // USB_SendData(UsbOutBuffer, OutNumber);
  67.                         usb_OUT_done();
  68.                 }
  69.                
  70.                 if (P32 == 0) {
  71.                         Delay_ms(20);
  72.                         if (P32 == 0) {
  73.                                 if (mode == 0) {
  74.                                         printf("单倍功德时间");
  75.                                         mode = 1;
  76.                                 } else if (mode == 1) {
  77.                                         printf("双倍功德时间");
  78.                                         mode = 0;
  79.                                 }
  80.                         }
  81.                         while (P32 == 0);
  82.                 }
  83.                 if (P33 == 0) {
  84.                         Delay_ms(20);
  85.                         if (TR0 == 1) {
  86.                                 printf("上次加功德还在进行中,请稍后\r\n");
  87.                                 while(P33 == 0);
  88.                                 continue;
  89.                         }
  90.                         if (P33 == 0) {
  91.                                 P00 = 0;
  92.                                 if (mode == 0) {
  93.                                         index += 2;
  94.                                         printf("功德+2 当前功德:%d\r\n", index);
  95.                                         Timer0_Init2();
  96.                                 } else if (mode == 1) {
  97.                                         index += 1;
  98.                                         printf("功德+1 当前功德:%d\r\n", index);
  99.                                         Timer0_Init1();
  100.                                 }
  101.                         }
  102.                         while (P33 == 0);
  103.                 }
  104.                
  105.         }
  106.        
  107. }
  108. void Timer0_Isr(void) interrupt 1 {
  109.         P00 = 1;
  110.         TR0 = 0;                                                        // 关闭定时器0
  111. }
复制代码
实机效果:

回复

使用道具 举报 送花

已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
 楼主| 发表于 2026-9-15 14:34:18 | 显示全部楼层
第八集   定时器周期性调度任务


本集开篇阐述了部分同学写代码上的问题(我觉得我可以跳过,但是还是查漏补缺了一下l)。
截图202609151333402636.jpg
从单一状态(三个参数)过渡到数组,最后到周期性调度任务(结构体)
在实际运用场景下,最后一者那一定会是更高效率的,因为改参数啥的都更方便。
然前者其实还可以用一个参数表示(就是取整运算来判断,当增加的值能整除300、600、900时改变状态)

截图202609151403417337.jpg


教了如何不用通过while来判断按钮的松开。
回复

使用道具 举报 送花

已绑定手机

2

主题

13

回帖

114

积分

注册会员

积分
114
 楼主| 发表于 前天 16:38 | 显示全部楼层
第九集   数码管

截图202609211408159140.jpg

老师说的AS和BS的概念可能不对
截图202609211409222124.jpg
应该是共阴和共阳的区别,AS代表共阴极,而BS代表共阳极。



本集内容中我与老师不同的显示时间代码:
  1. u8 SEG_NUM[] = {
  2.   0x3F,       /*'0', 0*/
  3.   0x06,       /*'1', 1*/
  4.   0x5B,       /*'2', 2*/
  5.   0x4F,       /*'3', 3*/
  6.   0x66,       /*'4', 4*/
  7.   0x6D,       /*'5', 5*/
  8.   0x7D,       /*'6', 6*/
  9.   0x07,       /*'7', 7*/
  10.   0x7F,       /*'8', 8*/
  11.   0x6F,       /*'9', 9*/
  12.   0x77,       /*'A', 10*/
  13.   0x7C,       /*'B', 11*/
  14.   0x39,       /*'C', 12*/
  15.   0x5E,       /*'D', 13*/
  16.   0x79,       /*'E', 14*/
  17.   0x71,       /*'F', 15*/
  18.   0x40,       /*'-', 16*/
  19.   0x00,       /*' ', 17*/
  20.   0x80,       /*'.', 18*/
  21. };
  22. u8 T_NUM[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
  23. u32 seconds = 0;
  24. void add_seconds(void) {
  25.   seconds++;
  26.   if (seconds == 86400) // 到了24:00:00了,重新计时
  27.   {
  28.     seconds = 0;
  29.   }
  30. }
  31. u8 seg_no = 0;
  32. void seg_task(void) {
  33.   u8 showHour, showMinute, showSec;
  34.   // 得小时 通过整除3600得到小时
  35.   showHour = seconds / 3600;;
  36.   // 得分钟 通过取余3600,再整除60
  37.   showMinute = (seconds % 3600) / 60;
  38.   // 得秒 通过取余60
  39.   showSec = seconds % 60;
  40.   if (seg_no == 0) {  
  41.     // 小时十位
  42.     Display(SEG_NUM[showHour / 10], ~T_NUM[0]);
  43.   } else if (seg_no == 1) {
  44.     // 小时个位
  45.     Display(SEG_NUM[showHour % 10], ~T_NUM[1]);
  46.   } else if (seg_no == 2) {
  47.     // 分割符
  48.     Display(SEG_NUM[16], ~T_NUM[2]);
  49.   } else if (seg_no == 3) {  
  50.     // 分钟十位
  51.     Display(SEG_NUM[showMinute / 10], ~T_NUM[3]);
  52.   } else if (seg_no == 4) {
  53.     // 分钟个位
  54.     Display(SEG_NUM[showMinute % 10], ~T_NUM[4]);
  55.   } else if (seg_no == 5) {
  56.     // 分割符
  57.     Display(SEG_NUM[16], ~T_NUM[5]);
  58.   } else if (seg_no == 6) {  
  59.     // 秒十位
  60.     Display(SEG_NUM[showSec / 10], ~T_NUM[6]);
  61.   } else if (seg_no == 7) {
  62.     // 秒个位
  63.     Display(SEG_NUM[showSec % 10], ~T_NUM[7]);
  64.   }
  65.   seg_no++;
  66.   if (seg_no == 8) seg_no = 0;
  67. }
复制代码




课后小练
实验箱演示:

代码文件:
course_09.zip (160.21 KB, 下载次数: 0)
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-23 16:09 , Processed in 0.360277 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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