找回密码
 立即注册
楼主: 熊能

学习《Ai8051U教学视频》第一集 序言

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 3 天前 | 显示全部楼层

《Ai8051U教学视频》第六集 I/O输入输出

1什么是GPIO
GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,就是一些引脚,可以通过她们输出高低电平或者通过它们读取引脚的状态-是高电平或低电平


2按键输入检测

按键消抖(机械按键按下或松开有抖动,一般在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速度
       
    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 接口配置

    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;
       
        P40 = 0;
       
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
       
        while(1)
        {
               
        if (bUsbOutReady)                                                        //如果接收到了数据
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();                                                        //
        }
               
//                //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
//                if( P32 == 0 )                                                                //判断P32按钮是否按下
//                {
//                        P00 = 0;
//                }
//                else
//                {
//                        P00 = 1;
//                }
//               
               
               
//                //任务2:按下P32按钮灯灭,松开P32按钮灯亮;
//                if( P32 == 1 )                                                                //判断P32按钮是否按下
//                {
//                        P00 = 0;
//                }
//                else
//                {
//                        P00 = 1;
//                }
               
                //任务3:按一下灯亮,按一下灯灭
                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时20ms消抖
                        if( P32 == 0 )
                        {
                                state = !state;                                                //变量取反 0 1 0 1 0 1
                                P00 = state;
                                printf("state:%d\r\n",(int)state);
                               
                                while( P32 == 0 );                                        //等待P32松开
                               
                        }
                }
       
               
        }
}

回复

使用道具 举报 送花

3

主题

1920

回帖

688

积分

等待验证会员

积分
688
发表于 3 天前 | 显示全部楼层
《Ai8051U教学视频》第六集 I/O输入输出 —— 专业解读GPIO与按键检测实现

一、GPIO基本概念解析

GPIO(General Purpose Input/Output)作为嵌入式系统中最基础的外设模块,其本质是可编程配置的数字信号引脚。在AI8051U微控制器中,GPIO模块遵循标准8051架构的I/O端口设计规范,同时进行了功能扩展。每个GPIO端口由Pn寄存器(n=0,1,2,3)进行控制,支持位寻址操作,具备以下核心特性:

1. 多模式配置:支持准双向口、推挽输出、高阻输入三种电气特性配置
2. 电平控制:通过Px寄存器设置输出电平状态(0/1)
3. 状态读取:通过Px寄存器读取引脚实时电平状态
4. 中断支持:部分端口支持外部中断触发功能

二、硬件消抖原理与实现

针对机械按键特有的接触抖动现象(典型时间范围5-20ms),本示例采用软件延时消抖方案。该方案基于以下技术考量:

1. 抖动时间窗分析:实测表明,绝大多数机械按键的稳定时间

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 3 天前 | 显示全部楼层

Ai8051U教学视频》第七集 定时器

1定时器的介绍
(1)用于计时系统,可以实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay,提高程序的运行效率和处理速度


2定时器的应用

#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速度
       
    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 接口配置

    IE2 |= 0x80;                                    //使能USB中断
//        Timer0_Init();                                                                        //定时器初始化
       
    EA = 1;                                                                                        //IE |= 0X80;
       
        P40 = 0;
       
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
       
        while(1)
        {
               
        if (bUsbOutReady)                                                        //如果接收到了数据
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            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;
                                }
//                                P00 = 0;
//                                Timer0_Init();
                                while( P32 == 0 );                                        //等待P32松开
                               
                        }
                }
               
        }
}

//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中断
//       
//        //TM0PS = 91
//        //12T                 /12
//        // THO-TL0 = 319
//       
//}

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;
}


定时器频率
定时时间
重装值(TH0,TL0)
3函数的定义,声明,调用

定义:
返回值类型 函数名 (入口参数)
{
    //函数体
    //函数执行的代码
    return 返回值;
}
声明:
返回值类型 函数名(入口参数)
调用:
函数名(入口参数)
回复

使用道具 举报 送花

3

主题

1920

回帖

688

积分

等待验证会员

积分
688
发表于 3 天前 | 显示全部楼层
AI8051U教学视频第七集:定时器详解

在AI8051U单片机的开发过程中,定时器是一个非常关键的模块。它不仅可以实现精准的计时功能,还能替代传统的软件延时函数,从而显著提升程序的运行效率和响应速度。本文将围绕定时器的基本概念、应用场景以及在实际项目中的使用方法进行详细解析。

一、定时器的功能与作用

定时器在单片机系统中扮演着“时间管理者”的角色,其主要功能如下:

1. 实现精确计时  
   定时器能够以非常高的精度进行时间测量,适用于需要定时执行任务的场合,例如定时采集传感器数据、定时刷新显示屏等。

2. 替代长时间Delay函数  
   传统的软件延时函数(如 Delay20ms())会占用CPU资源,使程序在等待期间无法执行其他任务。而使用定时器可以实现非阻塞式延时,在定时器计时的同时,CPU可以处理其他任务,从而提高系统效率。

3. 周期性任务调度  
   定时器可以通过中断机制,实现周期性任务的自动触发,如每100ms更新一次状态、每秒执行一次系统自检等。

二、定时器的工作原理

AI8051U系列单片机通常配备多个定时器模块(如Timer0、Timer1等),其基本工作原理如下:

1. 时钟源输入  
   定时器通过系统时钟或外部时钟源进行计数。AI8051U的主频为24MHz,定时器可以基于该时钟进行分频计数。

