找回密码
 立即注册
查看: 908|回复: 17

《8051U深度入门到32位51大型实战教学视频》学习记录

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-13 17:23:54 | 显示全部楼层 |阅读模式

《8051U深度入门到32位51大型实战教学视频》第一集学习记录打卡

从序言里面,感受到了Ai8051u这个仿真实验板的强大功能,

从多个例程下载运行,展示了搭载ai8051u的开发板实现了很多加有屏幕互动接口的强大功能。

也感受到了新型高速单片机带来的极致体验效果,以前的8051单片机如果搭载屏幕,是很消耗存储和系统资源的,但是从视频里面看到,它居然还可以播放视频,这足以说明这颗单片机通过简单的编程就可以达到快速编解码,高速通讯和高速刷新!功能实属强大!

以前用的单片机还是STC89C52等,内存不够,加的外置,所有的下载都还需要冷启动,这个单片机下载很简单也更快。

我希望在这里,通过国芯论坛,通过冲哥的视频教程,能学习到更好的硬件编程方法,和创造更有实用价值的制作。

以前访问的官网是:www.stcmcu.com,现在直接跳转到新的:www.stcaimcu.com,都是同一个地方!今天从其他网页看到活动消息,转链接到这里,看到了熟悉的芯片介绍图,想想我的第一个小制作,回忆起ISP方便的下载方式,和里面详细全面的资料介绍,没有什么能有它更人性化了,全部中文!于是从这里打开了我探索单片机世界的大门。

今天发现,STC出了好多更快更好的单片机,忍不住点开视频,再次探索新单片机带来的愉悦。

这是记录于2024年12月13日,关于《8051U深度入门到32位51大型实战教学视频》第一集的学习记录。

“哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前!”谢谢冲哥送出的这勉励话语,我将让其陪伴左右,警醒自己!升华自己!

1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-20 22:17:56 | 显示全部楼层

《8051U深度入门到32位51大型实战教学视频》第二集学习记录

第二集 硬件及工具介绍

这一集中,老师详细的介绍了AI8051U实验箱的各个硬件模块,也简要介绍了每个模块用到的场景;编程软件、程序下载软件的下载与安装;同时简要介绍了软件的基本操作,如何添加头文件及如何加入扩展功能等的操作。

最后演示了试验箱下载一个流水灯程序并成功运行的过程!

这一集中,老师重点强调了,如何获取资源,登录www.stcai.com,上方标签栏有“芯片手册”、“软件工具”等分类,可以依次找到对应芯片的资料及软件,获取试验箱程序代码等等。非常方便!

在程序下载环节,老师重点讲述了如何正确联机,如何正确设置端口、时钟等,如何正确下载程序到单片机里。

视频很短,但非常精炼!深深的勾起了我不断学习研究新事物的欲望!

这是记录于2024年12月14日,关于《8051U深度入门到32位51大型实战教学视频》第二集的学习记录。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-21 15:44:32 | 显示全部楼层

《8051U深度入门到32位51大型实战教学视频》第三集学习记录

第三集 点亮第一颗LED

课程开始,冲哥就讲解了keil软件的启动和工程的建立!

以前用的软件,好多都是汉化的,但这次用的是C251的环境,没有汉化版。但不知为何,今天在冲哥这里,听他讲了一会儿,我感觉摸着都能点正确,好多技巧都还是这次听了才玩明白!佩服国芯的工程师们,真的太牛了!

1.Keil软件启动,建立一个工程:先确定保存位置,且对该工程命名;

2.选择对应的芯片类型和型号,首先确定选择的是STC MCU数据库,然后在厂家型号大类中找到STC,从型号列表中找到关键字“STC8051U 32Bit”或者“AI8051U 32Bit”都行,都代表选择的型号是当前工程对应的。

3.新建程序文件,保存成C语言格式,main.c;

4.添加刚新建的程序文件到工程组里,Gource Group1,也 可以双击添加;

5.对该工程进行必要的设置:

①、Target项:

【CPU Mode】→选择Source(251 native) 指令运行模式,还需勾选“4 Byte interrupt Frame Size”

【Nemory Model】→选择XSmall 存储器模式

【Code Rom Size】→选择Large:64K program存储空间

②、Output项:勾选“Create HEX File”,【HEX Format】选择HEX-80,程序大于64K时选择HEX-386.

6.添加头文件到软件系统目录或者当前工程目录。常用“ ”来让软件自动寻找,或者利用ISP软件调取出来保存。

7.编写程序:①设置正确注释语言,一般选GB2312避免乱码;②设置TAB按键缩进。

#include “ai8051u.h”// 包含的头文件,让程序找到正确驱动硬件的信息

void main(void)//主函数,有且只有一个主函数

{

    P0M0 = 0x00;P0M1 = 0x00;        //只执行一次

    P1M0 = 0x00;P1M1 = 0x00;        //只执行一次

While(1) //反复执行

{

   P00 = 0;   //P00输出低电平

}

}

8.下载程序。

选择正确的单片机
扫描端口,与实验板联机。按下电源,按下P32,松开电源,松开P32。正确识别。
载入生成的程序代码,
下载进单片机。

冲哥在视频中详细介绍了IO端口的配置,每个IO口的配置都需要使用两个寄存器进行设置:

寄存器M0+M1分别单独设置,设置有点复杂,不过常用的还是都设成0x00,准双向最好用了。借助AIapp-ISP软件更好!可以快速帮助设置每一个端口,生成标准代码!现在都更新到6.95C了。十分好用!

这是记录于2024年12月20日,关于《8051U深度入门到32位51大型实战教学视频》第三集的学习记录。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-22 22:45:49 | 显示全部楼层

8051U****深度入门到32位51大型实战教学视频》第四集学习记录

第四集 USB不停电下载

通过实验的对比,当点击下载/编程时,程序自动更新到单片机,无需按电源键和P32键了。充分说明USB不停电下载的优越性。

要想获得这个效果,开启单片机支持不断电下载的功能,首先需要得到USB库文件。

www.stcai.com,从软件工具--库函数--下载【USB库函数】。

解压得到库文件和范例程序。他们的区别(在AIapp-ISP程序中关于下载部分【收到用户命令后复位到ISP监控程序区】选择时需要重点区分):

当选择【USB-CDC/串口模式】时,库文件和例程都需要选择带CDC关键字的,同时要区分8/32Bit CPU指令模式,要一致;

当选择【USB(HID)模式】时,库文件和例程都需要选择带HID关键字的,同时也要区分8/32Bit CPU指令模式,要一致;

其中,这两种模式的选择中,还有需要注意的是,他还分查询模式(query)和中断模式(interrupt):

查询模式,是指程序收到指令后并不立即执行下载,而是等待单片机运行当前程序后,在执行下载指令;

中断模式,是指下载指令下发后,引起中断,立即运行下载指令。

课程中,一般选择查询模式。

在工程文件夹中,就需要放入支持USB的头文件:stc32_stc8_usb.h和支撑STC-usb的库文件:stc_usb_cdc_32.LIB。

1.新建工程,将stc_usb_cdc_32.LIB添加进程序文件中,和main.c一起组成程序文件的组合。

  1. 编写主程序,将stc32_stc8_usb.h支持USB的头文件添加进主程序中;
  2. 在申明区添加几行关键内容:

char *USER_DEVICEDESC = NULL;

char *USER_PRODUCTDESC = NULL;

char *USER_STCISPCMD = "@STCISP#"; //必须与AIapp-ISP【收到用户命令后复位到ISP监控程序区】规定的内部/自定义一致

  1. 在主函数起始段添加USB初始化语句:

P_SW2 |= 0x80; // 使能访问XFR

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

IE2 |= 0x80; //打开USB中断

EA = 1; //打开中断

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

  1. 在主循环中加入执行语句:

if (bUsbOutReady)

{

  USB\_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试

  usb\_OUT\_done();

}

