找回密码
 立即注册
查看: 20|回复: 3

擎天柱学习打卡之旅!!!

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:140
  • 最近打卡:2025-12-18 08:52:37
已绑定手机

3

主题

11

回帖

615

积分

高级会员

积分
615
发表于 昨天 18:09 | 显示全部楼层 |阅读模式
擎天柱Ai8051U 打卡
第三集:擎天柱点亮LED灯
1.编译图片:
截图202512091146321698.jpg
2.代码:

#include "ai8051u.h"

void main(void)
{
    P2M0 = 0x00;
    P2M1 = 0x00;
    while(1)
    {
        P20 = 0;
        P21 = 0;
        P22 = 0;
        P23 = 0;
        P24 = 0;
        P25 = 0;
        P26 = 0;
        P27 = 0;
    }
}


3.结果验证:
截图202512091159592971.jpg
01_Light_On.7z (29.69 KB, 下载次数: 0)


第四集:USB不停电下载
1.编译图片:
截图202512101123042496.jpg
2.代码:


#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();
        }

        P20 = 0;
        P21 = 0;
        P22 = 0;
        P23 = 0;
        P24 = 0;
        P25 = 0;
        P26 = 0;
        P27 = 0;
    }
}


3.结果验证:
截图202512101131387799.gif
02_Usb_Non-stop_Download.7z (56.42 KB, 下载次数: 0)

第五集: C语言基础
1.编译图片:
截图202512131524025813.jpg
2.代码:


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

#define u8  unsigned 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("True\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();                         //
        }
        

    }
}



3.结果验证

截图202512131530284410.jpg
03_Basics_of_C_Language.7z (57.94 KB, 下载次数: 0)


第六集:GPIO输入输出
1.编译图片:
截图202512131824189634.jpg
2.代码:

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

#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 Delay1ms(unsigned int xms) //@24.000MHz
{
    unsigned char data i, j;
    while (xms--)
    {
        _nop_();
        i = 32;
        j = 40;
        do
        {
            while (--j)
                ;
        } while (--i);
    }
}

void main(void)
{
    WTST = 0;  // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    P_SW2 |= 0x80;      //B7位写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;

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

    while (1)
    {

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

            usb_OUT_done();
        }

        //      //任务1:按下P32按钮灯亮,松开P32按钮灯灭;
        //      if( P32 == 0 )                              //判断P32按钮是否按下
        //      {
        //          P20 = 0;
        //      }
        //      else
        //      {
        //          P20 = 1;
        //      }
        //

        // 任务2:按下P32按钮灯灭,松开P32按钮灯亮;
        //      if( P32 == 1 )                              //判断P32按钮是否按下
        //      {
        //          P20 = 0;
        //      }
        //      else
        //      {
        //          P20 = 1;
        //      }

        // 任务3:按一下灯亮,按一下灯灭
        if (P32 == 0) // 判断P32按钮是否按下
        {
            Delay1ms(20); // 延时20ms消抖
            if (P32 == 0)
            {
                state = !state; // 变量取反 0 1 0 1 0 1
                P20 = state;
                printf("state:%d\r\n", (int)state);

                while (P32 == 0)
                    ; // 等待P32松开
            }
        }
    }
}


3.结果验证
截图202512151214264488.gif


第七集:定时器中断
1.编译图片:
截图202512181122483680.jpg
2.代码:

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#define u8  unsigned char
#define u16 unsigned int

u8 state = 0; // 初始状态
u8 Run_State = 0; // 按键运行状态

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

void Delayms(unsigned int xms) //@24.000MHz
{
    unsigned char data i, j;
    while (xms--)
    {
        _nop_();
        i = 32;
        j = 40;
        do
        {
            while (--j)
                ;
        } while (--i);
    }
}
void Timer0_Init(void);
void main(void)
{
    int count=1;                                    //按键计数变量
    WTST = 0;  // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    P_SW2 |= 0x80;      //B7位写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();  // 定时器初始化,用于USB定时

    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按钮是否按下
//      {
//          Delayms(20);                            //延时20ms消抖
//          if( P32 == 0 )
//          {
//              printf("按键按下次数\xfd:%d 次\r\n",(int)count);
//              count++;
//              
//              while( P32 == 0 );                  //等待P32松开
//              
//          }
//      }
   
// //       //任务2:灯按一下点亮三秒后熄灭。
//      if( P32 == 0 )                              //判断P32按钮是否按下
//      {
//          Delayms(20);                            //延时20ms消抖
//          if( P32 == 0 )
//          {
// //               printf("按键按下次数\xfd:%d 次\r\n",(int)count);
// //               count++;
//              P20 = 0;
//              Timer0_Init();
//              while( P32 == 0 );                  //等待P32松开
               
//          }
//      }

//      
        //任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2       表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
        if( P32 == 0 )                              //判断P32按钮是否按下
        {
            Delayms(20);                            //延时20ms消抖
            if( P32 == 0 )
            {
                Run_State = !Run_State;
                            //运行状态取反
               
                if( Run_State==1 )                  //运行
                {
                    Timer0_Init();
                }
                else
                {
                    TR0 = 0;                        //关闭定时器
                    P20 = 1;
                    P21 = 1;
                }
                while( P32 == 0 );                  //等待P32松开
               
            }
        }
    }
}

