skyalong 发表于 2025-5-27 13:18:32

学习《Ai8051U教学视频》心得打卡

第一集序言
AI8051U 对比于STC32G有了以下增强,8051U的强大之处

1.屏幕显示和视频播放(flash编程器),因为优化了QSPI的一些flash芯片读写的内容,对于视频尤其是大容量视频播放有了一个质的提升
2.IIS录放音,IIS录放音已经做全了。演示中的代码下载前要将频率修改为36.864MHz
3.PWM DMA,之前的PWM没办法更好的兼容DMA,现在可以了
4.频谱分析仪(上位机),因为有了一些硬件的浮点乘除单元可以更好的实现
5.手写计算器,已经从STC进化到了AI
6.QSPI,PWM移相,硬件乘除,单精度浮点,一些最新的功能


AI8051U参数:

Ai8051U,USB型1T8051,支持32位和8位指令集,RMB2.3
管脚兼容天王级别的:89C52RC,12C5A60S2
要兼容8位8051指令集,可以用KeilC51/IAR/SDCC编译器
===就相当于更强大的8H8K64U
要兼容32位8051指令集,可以用KeilC251编译器,双核兼容设计
===就相当于更强大的32G12K128,32G8K64
34K SRAM(2K edata, 32K xdata), 64K Flash
TFPU@120MHz,硬件浮点/硬件三角函数 运算器
DMA支持PWM,DMA支持外设直接到外设,P2P
120MHz-PWM支持硬件移相,16位PWM;
真12位ADC USB,4组串口,12位ADC,轨到轨比较器
QSPI,SPI,12S,12C,TFT-i8080/M6800接口
PDIP40,LQFP44, LQFP48封装








--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前

国芯人工智能 发表于 2025-5-27 13:23:00

AI8051U教学视频学习心得打卡 第一集

学习AI8051U的视频是一次非常重要的实践机会,它不仅让我对AI技术有了更深入的理解,还让我在实践中锻炼了自己的动手能力和解决问题的能力。这是一次充满挑战的学习过程,但也是一次成长的机会。

首先,我学习了AI8051U的基本概念和核心原理。这门课程让我对AI的基本工作原理有了清晰的认识,特别是如何通过设计算法来实现复杂的目标,比如图像识别和自然语言处理等。通过课程中的案例和实验,我学会了如何将理论知识应用到实际项目中。

在学习过程中,我遇到了一些问题,比如如何选择合适的算法和参数,如何处理大数据和大数据分析等。这些挑战让我意识到自己在AI技术学习上的不足,也让我学会了如何不断调整学习方法,以适应新的知识和技能。

通过实践,我学会了如何使用AI8051U的硬件和软件工具。这包括如何编写Python代码来开发AI模型,如何处理数据集,以及如何进行模型的优化和评估。这些技能不仅提高了我的技术能力,还让我对AI的应用前景有了更清晰的认识。

此外,学习过程中我还学到了团队合作的重要性。在实验中,我和其他小组成员一起完成项目,这不仅让我学会了如何分工合作,还让我体会到了团队协作的魅力。通过集体学习和合作,我更加深刻地理解了AI技术的复杂性和重要性。

这次学习经历让我对AI技术充满了兴趣和热情。我认识到,AI技术正在深刻改变我们的生活和工作方式,它将为人类带来巨大的进步和机遇。未来,我希望能够继续深入学习AI技术,为社会发展贡献自己的力量。

总之,学习AI8051U的视频是一次非常宝贵的学习机会。通过这次学习,我不仅掌握了AI技术的核心知识,还学会了如何将理论知识应用到实际项目中,培养了我的问题解决能力和团队协作能力。这将对我未来的学习和职业发展产生深远的影响。

总结:

这次学习AI8051U的视频是一次非常重要的实践机会,不仅让我对AI技术有了更深入的理解,还让我在实践中锻炼了自己的动手能力和解决问题的能力。通过这次学习,我学会了如何使用AI8051U的硬件和软件工具,并且认识到AI技术正在深刻改变我们的生活和工作方式。未来,我希望能够继续深入学习AI技术,为社会发展贡献自己的力量。

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

skyalong 发表于 2025-5-27 13:48:44

