nzzxqbml 发表于 2024-12-2 15:31:30

AI8051u学习打卡 |已收到实验箱

第一集 序言
在视频的第一章了解了ai8051u的强悍性能,包括屏幕显示、视屏播放、录放音、pwm、频谱分析仪、手写计算器以及其它硬件知识。
由于没有接触过硬件知识,所以对于视频中下载时选择频率有疑问,为什么有时候是选择40,有的时候又不选择40,这是我的盲点,在后面的学习中会去理解为什么。对于演示的功能我有了其它的应用idea,比如在自己的研究中能否使用频谱分析仪导出频谱判断一个人的情感,收音功能能否作为采集文本模态信息,这都值得思考,总的来说,8051u值得进一步深入学习应用,嵌入式,我来了!

第二集 软硬件及工具介绍

正式看完了第二集,并且做了笔记,虽然在后面的步骤中发现原来直接有说明文档。
1.在这一节视频中,对ai8051u的开发板有了认识,了解了PCB和PCBA的区别。
2.完成了软件下载,keil由于版权作者没有给出直接的程序,但是直接搜索关键词,看到类似官网的直接下载就可以了,没有壁垒。
另外,催更!催更!催更!



第三集 点亮一颗LED灯


#include "ai8051u.h"
void main(void)
{
//    P0端口为准双向口
    P0M0 = 0x00;
    P0M1 = 0x00;
//    P4端口为准双向口
    P4M0 = 0x00;
    P4M1 = 0x00;
    while(1)
    {
//      P40、P00、P01端口输出为0V
      P40 = 0;
      P00 = 0;
      P01 = 0;
    }
}这一章的难度对于计算机科班生来说没有什么问题,对于c语言有了解就能很快入门,在这里我写代码用了工具,因为工具会自动补全,也更智能。学到的新知识点是端口设置为准双向口,也就是允许电压差通过,使得led灯亮起来,案例中使用了while死循环,如果设置延迟函数,可能形成走马灯的效果,值得尝试!

重要的事情说三遍!速更、速更、速更。一两集根本不够看,一学就上瘾

第四集 USB不停电下载

催更!催更!催更!
超哥讲的非常详细,很适合0基础入门,不仅计算机知识0基础入门,甚至ctrl+f查询功能都会教给我们,非常认真的在教学,哭死!

//第四集 USB不停电下载
// note:
//|=或等于:不会覆盖最初的1

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

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

void main(void)
{

//功能脚切换控制,B7位代表EAXFR,1代表能访问,1000 0000转换成十六进制为80
    P_SW2 |= 0x80;


//    P0端口为准双向口
    P0M0 = 0x00;
    P0M1 = 0x00;
//    P4端口为准双向口
    P4M0 = 0x00;
    P4M1 = 0x00;
//    所有口设置为准双向口
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

//    USB DC接口初始化
    usb_init();
//    使能USB中断
    IE2 |= 0x80;
//    打开总开关
    EA = 1;
//    等待USB完成配置
    while(DeviceState != DEVSTATE_CONFIGURED);

    while(1)
    {

      if(bUsbOutReady)
      {
//            发送数据缓冲区,长度
            USB_SendData(UsbOutBuffer,OutNumber);
            usb_OUT_done();
      }

//      P40、P00、P01端口输出为0V
      P40 = 0;
      P00 = 0;
      P01 = 0;
    }
}


第五集 C语言基础

本章对于科班生来说,还是很容易的。

第六集 I/O输入输出

催更!催更!催更!每次都会催更,一两集根本不够学,冲哥赶紧录,驴歇了冲哥也不许歇{:lol:}
本节学习了I/O输入输出,包括if else,while判断语句、函数定义和调用等软件知识,还学习了电平抖动、高低电平的硬件知识