//void Timer0_Init(void)        //3秒@24.000MHz 函数定义 <1 2>
//{
//  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 <3>
{
    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    //<1.2>
// {
//     // state = !state;
//     // P20 = state;
//     P20 = 1;
//     TR0 = 0;
// }


void Timer0_Isr(void) interrupt 1       //3秒执行一次 <3>
{
    state = !state;     
   
    P20 = state;
    P21 = !state;
}

3.结果验证
截图202512181134513635.gif
05_Timer.7z (60.15 KB, 下载次数: 0)


第八集:定时器周期性任务调度
1.编译图片:
截图202512181443258804.jpg
2.代码:

#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();
    EA = 1;      // IE |= 0X80;

    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();                  //系统计时

}

3.结果验证
截图202512181444203156.gif
06_Timer_Task_Scheduling.7z (73.36 KB, 下载次数: 0)


第九集:ISP虚拟接口 LED和数码管
1.编译图片:
截图202512181807187491.gif
2.代码:

#include "io.h"

u8 xdata SEG_NUM[]=
{
    0x3F,       /*'0', 0*/
    0x06,       /*'1', 1*/
    0x5B,       /*'2', 2*/
    0x4F,       /*'3', 3*/
    0x66,       /*'4', 4*/
    0x6D,       /*'5', 5*/
    0x7D,       /*'6', 6*/
    0x07,       /*'7', 7*/
    0x7F,       /*'8', 8*/
    0x6F,       /*'9', 9*/
    // 0x77,       /*'A', 10*/
    // 0x7C,       /*'B', 11*/
    // 0x39,       /*'C', 12*/
    // 0x5E,       /*'D', 13*/
    // 0x79,       /*'E', 14*/
    // 0x71,       /*'F', 15*/
    0x40,       /*'-', 16*/
    0x00,       /*' ', 17*/
    0x80,       /*'.', 18*/
};

u8 xdata T_NUM[8] =
{
    0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
};


u8 State1 = 0;                  //LED1初始状态
u8 State2 = 0;                  //LED2初始状态
u8 State3 = 0;                  //LED3初始状态

// u16 Key_Vol[3] ;             //按键按下持续时间

uint16_t xdata key_vol = 0;
uint8_t xdata state_LED = 0;

void LED0_Blink(void)
{
    State1 = !State1;
    P20 = State1;
}

void LED1_Blink(void)
{
    State2 = !State2;
    P21 = State2;
}

void LED2_Blink(void)
{
    State3 = !State3;
    P22 = State3;
}

void KEY_Task(void)
{
    // if( P32 == 0 )
    // {
    //  Key_Vol[0]++;
    //  if( Key_Vol[0]==5 )
    //  {
    //      //按键按下的任务
    //      printf( "按键单击\r\n" );
    //  }
    // }
    // else
    // {
    //  Key_Vol[0] = 0;
    // }
}
   

u8 shi  =0;
u8 fen  =0;
u8 miao =0;


void TIMECOUNT_Task(void)
{
    miao ++;
    if( miao>59 )
    {
        miao = 0;
        fen++;
        if( fen>59 )
        {
            fen = 0;
            shi ++;
            if( shi>23 )
                shi = 0;
        }
    }
}

u8 state_now = 0;


void PLED_40(void)
{
    u8 cod[8];
    cod[0] = 0x0f;      //表示开启P0-P3
    cod[1] = 0X01;      //P0端口   
    cod[2] = 0X01;      //P1
    // cod[3] = ~T_NUM[state_now];      //P2
    cod[3] = ~T_NUM[state_LED]; //P2 端口
    // cod[4] = 0X01;       //P3
    cod[4] = ~0x80;             //P3 端口
    LED40_SendData( cod,5 );
   
    P2 = ~T_NUM[state_now];
    // state_now++;
    // if( state_now>7 )
    //  state_now = 0;
    state_LED++;
    if (state_LED > 7)
        state_LED = 0;
}