经过冲哥视频里面的教学,我一步一步按照流程,将程序下载进单片机。第一次没有成功点亮,串口窗口没有停留在等待状态。我再次修改换成其他端口尝试,(擎天柱转换板默认焊接了P2端口8个LED),这次也换成P23\P24等等,还是无法解决不亮灯情形。我一直怀疑我是不是那个步骤错了。反复观看教学视频,从一步一步敲代码重复实验,还是用官网下载的例程,AIapp_isp分别用了6.94Y、6.95C版本,均无法让其获得不断电下载的效果。折腾了一晚上,实在想不到哪个环节出问题了。我想还是用老办法下载程序吧。

接下来我继续跟着冲哥学习后面的章节,想更快的熟悉这颗强大的芯。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-26 16:44:15 | 显示全部楼层

第五集 C语言基础

这一课的主要内容摘要

1.USB-CDC串口之printf函数的实现

2.数的进制:2、10、16进制

3.数据的基本类型

4.C语言常用运算符

下面是学习的一些重点记录

一、打开printf函数,开启串口打印功能,打印出变量的类型等,帮助我们快速开发。

定位到库文件“stc32_stc8_usb.h”打开,

打开该USB库定义中的PRINTF_HID宏定义,默认是注释掉的。

去掉#define PRINTF_HID前面的//即可。

“define”代表定义的意思,同时还可以用来用新的名称定义老的名称(重定义)

二、深度讲解printf函数功能,参数设置,和格式等。

   关于打印函数,“printf(const char \*fmt, ...)”中参数“\*fmt”的定义;

   输出普通字符:在“”引号里面的普通字符原封不动的输出;

   转换输出:用”%  ”,一个百分号代表需转换一次,输出内容以逗号“,”开始紧接着的引号“”开始。

   一个“”的字符串内容用仅能 用一个%转换。

   %百分号转换常量时无需双引号,输出时有N+1的效果,即第一个%百分号输出的是第二个语句,第二个%百分号输出的是第三个语句,

语句用逗号隔开。

三、printf函数应用。

   去掉:

//USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

在这个语句中测试该函数

if (bUsbOutReady) //如果接收到了数据

    {

        //USB\_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

printf("X %% Y = %u \r\n",(u16)(X%Y)); // ===========添加测试语句

        usb\_OUT\_done();                                            //

    }

在AIapp-ISP中,用CDC/HID串口助手打开串口就可以得到测试效果。

五、C语言常用运算符

六、总结

   1.让AI8051U开启串口打印功能,需要在库文件中打开定义PRINTF\_HID,去掉注释//即开启该功能;

   2.重点运用printf函数功能,掌握它的输出规则。

   3.需要熟练掌握C语言基础知识,特别是各种运算符,数值类型,数制转换等。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-26 18:26:22 | 显示全部楼层