第二集   硬件以及工具介绍
1:实验箱硬件部分:
硬件功能模块,如图实验箱整体功能布局(我还没有试验箱,先截个屏{:ciya:})

有个疑问老师说的那个示波器输入进来调节波形调的是什么呢,如果我们调节了是不是意味着信号失真了呢?

2:软件和工具
开发工具依然还是keil(STC是不是也应该推出自己的开发工具了{:touxiao:}),下载软件ISP功能更强大了{:qiang:}

MCU型号添加:在ISP软件 keil仿真设置 添加型号 ...点击后选择keil路径即可

进入下载模式,先按住P3.2按键,然后按下off 松开off后即进入下载模式






--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前





skyalong 发表于 2025-5-28 09:55:18

第三集点亮第一颗LED

新建工程的设置
target

output,64K以内可以选80,超过64K必须选择386

用ISP软件生成头文件 选择芯片型号,选择keil格式头文件,然后点击保存文件,选择路径保存即可

第一段代码点亮第一个灯如下
#include "ai8051u.h"

void main(void)
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;

    P40 = 0;
    while(1)
    {
      P00 = 0;
    }
}
P0M0 = 0x00; ...   IO口模式设置将P0 和P4口各8个引脚全部设置为准双向口
P40 = 0;开启三极管给LED供电,P00 = 0;第一个灯给0形成回路点亮第一个灯
      




--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前












skyalong 发表于 2025-5-28 15:30:09

第四集    USB不停电下载


下载所需文件(STC官网-软件工具-库函数-USB库文件)

添加库函数和头文件到工程
在main.c中添加代码

因为新的USB库做了修改所以老师讲的一些语句已经不需要再添加,重新参考历程修改代码如下
(因为USB库更新了所以不知到命令在哪里设置了,还是先保持默认不变)


#include "ai8051u.h"
#include "stc32_stc8_usb.h"

void usb_callback();

void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
   
    EA = 1;
   
    P40 = 0;
    while(1)
    {
      P00 = 0;
    }

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



--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前

skyalong 发表于 2025-5-28 16:42:49

第五集语言基础

一.C语言USB-CDC串口之printf函数的实现
1.打开USB库中的PRINTF HID宏定义(去掉/)
2.理解PRINTF的函数原型的定义
#define printf printf hid
int printf hid (const char *fmt; .….);

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


三.数据的基本类型


四.C语言常用运算符
   




--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前



skyalong 发表于 2025-5-29 13:59:06

第六集IO输入输出


GPIO 工作模式

高低电平限值

按键检测

任务:

任务实现代码:

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
void usb_callback();
void Delay20ms(void)    //@24.000MHz
{
    unsigned long edata i;

    _nop_();
    _nop_();
    i = 119998UL;
    while (i) i--;
}
void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
   
    EA = 1;
   
    P40 = 0;
    while(1)
    {
      /*//任务1
      if(P32 == 0)
      {
            P20 = 0;
      }
      else
      {
            P20 = 1;
      }
      
      //任务2
      if(P32 == 1)
      {
            P20 = 0;
      }
      else
      {
            P20 = 1;
      }*/
      //任务3
      if(P32 == 0)
      {
            Delay20ms();
            if(P32 == 0)
            {
                P20 = !P20;
                while(P32 == 0);
            }
      }
      
    }

}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
课后练习练习代码
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
void usb_callback();
void Delay20ms(void)    //@24.000MHz
{
    unsigned long edata i;

    _nop_();
    _nop_();
    i = 119998UL;
    while (i) i--;
}
void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
   
    EA = 1;
   
    P40 = 0;
    P2 = 0xff;
    while(1)
    {
      /*//任务1
      if(P32 == 0)
      {
            P20 = 0;
      }
      if(P33 == 0)
      {
            P20 = 1;
      }*/
      //任务2
      if(P32 == 0)
      {
            Delay20ms();
            if(P32 == 0)
            {
                P2 = P2 << 1;
                while(P32 == 0);
            }
      }
    }

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



--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前




skyalong 发表于 2025-5-29 14:39:00

第七集   定时器中断

定时器应用:


打印”数”乱码问题:


