bwqqgwvu 发表于 2025-6-26 09:01:38

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

第3集点亮第一颗LED

代码运行通过,功能实现:


源代码如下:

#include "ai8051u.h"
void main(void)
{
      P0M0 = 0X00;
      P0M1 = 0X00;
      P4M0 = 0X00;
      P4M1 = 0X00;
      P40 = 0;
      while(1)
      {
                P00 = 0;
                P01 = 0;
      }
}

国芯人工智能 发表于 2025-6-26 09:03:00

第3集 | 点燃第一颗LED
【代码功能实现】
代码运行通过,功能实现如下:
1. P4M0和P4M1的初始化:
   P4M0和P4M1初始化为0x00,表示它们在初始化时处于“reset”的状态。
   这意味着它们需要通过后续的位操作来设置LED的驱动位(P4M0和P4M1的设置)以实现LED的点亮功能。

2. P40的初始化:
   P40初始化为0,表示在模块初始化时,P40的状态为“free”的状态。
   这意味着在模块初始化完成后,P40的状态可以被设置为“reset”或“initialize”以进一步调整模块的配置。

3. 代码执行逻辑:
   while(1)循环内,P00和P01初始化为0x00,表示在点亮LED的高 byte部分保持处于“idle”的状态。
   代码块中,P4M0和P4M1被设置为0x80,表示它们在低 byte部分设置为“initialize”状态, ready for LED的点亮操作。
   此外,P00和P01被设置为0x00,表示在点亮LED的高 byte部分保持处于“idle”的状态,直到后续的位操作完成。

【模块初始化原理】
1. P4M0和P4M1的设置:
   P4M0和P4M1在模块初始化完成后,可以被设置为“initialize”的状态,以进一步完成LED的点亮操作。
   这意味着它们需要通过后续的位操作(如P40和P4M0的设置)来实现对LED驱动位的调整。

2. 位操作的作用:
P4M0的设置:用于设置LED的驱动位(Low byte),通过与P40的或运算(P40 | P4M0)完成对驱动位的设置。
P4M1的设置:用于设置LED的控制位(High byte),通过与P00的或运算(P00 | P4M1)完成对控制位的设置。

【国芯AI的优势】
1. 高性能与低功耗:
   国芯AI在8051U模块上的设计,采用了先进的高性能架构和低功耗技术,使得LCIO和51系列模块在功耗和性能上具有显著优势。

2. 高精度与低延迟:
   国芯AI通过采用高精度的位运算和低延迟的控制算法,确保了LED的点亮操作具有稳定性和准确性。

3. 灵活的模块配置:
   国芯AI支持多种模块配置,包括不同位的设置(如P4M0、P4M1、P40等),使得用户可以根据具体需求灵活调整模块的性能和功能。

【实验过程与总结】
1. 代码的运行与调试:
   在代码运行过程中,用户需要通过调试工具(如IDE或调试器)逐步完成对模块的初始化和位操作的设置,以实现LED的点亮功能。

2. 实验结果与验证:
   通过实验,用户可以根据代码的逻辑和模块的配置,验证LED的点亮功能是否正常工作。

3. 技术总结:
   通过本次实验,用户可以了解如何利用8051U模块实现简单的LED点亮功能,掌握位操作的基本原理,并了解国芯AI在模块设计中的优势。

【视频与实践的结合】
1. 视频内容:
   本次视频展示了如何通过国芯AI的8051U模块实现LED的点亮功能,包括模块的初始化、位操作的设置和实验过程中的注意事项。

2. 实践操作:
   随后,用户可以根据视频内容,尝试在自己的实验设备上完成相同的实验,加深对8051U模块和LED点亮功能的理解。

【总结与展望】
通过本次学习,用户对8051U模块的入门到实战有了全面的了解,不仅掌握了模块的初始化和位操作的基本技巧,还了解了国芯AI在模块设计中的专业性和优势。
未来,用户可以进一步学习LCIO和51系列模块的高级功能,如LED的灯光效果调整、模块的定时功能设置等,进一步提升实验的深度和广度。

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

