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

学习《Ai8051U教学视频》体会

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-2 20:07:46 | 显示全部楼层 |阅读模式
第一集 序言

展示了基于8051U的一些高级功能,通过这些实现的功能展示了8051U的强大计算能力和配套的软硬件的良好支持。

0.jpg

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-2 20:11:15 | 显示全部楼层
第二课 工具介绍

实验箱

1.jpg

功能健全,满足各类产品的开发测试;



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-2 20:12:57 | 显示全部楼层
第三集 点亮第一颗LED

讲得很详细,非常适合入门学习。特别是讲了一些代码编写规范,从开始就培养好的编程习惯。
要记得配置I/O模式,写了一个函数,以后复制粘贴就行了。
总的来说这节课相对简单,基本都掌握了。由浅入深继续学习。

2.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-3 20:28:50 | 显示全部楼层

第4集 USB不停电下载

USB不停电下载用到了STC官方提供的STC-USB库。创建项目时需要导入这个库,加入头文件。

#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h"

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
    P_SW2 |= 0x80; //B7位写1,使能访问XFR   

    usb_init();   
    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;
  
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置


        while(1)
        {  
                if (bUsbOutReady)
        {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  
            usb_OUT_done();
        }
   
         P40 = 0;
         P00 = 0;
         P02 = 0;
     }   
}

串口的下载模式同时也改成了USB-CDC

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-3 20:33:41 | 显示全部楼层

第5集 C语言基础

本集重新温习了一遍C语言的基本语法。

重点讲解了如何使用STC-USB库实现的printf函数,可以直接与上位机通信,方便调试及与单片机交互。

见代码:

#include "ai8051u.h"        //调用头文件
#include "stc32_stc8_usb.h" //调用头文件