定时器要配置的寄存器:
   
   

定时时间计算:


函数定义、声明和调用:


任务:
任务1:LED灯三秒取反一次,这期间任意时刻按下按钮,串口打印按键次数。
完成任务1时遇到个问题,生成定时器时忘记勾选使能中断生成代码如下:

void Timer0_Init(void)                //3秒@24.000MHz
{
      TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0x7F;                        //定时器时钟12T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0x3F;                              //设置定时初始值
      TH0 = 0x01;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
}
勾选使能中断后生成代码如下:

void Timer0_Isr(void) interrupt 1
{
}
void Timer0_Init(void)                //3秒@24.000MHz
{
      TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0x7F;                        //定时器时钟12T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0x3F;                              //设置定时初始值
      TH0 = 0x01;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
      ET0 = 1;                              //使能定时器0中断
}
误以为两次生成Timer0_Init代码一致,所以只拷贝了中断代码,导致程序不好用后排查是不进中断,最终排查到第一次生成代码中缺少了一句ET0 = 1;//使能定时器0中断
写代码还是要仔细,按部就班的去做不要偷懒啊{:lenghan:}

任务2:灯按一下点亮三秒后熄灭。
任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2 ·表示红和蓝灯);再按一下报警按钮,红蓝灯停止。
任务代码:

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
#define u8 unsigned char
void usb_callback();
u8 count = 1;
bit key_count = 0;

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

    _nop_();
    _nop_();
    i = 119998UL;
    while (i) i--;
}
//任务1 2
//void Timer0_Init(void)      //3秒@24.000MHz
//{
//TM0PS = 0x5B;         //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
//AUXR &= 0x7F;         //定时器时钟12T模式
//TMOD &= 0xF0;         //设置定时器模式
//TL0 = 0x3F;             //设置定时初始值
//TH0 = 0x01;             //设置定时初始值
//TF0 = 0;                //清除TF0标志
////任务1 TR0 = 1;            //定时器0开始计时
//ET0 = 1;                //使能定时器0中断
//}
void Timer0_Init(void)      //300毫秒@24.000MHz
{
    TM0PS = 0x09;         //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
    AUXR &= 0x7F;         //定时器时钟12T模式
    TMOD &= 0xF0;         //设置定时器模式
    TL0 = 0xA0;             //设置定时初始值
    TH0 = 0x15;             //设置定时初始值
    TF0 = 0;                //清除TF0标志
    ET0 = 1;                //使能定时器0中断
}
void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
    Timer0_Init();
    EA = 1;
    while(1)
    {
//      //任务1
//      if(P32 == 0)
//      {
//          Delay20ms();
//          if(P32 == 0)
//          {
//            printf("按键按下次数\xfd: %d\r\n",count);
//            count ++ ;
//            while(P32 == 0);
//          }
//      }
//      //任务2
//      if(P32 == 0)
//      {
//          Delay20ms();
//          if(P32 == 0)
//          {
//            TR0 = 1;
//            P20 = 0;
//            while(P32 == 0);
//          }
//      }
      //任务3
      if(P32 == 0)
      {
            Delay20ms();
            if(P32 == 0)
            {
            key_count = !key_count;
                if(key_count == 1)
                {
                  TR0 = 1;
                  P20 = 0;
                  P21 = 1;
                }
                else
                {
                  TR0 = 0;
                  P20 = 1;
                  P21 = 1;
                }
                while(P32 == 0);
            }
      }
    }

}
void Timer0_Isr(void) interrupt 1
{
////任务1:LED灯三秒取反一次,这期间任意时刻按下按钮,串口打印按键次数。
//P20 = !P20;
   
////任务2:灯按一下点亮三秒后熄灭。
//P20 = 1;
//TR0 = 0;
   
    //任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2 ·表示红和蓝灯);再按一下报警按钮,红蓝灯停止
    P20 = !P20;
    P21 = !P21;
}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}