2. 计数器寄存器  
   每个定时器都有对应的计数寄存器(如TH0、TL0),用于存储当前计数值。

3. 中断触发机制  
   当计数器达到设定值(即溢出)时,可以触发中断服务程序(ISR),执行用户定义的操作。

4. 模式选择  
   定时器支持多种工作模式,如16位自动重载模式、8位自动重载模式、13位计数模式等,开发者可根据实际需求选择合适的模式。

三、定时器的初始化与配置

以Timer0为例,下面是一个典型的定时器初始化函数:
  1. c
  2. void Timer0Init(void)
  3. {
  4.     TMOD = 0x02;           // 设置为8位自动重载模式
  5.     TH0 = 0x06;            // 设置初值,对应3秒延时(基于24MHz主频)
  6.     TL0 = 0x06;
  7.     ET0 = 1;               // 使能Timer0中断
  8.     EA = 1;                // 使能全局中断
  9.     TR0 = 1;               // 启动Timer0
  10. }
复制代码

在该配置中,定时器工作于8位自动重载模式,TH0和TL0的初值决定了定时器的溢出周期。通过设置中断使能位ET0和EA,允许定时器中断被响应。最后通过TR0启动定时器。

四、定时器中断服务程序

当定时器溢出时,会触发相应的中断服务程序。在AI8051U中,Timer0的中断服务函数如下:
  1. c
  2. void Timer0ISR(void) interrupt 1
  3. {
  4.     static u16 timercount = 0;
  5.     timercount++;
  6.     if(timercount >= 1000)  // 假设每1ms中断一次,累计1000次即为1秒
  7.     {
  8.         timercount = 0;
  9.         // 执行每秒一次的操作,如LED闪烁、状态更新等
  10.     }
  11. }
复制代码

在该中断函数中,我们通过累加计数器 timercount 来实现更长时间的定时控制。例如,每1ms触发一次中断,则累加1000次即可实现1秒的时间间隔。

五、定时器的实际应用场景

1. LED闪烁控制  
   利用定时器实现LED的周期性闪烁,避免使用延时函数导致的CPU阻塞。

2. 按键去抖  
   定时器可用于按键去抖处理,通过定时采样按键状态,提高按键识别的准确性。

3. PWM波形生成  
   定时器可以配合比较寄存器生成PWM信号,用于控制电机转速、LED亮度等。

4. 系统时钟维护  
   定时器可作为系统时钟的基础模块,实现毫秒、秒、分钟等时间单位的维护。

5. 任务调度  
   在多任务系统中,定时器可用于任务的周期性调度,实现轻量级操作系统的调度功能。

六、与软件延时的对比分析

| 特性 | 软件延时(Delay) | 定时器 |
|------|------------------|--------|
| 实现方式 | 通过空循环实现 | 硬件计数器+中断 |
| CPU占用 | 高(期间无法执行其他任务) | 低(可并行处理其他任务) |
| 精度 | 依赖循环次数,精度较低 | 硬件级精度,可调 |
| 可扩展性 | 差,难以实现多任务 | 好,支持多任务调度 |
| 中断响应 | 不支持 | 支持 |

从上表可以看出,定时器在性能、精度和系统响应能力上全面优于传统的软件延时方式。

七、总结

在AI8051U单片机的开发中,定时器是实现时间控制、任务调度和系统优化的重要工具。通过合理配置定时器,可以有效提升程序的运行效率和稳定性,避免因软件延时导致的资源浪费和响应延迟。

在实际开发过程中,建议根据项目需求选择合适的工作模式,并结合中断机制实现高效的时间管理。同时,注意定时器初值的计算,确保定时精度符合预期。

通过本集视频的学习,开发者应掌握定时器的基本配置方法、中断处理机制以及在实际项目中的应用技巧,为后续更复杂的嵌入式系统开发打下坚实基础。

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:199
  • 最近打卡:2025-10-06 10:42:21

784

主题

1万

回帖

1万

积分

管理员

积分
19492
发表于 前天 10:41 | 显示全部楼层
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
本坛转发时,要去掉中括号后的第一个“-,就可以将视频帖到其他帖子中


上面是 小李 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成


上面是 小赵 演示:Ai8051U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:199
  • 最近打卡:2025-10-06 10:42:21

784

主题

1万

回帖

1万

积分

管理员

积分
19492
发表于 前天 10:42 | 显示全部楼层
在同一个帖子中 打卡,否则我们论坛会乱了
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 前天 14:46 | 显示全部楼层
AI8051U教学视频第八集:定时器周期性调度任务
1周期性任务介绍
2文件的创建(*.h,*.c)
3结构体的介绍
4结构体数组的周期性任务调度
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 前天 14:55 | 显示全部楼层
AI8051U教学视频第九集:数码管
1数码管介绍

2数码管显示原理
3数码管静态显示
4数码管动态显示
5虚拟显示--LED和数码管
截图202510051451277277.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-10-06 06:15:01
已绑定手机

7

主题

4

回帖

103

积分

注册会员

积分
103
发表于 前天 15:00 | 显示全部楼层
AI8051U教学视频第十集:虚拟LED和数码管
1虚拟显示-LED
硬件准备
软件准备(最新的ISP软件)
参数设置(仿真调试接口-接口设置)
选择指定的接口和协议匹配
2虚拟显示-数码管
3虚拟键盘
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-7 05:18 , Processed in 0.121465 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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