[*]//第6集 I/O输入输出
[*]// note:
[*]//|=或等于:不会覆盖最初的
[*]//换行\r\n
[*]
[*]//#define printf printf_hid
[*]//define 替换名 被替换名
[*]//*fmt格式控制字符串
[*]
[*]//调用头文件
[*]#include "ai8051u.h"
[*]#include "stc32_stc8_usb.h"
[*]#include "intrins.h"
[*]
[*]//宏定义,定义8位无符号变量(0-255)
[*]define u8 unsigned char
[*]//定义16位无符号变量(0-65536)
[*]//define u16 unsigned int
[*]
[*]//定义一个变量,用于记录状态,初始状态为0;
[*]u8 state = 0;
[*]
[*]char *USER_DEVICEDESC = NULL;
[*]char *USER_PRODUCTDESC = NULL;
[*]CHAR *USER_STCISPCMD = "@STCISP#";
[*]
[*]//24.000MHZ延时20ms
[*]void Delay20ms(void)
[*]{
[*]    unsigned long edata i;
[*]    _nop_();
[*]    _nop_();
[*]    i = 119998UL;
[*]    while (i) i--;
[*]}
[*]
[*]
[*]void main(void)
[*]{
[*]
[*]//功能脚切换控制,B7位代表EAXFR,1代表能访问,1000 0000转换成十六进制为80
[*]//    P_SW2 |= 0x80;
[*]
[*]//设置程序指令延时参数,赋值为0可将cpu执行指令的速度设置为最快
[*]    WTST = 0;
[*]//    扩展寄存器(XFR)访问使能
[*]    EAXFR= 1;
[*]//    提高访问XRAM的速度
[*]    CKCON = 0;
[*]
[*]
[*]//    P0端口为准双向口
[*]    P0M0 = 0x00;
[*]    P0M1 = 0x00;
[*]//    P4端口为准双向口
[*]    P4M0 = 0x00;
[*]    P4M1 = 0x00;
[*]//    所有口设置为准双向口
[*]    P1M0 = 0x00;
[*]    P1M1 = 0x00;
[*]    P2M0 = 0x00;
[*]    P2M1 = 0x00;
[*]    P3M0 = 0x00;
[*]    P3M1 = 0x00;
[*]    P5M0 = 0x00;
[*]    P5M1 = 0x00;
[*]    P6M0 = 0x00;
[*]    P6M1 = 0x00;
[*]    P7M0 = 0x00;
[*]    P7M1 = 0x00;
[*]
[*]//    USB DC接口初始化
[*]    usb_init();
[*]//    使能USB中断
[*]    IE2 |= 0x80;
[*]//    打开总开关
[*]    EA = 1;
[*]//    打开P40,8颗灯的开关,
[*]    P40 = 0;
[*]//    等待USB完成配置
[*]    while(DeviceState != DEVSTATE_CONFIGURED);
[*]
[*]    while(1)
[*]    {
[*]
[*]      if(bUsbOutReady)
[*]      {
[*]//            发送数据缓冲区,长度
[*]//            USB_SendData(UsbOutBuffer,OutNumber);
[*]            usb_OUT_done();
[*]      }
[*]//      task1:按下P32按钮灯亮,松开P32按钮灯灭
[*]//      判断p32按钮是否按下
[*]      if(P32 == 0)
[*]      {
[*]            P00 = 0;
[*]      }
[*]      else
[*]      {
[*]            P00 = 1;
[*]      }
[*]
[*]//      task2:按下P32按钮灯灭,松开P32按钮灯亮
[*]//      判断p32按钮是否按下
[*]      if(P32 == 1)
[*]      {
[*]            P00 = 0;
[*]      }
[*]      else
[*]      {
[*]            P00 = 1;
[*]      }
[*]
[*]//      task3:按下P32按钮灯亮,再按一下P32灯灭,以此循环
[*]//      if(P32 == 0)
[*]//      {
[*]//            state取反后赋值给state
[*]//            state = !state
[*]//            P00 = state;
[*]//          等待P32松开
[*]//            while(P32 == 0);
[*]//      }
[*]
[*]//      task3:按下P32按钮灯亮,再按一下P32灯灭,以此循环
[*]      if(P32 == 0)
[*]      {
[*]//            调用函数延迟20ms,消除抖动
[*]            Delay20ms();
[*]            if(P32 == 0)
[*]            {
[*]                state = !state
[*]                P00 = state;
[*]                printf("state:%d\r\n",(int)state);
[*]//            等待P32松开
[*]                while (P32 == 0)
[*]            }
[*]      }
[*]
[*]      else
[*]      {
[*]            P00 = 1;
[*]      }
[*]//      P40、P00、P01端口输出为0V
[*]      P40 = 0;
[*]      P00 = 0;
[*]      P01 = 0;
[*]    }
[*]}
[*]

