markxu 发表于 2025-2-14 16:41:19

Ai8051U学习之旅(1) - 从学习开始

第一讲笔记

       因为遇见,所以学习,因为学习,所以喜欢,先学习一下
       不得不说,这款MCU还是挺强悍的


第二讲笔记
      不得不说,这个平台做的还是蛮全面的,适合快速评估原型机,也适合验证一下想法,挺好的
      开发环境可以用我们熟悉的keil

安装工具/开发环境这一块一定要按着这个方法处理,不然会走弯路



测试了一个简单的工程
#include "ai8051u.h"                //µ÷ÓÃÍ·Îļþ

//×¢Òâ£ºÇæÌìÖùµÄLED¶Ë¿ÚÔÚP2£¬ÇÒûÓÐÈý¼«¹ÜµÄµçÔ´¿ØÖÆ£¬ËùÒÔÖ»Òª¿ØÖÆP2¶Ë¿Ú¼´¿É
void main(void)
{
        P2M0 = 0;                //P2¶Ë¿Ú(P20-P27)Ϊ׼˫Ïò¿Ú
        P2M1 = 0;
       
        while(1)
        {
                P20 = 0;        //P20¶Ë¿ÚÊä³ö0V
                P21 = 0;        //P21¶Ë¿ÚÊä³ö0V
        }
}编译通过,下一步,等板子来了,就可以开干了




虽然板子还没有申请到,为了兼容自己以前的程序,把数据类型稍微修改一下
/*----------------------------------------------------------------------------------------------------------------------
* Copyright(c) 2025, Mark Xu Work Studio R&D Department. All rights reserved.
* 文件名称 : DataTypes.h
* 文件版本 : V1.0.0
* 功能描述 : typedef the datas
* 编辑人员 : Mark
* 编辑日期 : 2025/02/16
----------------------------------------------------------------------------------------------------------------------*/
#ifndef __DATATYPES_H__
#define __DATATYPES_H__

//----------------------------------------------------------------------------------------------------------------------
// 宏定义
//----------------------------------------------------------------------------------------------------------------------
#define      TRUE                              (1)
#define      FALSE                              (0)

#ifndef NULL      
      #define      NULL                        (0)
#endif

#define ENABLE                              (1)
#define DISABLE                              (0)

#define SUCCESS                              (0)
#define FAIL                              (-1)

#define      Priority_0                        0      //中断优先级为 0 级(最低级)
#define      Priority_1                        1      //中断优先级为 1 级(较低级)
#define      Priority_2                        2      //中断优先级为 2 级(较高级)
#define      Priority_3                        3      //中断优先级为 3 级(最高级)

#define      I2C_Mode_Master                (1)
#define      I2C_Mode_Slave                (0)

#define      PIE                                        (0x20)      //1: 比较结果由0变1, 产生上升沿中断
#define      NIE                                        (0x10)      //1: 比较结果由1变0, 产生下降沿中断

#define      PWMA                              (128)
#define      PWMB                              (129)



//----------------------------------------------------------------------------------------------------------------------
// 类型定义
//----------------------------------------------------------------------------------------------------------------------
typedef unsigned char         u8;   //8 bits
typedef unsigned int            u16;    // 16 bits
typedef unsigned long         u32;    // 32 bits

typedef signed char             int8;   //8 bits
typedef signed int            int16;// 16 bits
typedef signed long             int32;// 32 bits

typedef unsigned char         uint8;//8 bits
typedef unsigned int            uint16; // 16 bits
typedef unsigned long         uint32; // 32 bits

typedef signed char             int8_t;
typedef signed int            int16_t;
typedef signed long             int32_t;// 32 bits

typedef unsignedchar               uint8_t;
typedef unsignedint               uint16_t;
typedef unsignedlong               uint32_t;

typedef bit                                 BOOL;
typedef unsigned char               BYTE;
typedef unsigned int               WORD;
typedef unsigned long               DWORD;

typedef unsigned char               uchar;
typedef unsigned int               uint;
typedef unsigned int               ushort;
typedef unsigned long               ulong;