思考:定时器一次只能定时一次,如果我有很多个定时任务怎么办?
个人答案:
取一个基准时钟,比如一个任务2秒,一个任务3秒,一个任务5秒,则定时器定时1秒,没次进中断做计数和判断,任务1进两次执行一次,任务2进三次执行一次,任务3进五次执行一次。
参考代码:

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
#define u8 unsigned char
void usb_callback();
u8 interrupt_count = 0;
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 main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
    Timer0_Init();
    EA = 1;
    while(1);
}
void Timer0_Isr(void) interrupt 1
{
    interrupt_count++;
    printf("秒数\XFD:%d\r\n",interrupt_count);
    switch (interrupt_count%5)
    {
      case 2:P20 = !P20;break;
      case 3:P21 = !P21;break;
      case 0:P22 = !P22;break;
    }
}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}



课后练习

练习代码:

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
#define u8 unsigned char
void usb_callback();
u8count = 0;
bit key_count = 0;
bit sec_count = 0;

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

    _nop_();
    _nop_();
    i = 119998UL;
    while (i) i--;
}
void Timer0_Init(void)      //1秒@24.000MHz
{
    TM0PS = 0x1E;         //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
    AUXR &= 0x7F;         //定时器时钟12T模式
    TMOD &= 0xF0;         //设置定时器模式
    TL0 = 0xFC;             //设置定时初始值
    TH0 = 0x03;             //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 0;                //定时器0开始计时
    ET0 = 1;                //使能定时器0中断
}
void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
    Timer0_Init();
    EA = 1;
    while(1)
    {
      if(P32 == 0)
      {
            Delay20ms();
            if(P32 == 0)
            {
                key_count = !key_count;
                if(key_count == 1)
                {
                  printf("双倍功德时间\r\n");
                }
                else
                {
                  printf("单倍功德时间\r\n");
                }
                while(P32 == 0);
            }
      }
      if(P33 == 0)
      {
            Delay20ms();
            if(P33 == 0)
            {
                if(key_count == 1)
                {
                  count = count+2;
                  printf("功德+2,当前功德%d\r\n",count);
                  TR0 = 1;
                  P20 = 0;
                }
                else
                {
                  count = count+1;
                  printf("功德+1,当前功德%d\r\n",count);
                  TR0 = 1;
                  P20 = 0;
                }
            }
            while(P33 == 0);
      }
    }
}
void Timer0_Isr(void) interrupt 1
{
    sec_count = !sec_count;
    if(key_count == 1)
    {
      if(sec_count == 0)
      {
            TR0 = 0;
            P20 = 1;
      }
    }
    else
    {   
      TR0 = 0;
      P20 = 1;
    }
}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}

--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前

skyalong 发表于 2025-5-30 15:00:53

第八集 定时器周期性调度任务
(前1-7集感觉就是带小白入门,从本集开始难度飙升,半吊子的我学起来有一丢丢吃力了{:xiaoku:})
本集主要内容如下:
1.常见的错误介绍
2.周期性任务介绍
3.数组
4.按键不再用while检测按键抬起,防止冲突其他任务,改用定时器计数
5.多文件的建立
6.用结构体去创建多任务


任务1:用一个定时器实现这个任务。LED1实现0.3秒取反一次,LED2实现0.6 秒取反一次,LED3 0.9秒取反一次
周期性任务代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
#define u8 unsigned char
#define u16 unsigned int
   
void usb_callback();
u8 interrupt_count = 0;
u16 LED1_count = 0;
u16 LED2_count = 0;
u16 LED3_count = 0;

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

void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
    Timer0_Init();
    EA = 1;
    while(1)
    {
      if(LED1_count == 300)
      {
            LED1_count = 0;
            P20 = !P20;
      }
      if(LED2_count == 600)
      {
            LED2_count = 0;
            P21 = !P21;
      }
      if(LED3_count == 900)
      {
            LED3_count = 0;
            P22 = !P22;
      }
    }
}
void Timer0_Isr(void) interrupt 1
{
    LED1_count++;
    LED2_count++;
    LED3_count++;
}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
数组方式实现:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
#define u8 unsigned char
#define u16 unsigned int

void usb_callback();
u8 interrupt_count = 0;
//u16 LED1_count = 0;
//u16 LED2_count = 0;
//u16 LED3_count = 0;
u16 count={0,0,0};

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

