找回密码
 立即注册
查看: 397|回复: 12

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

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 2025-5-27 13:18:32 | 显示全部楼层 |阅读模式
第一集序言
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封装








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


回复

使用道具 举报 送花

3

主题

722

回帖

155

积分

等待验证会员

积分
155
发表于 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技术,为社会发展贡献自己的力量。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 2025-5-27 13:48:44 | 显示全部楼层
第二集   硬件以及工具介绍
1:实验箱硬件部分:
硬件功能模块,如图实验箱整体功能布局(我还没有试验箱,先截个屏

硬件功能模块

硬件功能模块

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

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

软件和工具

软件和工具

MCU型号添加:在ISP软件 keil仿真设置 添加型号 ...  点击后选择keil路径即可
AIapp-ISP-v6.95R.zip (7.52 MB, 下载次数: 6)
进入下载模式,先按住P3.2按键,然后按下off 松开off后即进入下载模式






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






拓展Keil的C代码中断号.zip

157.67 KB, 下载次数: 5

中断拓展插件

AI8051U实验箱V1.2使用说明书.pdf

4.96 MB, 下载次数: 6

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 2025-5-28 09:55:18 | 显示全部楼层
第三集  点亮第一颗LED

新建工程的设置
target

target设置

target设置

output,64K以内可以选80,超过64K必须选择386
截图202505281420005547.jpg
用ISP软件生成头文件 选择芯片型号,选择keil格式头文件,然后点击保存文件,选择路径保存即可
截图202505281429086115.jpg
第一段代码点亮第一个灯如下
#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形成回路点亮第一个灯
截图202505281512276344.jpg        截图202505281525275758.jpg




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













回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 2025-5-28 15:30:09 | 显示全部楼层
第四集    USB不停电下载


下载所需文件(STC官网-软件工具-库函数-USB库文件)
STC_USB_LIBRARY.zip (1.07 MB, 下载次数: 6)
添加库函数和头文件到工程
在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);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
截图202506040907292818.jpg


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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 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进制
截图202505281654145132.jpg

三.数据的基本类型
截图202505281656421345.jpg

四.C语言常用运算符
截图202505281704342151.jpg    
截图202505281707144848.jpg   
截图202505281714098154.jpg


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




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 2025-5-29 13:59:06 | 显示全部楼层
第六集  IO输入输出


GPIO 工作模式
截图202505291400099217.jpg
高低电平限值
截图202505291401549518.jpg
按键检测
截图202505291402358253.jpg
任务:
截图202505291404432093.jpg
任务实现代码:

#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);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}

课后练习
截图202505291422416142.jpg
练习代码

#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);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}



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





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 2025-5-29 14:39:00 | 显示全部楼层
第七集   定时器中断

定时器应用:
截图202505291439311961.jpg

打印”数”乱码问题:
截图202505291447567804.jpg

定时器要配置的寄存器:
截图202505291451503000.jpg    截图202505291453507629.jpg    截图202505291456108180.jpg
截图202505291457125783.jpg    截图202505291458311368.jpg    截图202505291459253772.jpg

定时时间计算:
截图202505291502105566.jpg

函数定义、声明和调用:
截图202505291504583180.jpg    截图202505291506134281.jpg

任务:
任务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中断
写代码还是要仔细,按部就班的去做不要偷懒啊

任务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);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}



课后练习
截图202505291542551733.jpg
练习代码:

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#define MAIN_Fosc       24000000L   //定义主时钟
#define u8 unsigned char
void usb_callback();
u8  count = 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);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}

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



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 2025-5-30 15:00:53 | 显示全部楼层
第八集 定时器周期性调度任务

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

截图202506031441278213.jpg
任务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[3]={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[0] == 300)
        {
            count[0] = 0;
            P20 = !P20;
        }
        if(count[1] == 600)
        {
            count[1] = 0;
            P21 = !P21;
        }
        if(count[2] == 900)
        {
            count[2] = 0;
            P22 = !P22;
        }
    }

}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
截图202506031442578652.jpg
任务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[3]={0,0,0};
u16 led[14]={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[0] == 300)
        {
            count[0] = 0;
            P2 = ~led[j];
            j++;
            if(j > 13){j =0;}
        }
        
    }
   
}
void usb_callback()
{
    USB_SendData(UsbOutBuffer,OutNumber);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}
截图202506031444352727.jpg
任务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[3]={0,0,0};
u16 led[14]={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[j];
        if(count[0] == 1000)
        {
            count[0] = 0;
            printf("AI8051U\r\n");
        }
        
        if(count[1] == 10)
        {
            count[1] = 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);           //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
}

多文件
截图202506041719587977.jpg

多任务
截图202506041724095508.jpg
AI8051_2_8.7z (35.5 KB, 下载次数: 5)


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




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-06-16 07:09:04
已绑定手机

1

主题

12

回帖

119

积分

注册会员

积分
119
发表于 2025-6-4 17:20:44 | 显示全部楼层
第九集  数码管
主要内容如下
摘要
1.数码管介绍
数码管外观
截图202506061655569468.jpg     截图202506061656483676.jpg     截图202506061657461469.jpg

2.数码管显示原理
截图202506061702414031.jpg     截图202506061703593831.jpg     截图202506061713114978.jpg
生成段码
截图202506061715204205.jpg
3数码管静态显示
任务1:数码管静态的显示一个数字

4数码管动态显示
任务2:数码管显示"12345678"
截图202506061717471613.jpg
任务3:数码管显示“00-00-00”分别代表时分秒,每过1秒钟秒+1

5.虚拟显示LED和数码管
截图202506091049188447.jpg     截图202506091049542590.jpg
任务1:数码管静态的显示一个数字
任务2:数码管显示"12345678"
任务3:数码管显示“00-00-00”分别代表时分秒,每过1秒钟秒+1
虚拟现实

任务代码: AI8051_3_9.7z (81.77 KB, 下载次数: 1)


所用硬件原理图
截图202506061725062854.jpg
拓展训练:
截图202506091050477699.jpg
拓展代码:
AI8051_4_9.7z (83.52 KB, 下载次数: 5)




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





回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 13:06 , Processed in 0.135961 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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