zhrxxhuy 发表于 6 天前

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

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




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

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





国芯人工智能 发表于 6 天前

利用普中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架构单片机,为嵌入式开发提供了更多的可能性。通过系统的学习和实践,我相信能够充分发挥其性能优势,并在未来的项目中取得更大的突破。

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

[本文内容由国芯人工智能辅助生成,仅供参考]

mechray 发表于 6 天前

第三期(第3集《点亮第一颗LED》)

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

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

745



void main(void)
{
    u8 i;   
    SYS_Init();

    while (1)
    {
                for(i=0;i<8;i++)
                {
                        P2 =~(1<<i);
                        delay_ms(200);
                }
    }
}

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

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

mechray 发表于 6 天前

第五期(第5集《C语言基础》)

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

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

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



void main(void)
{
      u8 i;
      
    SYS_Init();

    while (1)
    {
                if(P32==0)
                {
                        delay_ms(20);
                        while(P32==0);
                        P2 &=~(1<<i);
                        i++;
                        if(i>7) i=7;
                        printf("P32 pressed\n");
                        delay_ms(20);
                }
                if(P33==0)
                {
                        delay_ms(20);
                        while(P33==0);
                        P2 |=(1<<i);
                        i--;      
                        if(i==255) i=0;
                        printf("P33 pressed\n");
                        delay_ms(20);
                }
    }
}

mechray 发表于 6 天前

第七期(第7集《定时器中断》)

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


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

mechray 发表于 6 天前

第八期(第8集《定时器周期性调度任务》)

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


#include "Task.h"

//========================================================================
//                               本地变量声明
//========================================================================

static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
    {0, 300, 300, LED_Task1},          /* task 1 Period: 300ms */
    {0, 500, 500, LED_Task2},          /* task 2 Period: 500ms */

    /* Add new task here */
};

u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);

//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
      if(Task_Comps.TIMCount)      /* If the time is not 0 */
      {
            Task_Comps.TIMCount--;   /* Time counter decrement */
            if(Task_Comps.TIMCount == 0) /* If time arrives */
            {
                /*Resume the timer value and try again */
                Task_Comps.TIMCount = Task_Comps.TRITime;
                Task_Comps.Run = 1;      /* The task can be run */
            }
      }
    }
}

//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
      if(Task_Comps.Run) /* If task can be run */
      {
            Task_Comps.Run = 0;      /* Flag clear 0 */
            Task_Comps.TaskHook();   /* Run task */
      }
    }
}


void LED_Task1(void)
{
      P26=~P26;
}

void LED_Task2(void)
{
      P27=~P27;
}



tianjing818 发表于 5 天前

{:qiang:}

zhaoye818 发表于 5 天前

必须点赞

mechray 发表于 5 天前

第九期(第9集《数码管》)


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

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








u8 nixie[]={
      0x3F,       /*'0', 0*/
    0x06,       /*'1', 1*/
    0x5B,       /*'2', 2*/
    0x4F,       /*'3', 3*/
    0x66,       /*'4', 4*/
    0x6D,       /*'5', 5*/
    0x7D,       /*'6', 6*/
    0x07,       /*'7', 7*/
    0x7F,       /*'8', 8*/
    0x6F,       /*'9', 9*/
    0x77,       /*'A', 10*/
    0x7C,       /*'B', 11*/
    0x39,       /*'C', 12*/
    0x5E,       /*'D', 13*/
    0x79,       /*'E', 14*/
    0x71,       /*'F', 15*/
    0x3D,       /*'G', 16*/
    0x76,       /*'H', 17*/
    0x10,       /*'I', 18*/
    0x0E,       /*'J', 19*/
    0x7A,       /*'K', 20*/
    0x38,       /*'L', 21*/
    0x55,       /*'M', 22*/
    0x54,       /*'N', 23*/
    0x5C,       /*'O', 24*/
    0x73,       /*'P', 25*/
    0x67,       /*'Q', 26*/
    0x50,       /*'R', 27*/
    0x64,       /*'S', 28*/
    0x78,       /*'T', 29*/
    0x3E,       /*'U', 30*/
    0x62,       /*'V', 31*/
    0x6A,       /*'W', 32*/
    0x36,       /*'X', 33*/
    0x6E,       /*'Y', 34*/
    0x49,       /*'Z', 35*/
    0x40,       /*'-', 36*/
    0x00,       /*' ', 37*/
    0x80,       /*'.', 38*/
};

void digit_show(u8 num, u8 digit, u8 dot){
      switch(digit){
                case 1:P22=0;P23=0;P24=0;break;
                case 5:P22=0;P23=0;P24=1;break;
                case 3:P22=0;P23=1;P24=0;break;
                case 7:P22=0;P23=1;P24=1;break;
                case 2:P22=1;P23=0;P24=0;break;
                case 6:P22=1;P23=0;P24=1;break;
                case 4:P22=1;P23=1;P24=0;break;
                case 8:P22=1;P23=1;P24=1;break;      
      }
      if(dot)
                P0=nixie|0x80;
      else
                P0=nixie;
}

u8 digit_num(u32 num){
      u8 digit;
      u8 i;
      u32 result;
      if(num)
      {
                digit=(int)floor(log10(num))+1;
                for(i=0;i<digit;i++){
                        result=num/(int)pow(10,i);
                        digit_show((u8)(result%10),(u8)(i+1),0);
                }
      }else{
                digit=1;
                digit_show(0,1,0);
      }
      return digit;
}

mechray 发表于 5 天前

第十期(第10集《虚拟键盘LED和数码管》)

这集视频主要尝试了一下LED、数码管和键盘虚拟显示工具。虽然这个工具也很有用趣,但感觉更喜欢在开发板上看现象,可能以后会比较少用到。
页: [1] 2
查看完整版本: 利用普中A2开发板学习AI8051U的心得