找回密码
 立即注册
查看: 477|回复: 32

AI8051U学习心得-1

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2026-02-12 08:01:00
已绑定手机

1

主题

33

回帖

399

积分

中级会员

积分
399
发表于 2026-1-2 08:44:29 | 显示全部楼层 |阅读模式
新的开发板到了,操练起来,
首先下载方式采用
按P32=0,按power按键停电/再松开上电,
ISP出现USB下载串口,即可对单片机进行烧录,非常科学!

===这时可松开P32
Snipaste_2026-01-02_08-33-56.png
IMG_20260102_083525.jpg
截图202601020843102126.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:324
  • 最近打卡:2026-02-12 09:05:32

835

主题

1万

回帖

2万

积分

管理员

积分
22170
发表于 2026-1-2 09:34:52 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:324
  • 最近打卡:2026-02-12 09:05:32

835

主题

1万

回帖

2万

积分

管理员

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

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

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

下载 最新的 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之图形化程序自动生成
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2026-02-12 08:01:00
已绑定手机

1

主题

33

回帖

399

积分

中级会员

积分
399
发表于 2026-1-2 09:44:34 | 显示全部楼层
学习打卡-2

来点亮led灯,由擎天柱开发板原理图可知,p2口led为低电平点亮,
#include "ai8051u.h"                //调用头文件

//注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可
void main(void)
{
        P2M0 = 0;                //P2端口(P20-P27)为准双向口
        P2M1 = 0;
        
        while(1)
        {
                P20 = 0;        //P20端口输出0V
                P21 = 0;        //P21端口输出0V
               
                P25 = 0;        //P25端口输出0V
                P26 = 0;        //P26端口输出0V

        }

通过以上代码,即可点亮第0,1,5,6号灯。
一灯.png
Snipaste_2026-01-02_09-33-58.png
IMG_20260102_093206.jpg
IMG_20260102_093344.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2026-02-12 08:01:00
已绑定手机

1

主题

33

回帖

399

积分

中级会员

积分
399
发表于 2026-1-2 10:11:26 | 显示全部楼层
切记按键时不能操作过快,要不然无法识别HID1
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2026-02-12 08:01:00
已绑定手机

1

主题

33

回帖

399

积分

中级会员

积分
399
发表于 2026-1-2 10:21:38 | 显示全部楼层
学习心得-3

char *USER_STCISPCMD = "@STCISP#"; 这行代码定义了一个特殊的命令字符串。这是 STC 单片机的一个特色功能:它允许 USB 设备模拟一个虚拟的串口(CDC 类设备),并且可以被 STC-ISP 烧录软件识别。当软件发送这个特定命令时,单片机会进入 ISP(在系统编程)模式,从而实现通过 USB 口在线下载程序,这就是注释中提到的 “USB 不停电下载”。


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

//注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,本节课程的其余内容(USB不停电下载)均通用!

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;                                        //P00端口输出0V
                P22 = 0;                                        //P02端口输出0V

        }
}


开发板现象

开发板现象

ISP usbcdc标识

ISP  usbcdc标识

点评

楼上 是 旧的程序,不好; 使用新的 USB库,新的程序 [attachimg]127234[/attachimg] [attachimg]127233[/attachimg] [attachimg]127235[/attachimg] [attachimg]127236[/attachimg]  详情 回复 发表于 2026-1-2 10:35
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:324
  • 最近打卡:2026-02-12 09:05:32

835

主题

1万

回帖

2万

积分

管理员

积分
22170
发表于 2026-1-2 10:35:07 | 显示全部楼层
vdgh*** 发表于 2026-1-2 10:21
学习心得-3

char *USER_STCISPCMD = "@STCISP#"; 这行代码定义了一个特殊的命令字符串。这是 STC 单片机的 ...
楼上 是 旧的程序,不好;
使用新的 USB库,新的程序


截图202601021033463189.jpg


截图202601021032135916.jpg


截图202601021034272635.jpg

截图202601021034575102.jpg

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2026-02-12 08:01:00
已绑定手机

1

主题

33

回帖

399

积分

中级会员