void SEG_PC( void )
{
    u8 cod[8];
   

    cod[0] = SEG_NUM[shi/10];                   //小时的十位数的数码管段码
    cod[1] = SEG_NUM[shi%10];
    cod[2] =SEG_NUM[10];                        //数码管刷段码和位码

    cod[3] = SEG_NUM[fen/10];                   //分钟
    cod[4] = SEG_NUM[fen%10];
    cod[5] =SEG_NUM[10];                        //数码管刷段码和位码   

    cod[6] = SEG_NUM[miao/10];                  //分钟
    cod[7] = SEG_NUM[miao%10];
   
    SEG7_ShowCode(cod);

    miao ++;
    if(miao > 59)
    {
        miao = 0;
        fen ++;
        if(fen > 59)
        {
            fen = 0;
            shi ++;
            if(shi > 23)
                shi = 0;
        }
    }
}


uint8_t flag_1 = 0;     //初始值标志
uint8_t flag_2 = 0;     //计数启停标志
//temp[0] = ms
//temp[1] = s
uint8_t temp[2] = {0};
//========================================================================
// ISP 调试仿真接口   数码管PC
// 课后小练:简易免单器
//========================================================================
void SEG7_Pra(void)
{
    uint8_t cod[8];


    if(!flag_1)
    {
        cod[0] = SEG_NUM[0];
        cod[1] = SEG_NUM[0];
        cod[2] = SEG_NUM[0];
        cod[3] = SEG_NUM[0];

        cod[4] = SEG_NUM[0];
        cod[5] = SEG_NUM[0]|SEG_NUM[12];// 0xBF;
        cod[6] = SEG_NUM[0];
        cod[7] = SEG_NUM[0];

        SEG7_ShowCode(cod);
    }

    if(flag_2)
    {
        cod[0] = SEG_NUM[0];
        cod[1] = SEG_NUM[0];
        cod[2] = SEG_NUM[0];
        cod[3] = SEG_NUM[0];

        cod[4] = SEG_NUM[temp[1]/10];
        cod[5] = SEG_NUM[temp[1]%10]|SEG_NUM[12];// 0xBF;
        cod[6] = SEG_NUM[temp[0]/10];
        cod[7] = SEG_NUM[temp[0]%10];

        SEG7_ShowCode(cod);

        temp[0] ++;
        if(temp[0] > 99)
        {
            temp[0] = 0;
            temp[1] ++;
            if(temp[1] > 99)
                temp[1] = 99;
        }
    }

}

void Key_SEG7_Task(void)
{
    uint8_t key_cnt = 0;        // ????????????flag_1??

    if(P33 == 0)
    {
        key_vol ++;
        if(key_vol == 5)
        {
            if(key_cnt == 0)
                flag_1 = 1;
            flag_2 = !flag_2;
            key_cnt ++;
            if(key_cnt > 254)
                key_cnt = 254;
        }
    }
    else   
        key_vol = 0;
}

3.结果验证
截图202512181807494427.gif
07_Digital_Tube.7z (77.46 KB, 下载次数: 0)




回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-12-18 09:22:10
已绑定手机

1

主题

9

回帖

35

积分

新手上路

积分
35
发表于 昨天 20:39 | 显示全部楼层
你的板子怎么有红色LED灯?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21329
发表于 昨天 21:42 | 显示全部楼层

USB 直接搞定了:
可以 直接申请 AI8051U 实验箱
另外 USB的程序用我们新的库,

新的程序,不死等

截图202512182140212271.jpg

截图202512182141032578.jpg

截图202512182141451860.jpg

截图202512182142257845.jpg


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21329
发表于 昨天 21:43 | 显示全部楼层
要 做到 USB不停电下载
要 尝试 AiCube 图形化自动配置生成程序工具
推荐优先看的:  
printf_usb("Hello World !\r\n")
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html

下载 最新的 AiCube-ISP-V6.96J 或以上版本软件 !

深圳国芯人工智能有限公司-工具软件

下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !

下载 最新的 Ai8051U 用户手册
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf

下载 最新的 Ai8051U 实验指导书,
AiCube 图形化自动配置生成程序工具使用说明
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf


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


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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-19 05:50 , Processed in 0.108440 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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