//兼容自己的老程序
typedef unsigned char               U8;
typedef unsigned int               U16;
typedef unsigned long               U32;
typedef signed char             S8;
typedef signed int            S16;
typedef signed long             S32;// 32 bits

#endif      //#ifndef __DATATYPES_H__


第三讲笔记
      万事开头难,有了第一个工程,可以点亮一颗灯,点亮了一颗灯,可以搞定一个数码管,搞定一个数码管,可以驱动LCD……
      走路嘛,总是从爬开始,然后坚持,坚持 再坚持才能健步如飞,才能跨越山海


看到这里迫不及待的想写个工程试一下,可是发现出现下面问题:

这说明KEIL的插件没有安装完成,说明视频没有看仔细,再看一遍,发现需要安装C256版本,目前电脑中只安装了c51与arm,
下载安装

Keil C251简介
Keil C251是美国Keil公司(该公司2005年被ARM公司收购)出品的针对251微控制器系列兼容单片机C语言软件开发系统。
与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。Keil C251是支持251微控制器体系结构的Keil开发工具,适合每个阶段的开发人员,不管是专业的应用工程师,还是刚学习嵌入式软件开发的学生。
扩展:Keil公司开发的ARM开发工具MDK(Microcontroller Development Kit),是用来开发基于ARM核的系列微控制器的嵌入式应用程序。
打开的界面如下:


至于安装与C51类似,这里就不重复叙述了,不会的可以网上查一下
单个附件只能是20M,分了个包








第四讲笔记
   STC的特点可能就是稳定,下载方便


第五讲笔记
      作为MCU的支柱编程语言,C一定要学好,能精通是最好,然后数据结构,算法


第六讲笔记
   这个可能是每一位MCU编程者入门的必经之路,致敬每一位第一次点亮LED的时刻


第七讲笔记
      大部分电子产品都可以以时间做状态机完成,定时器是控制逻辑的核心,所以一定要知道怎么用


第八讲笔记
       定时器的应用






第八讲学习笔记
       本节主要是定时器调度,对于MCU开发者来说,学会了 定时器的妙用,可以开发出很多有趣的好玩意

https://www.stcaimcu.com/data/attachment/forum/202502/17/135620j6itvx6gs6t69qst.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/135642e4ojk4bj6gjojlbg.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/135821kt0ud41p066uncoj.jpg

第九讲学习笔记
      数码管是消费电子及家电产品常用的器件
https://www.stcaimcu.com/data/attachment/forum/202502/17/135905paagp0866g9j96no.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/140754ce5l2gyessyy5de2.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/140821djzit72d7s3okmtk.jpg





第十讲学习笔记
      输入动作的获取,输出信息的显示,这是电子类产品基本的操作

https://www.stcaimcu.com/data/attachment/forum/202502/17/140921yzzay0bzypj6vplz.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141012wvdu7ooaovar3z99.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141028s33bthqf2hx313hg.jpg


第十一讲学习笔记
      对于IO口少,按键多的产品,矩阵键盘是一个不错的选择,作为软件开发,一定要知道矩阵扫描的原理

https://www.stcaimcu.com/data/attachment/forum/202502/17/141101n3733j37q4njmv6h.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141154rhxc7crcbbw77wbz.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141209p691dqg0651ayw93.jpg

第十二讲学习笔记
      为什么要复位系统?可能是为了恢复初始状态,也可能是因部分异常导致
https://www.stcaimcu.com/data/attachment/forum/202502/17/141317uri71qpp57i3e97b.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141339rm0275vmvdv327cv.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141408gj1d1dgzj30d3j1d.jpg

第十三讲学习笔记
      什么是中断?就是我正在学MCU视频,妈妈让我倒垃圾,于是我先暂停视频,然后去倒垃圾,倒完回来继续学
https://www.stcaimcu.com/data/attachment/forum/202502/17/141534lboxygodyegoogbf.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141550pqhz8xxt956ds3p9.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141604zkcqzrkyjee6qee0.jpg

第十四讲学习笔记
      IO口的中断对于捕获信号,唤醒系统,编写通讯协议都有用处
