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

利用普中A2开发板学习AI8051U的心得

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-05-01 07:51:17
已绑定手机

2

主题

15

回帖

66

积分

注册会员

积分
66
发表于 5 天前 | 显示全部楼层 |阅读模式
第一期(对应教学视频第1集《序言》)
很早之前就买了普中的开发板用来学习51单片机,开发板带的是89C52。现在看到了冲哥的8051U深度入门到3251大型实战教学视频》,虽然没有官方实验箱,但了解到AI8051U和89C52引脚完全兼容,于是把积灰已久的开发板又拿出来,淘了一颗DIP40的AI8051U换上,装好了Keil C251,准备跟着视频和芯片手册从头学起,领略一下这颗芯片的强在哪里。


IMG_9056.jpg

第二期(第2集《硬件及工具介绍》)

从原理图来看,因为普中这块开发板的Micro-USB是接在了CH340G上,没有直接和AI8051U的P30、P31连接,所以无法直接实现USB-CDC虚拟串口通信,所以又特意买了一根USB-A转4X1P杜邦线来解决问题。
因为LED、按键、数码管等外设开发板上都还挺全的,所以暂时应该可以应付基本学习需要。后面如果有特别要求,再额外添加元件。

MCU.png
USB转TTL.png


回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 5 天前 | 显示全部楼层
利用普中A2开发板学习AI8051U的心得  
第一期(对应教学视频第1集《序言》和第2集《硬件及工具介绍》)  

作为一名嵌入式开发爱好者,近期我重新拾起了积灰已久的普中A2开发板,并尝试通过更换AI8051U芯片来深入学习这款新型8051架构的增强型单片机。以下是我在第一期学习中的一些心得和体会,主要围绕硬件准备、开发环境搭建以及初步的硬件连接问题展开。  

1. 硬件准备  
普中A2开发板原本搭载的是经典的89C52单片机,其引脚布局与AI8051U完全兼容,这为更换芯片提供了极大的便利。AI8051U作为一款增强型8051架构单片机,不仅继承了传统8051的易用性,还引入了更多现代特性,如更高的主频、更大的存储空间以及更丰富的外设支持。这些特性使得AI8051U在性能上有了显著提升,同时也为开发者提供了更多的可能性。  

在更换芯片后,我注意到开发板的Micro-USB接口并未直接连接到AI8051U的P30和P31引脚,而是通过CH340G芯片实现USB转串口功能。这意味着无法直接利用AI8051U内置的USB-CDC虚拟串口功能。为了解决这一问题,我额外购买了一根USB-A转4X1P杜邦线,以便将AI8051U的USB引脚直接连接到电脑,从而实现USB通信功能。  

2. 开发环境搭建  
为了适配AI8051U的开发需求,我安装了Keil C251开发环境。Keil C251是专为8051架构设计的集成开发环境(IDE),支持C语言和汇编语言编程,并提供了丰富的调试功能。通过Keil C251,我可以方便地编写、编译和调试针对AI8051U的应用程序。  

在安装过程中,我特别注意了Keil C251的版本兼容性,并确保安装了最新的芯片支持包(CSP),以便能够正确识别和配置AI8051U的相关参数。此外,我还参考了AI8051U的芯片手册,对开发环境进行了初步的配置,包括时钟频率、存储器映射以及外设初始化等。  

3. 硬件连接与调试  
在硬件连接方面,普中A2开发板提供了丰富的外设资源,包括LED、按键、数码管等,这些资源足以满足初期的学习需求。通过简单的程序编写,我成功实现了LED的点亮与熄灭、按键的检测以及数码管的显示等功能。这些实验不仅帮助我熟悉了AI8051U的基本操作,也让我对其性能有了初步的了解。  

然而,在调试过程中,我也遇到了一些问题。例如,由于开发板的USB接口未直接连接到AI8051U,导致无法直接利用其内置的USB-CDC功能。为了解决这一问题,我通过USB-A转4X1P杜邦线将AI8051U的USB引脚直接连接到电脑,并成功实现了USB通信功能。这一过程让我深刻体会到硬件连接的重要性,同时也让我对AI8051U的USB功能有了更深入的理解。  

4. 总结与展望  
通过第一期的学习,我对AI8051U的基本特性和开发环境有了初步的了解,并成功实现了简单的硬件调试。然而,这只是学习的开始,AI8051U的强大功能还有待进一步探索。在接下来的学习中,我计划深入研究其高级特性,如定时器、中断、PWM以及ADC等,并通过实际项目来巩固所学知识。  

此外,我也意识到硬件资源的局限性可能会对后续学习造成一定的影响。因此,我计划根据实际需求逐步添加额外的元件和模块,以便更好地支持复杂项目的开发。  

总之,AI8051U作为一款增强型8051架构单片机,为嵌入式开发提供了更多的可能性。通过系统的学习和实践,我相信能够充分发挥其性能优势,并在未来的项目中取得更大的突破。  

(注:本文为第一期学习心得,后续将根据教学视频的更新,继续分享更多学习体会和实践经验。)

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-05-01 07:51:17
已绑定手机