#define u8 unsigned char // 8位无符号变量(0-255)
#define u16 unsigned int // 16位无符号变量(0-65535)

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void main(void)
{
    P_SW2 |= 0x80; // B7位写1,使能访问XFR

    usb_init(); // USB CDC 接口配置

    IE2 |= 0x80; // 使能USB中断
    EA = 1;      // IE |= 0X80;

    while (DeviceState != DEVSTATE_CONFIGURED)
        ; // 等待USB完成配置

    while (1)
    {
        if (bUsbOutReady) // 如果接收到了数据
        {
            printf("调试信息");
            usb_OUT_done();
        }
    }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-3 20:35:50 | 显示全部楼层

第6集 IO输入输出

讲解了 GPIO 的概念。1 高电平 0 低电平

 GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。
 高电平就是指接近于电源正极电压的电平;也叫逻辑“1”; VDD最大电压不能超过5.5V。上限溢出允许0.3v内.
 单片机输出高电平就是输出VCC电压,输出低电平就是输出GND的电压。
 四种模式:准双向口、推挽输出、高阻输出、开漏模式。 灌电流(电源到管脚串电阻尽量大于1K,不小于470欧)和拉电流(管脚到Gnd,推挽/强上拉)的讲解
 单片机电压3.3V,施密特触发器,低电平不能高于0.99V,高电平不能低于1.18V。

通过按键来检测io状态
按键消抖。延时20ms

上代码

#include "ai8051u.h"        //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h"        //d调用头文件

#define u8 unsigned char // 8位无符号变量(0-255)
#define u16 unsigned int // 16位无符号变量(0-65535)

u8 state = 0; // 初始状态

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void Delay20ms(void) //@24.000MHz  Delay20ms();
{
    unsigned long edata i;

    _nop_();
    _nop_();
    i = 119998UL;
    while (i)
        i--;
}

void main(void)
{
    WTST = 0;  // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; // 扩展寄存器(XFR)访问使能
    CKCON = 0; // 提高访问XRAM速度

    usb_init(); // USB CDC 接口配置

    IE2 |= 0x80; // 使能USB中断
    EA = 1;      // IE |= 0X80;

    while (DeviceState != DEVSTATE_CONFIGURED)
        ; // 等待USB完成配置

    while (1)
    {

        if (bUsbOutReady) // 如果接收到了数据
        {
            usb_OUT_done(); //
        }

        //      //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
        //      if( P32 == 0 )                              //判断P32按钮是否按下
        //      {
        //          P20 = 0;
        //      }
        //      else
        //      {
        //          P20 = 1;
        //      }
        //

        // 任务2:按下P32按钮灯灭,松开P32按钮灯亮;
        //      if( P32 == 1 )                              //判断P32按钮是否按下
        //      {
        //          P20 = 0;
        //      }
        //      else
        //      {
        //          P20 = 1;
        //      }

        // 任务3:按一下灯亮,按一下灯灭
        if (P32 == 0) // 判断P32按钮是否按下
        {
            Delay20ms(); // 延时20ms消抖
            if (P32 == 0)
            {
                state = !state; // 变量取反 0 1 0 1 0 1
                P20 = state;
                printf("state:%d\r\n", (int)state);

                while (P32 == 0)
                    ; // 等待P32松开
            }
        }
    }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-3 20:39:02 | 显示全部楼层

第七集 定时器

定时器是Ai8051U最重要的数字外设之一。

Ai8051U 系列单片机内部设置了 6 个 24 位定时器/计数器(8 位预分频+16 位计数)。6 个 16 位定时器 T0、T1、T2、T3、T4 和 T11 都具有计数方式和定时方式两种工作方式。

下面的代码使用定时器0实现的简单的任务

#include "ai8051u.h"        //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
#include "intrins.h"        //d调用头文件

#define u8 unsigned char // 8位无符号变量(0-255)
#define u16 unsigned int // 16位无符号变量(0-65535)

u8 state = 0;     // 初始状态
u8 Run_State = 0; // 运行状态

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void Delay20ms(void) //@24.000MHz  Delay20ms();
{
    unsigned long edata i;

    _nop_();
    _nop_();
    i = 119998UL;
    while (i)
        i--;
}
void Timer0_Init(void); // 3秒@24.000MHz     //函数声明

void main(void)
{
    int count = 1; // 按键计数变量

    WTST = 0;  // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; // 扩展寄存器(XFR)访问使能
    CKCON = 0; // 提高访问XRAM速度

    usb_init(); // USB CDC 接口配置

    IE2 |= 0x80; // 使能USB中断
    EA = 1; // IE |= 0X80;

    P40 = 0;

    while (DeviceState != DEVSTATE_CONFIGURED)
        ; // 等待USB完成配置

    while (1)
    {
        if (bUsbOutReady) // 如果接收到了数据
        {
            usb_OUT_done(); //
        }

        // 任务1:
        if (P32 == 0) // 判断P32按钮是否按下
        {
            Delay20ms(); // 延时20ms消抖
            if (P32 == 0)
            {
                printf("按键按下次数\xfd:%d 次\r\n", (int)count);
                count++;

                while (P32 == 0)
                    ; // 等待P32松开
            }
        }

        // 任务2:灯按一下点亮三秒后熄灭。
        if (P32 == 0) // 判断P32按钮是否按下
        {
            Delay20ms(); // 延时20ms消抖
            if (P32 == 0)
            {
                printf("按键按下次数\xfd:%d 次\r\n", (int)count);
                count++;
                P00 = 0;
                Timer0_Init();
                while (P32 == 0)
                    ; // 等待P32松开
            }
        }

        // 任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
        if (P32 == 0) // 判断P32按钮是否按下
        {
            Delay20ms(); // 延时20ms消抖
            if (P32 == 0)
            {
                Run_State = !Run_State; // 运行状态取反

                if (Run_State == 1) // 运行
                {
                    Timer0_Init();
                }
                else
                {
                    TR0 = 0; // 关闭定时器
                    P00 = 1;
                    P01 = 1;
                }
                while (P32 == 0)
                    ; // 等待P32松开
            }
        }
    }
}

void Timer0_Init(void) // 500毫秒@24.000MHz
{
    TM0PS = 0x0F; // 设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
    AUXR &= 0x7F; // 定时器时钟12T模式
    TMOD &= 0xF0; // 设置定时器模式
    TL0 = 0xDC;   // 设置定时初始值
    TH0 = 0x0B;   // 设置定时初始值
    TF0 = 0;      // 清除TF0标志
    TR0 = 1;      // 定时器0开始计时
    ET0 = 1;      // 使能定时器0中断
}

void Timer0_Isr(void) interrupt 1 // 3秒执行一次
{
    state = !state;

    P00 = state;
    P01 = !state;
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-3 20:45:53 | 显示全部楼层

第八集-定时器周期性调度任务

继续讲解定时器,讲解如何在实际项目中应用定时器解决问题。

目标是周期性执行3个任务。如下:

  • 任务1:用一个定时器实现,LED1实现0.3秒取反一次,LED2实现0.6秒取反一次,LED3 0.9秒取反一次。
  • 任务2:数组点亮LED,实现流水灯。
  • 任务3:按键1按一下,LED通过数组移动一下等。

学完本集,主要有二点收获:

  1. 代码的模块化管理
  2. 任务的合理分解

随着功能的增加,代码量也直线上升,如何组织代码很关键,对以后的需求变化影响至关重要。

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-07 11:33:38
已绑定手机

1

主题

12

回帖

83

积分

注册会员

积分
83
发表于 2025-2-3 20:49:27 | 显示全部楼层

第九集 数码管

数码管是我们日常最常用的显示器件。

LED数码管由8个发光二极管构成,通过不同的组合可用来显示数字0~9、字符A~F和小数点“.”。

最大的收获就是学到了原来还可以通过AIapp-ISP虚拟仿真数码管和LED灯的显示。太好了!

image.png

显示效果见下:

image.png

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-30 06:12 , Processed in 0.132873 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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