https://www.stcaimcu.com/data/attachment/forum/202502/17/141648stumtmdyttyruuau.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141734svxfnmmy1femfe6j.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141751q54hcs3lpzhp1pm4.jpg

第十五讲学习笔记
      这是定时器的一个用法
https://www.stcaimcu.com/data/attachment/forum/202502/17/141820hq8drrhnar1vthvi.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141845unbd280kkk4k68we.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/141906akkbub99jb9za3m7.jpg

第十六讲学习笔记
      单片机调试的法宝之一,就是用串口打印信息
https://www.stcaimcu.com/data/attachment/forum/202502/17/141938b7b5ttcweidwiidb.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/142013f6vmb9pv0c04c6f7.jpg https://www.stcaimcu.com/data/attachment/forum/202502/17/142027hgfsvm0ripacbdvb.jpg






收藏







markxu 发表于 2025-2-17 17:55:50

二、实操
      作为有强迫症的小电工,看了代码,为了不与自己的习惯对抗,把工程稍微改装了一下
      1)每一个C文件对应一个h文件。例如:main.c,会对应有一个main.h
      
      2)对于注释也进行了更新,如下:
      mian.h
   /*----------------------------------------------------------------------------------------------------------------------
* Copyright(c) 2025, Mark Xu Work Studio R&D Department. All rights reserved.
* 文件名称 : main.h
* 文件版本 : V1.0.0
* 功能描述 : 主程序头文件
* 创建人员 : Mark Xu
* 创建日期 : 2025/02/17
----------------------------------------------------------------------------------------------------------------------*/
#ifndef        __MAIN_H__
#define        __MAIN_H__

#include "includes.h"

//----------------------------------------------------------------------------------------------------------------------
// 常量、宏
//----------------------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------------------
// 类型重定义                                    
//----------------------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------------------
// 全局变量
//----------------------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------------------
// 全局函数
//----------------------------------------------------------------------------------------------------------------------

#endif //#ifndef        __MAIN_H__




   3) 对文件夹也进了部分更改,如下:
   
      

markxu 发表于 2025-2-17 18:01:02

三、实操2
    1)对工程的工件夹结构也进行了小调整,方便归类与查看
      
    2)对于源文件的命名也进行了跟随了自己的习惯
       >> 应用层的文件命名:以app_开关, app_disp.c/app_disp.h//显示相关的应用
       >> 驱动类的文件命名:以drv_开关,例如:drv_timer.c/drv_timer.h

markxu 发表于 2025-2-17 18:12:54

四、mdk, keil c51, keil c251安装在一个文件夹的方法
      
      参考这个教程,然后,把C251按C51的方法再操作一遍就可以了


markxu 发表于 2025-2-18 10:42:20

五、增加图形配置文件
       关于圈形配置文件的编写可以搜索Keil Configuration Wizard
      直接上简单的代码:
/*----------------------------------------------------------------------------------------------------------------------
* Copyright(c) 2025, Mark Xu Work Studio R&D Department. All rights reserved.
* 文件名称 : SysConfig.h
* 文件版本 : V1.0.0
* 功能描述 : 系统配置文件
* 创建人员 : Mark Xu
* 创建日期 : 2025/02/17
----------------------------------------------------------------------------------------------------------------------*/

#ifndef __SYSCONFIG_H__
#define __SYSCONFIG_H__

// <<< Use Configuration Wizard in Context Menu >>>

//----------------------------------------------------------------------------------------------------------------------
//<h> The Project information

// <s> The Hardware Version
#define HW_PCBA_VERSION             "R00"

// <s> The Firmware Version
#define FW_FIRMWARE_VERSION         "R00"

//</h>

//----------------------------------------------------------------------------------------------------------------------
//<h> The mcu peripheral config
// <q> The timer0 config
//<i> Enable or Disable
#define DRV_TIMER0_EN                                        (0)                //定时器0,0-禁用,1-使能

// <q> The timer1 config
//<i> Enable or Disable
#define DRV_TIMER1_EN                                        (0)                //定时器1,0-禁用,1-使能