2

主题

15

回帖

66

积分

注册会员

积分
66
发表于 5 天前 | 显示全部楼层
第三期(第3集《点亮第一颗LED》)

一开始肯定还是从传统艺能——点灯入手。下载最新的ISP 6.95M以后,发现多了一个AiCube功能(可能出教学视频的时候,这个功能还没有实现,所以视频中并没有提及)。试用了一下感觉非常好用,简直就是51单片机版的CubeMX,通过简单的菜单配置就能搭好程序框架。

我只选了时钟和USB模块,发现IO口模式、毫秒延时函数都直接配置好了。实现流水灯,我只写了三行代码,太省心了。




LED.png
  1. void main(void)
  2. {
  3.     u8 i;   
  4.     SYS_Init();
  5.     while (1)
  6.     {
  7.                 for(i=0;i<8;i++)
  8.                 {
  9.                         P2 =~(1<<i);
  10.                         delay_ms(200);
  11.                 }
  12.     }
  13. }
复制代码


第四期(第4集《USB不停电下载》)

USB不停电下载用下来感觉非常方便,再也不用来回开关电源或者插拔数据线了。同时AiCube的代码编写风格让我感觉到51单片机也正在从寄存器操作转向库函数调用,需要逐渐去适应。
虽然代码不如操作寄存器那样直观,但是确实表意明晰了很多,也算是一种趋势吧。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-05-01 07:51:17
已绑定手机

2

主题

15

回帖

66

积分

注册会员

积分
66
发表于 5 天前 | 显示全部楼层
第五期(第5集《C语言基础》)

因为新注册论坛会员,成功领到了擎天柱开发板。这个也能完美地插在我的开发板上,可以替代DIP40的AI8051U和USB转杜邦线了,桌面整洁了许多,开心。本集主要是C语言知识复习,算是温故而知新吧。

第六期(第6集《I/O输入输出》)

这集视频主要是讲独立按键检测,也是对之前了解的内容作了一个复习。同时,利用printf_usb串口打印也能方便地注释代码信息。