第六集 IO输入输出的学习记录
1.        单片机的I/O口需要在程序中配置。
通常默认状态设置为为输入输出准双向口:用作输入和输出。弱上拉,强灌电流;
推挽:用作输出,强拉和强灌;
高阻:用作输入,不能用于输出电流也不能用于输入电流
开漏:用作强灌,无上拉输出作用,该模式用做读时,需要开启上拉或者外接上拉。
2.        按键检测的输入
如何判断按键的高低电平?开启准双向口,利用读端口电平(0或者1)的状态来判断。
如何避免按键的抖动?加入按键标志位,同时加入抖动延时,一般延时20ms后再判断。
3.        延时函数的写法
用ISP软件中提供的“软件延时计算器”提取出来,放在主函数前面。
设置运行频率与软件中一直。
4.        课后任务
按一下亮一个灯,再按一下亮两个,再按直到全亮
if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P32 == 0 )
                        {
                               
                                state = (state*2+1);                                                //相似于二进制累加
                                P0 = ~state;
                                printf("state:%d\r\n",(int)state);
                               
                                while( P32 == 0 );                                        //等待P32松开
                               
                        }
                }
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-27 17:12:35 | 显示全部楼层
第七集 定时器中断
1.        在大循环中,利用定时器中断执行另外的程序。
利用定时器中断,可以替代软件长时间延时带来的响应慢问题。
利用定时器中断,可以提高程序运行效率和处理速度!
2.        利用软件生成定时器,里面有很健全的设置参数。
利用AIapp-ISP软件生成:利用“定时器计算器”可以方便的生成定时器所需要的各种参数,能快速的生成代码!
注意:选择“时钟频率”应和“运行时的IRC频率”设成一致!
勾选“使能定时器中断”生成入口函数。
        void Timer0_Init(void)                //函数体可以放在主函数main的前面(无需声明),也可以放在后面(需要声明)
        {
                }
        void Timer0_Isr(void) interrupt 1 //中断入口函数一般放在主函数后面!
        {
                AUXR &= 0x7F;                        //定时器时钟12T模式
                TMOD &= 0xF0;                        //设置定时器模式
                TL0 = 0x30;                                //设置定时初始值
                TH0 = 0xF8;                                //设置定时初始值
                TF0 = 0;                                //清除TF0标志
                TR0 = 1;                                //定时器0开始计时
                ET0 = 1;                                //使能定时器0中断
        }
3.        课后练习:电子功德箱
添加代码:
                //任务4:电子功德箱:
//        1.按下按钮1,串口显示“双倍功德时间”,再次按下显示“单倍功德时间”;
//        2.按下按键2,双倍功德时间下串口显示“功德+2  当前功德:xxx”;      
//        3.按下按键2,单倍功德时间下串口显示“功德+1  当前功德:xxx”;·
//        4.功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
//        5.功德+2时,LED点亮2秒后熄灭表示功德成功点亮,

                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P32 == 0 )
                        {
                                Run_State = !Run_State;                                //运行状态取反
                                if( Run_State==1 )                                        //运行
                                {
                                        printf("单倍功德时间 \r\n");
                                }
                                else
                                {
                                        printf("双倍功德时间 \r\n");
                                }
                                while( P32 == 0 );                                        //等待P32松开
                        }
                }
                if( P33 == 0 )                                                                //判断P33按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P33 == 0 )
                        {
                                if( Run_State==1 )                                        //运行
                                {
                                        cont+=1;
                                        printf("功德+1   当前功德:%d \r\n",cont);
                                        P00 = 0;
                                        Timer0_Init();  //1秒
                                }
                                else
                                {
                                        cont+=2;
                                        printf("功德+2   当前功德:%d \r\n",cont);
                                        P00 = 0;
                                        Timer1_Init();        //2秒
                                }
                                while( P33 == 0 );                                        //等待P33松开
                        }
                }
        }
}
void Timer0_Init(void)                //1秒@24.000MHz
{
        TM0PS = 0x1E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xFC;                                //设置定时初始值
        TH0 = 0x03;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
void Timer1_Init(void)                //2秒@24.000MHz
{
        TM1PS = 0x3D;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR &= 0xBF;                        //定时器时钟12T模式
        TMOD &= 0x0F;                        //设置定时器模式
        TL1 = 0xFC;                                //设置定时初始值
        TH1 = 0x03;                                //设置定时初始值
        TF1 = 0;                                //清除TF1标志
        TR1 = 1;                                //定时器1开始计时
        ET1 = 1;                                //使能定时器1中断
}
void Timer0_Isr(void) interrupt 1                //1秒执行一次
{
        P00 = 1;
        ET0 = 0;
}
void Timer1_Isr(void) interrupt 3                //2秒执行一次
{
        P00 = 1;
        ET1 = 0;
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-27 23:18:14 | 显示全部楼层
第八集 定时器周期性调度任务 的 学习记录
1、关于周期性任务之流水灯的实现
    a.        一般的方法是利用3个变量通过计数来达到需要的效果,判断计数满后就执行相关任务,优点是没有延时函数,不堵塞系统运行。
    b.        用数组,按八位一组,利用for语句依次调取。
    c.        中断函数设定为1ms中断一次,用变量记录中断次数,达到计数满就等同于设定了多少个毫秒。
    d.        关于数组,中括号里面的常量/变量是数据的位置索引!从0开始计数,0代表第一位。每个数据内容用逗号隔开。
2、关于按键消抖的新处理方法
        a.        当按下按键时,计数延时毫秒数,达到消抖要求后再次判断是否稳定,达到要求后输出按键值。
        b.        当计数期间时钟不稳定,从新计数,从新判断。
        c.        整环节没有采用延时函数。记录中断次数(毫秒周期数),不堵塞系统运行。
3、创建程序文件。合理创建按照不同功能分类的.c和.h文件,让程序看起来简洁,梳理方便。
        a.        创建.c程序文件
        b.        创建同名.h头件,和同名.c成双成对,一个负责声明,一个负责功能实现。
        c.        教程中创建了系统初始化头文件,包括声明定时器函数,端口初始化,系统功能初始化,系统变量定义等。
4、周期性任务之结构体数组的实现
        这是最难理解的一个内容了,冲哥讲得非常仔细,我需要慢慢消化!
5、本集核心内容是利用好定时器中断的计数功能,采用多种方法实现多任务的同时进行,没有延迟,没有堵塞。
      同时讲到了工程文件中多文件的建立与应用实现!是非常难得的学习精髓。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-30 18:54:00 | 显示全部楼层
第九集-数码管
1.    利用试验箱数码管模块做静态数字显示、动态数字显示的实验。
详细介绍HC595芯片的原来和引脚功能,以及编程对应的控制语句写法:
595是8位带锁存的串行转并行的转换接口,有时钟信号SCK;锁存信号RCK;数据信号SER。通过传输8位数据信号后再传输锁存信号得到了
8位并行输出;
数码管有共阳和共阴的区别,每一位都用7个段码组成一个8字。
通过建立段码数组和位码数组,利用一次传输8个位数据的函数,让HC595驱动数码管显示出来,想要显示什么都可以。只要是数组里面所包含的都行。
有注意的地方是:发送串行数据时,左移语句后,提取了一个CY进位标志,巧妙的做了数据发送的依据,非常的精妙!
动态输出时,要保证每一位刷新时的延时要保证在1~20ms之间,太快或者太慢都打不到显示效果,有可能会闪烁!
2.    利用ISP调试仿真接口做虚拟端口和虚拟数码管显示实验;
实验前需要先熟悉调试接口的说明和调取方法,程序使用方法等!
1.png
2.png
实验中采用擎天柱转换板做实物实验!
下载进单片机的程序通过USB串口与PC通讯,100%虚拟出了与实物端口一模一样的效果!
实验中,充分利用多任务运行函数:
staticTASK_COMPONENTS Task_Comps[]=
{
{0,    1,  1  ,   Seg_Task},        /* task 1 Period: 600ms */
{0, 1000,  1000,   TIMECOUNT_Task},   /* task 1 Period:600ms */  
{0, 1000,  1000,   PLED_40},  /* task 1 Period: 600ms */   
{0, 1000,  1000,   SEG_PC},  /* task 1 Period: 600ms */   
};
完美实验所有任务的同步高效运行。
3.png
3.    课后小练:简易10秒免单计数器
1.在前四位数码管上显示目标时间,即“ 10. 00 ”表示定时时间10秒钟
2.后四位显示当前的计时00.00,最小单位为10ms,
3.按下开始按钮后,每10ms最末尾的数字+1;直到按下结束按钮后停止计数。
下面是借助冲哥的代码修改后实现的功能,符合要求。
4.png
5.png
6.png
7.png 8.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:137
  • 最近打卡:2025-05-02 02:49:44
已绑定手机

4

主题

64

回帖

762

积分

高级会员

积分
762
发表于 2024-12-30 21:13:50 | 显示全部楼层

加油!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 18:11 , Processed in 0.173845 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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