bwqqgwvu 发表于 2025-6-26 09:14:55

第4集USB不停电下载

代码运行通过,功能实现:



源代码如下:

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


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

void main(void)
{
    P_SW2 |= 0x80;                //B7位写1,使能访问XFR
      
    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;
      
      while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
      
      while(1)
      {
               
      if (bUsbOutReady)
      {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
      }
               
                P40 = 0;      //P40端口输出0V
                P00 = 0;      //P00端口输出0V
                P02 = 0;      //P02端口输出0V
                //P01 = 0;      //P01端口输出0V
                //
      }
}

bwqqgwvu 发表于 2025-6-26 09:20:59

第五集C语言基础配套程序

代码运行通过,功能实现:

源代码:

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


#define u8unsigned char                //8位无符号变量(0-255)
#define u16 unsigned int                //16位无符号变量(0-65535)      
      
u8 X = 200;
u8 Y = 10;

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

void main(void)
{
    P_SW2 |= 0x80;                //B7位写1,使能访问XFR
      
    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;
      
      while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
      
      while(1)
      {
               
      if (bUsbOutReady)                                                      //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
                        if( X && Y )      //如果条件为真,输出什么
                        {
                              printf("条件为真\r\n");
                        }
//                        else
//                        {
//                              printf("条件为假\r\n");
//                        }
                              
//                        printf("X / Y = %u \r\n",(u16)(X/Y));
                        
//                        printf("X %% Y = %u \r\n",(u16)(X%Y));
                        
            usb_OUT_done();                                                      //
      }
               
//                P40 = 0;      //P40端口输出0V
//                P00 = 0;      //P00端口输出0V
//                P02 = 0;      //P02端口输出0V
                //P01 = 0;      //P01端口输出0V
                //
      }
}

bwqqgwvu 发表于 2025-6-26 09:25:23

第六集I/O口输入输出

代码运行通过,功能实现:


源代码:

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

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

#define u8 unsigned char
#define u16 unsigned int
      

u8 state = 0;


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

      _nop_();
      _nop_();
      _nop_();
      i = 119998UL;
      while (i) i--;
}


void main(void)
{
      WTST = 0;
      EAXFR = 1;
      CKCON = 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;
      
      P40 = 0;
      
      usb_init();
      IE2 |= 0X80;
      EA = 1;
      
      while (DeviceState != DEVSTATE_CONFIGURED);
      
      while(1)
      {
                if (bUsbOutReady)
      {
                        //USB_SendData(UsbOutBuffer,OutNumber);
                        
                        
                        usb_OUT_done();
      }
               
               
                if(P32 ==0)
                {
                        Delay20us();
                        if(P32 ==0)
                        {
                              state =! state;
                              P00 =state;
                              printf("state:%d\r\n",(int)state);
                              
                              while(P32 == 0);
                        }
                }
               
      }
               
}

bwqqgwvu 发表于 2025-6-26 09:29:20

第七集定时器中断

代码运行通过,功能实现:



源代码:

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

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

#define u8 unsigned char
#define u16 unsigned int
      

u8 state = 0;
u8 Run_State = 0;   //运行状态

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

      _nop_();
      _nop_();
      _nop_();
      i = 119998UL;
      while (i) i--;
}

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 main(void)
{
      int count=1;
      WTST = 0;
      EAXFR = 1;
      CKCON = 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;
      
      P40 = 0;
      
      usb_init();
      IE2 |= 0X80;
      
      //Timer0_Init();         //定时器初始化
      
      EA = 1;
      
      while (DeviceState != DEVSTATE_CONFIGURED);
      
      while(1)
      {
                if (bUsbOutReady)
      {
                        //USB_SendData(UsbOutBuffer,OutNumber);
                        
                        
                        usb_OUT_done();
      }
                //灯光交替
               
                if(P32 ==0)
                {
                        Delay20us();
                        if(P32 ==0)
                        {
                              Run_State = !Run_State;
                              if (Run_State ==1)
                              {
                                        Timer0_Init();
                              }
                              else
                              {
                                        TR0=1;
                                        P00 = 1;
                                        P01 =1;
                              }
                              //P00 =0;
                              //Timer0_Init();

                              while(P32 == 0);
                        }
                }
               
      }
               
}
void Timer0_Isr(void) interrupt 1
{
      state =! state;
      P00 =state;
      P01 =!state;

}