// <q> The timer2 config
//<i> Enable or Disable
#define DRV_TIMER2_EN                                        (1)                //定时器2,0-禁用,1-使能

// <q> The pwm config
//        <i> enable or disable
#define DRV_PWM_EN                                                (0)                //PWM模块,0-禁用,1-使能

// <q> The comparor config
//        <i> enable or disable
#define DRV_CMP_EN                                                (0)                //比较器, 0-禁用,1-使能

// <q> The uart1 config
//<i> Enable or Disable
#define DRV_UART1_EN                                        (0)                //串口,   0-禁用,1-使能
// <q> The uart2 config
//<i> Enable or Disable
#define DRV_UART2_EN                                        (0)                //串口,   0-禁用,1-使能
// <q> The uart3 config
//<i> Enable or Disable
#define DRV_UART3_EN                                        (0)                //串口,   0-禁用,1-使能
// <q> The uart4 config
//<i> Enable or Disable
#define DRV_UART4_EN                                        (0)                //串口,   0-禁用,1-使能

// <q> The spi function
//<i> Enable or Disable
#define DRV_SPI_EN                           (0)                //SPI功能,0-禁止, 1-使能

// <q> The RTC function
//<i> Enable or Disable
#define DRV_RTC_EN                           (0)                //RTC功能,0-禁止,1-使能

// <q> The watchdog config
//        <i> enable or disable
#define DRV_WDT_EN                                                (0)                //看门狗, 0-禁用,1-使能
// </h>


//应用测试相关
//----------------------------------------------------------------------------------------------------------------------
//<h> The function test module
// <q> The adc sample test
//<i> Enable or Disable
#define APP_ADC_TEST_EN                                        (0)                //ADC采样测试,0-禁用,1-使能

// <q> The eeprom write and read test
//<i> Enable or Disable
#define APP_EEPROM_TEST_EN                                (0)                //eeporm测试,   0-禁用,1-使能
// </h>


//调试打印相关
// <e> The debug print function
//       <i> Enable or Disable
#define APP_DEBUG_PRINT_EN                                (0)                //调试打功能, 0-禁用,1-使能
#if (APP_DEBUG_PRINT_EN)
        // <q> The main module debug print function
        //        <i> enable or disable
        #define MAIN_PRINT_EN                                (1)                //主程序模块,打印功能
        // <q> The system module debug print function
        //        <i> enable or disable
        #define SYS_PRINT_EN                                (0)                //SYS模块, 打印功能
        // <q> The charging module debug print function
        //        <i> enable or disable
        #define CHRG_PRINT_EN                                (0)                //充电模块,打印功能
        // <q> The key module debug print function
        //        <i> enable or disable
        #define KEY_PRINT_EN                                (0)                //按键模块,打印功能
        // <q> The led module debug print function
        //        <i> enable or disable
        #define LED_PRINT_EN                                (0)                //显示模块,打印功能

        //如果忘记打开宏“DRV_UART_EN”,在编译时,此处会有提示
        #if (!DRV_UART_EN)       
                #error Please enable the uart driver (set the macro "DRV_UART_EN" to 1)!!!
        #endif //#if (!DRV_UART_EN)
#else
        #define MAIN_PRINT_EN                                (0)                //主程序模块,打印功能
        #define SYS_PRINT_EN                                (0)                //SYS模块, 打印功能
        #define CHRG_PRINT_EN                                (0)                //充电模块,打印功能
        #define KEY_PRINT_EN                                (0)                //按键模块,打印功能
        #define LED_PRINT_EN                                (0)                //显示模块,打印功能
#endif //#if (APP_DEBUG_PRINT_EN)
// </e>



// <<< end of configuration section >>>

#endif //#ifndef __SYSCONFIG_H__




markxu 发表于 2025-2-20 17:59:17

2025年2月20日 板子收到
开发板已收到,从今天起准备开干
从头开始,每天进步一点点,开心多一点
页: [1]
查看完整版本: Ai8051U学习之旅(1) - 从学习开始