第七集 定时器中断
因为MCU是单核的,同一时间只能执行一个事情,没有特殊情况不能被打断,所以这里就要引入一个特殊情况,定时器中断;
定时器作用:(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作(2)替代长时间的Delay;提高程序的运行效率和处理速度(可以打断主循环)//第七集 定时器

//函数的定义、声明、调用

    //返回值类型 函数名(入口参数)
    //{
    //    函数体
    //    函数执行的代码
    //    return 返回值
    //}

    //返回值类型 函数名(入口参数)

    //函数名(入口参数)


//调用头文件
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
//避免c语言print报错
#include "stdio.h"

//宏定义,定义8位无符号变量(0-255)
define u8 unsigned char

//定义一个全局变量,用于记录状态,初始状态为0;
u8 state = 0;
//定义一个全局变量,用于记录运行状态,初始化为0;
u8 Run_State = 0;

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

//定义一个Delay20ms函数,实现24.000MHZ延时20ms
void Delay20ms(void)
{
    unsigned long edata i;
    _nop_();
    _nop_();
    i = 119998UL;
    while (i) i--;
}

//定义一个Timer0_Init函数,实现定时器3秒24.000MHz中断功能
void Timer0_Init(void)
{
//    设置定时器时钟预分频(并非所有系列都有此寄存器,详情请查看数据手册)
    TMOPS = 0x5B;
//    定时器时钟12T模式
    AUXR &= 0x7F;
//    设置定时器模式
    TMOD &= 0xF0;
//    设置定时初始值
    TLO = 0x3F;
    TH0 = 0x01;
//    清除TF0标志
    TF0 = 0;
//    定时器0开始计时
    TR0 = 1;
//    使能定时器0中断
    ET0 = 1;
}

//定义一个Timer1_Init函数,实现定时器500ms秒24.000MHz中断功能
void Timer1_Init(void)
{
//    设置定时器时钟预分频(并非所有系列都有此寄存器,详情请查看数据手册)
    TMOPS = 0x0F;
//    定时器时钟12T模式
    AUXR &= 0x7F;
//    设置定时器模式
    TMOD &= 0xF0;
//    设置定时初始值
    TLO = 0xDC;
    TH0 = 0x0B;
//    清除TF0标志
    TF0 = 0;
//    定时器0开始计时
    TR0 = 1;
//    使能定时器0中断
    ET0 = 1;
}

void main(void)
{

//    定义一个局部变量,用于按键计数,初始化为0
    int count = 0;
//功能脚切换控制,B7位代表EAXFR,1代表能访问,1000 0000转换成十六进制为80
//    P_SW2 |= 0x80;

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


//    P0端口为准双向口
    P0M0 = 0x00;
    P0M1 = 0x00;
//    P4端口为准双向口
    P4M0 = 0x00;
    P4M1 = 0x00;
//    所有口设置为准双向口
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

//    USB DC接口初始化
    usb_init();
//    使能USB中断

//    调用函数Timer0_Init();
    Timer0_Init();

    IE2 |= 0x80;
//    打开总开关
    EA = 1;
//    打开P40,8颗灯的开关,
    P40 = 0;
//    等待USB完成配置
    while(DeviceState != DEVSTATE_CONFIGURED);

    while(1)
    {

      if(bUsbOutReady)
      {
            usb_OUT_done();
      }
//      任务1:LED灯三秒取反一次,这期间任意时刻按下按钮,串口打印按键次数
//    判断P32是否按下
      if(P32 == 0)
      {
//    延迟20ms消抖
            Delay20ms();
            if(P32== 0);
            {
//    GB2312 中,包含 0xfd 编码的汉字如下:褒饼昌除待谍洱俘庚过糊积箭烬君魁例笼慢谬凝琵讫驱三升数她听妄锡淆
//    旋妖引育札正铸 佚冽邶埤荦蔟摭啐帻猃恺泯潺妪纨琮椠辇挲臊忑睚铨稞疲颀螨簖酏觚鳊鼾
                printf("按键按下次数\xfd:%d次\r\n",(int)count);
                count++;
//    等待P32松开
                while (P32 == 0);
            }
      }

//    任务2:灯按一下点亮3秒后熄灭
//    判断P32是否按下
      if(P32 == 0)
      {
//    延迟20ms消抖
            Delay20ms();
            if(P32== 0);
            {
                P00 = 0;
                Timer0_Init();
//    等待P32松开
                while (P32 == 0);
            }
      }

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

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

//   main函数结束括号
    }

//    3秒执行一次
    void Timer0_Isr(void) interrupt 1
    {
      state = !state;
//      任务一 取反
      P00 = state;
//      任务二 关闭定时器
      TR0 = 1
    }
   
//   500MS秒执行一次
    void Timer1_Isr(void) interrupt 1
    {
      state = !state;
      p00 = state;
      P01 = !state;
    }

}

国学芯用 发表于 2024-12-3 09:14:39

很用心的Ai8051U教学视频学习笔记,期待您更加精彩的点评。
恭喜您提前获赠Ai8051U实验箱,今日会给您顺丰免费包邮寄出。
期待您在论坛上给大持续分享测试心得,一起前进!
截图发给客户小姐姐,免费+包邮送!

芯LYS 发表于 2024-12-3 16:58:51

已联系,继续加油!
页: [1]
查看完整版本: AI8051u学习打卡 |已收到实验箱