bwqqgwvu 发表于 2025-6-26 09:36:18

第八集定时器周期性调度任务

代码运行通过,功能实现:


源代码:

#include "io.h"


u8 State1 = 0;
u8 State2 = 0;
u8 State3 = 0;
u16 Key_Vol = 0;

void LED0_Blink(void)
{
      State1 = !State1;
      P00 = State1;
}
void LED1_Blink(void)
{
      State2 = !State2;
      P01 = State2;
}
void LED2_Blink(void)
{
      State3 = !State3;
      P02 = State3;
}
void KEY_Task(void)
{
      if(P32 == 0)
      {
                Key_Vol++;
                if(Key_Vol == 5)
                {
                        printf("按键单机任务");
                }
      }
      else
      {
                Key_Vol = 0;
      }
}

bwqqgwvu 发表于 2025-6-26 09:40:01

第九集数码管

代码运行通过,功能实现:


源代码:

#include "config.h"
#include "task.h"
#include "io.h"


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


void main(void)
{
      Sys_init();                                                                              //系统初始化
      usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
      Timer0_Init();                                                                        //定时器初始化
      init_595();                                    //595端口电平初始化
    EA = 1;                                                                                        //IE |= 0X80;
      
      P40 = 0;
      
      while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
      
      while(1)
      {
               
      if (bUsbOutReady)                                                      //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                        
            usb_OUT_done();                                                      //
      }
                Task_Pro_Handler_Callback();                              //执行功能函数

      }
}



void Timer0_Isr(void) interrupt 1                //1MS执行一次
{

      Task_Marks_Handler_Callback();                                        //系统计时

}


bwqqgwvu 发表于 2025-6-26 10:05:19

第十集虚拟键盘LED和数码管

代码成功运行,功能实现:




源代码:

#include "config.h"
#include "task.h"
#include "io.h"


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

extern u32 REC_NUM;

void main(void)
{
      Sys_init();                                                                              //系统初始化
      usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
      Timer0_Init();                                                                        //定时器初始化
    EA = 1;                                                                                        //IE |= 0X80;
      
      P40 = 0;
      
      while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
      
      while(1)
      {
               
      if (bUsbOutReady)                                                      //如果接收到了数据
      {
                        REC_NUM = UsbOutBuffer-48;
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                        
            usb_OUT_done();                                                      //
      }
                Task_Pro_Handler_Callback();                              //执行功能函数

      }
}



void Timer0_Isr(void) interrupt 1                //1MS执行一次
{

      Task_Marks_Handler_Callback();                                        //系统计时

}



bwqqgwvu 发表于 2025-6-26 10:14:27

第十一集矩阵按键

代码成功运行,功能实现:


源代码:

#include "config.h"
#include "task.h"
#include "io.h"


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


void main(void)
{
      Sys_init();                                                                              //系统初始化
      usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
      Timer0_Init();                                                                        //定时器初始化
      Init_595();
    EA = 1;                                                                                        //IE |= 0X80;
      
      P40 = 0;
      
      while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
      
      while(1)
      {
               
      if (bUsbOutReady)                                                      //如果接收到了数据
      {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                        
            usb_OUT_done();                                                      //
      }
                Task_Pro_Handler_Callback();                              //执行功能函数

      }
}



void Timer0_Isr(void) interrupt 1                //1MS执行一次
{

      Task_Marks_Handler_Callback();                                        //系统计时

}


页: [1] 2 3
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》学习打卡