积分
399
发表于 2026-1-2 11:14:22 | 显示全部楼层
学习心得-4
           按一下灯亮,按一下灯灭     通过if函数  判断按键是否按下,同时通过串口打印出p20端口的状态
                if( P32 == 0 )                                                                //判断P32按钮是否按下
                {
                        Delay20ms();                                                        //延时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松开
IMG_20260102_105831.jpg
Snipaste_2026-01-02_10-58-06.png
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2026-02-12 08:01:00
已绑定手机

1

主题

33

回帖

399

积分

中级会员

积分
399
发表于 2026-1-2 11:37:28 | 显示全部楼层
学习心得-5  使用新程序  打印输出Hello World!


#include  "ai8051u.h"        //头文件不分大小写,但关键字分大小写
#include  "ai_usb.h"        //USB库和USB虚拟设备的头文件

void  main(void)
{
        EAXFR = 1;        //允许访问扩展的特殊寄存器,XFR
        WTST = 0;        //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
        CKCON = 0;        //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间

        P0M0 = 0x00; P0M1 = 0x00;        //初始化P0口为准双向口模式
        P1M0 = 0x00; P1M1 = 0x00;         //初始化P1口为准双向口模式
        P2M0 = 0x00; P2M1 = 0x00;         //初始化P2口为准双向口模式
        P3M0 = 0x00; P3M1 = 0x00;         //初始化P3口为准双向口模式
        P4M0 = 0x00; P4M1 = 0x00;         //初始化P4口为准双向口模式
        P5M0 = 0x00; P5M1 = 0x00;         //初始化P5口为准双向口模式

        usb_init();
        //初始化USB模块,并且会将【P3.0,P3.1】初始化为高阻输入,不影响USB【D-,D+】通讯
        EA = 1;                //使能总中断

        while (1)
        {
                printf_usb("Hello World !\r\n");
                //  \r是回车,并跳到行首,\n是换行,就是换到下一行;\r\n不要交换次序
        }
}

打印输出.png
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2026-02-12 08:01:00
已绑定手机

1

主题

33

回帖

399

积分

中级会员

积分
399
发表于 2026-1-2 12:27:35 | 显示全部楼层
学习心得-6  运用定时器执行双灯轮巡点亮
  1. #include "ai8051u.h"                        //调用头文件
  2. #include "stc32_stc8_usb.h"                //调用头文件
  3. #include "intrins.h"                        //d调用头文件
  4. //注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可,按键通用,本节课程的其余内容均通用!
  5. #define u8  unsigned char                //8位无符号变量(0-255)
  6. #define u16 unsigned int                //16位无符号变量(0-65535)       
  7.        
  8. u8 state = 0;                                        //初始状态
  9. u8 Run_State = 0;                                //运行状态
  10. char *USER_DEVICEDESC = NULL;
  11. char *USER_PRODUCTDESC = NULL;
  12. char *USER_STCISPCMD = "@STCISP#";
  13. void Delay20ms(void)        //@24.000MHz  Delay20ms();
  14. {
  15.         unsigned long edata i;
  16.         _nop_();
  17.         _nop_();
  18.         i = 119998UL;
  19.         while (i) i--;
  20. }
  21. void Timer0_Init(void);                //3秒@24.000MHz                //函数声明
  22. void main(void)
  23. {
  24.         int count=1;                                                                        //按键计数变量
  25.        
  26.     WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  27.     EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
  28.     CKCON = 0;                                                                                 //提高访问XRAM速度
  29.        
  30.     P0M1 = 0x00;   P0M0 = 0x00;
  31.     P1M1 = 0x00;   P1M0 = 0x00;
  32.     P2M1 = 0x00;   P2M0 = 0x00;
  33.     P3M1 = 0x00;   P3M0 = 0x00;
  34.     P4M1 = 0x00;   P4M0 = 0x00;
  35.     P5M1 = 0x00;   P5M0 = 0x00;
  36.     P6M1 = 0x00;   P6M0 = 0x00;
  37.     P7M1 = 0x00;   P7M0 = 0x00;
  38.        
  39.         usb_init();                                     //USB CDC 接口配置
  40.     IE2 |= 0x80;                                    //使能USB中断
  41. //        Timer0_Init();                                                                        //定时器初始化
  42.        
  43.     EA = 1;                                                                                        //IE |= 0X80;
  44.        
  45.         P40 = 0;
  46.        
  47.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  48.        
  49.         while(1)
  50.         {
  51.                
  52.         if (bUsbOutReady)                                                        //如果接收到了数据
  53.         {
  54.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  55.             
  56.             usb_OUT_done();                                                        //
  57.         }
  58.                
  59.                 //任务1:
  60. //                if( P32 == 0 )                                                                //判断P32按钮是否按下
  61. //                {
  62. //                        Delay20ms();                                                        //延时20ms消抖
  63. //                        if( P32 == 0 )
  64. //                        {
  65. //                                printf("按键按下次数\xfd:%d 次\r\n",(int)count);
  66. //                                count++;
  67. //                               
  68. //                                while( P32 == 0 );                                        //等待P32松开
  69. //                               
  70. //                        }
  71. //                }
  72.        
  73. //                //任务2:灯按一下点亮三秒后熄灭。
  74.                 if( P32 == 0 )                                                                //判断P32按钮是否按下
  75.                 {
  76.                         Delay20ms();                                                        //延时20ms消抖
  77.                         if( P32 == 0 )
  78.                         {
  79. //                                printf("按键按下次数\xfd:%d 次\r\n",(int)count);
  80. //                                count++;
  81.                                 P20 = 0;
  82.                                 Timer0_Init();
  83.                                 while( P32 == 0 );                                        //等待P32松开
  84.                                
  85.                         }
  86.                 }
  87. //               
  88.                 //任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2              表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
  89.                 if( P32 == 0 )                                                                //判断P32按钮是否按下
  90.                 {
  91.                         Delay20ms();                                                        //延时20ms消抖
  92.                         if( P32 == 0 )
  93.                         {
  94.                                 Run_State = !Run_State;                                //运行状态取反
  95.                                
  96.                                 if( Run_State==1 )                                        //运行
  97.                                 {
  98.                                         Timer0_Init();
  99.                                 }
  100.                                 else
  101.                                 {
  102.                                         TR0 = 0;                                                //关闭定时器
  103.                                         P20 = 1;
  104.                                         P21 = 1;
  105.                                 }
  106.                                 while( P32 == 0 );                                        //等待P32松开
  107.                                
  108.                         }
  109.                 }
  110.                
  111.         }
  112. }
  113. //void Timer0_Init(void)                //3秒@24.000MHz        函数定义
  114. //{
  115. //        TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  116. //        AUXR &= 0x7F;                        //定时器时钟12T模式
  117. //        TMOD &= 0xF0;                        //设置定时器模式
  118. //        TL0 = 0x3F;                                //设置定时初始值
  119. //        TH0 = 0x01;                                //设置定时初始值
  120. //        TF0 = 0;                                //清除TF0标志
  121. //        TR0 = 1;                                //定时器0开始计时
  122. //        ET0 = 1;                                //使能定时器0中断
  123. //       
  124. //        //TM0PS = 91
  125. //        //12T                 /12
  126. //        // THO-TL0 = 319
  127. //       
  128. //}
  129. void Timer0_Init(void)                //500毫秒@24.000MHz
  130. {
  131.         TM0PS = 0x0F;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  132.         AUXR &= 0x7F;                        //定时器时钟12T模式
  133.         TMOD &= 0xF0;                        //设置定时器模式
  134.         TL0 = 0xDC;                                //设置定时初始值
  135.         TH0 = 0x0B;                                //设置定时初始值
  136.         TF0 = 0;                                //清除TF0标志
  137.         TR0 = 1;                                //定时器0开始计时
  138.         ET0 = 1;                                //使能定时器0中断
  139. }
  140. void Timer0_Isr(void) interrupt 1                //3秒执行一次
  141. {
  142.         state = !state;               
  143.        
  144.         P20 = state;
  145.         P21 = !state;
  146. }
复制代码



可以模拟救护车车灯。学习了按键防抖的基础代码,同时学习了中断的控制代码。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-12 18:02 , Processed in 0.117676 second(s), 83 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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