void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;

    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
    Timer0_Init();
    EA = 1;
    while(1)
    {
    }
}
void Timer0_Isr(void) interrupt 1
{
    u8 i;
    for( i=0;i<3;i++)
    {
      count++;
      if(count == 300)
      {
            count = 0;
            P20 = !P20;
      }
      if(count == 600)
      {
            count = 0;
            P21 = !P21;
      }
      if(count == 900)
      {
            count = 0;
            P22 = !P22;
      }
    }

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

任务2:数组点亮LED,实现流水灯
实现代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
#define u8 unsigned char
#define u16 unsigned int
   
void usb_callback();
u8 interrupt_count = 0;
u16 count={0,0,0};
u16 led={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x04,0x02};
u8 j=0;
void Timer0_Init(void)      //1毫秒@24.000MHz
{
    TM0PS = 0x00;         //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
    AUXR &= 0x7F;         //定时器时钟12T模式
    TMOD &= 0xF0;         //设置定时器模式
    TL0 = 0x30;             //设置定时初始值
    TH0 = 0xF8;             //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    ET0 = 1;                //使能定时器0中断
}

void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
    Timer0_Init();
    EA = 1;
    while(1)
    {

    }
}
void Timer0_Isr(void) interrupt 1
{
    u8 i;
    for( i=0;i<3;i++)
    {
      count++;
      if(count == 300)
      {
            count = 0;
            P2 = ~led;
            j++;
            if(j > 13){j =0;}
      }
      
    }
   
}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}

任务3:按键1按一下,LED通过数组移动一下
实现代码:
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
#define u8 unsigned char
#define u16 unsigned int
   
void usb_callback();
u8 interrupt_count = 0;
u16 count={0,0,0};
u16 led={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x04,0x02};
u8 j = 0,key_num = 0;
void Timer0_Init(void)      //1毫秒@24.000MHz
{
    TM0PS = 0x00;         //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
    AUXR &= 0x7F;         //定时器时钟12T模式
    TMOD &= 0xF0;         //设置定时器模式
    TL0 = 0x30;             //设置定时初始值
    TH0 = 0xF8;             //设置定时初始值
    TF0 = 0;                //清除TF0标志
    TR0 = 1;                //定时器0开始计时
    ET0 = 1;                //使能定时器0中断
}

void main(void)
{   
    EAXFR = 1;                        //允许访问扩展的特殊寄存器,XFR
    WTST = 0;                           //设置取程序代码等待时间,
                                        //赋值为0表示不等待,程序以最快速度运行
    CKCON = 0;                        //设置访问片内的xdata速度,
                                        //赋值为 0表示用最快速度访问,
                                        //不增加额外的等待时间   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
   
    usb_init();                                     //USB CDC 接口配置
    set_usb_OUT_callback(usb_callback);             //设置中断回调回调函数
    Timer0_Init();
    EA = 1;
    while(1)
    {   
      P2 = ~led;
      if(count == 1000)
      {
            count = 0;
            printf("AI8051U\r\n");
      }
      
      if(count == 10)
      {
            count = 0;
            if(P32 == 0)
            {
                key_num++;
                if(key_num == 5)
                {
                  j++;
                  if(j > 13){j =0;}
                }   
            }
            else
            {
                key_num = 0;
            }
      }   
    }
}
void Timer0_Isr(void) interrupt 1
{
    u8 i;
    for( i=0;i<3;i++)
    {
      count++;
    }   
}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
多文件


多任务




--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前



skyalong 发表于 2025-6-4 17:20:44

第九集数码管主要内容如下摘要1.数码管介绍数码管外观      
2.数码管显示原理      生成段码3数码管静态显示任务1:数码管静态的显示一个数字
4数码管动态显示任务2:数码管显示"12345678"任务3:数码管显示“00-00-00”分别代表时分秒,每过1秒钟秒+1
5.虚拟显示LED和数码管   
任务1:数码管静态的显示一个数字任务2:数码管显示"12345678"任务3:数码管显示“00-00-00”分别代表时分秒,每过1秒钟秒+1虚拟现实
任务代码:

所用硬件原理图拓展训练:拓展代码:



--哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前




页: [1] 2
查看完整版本: 学习《Ai8051U教学视频》心得打卡