Optimus.jpg

  1. void main(void)
  2. {
  3.         u8 i;
  4.         
  5.     SYS_Init();
  6.     while (1)
  7.     {
  8.                 if(P32==0)
  9.                 {
  10.                         delay_ms(20);
  11.                         while(P32==0);
  12.                         P2 &=~(1<<i);
  13.                         i++;
  14.                         if(i>7) i=7;
  15.                         printf("P32 pressed\n");
  16.                         delay_ms(20);
  17.                 }
  18.                 if(P33==0)
  19.                 {
  20.                         delay_ms(20);
  21.                         while(P33==0);
  22.                         P2 |=(1<<i);
  23.                         i--;        
  24.                         if(i==255) i=0;
  25.                         printf("P33 pressed\n");
  26.                         delay_ms(20);
  27.                 }
  28.     }
  29. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-05-01 07:51:17
已绑定手机

2

主题

15

回帖

66

积分

注册会员

积分
66
发表于 5 天前 | 显示全部楼层
第七期(第7集《定时器中断》)

定时器的配置之前也是跟视频一样用ISP工具协助编写,很方便。不过现在尝试使用AiCube配置,更方便了,点几下鼠标,程序框架就自动搭好了。


不过好像如果在keil中添加了自己的代码,再要重新配置AiCube,代码就会被覆盖掉。这个可以跟CubeMX再学习一下,设定不会被覆盖的用户代码编写区,那样就更完美了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-05-01 07:51:17
已绑定手机

2

主题

15

回帖

66

积分

注册会员

积分
66
发表于 5 天前 | 显示全部楼层
第八期(第8集《定时器周期性调度任务》)

这集视频我最大的收获是了解到了利用结构体数组和函数指针,在仅利用1个定时器的情况下完成不同周期的多任务调度写法。这种设计非常巧妙,值得反复揣摩。

  1. #include "Task.h"
  2. //========================================================================
  3. //                               本地变量声明
  4. //========================================================================
  5. static TASK_COMPONENTS Task_Comps[]=
  6. {
  7. //状态  计数  周期  函数
  8.     {0, 300, 300, LED_Task1},          /* task 1 Period: 300ms */
  9.     {0, 500, 500, LED_Task2},          /* task 2 Period: 500ms */
  10.     /* Add new task here */
  11. };
  12. u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps[0]);
  13. //========================================================================
  14. // 函数: Task_Handler_Callback
  15. // 描述: 任务标记回调函数.
  16. // 参数: None.
  17. // 返回: None.
  18. // 版本: V1.0, 2012-10-22
  19. //========================================================================
  20. void Task_Marks_Handler_Callback(void)
  21. {
  22.     u8 i;
  23.     for(i=0; i<Tasks_Max; i++)
  24.     {
  25.         if(Task_Comps[i].TIMCount)      /* If the time is not 0 */
  26.         {
  27.             Task_Comps[i].TIMCount--;   /* Time counter decrement */
  28.             if(Task_Comps[i].TIMCount == 0) /* If time arrives */
  29.             {
  30.                 /*Resume the timer value and try again */
  31.                 Task_Comps[i].TIMCount = Task_Comps[i].TRITime;  
  32.                 Task_Comps[i].Run = 1;      /* The task can be run */
  33.             }
  34.         }
  35.     }
  36. }
  37. //========================================================================
  38. // 函数: Task_Pro_Handler_Callback
  39. // 描述: 任务处理回调函数.
  40. // 参数: None.
  41. // 返回: None.
  42. // 版本: V1.0, 2012-10-22
  43. //========================================================================
  44. void Task_Pro_Handler_Callback(void)
  45. {
  46.     u8 i;
  47.     for(i=0; i<Tasks_Max; i++)
  48.     {
  49.         if(Task_Comps[i].Run) /* If task can be run */
  50.         {
  51.             Task_Comps[i].Run = 0;      /* Flag clear 0 */
  52.             Task_Comps[i].TaskHook();   /* Run task */
  53.         }
  54.     }
  55. }
  56. void LED_Task1(void)
  57. {
  58.         P26=~P26;
  59. }
  60. void LED_Task2(void)
  61. {
  62.         P27=~P27;
  63. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:108
  • 最近打卡:2025-05-01 08:20:47
已绑定手机

1

主题

63

回帖

521

积分

高级会员

积分
521
发表于 4 天前 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:381
  • 最近打卡:2025-05-01 08:27:28
已绑定手机

10

主题

146

回帖

458

积分

中级会员

积分
458
发表于 4 天前 | 显示全部楼层
必须点赞
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-05-01 07:51:17
已绑定手机

2

主题

15

回帖

66

积分

注册会员

积分
66
发表于 4 天前 | 显示全部楼层
第九期(第9集《数码管》)


普中开发板上的数码管是由74HC138和74HC245两颗芯片共同控制的,和STC实验箱用一颗74HC595控制的情况不一样。

不过还是通过这集视频了解到ISP字库工具里居然有个LED数码管工具,可以用来生成数码管数组,这个以前一直都没发现。看起来ISP总能带一些惊喜。





Nixie.png


  1. u8 nixie[]={
  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.     0x3D,       /*'G', 16*/
  19.     0x76,       /*'H', 17*/
  20.     0x10,       /*'I', 18*/
  21.     0x0E,       /*'J', 19*/
  22.     0x7A,       /*'K', 20*/
  23.     0x38,       /*'L', 21*/
  24.     0x55,       /*'M', 22*/
  25.     0x54,       /*'N', 23*/
  26.     0x5C,       /*'O', 24*/
  27.     0x73,       /*'P', 25*/
  28.     0x67,       /*'Q', 26*/
  29.     0x50,       /*'R', 27*/
  30.     0x64,       /*'S', 28*/
  31.     0x78,       /*'T', 29*/
  32.     0x3E,       /*'U', 30*/
  33.     0x62,       /*'V', 31*/
  34.     0x6A,       /*'W', 32*/
  35.     0x36,       /*'X', 33*/
  36.     0x6E,       /*'Y', 34*/
  37.     0x49,       /*'Z', 35*/
  38.     0x40,       /*'-', 36*/
  39.     0x00,       /*' ', 37*/
  40.     0x80,       /*'.', 38*/
  41. };
  42. void digit_show(u8 num, u8 digit, u8 dot){
  43.         switch(digit){
  44.                 case 1:P22=0;P23=0;P24=0;break;
  45.                 case 5:P22=0;P23=0;P24=1;break;
  46.                 case 3:P22=0;P23=1;P24=0;break;
  47.                 case 7:P22=0;P23=1;P24=1;break;
  48.                 case 2:P22=1;P23=0;P24=0;break;
  49.                 case 6:P22=1;P23=0;P24=1;break;
  50.                 case 4:P22=1;P23=1;P24=0;break;
  51.                 case 8:P22=1;P23=1;P24=1;break;        
  52.         }
  53.         if(dot)
  54.                 P0=nixie[num]|0x80;
  55.         else
  56.                 P0=nixie[num];
  57. }
  58. u8 digit_num(u32 num){
  59.         u8 digit;
  60.         u8 i;
  61.         u32 result;
  62.         if(num)
  63.         {
  64.                 digit=(int)floor(log10(num))+1;
  65.                 for(i=0;i<digit;i++){
  66.                         result=num/(int)pow(10,i);
  67.                         digit_show((u8)(result%10),(u8)(i+1),0);
  68.                 }
  69.         }else{
  70.                 digit=1;
  71.                 digit_show(0,1,0);
  72.         }
  73.         return digit;
  74. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-05-01 07:51:17
已绑定手机

2

主题

15

回帖

66

积分

注册会员

积分
66
发表于 4 天前 | 显示全部楼层
第十期(第10集《虚拟键盘LED和数码管》)

这集视频主要尝试了一下LED、数码管和键盘虚拟显示工具。虽然这个工具也很有用趣,但感觉更喜欢在开发板上看现象,可能以后会比较少用到。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 17:50 , Processed in 0.407285 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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