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

还是从 printf_usb("Hello World !\r\n") 开始,《单片机原理及应用》入门@Ai8051U

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-3 21:34:12 | 显示全部楼层 |阅读模式
最新软件 版本是  AiCube@AIapp-ISP V6.95T, 大家直接使用最新版本软件

以下是纯手敲代码, 未使用 AiCube@AIapp-ISP V6.95T
还是从
printf_usb("Hello World !\r\n") 开始,不停电自动下载
单片机原理及应用》入门@Ai8051U
Ai8051U这是32位8051的USB时代printf_usb()不停电自动下载

实验一:printf_usb("Hello World !\r\n"),  
              第一个完整的C语言程序
实验二:  查询方式,查询到电脑命令后,

              printf_usb("Hello World !\r\n")或其他
实验三:  中断方式,单片机USB中断接收服务函数收到命令后,
              printf_usb("Hello World !\r\n")或其他

截图202504032137569557.jpg
最新《单片机原理及应用@Ai8051U》,电子版教材
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf
最新 AIapp-ISP V6.95T 开发工具包
https://www.stcaimcu.com/data/download/Tools/AIapp-ISP-v6.95T.zip

Ai8051U利用 AiCube@AIapp-ISP
实验一:printf_usb("Hello World !\r\n"),  
              第一个完整的C语言程序
实验二:  查询方式,查询到电脑命令后,

              printf_usb("Hello World !\r\n")或其他
实验三:  中断方式,单片机USB中断接收服务函数收到命令后,
              printf_usb("Hello World !\r\n")或其他


利用 AiCube@AIapp-ISP V6.95Q
AiCube-可视化 图形 I/O配置各种外设 系统框架程序 自动生成 体验


STC32G12K128,利用 AiCube@AIapp-ISP V6.95M
各功能模块智能配置启动程序框架程序自动生成器,实现如下的实验:
32位8051单片机入门第一个完整的C语言程序,
printf_usb("Hello World !\r\n") 及不停电下载

STC32G12K128:
AiCube 实验一:  直接 printf_usb("Hello World !\r\n")
===32位8051单片机入门第一个完整的C语言程序

AiCube 实验二:  查询方式,查询到电脑命令后,
                           printf_usb("Hello World !\r\n")或其他

AiCube 实验三:  中断方式单片机USB中断接收服务函数收到命令后,
                           printf_usb("Hello World !\r\n")或其他

STC8H8K64U:
AiCube 三个实验:



回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-15 12:44:44 | 显示全部楼层

2025/4/15:
利用 AiCube@AIapp-ISP V6.95M
智能配置开发工具,实现如下的实验:
AiCube 实验一:  直接 printf_usb("Hello World !\r\n")
32位8051单片机入门第一个完整的C语言程序
截图202504160808318609.jpg

截图202504160809312052.jpg

截图202504160810026391.jpg

2025/4/15:
利用 AiCube@AIapp-ISP V6.95M
智能配置开发工具,实现如下的实验:
AiCube 实验一:  直接 printf_usb("Hello World !\r\n")
32位8051单片机入门第一个完整的C语言程序

截图202504152254295564.jpg
截图202504152142559125.jpg
深圳国芯人工智能有限公司-工具软件
keil C51/C251 编译器只支持31以内中断号,超过31编译报错。
热心网友提供的简单KEIL中断号拓展工具,可将中断号拓展到254,
在KEIL 未打开的状况下,运行【Keil 中断拓展插件】,将中断号拓展到254。

截图202504152147296646.jpg
使用 AIapp-ISP V6.95M 或以上版本,在KEIL 未打开的状况下
重新添加一次新的头文件

截图202504152148558364.jpg
添加的 新头文件 在这


使用 AIapp-ISP V6.95M 或以上版本中的
AiCube 智能配置工具自动生成强大的初始化程序
截图202504152155012115.jpg

截图202504152157136742.jpg
对应的在 KEIL C251 中的 项目设置,已是最优,不需要修改

截图202504152202477372.jpg
可视图形化I/O口配置工具】本实验暂时不需要配置

截图202504152208281771.jpg
选择用 出厂预置的 40MHz 高速IRC 时钟 跑用户程序
===如在这选择用户程序区用户程序自己去修改频率
===那ISP烧录时的频率会被改为上面的频率

截图202504152219022399.jpg
选择使用【USB外设】;
选择本实验程序 使用【USB-CDC 通信协议】;
也可以选择本实验程序 使用【USB-HID 通信协议】;
其他设置本实验程序暂时用不到,直接点击【创建项目

截图202504152222044333.jpg
项目创建成功后,Keil 自动打开该【项目文件
截图202504152224413238.jpg

截图202504152227245074.jpg
本程序用

printf_usb("Hello World !\r\n");
//直接打印输出  "Hello World !\r\n" 到 主机端的 USB-CDC/HID-串口助手
//取代下面这行 AiCube 自动生成的语句

//USBLIB_OUT_Done();    //查询方式处理USB接收的数据
截图202504152234277904.jpg
编译产生的 *.HEX文件在下面目录中
截图202504152236193523.jpg
截图202504152237385299.jpg
打开该目标文件,
AI8051U实验设备, P3.2按键按下,P3.2为低,
重新上电,点击【下载/编程】按钮, 烧录成功。
单片机/MCU, AI8051U,
自动运行 printf_usb("Hello World !\r\n")程序。
截图202504152240358875.jpg

截图202504152243592422.jpg
如上,点击【打开串口

截图202504152246542922.jpg
程序运行效果如上

具体程序如下:
////////////////////////////////////////
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-04-15) 创建文件
////////////////////////////////////////


#include "config.h"                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件


////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    SYS_Init();


    while (1)
    {
      printf_usb("Hello World !\r\n");
      //直接打印输出  "Hello World !\r\n" 到 主机端的 USB-CDC/HID-串口助手
      //取代下面这行 AiCube 自动生成的语句
                        //USBLIB_OUT_Done();              //查询方式处理USB接收的数据
    }
}


////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基


    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口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式


    CLK_Init();                         //时钟模块初始化
    USBLIB_Init();                      //USB库初始化


    EnableGlobalInt();                  //使能全局中断
}


////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;


    do
    {
        i = MAIN_Fosc / 6000;
        while (--i);
    } while (--ms);
}




////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
    CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频


    HIRC_40M();                         //选择内部预置的频率


    CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为主时钟
    CLK_MCLK2_BYPASS();                 //旁路MCLK2,直接使用MCLK选择


    CLK_SYSCLK_Divider(1);              //设置系统时钟分频系数


    CLK_HSIOCK_MCLK();                  //选择MCLK主时钟作为高速外设时钟源
    CLK_HSIOCK_Divider(1);              //设置高速外设时钟预分频系数


    CLK_SPICLK_Divider(1);              //设置SPI时钟预分频系数
    CLK_I2SCLK_Divider(1);              //设置I2S时钟预分频系数
    CLK_PWMACLK_Divider(1);             //设置PWMA时钟预分频系数
    CLK_PWMBCLK_Divider(1);             //设置PWMB时钟预分频系数
    CLK_TFPUCLK_Divider(1);             //设置TFPU时钟预分频系数
}


////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
    usb_init();                         //初始化USB模块
    USB_SetIntPriority(0);              //设置中断为最低优先级
    set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
}


////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
}


////////////////////////////////////////
// USB设备接收数据处理程序
// 入口参数: 无
// 函数返回: 无
// bUsbOutReady:USB设备接收数据标志位
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Done(void)
{
    if (bUsbOutReady)                   //查询是否有接收到USB主机发送数据
    {
        USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
        usb_OUT_done();                 //当前包的数据处理完成,通知USB主机可以发送下一包数据
    }
}


截图202504160043435951.jpg

截图202504160044185313.jpg

printf_usb.zip

137.99 KB, 下载次数: 27

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-15 23:29:56 | 显示全部楼层
2025/4/15:
利用 AiCube@AIapp-ISP V6.95M
智能配置开发工具,实现如下的实验:
AiCube 实验二:  查询方式,查询到电脑命令后,
                           printf_usb("Hello World !\r\n")或其他

32位8051单片机入门第一个完整的C语言程序
截图202504160806002606.jpg

截图202504160806398372.jpg
2025/4/15:
利用 AiCube@AIapp-ISP V6.95M
智能配置开发工具,实现如下的实验:
AiCube 实验二:  查询方式,查询到电脑命令后,
                           printf_usb("Hello World !\r\n")或其他
32位8051单片机入门第一个完整的C语言程序
截图202504152334288149.jpg

截图202504152334573376.jpg
深圳国芯人工智能有限公司-工具软件
keil C51/C251 编译器只支持31以内中断号,超过31编译报错。
热心网友提供的简单KEIL中断号拓展工具,可将中断号拓展到254,
在KEIL 未打开的状况下,运行【Keil 中断拓展插件】,将中断号拓展到254。
截图202504152335232945.jpg
使用 AIapp-ISP V6.95M 或以上版本,在KEIL 未打开的状况下
重新添加一次新的头文件
截图202504152335409446.jpg
添加的 新头文件 在这


使用 AIapp-ISP V6.95M 或以上版本中的
AiCube 智能配置工具自动生成强大的初始化程序
截图202504152357067259.jpg

截图202504152343117317.jpg
对应的在 KEIL C251 中的 项目设置,已是最优,不需要修改

截图202504152344489933.jpg
可视图形化I/O口配置工具】本实验暂时不需要配置

截图202504152345513273.jpg
选择用 出厂预置的 40MHz 高速IRC 时钟 跑用户程序
===如在这选择用户程序区用户程序自己去修改频率
===那ISP烧录时的频率会被改为上面的频率

截图202504152347038812.jpg
选择使用【USB外设】;
选择本实验程序 使用【USB-CDC 通信协议】;
也可以选择本实验程序 使用【USB-HID 通信协议】;
其他设置本实验程序暂时用不到,直接点击【创建项目

截图202504152353067986.jpg

项目创建成功后,Keil 自动打开该【项目文件
截图202504152359447762.jpg

截图202504160007401100.jpg
将下面这段程序
USB_SendData(UsbOutBuffer, OutNumber); //用户修改本行程序去达到自己的目的
改成:
if(UsbOutBuffer[0]==6)
        printf_usb("HelloWorld!\r\n"); //如接收到的数据包的第0个字节是6,打印“HelloWorld!"
else if(UsbOutBuffer[0]==7)
        printf_usb("China!\r\n");  //如接收到的数据包的第0个字节是7,打印“China!"
截图202504160015139318.jpg
编译产生的 *.HEX文件在下面目录中
截图202504160019308471.jpg
用 ISP软件 打开该目标文件,
AI8051U实验设备, P3.2按键按下,P3.2为低,
重新上电,点击【下载/编程】按钮, 烧录成功。
单片机/MCU, AI8051U,
自动运行 printf_usb("Hello World !\r\n")程序。
截图202504160021406803.jpg

截图202504160023541766.jpg
如上,点击【打开串口

截图202504160026222721.jpg
程序运行效果如上

具体程序如下
  1. ////////////////////////////////////////
  2. // 文件名称: main.c
  3. // 文件描述:
  4. // 文件版本: V1.0
  5. // 修改记录:
  6. //   1. (2025-04-15) 创建文件
  7. ////////////////////////////////////////
  8. #include "config.h"                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
  9. ////////////////////////////////////////
  10. // 项目主函数
  11. // 入口参数: 无
  12. // 函数返回: 无
  13. ////////////////////////////////////////
  14. void main(void)
  15. {
  16.     SYS_Init();
  17.     while (1)
  18.     {
  19.         USBLIB_OUT_Done();              //查询方式处理USB接收的数据
  20.     }
  21. }
  22. ////////////////////////////////////////
  23. // 系统初始化函数
  24. // 入口参数: 无
  25. // 函数返回: 无
  26. ////////////////////////////////////////
  27. void SYS_Init(void)
  28. {
  29.     EnableAccessXFR();                  //使能访问扩展XFR
  30.     AccessCodeFastest();                //设置最快速度访问程序代码
  31.     AccessIXramFastest();               //设置最快速度访问内部XDATA
  32.     IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
  33.     P0M0 = 0x00; P0M1 = 0x00;           //初始化P0口为准双向口模式
  34.     P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口为准双向口模式
  35.     P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口为准双向口模式
  36.     P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口为准双向口模式
  37.     P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口为准双向口模式
  38.     P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口为准双向口模式
  39.     P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
  40.     P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式
  41.     CLK_Init();                         //时钟模块初始化
  42.     USBLIB_Init();                      //USB库初始化
  43.     EnableGlobalInt();                  //使能全局中断
  44. }
  45. ////////////////////////////////////////
  46. // 毫秒延时函数
  47. // 入口参数: ms (设置延时的毫秒值)
  48. // 函数返回: 无
  49. ////////////////////////////////////////
  50. void delay_ms(uint16_t ms)
  51. {
  52.     uint16_t i;
  53.     do
  54.     {
  55.         i = MAIN_Fosc / 6000;
  56.         while (--i);
  57.     } while (--ms);
  58. }
  59. ////////////////////////////////////////
  60. // 时钟初始化函数
  61. // 入口参数: 无
  62. // 函数返回: 无
  63. ////////////////////////////////////////
  64. void CLK_Init(void)
  65. {
  66.     CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频
  67.     HIRC_40M();                         //选择内部预置的频率
  68.     CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为主时钟
  69.     CLK_MCLK2_BYPASS();                 //旁路MCLK2,直接使用MCLK选择
  70.     CLK_SYSCLK_Divider(1);              //设置系统时钟分频系数
  71.     CLK_HSIOCK_MCLK();                  //选择MCLK主时钟作为高速外设时钟源
  72.     CLK_HSIOCK_Divider(1);              //设置高速外设时钟预分频系数
  73.     CLK_SPICLK_Divider(1);              //设置SPI时钟预分频系数
  74.     CLK_I2SCLK_Divider(1);              //设置I2S时钟预分频系数
  75.     CLK_PWMACLK_Divider(1);             //设置PWMA时钟预分频系数
  76.     CLK_PWMBCLK_Divider(1);             //设置PWMB时钟预分频系数
  77.     CLK_TFPUCLK_Divider(1);             //设置TFPU时钟预分频系数
  78. }
  79. ////////////////////////////////////////
  80. // USB库初始化函数
  81. // 入口参数: 无
  82. // 函数返回: 无
  83. ////////////////////////////////////////
  84. void USBLIB_Init(void)
  85. {
  86.     usb_init();                         //初始化USB模块
  87.     USB_SetIntPriority(0);              //设置中断为最低优先级
  88.     set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
  89. }
  90. ////////////////////////////////////////
  91. // 等待USB配置完成函数
  92. // 入口参数: 无
  93. // 函数返回: 无
  94. ////////////////////////////////////////
  95. void USBLIB_WaitConfiged(void)
  96. {
  97.     while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
  98. }
  99. ////////////////////////////////////////
  100. // USB设备接收数据处理程序
  101. // 入口参数: 无
  102. // 函数返回: 无
  103. // bUsbOutReady:USB设备接收数据标志位
  104. // OutNumber:USB设备接收到的数据长度
  105. // UsbOutBuffer:保存USB设备接收到的数据
  106. ////////////////////////////////////////
  107. void USBLIB_OUT_Done(void)
  108. {
  109.     if (bUsbOutReady) //查询模式固定格式,查询是否有接收到USB主机发送数据
  110.     {
  111.         //USB_SendData(UsbOutBuffer, OutNumber); //用户修改本行程序去达到自己的目的
  112.                           //上句是,将接收到的数据,原路返回, 送回主机,用于测试,可任意修改
  113.                           if(UsbOutBuffer[0]==6)
  114.                                                 printf_usb("HelloWorld!\r\n"); //如接收到的数据包的第0个字节是 6,打印“HelloWorld!"
  115.                                 else if(UsbOutBuffer[0]==7)
  116.                                                 printf_usb("China!\r\n");        //如接收到的数据包的第0个字节是7,打印“China!"
  117.                                 
  118.         usb_OUT_done();  //查询模式固定格式,当前包的数据已处理完成,通知USB主机可以发送下一包数据
  119.     }
  120. }
复制代码

截图202504160046023915.jpg

截图202504160046336643.jpg

printf_usb_query.zip

138.75 KB, 下载次数: 27

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-16 00:35:28 | 显示全部楼层

2025/4/16:
利用 AiCube@AIapp-ISP V6.95M
智能配置开发工具,实现如下的实验:
AiCube 实验三:  中断方式单片机USB中断接收服务函数收到命令后,
                           printf_usb("Hello World !\r\n")或其他
32位8051单片机入门第一个完整的C语言程序
截图202504160812298115.jpg

截图202504160813082326.jpg

截图202504160813461531.jpg

2025/4/16:
利用 AiCube@AIapp-ISP V6.95M
智能配置开发工具,实现如下的实验:
AiCube 实验三:  中断方式单片机USB中断接收服务函数收到命令后,
                           printf_usb("Hello World !\r\n")或其他
32位8051单片机入门第一个完整的C语言程序

截图202504160815438172.jpg

截图202504160816039828.jpg
keil C51/C251 编译器只支持31以内中断号,超过31编译报错。
热心网友提供的简单KEIL中断号拓展工具,可将中断号拓展到254,
在KEIL 未打开的状况下,运行【Keil 中断拓展插件】,将中断号拓展到254。


截图202504160816267894.jpg
使用 AIapp-ISP V6.95M 或以上版本,在KEIL 未打开的状况下
重新添加一次新的头文件

截图202504160816438377.jpg
添加的 新头文件 在这


使用 AIapp-ISP V6.95M 或以上版本中的
AiCube 智能配置工具自动生成强大的初始化程序
截图202504160822119289.jpg

截图202504160824492922.jpg
对应的在 KEIL C251 中的 项目设置,已是最优,不需要修改
截图202504160828543135.jpg
可视图形化I/O口配置工具】本实验暂时不需要配置
截图202504160831513003.jpg
选择用 出厂预置的 40MHz 高速IRC 时钟 跑用户程序
===如在这选择用户程序区用户程序自己去修改频率
===那ISP烧录时的频率会被改为上面的频率
截图202504160832537932.jpg

截图202504160833409183.jpg

截图202504160834175872.jpg

截图202504160835514416.jpg
项目创建成功后,Keil 自动打开该【项目文件
截图202504160837446026.jpg

截图202504160843035087.jpg
将下面这段程序
    USB_SendData(UsbOutBuffer, OutNumber); //将接收的数据,直接送回主机,用于演示测试
改成:
if(UsbOutBuffer[0]==6)
        printf_usb("HelloWorld!\r\n"); //如接收到的数据包的第0个字节是6,打印“HelloWorld!"
else if(UsbOutBuffer[0]==7)
        printf_usb("China!\r\n");  //如接收到的数据包的第0个字节是7,打印“China!"
截图202504160848521447.jpg
编译产生的 *.HEX文件在下面目录中
截图202504160849521666.jpg
用 ISP软件 打开该目标文件,
AI8051U实验设备, P3.2按键按下,P3.2为低,
重新上电,点击【下载/编程】按钮, 烧录成功。
单片机/MCU, AI8051U,
自动运行USB中断程序,跟据接收到的命令,
执行:printf_usb("Hello World !\r\n")程序。
或执行:printf_usb("China !\r\n")程序。
截图202504160852344124.jpg

截图202504160853127689.jpg

截图202504160854345985.jpg
如上,点击【打开串口

截图202504160855233426.jpg
程序运行效果如上

具体程序如下
////////////////////////////////////////
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
//   1. (2025-04-16) 创建文件
////////////////////////////////////////

#include "config.h"                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件

////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    SYS_Init();

    while (1)
    {
    }
}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
    EnableAccessXFR();                  //使能访问扩展XFR
    AccessCodeFastest();                //设置最快速度访问程序代码
    AccessIXramFastest();               //设置最快速度访问内部XDATA
    IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    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口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式

    CLK_Init();                         //时钟模块初始化
    USBLIB_Init();                      //USB库初始化

    EnableGlobalInt();                  //使能全局中断
}

////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
    uint16_t i;

    do
    {
        i = MAIN_Fosc / 6000;
        while (--i);
    } while (--ms);
}


////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
    CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频

    HIRC_40M();                         //选择内部预置的频率

    CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为主时钟
    CLK_MCLK2_BYPASS();                 //旁路MCLK2,直接使用MCLK选择

    CLK_SYSCLK_Divider(1);              //设置系统时钟分频系数

    CLK_HSIOCK_MCLK();                  //选择MCLK主时钟作为高速外设时钟源
    CLK_HSIOCK_Divider(1);              //设置高速外设时钟预分频系数

    CLK_SPICLK_Divider(1);              //设置SPI时钟预分频系数
    CLK_I2SCLK_Divider(1);              //设置I2S时钟预分频系数
    CLK_PWMACLK_Divider(1);             //设置PWMA时钟预分频系数
    CLK_PWMBCLK_Divider(1);             //设置PWMB时钟预分频系数
    CLK_TFPUCLK_Divider(1);             //设置TFPU时钟预分频系数
}

////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
    usb_init();                         //初始化USB模块
    USB_SetIntPriority(3);              //设置中断为最高优先级
    set_usb_OUT_callback(USBLIB_OUT_Callback); //设置USB中断回调函数
    set_usb_ispcmd("@STCISP#");         //设置USB不停电下载命令
}

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
    while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
}

////////////////////////////////////////
// USB设备接收数据中断回调程序
// 入口参数: 无
// 函数返回: 无
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Callback(void)
{
    //USB_SendData(UsbOutBuffer, OutNumber);
          //将接收的数据,直接送回主机,用于演示测试
    //用户请自行将上句,改成用户自己实际需要的用户代码

//下面是用户自己添加的代码取代上面的演示程序

                if(UsbOutBuffer[0]==6)
                                printf_usb("HelloWorld!\r\n"); //如接收到的数据包的第0个字节是 6,打印“HelloWorld!"
                else if(UsbOutBuffer[0]==7)
                                printf_usb("China!\r\n");        //如接收到的数据包的第0个字节是7,打印“China!"
}


printf_usb_INT.zip

138.49 KB, 下载次数: 51

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-3 21:41:32 | 显示全部楼层
截图202504032140393728.jpg


截图202504032141285624.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-3 21:44:51 | 显示全部楼层
Ai8051U-LQFP48RMB2.3
USB 32 80511T 8051,支持328051指令集和88051指令集
比普通32位机强太多的地方:
1  Ai8051UTFPU@120MHz, 算力强, uS硬件三角函数/浮点运算器
2  Ai8051U抗干扰强12ADC全新设计更精准,轨到轨比较器
3  Ai8051U内置专业级复位电路,彻底省外部复位;
4  Ai8051U内部高可靠时钟完全满足串口通信要求,4高速串口
5  Ai8051UQSPIFlash,直送i8080/M6800-TFT接口,视频级刷彩屏,C8T6没有;
6  Ai8051UPWM支持硬件移相@120MHzDMA可以外设直接到外设P2P
7  Ai8051U 34K SRAM64K Flash
8  Ai8051U自带硬件USB1个芯片就能直接USB连接电脑仿真/下载,全球唯一
9  PDIP40LQFP44LQFP48封装,管脚兼容经典的89C52RC12C5A60S2
10,当328051使用,可以用 Keil C251 编译器,双核兼容设计
11,当88051使用,可以用 Keil C51/IAR/SDCC 编译器
Ai8051U-LQFP48USB 32 8051RMB2.3含税

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-3 21:52:21 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-7 13:23:54 | 显示全部楼层
实验一:printf_usb("Hello World !\r\n"),  
              第一个完整的C语言程序
截图202504071327529138.jpg

#include "ai8051u.h"
#include "ai_usb.h"

void main(void)
{
        EAXFR = 1;        //允许访问扩展的特殊寄存器·XFR
        //P_SW2 |= 0x80;
        //允许访问扩展的特殊寄存器·XFR,8位模式请使用这句,注释上一句
        WTST = 0;        //设置取程序代码等待时间,赋值为0表示不等待,程序以最快速度运行
        CKCON = 0;      //设置访问片内的xdata速度,赋值为0表示用最快速度访问,不增加额外的等待时间
      
        usb_init();    //USB初始化
        EA = 1;        //总中断允许位打开

        while(1)
        {
                 printf_usb("Hello World !\r\n");
                 //直接打印输出 “Hello World !” 到主机相应软件的USB【CDC/HID-串口助手】
        }
}





TEST1.uvgui.zip

54.31 KB, 下载次数: 35

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-7 13:24:19 | 显示全部楼层

截图202504161015438115.jpg

截图202504161016143986.jpg

截图202504161016421212.jpg

实验二: 查询方式,查询到电脑命令后,
            printf_usb("Hello World !\r\n")或其他
截图202504071332097500.jpg

#include "ai8051u.h"
#include "ai_usb.h"

void main(void)
{
        EAXFR = 1;        //允许访问扩展的特殊寄存器·XFR
        //P_SW2 |= 0x80;
        //允许访问扩展的特殊寄存器·XFR,8位模式请使用这句,注释上一句
        WTST = 0;                //设置取程序代码等待时间,赋值为0表示不等待,程序以最快速度运行        
        CKCON = 0;        //设置访问片内的xdata速度,赋值为0表示用最快速度访问,不增加额外的等待时间
        
        usb_init();    //USB初始化
        EA = 1;        //总中断允许位打开

        while(1)
        {
                //  printf_usb("Hello World !\r\n");     //直接打印输出 Hello World !

                if(bUsbOutReady)
                {     //查询方式:USB-Device单片机查询是否有接收完成的USB主机送来的数据包
                      //“bUsbOutReady”: 主机发送给 HID/CDC 设备的数据状态标志。
                      //  USB 库中有定义 bUsbOutReady 位变量,
                      //  状态位为1表示,主机发送给 HID/CDC 设备数据已完成,
                      //  设备已成功接收一包数据,等待对数据继续处理。

                      if (UsbOutBuffer[0] == 6)
                             printf_usb("Hello World !\r\n");   //接收到数据6后,打印“HelloWorld!”
                      else if(UsbOutBuffer[0] == 7)
                              printf_usb("China !\r\n");   //接收到数据7后,打印“China!”
                                
                       usb_OUT_done();     //USB 查询方式,Device单片机通知【主机可以发下一个数据包】
                      //当使用査询方式调用 USB 库函数时,数据处理完成后,
                      //必须调用一次“usb_OUT_done();”这样才能接收下一包数据。
                      //如果是使用中断方式调用 USB 库函数,用户程序不需要调用“usb_OUT_done();”
                      //中断方式,USB库函数内部会自动处理。
               }
        }
}



TEST2.zip

48.66 KB, 下载次数: 32

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-7 13:24:47 | 显示全部楼层

截图202504161018137594.jpg

截图202504161018458580.jpg

截图202504161019185428.jpg



实验三: 中断方式,单片机USB中断接收服务函数收到命令后,
                              printf_usb("Hello World !\r\n")或其他


截图202504071337112704.jpg

#include "ai8051u.h"
#include "ai_usb.h"

void USBLIB_OUT_Callback(void)
{
        if (UsbOutBuffer[0] == 6)
        {
                        printf_usb("Hello World !\r\n");
                        //接收到数据6后打印“HelloWorld!”
//                        LED40_ClrBit(0, 0);
//                        LED40_SetPort(0, 0xF0);    //设置P0口输出F0H   
        }
        else if (UsbOutBuffer[0] == 7)
        {
                        printf_usb("China !\r\n");
                        //接收到数据7后打印“China!”
//                        LED40_ClrBit(0, 7);
//                        LED40_SetPort(0, 0x0F);    //设置P0口输出0FH
        }
}
void main(void)
{
        EAXFR = 1;        //允许访问扩展的特殊寄存器·XFR
        //P_SW2 |= 0x80;
        //允许访问扩展的特殊寄存器·XFR,8位模式请使用这句,注释上一句
        WTST = 0;                //设置取程序代码等待时间,赋值为0表示不等待,程序以最快速度运行
        
        CKCON = 0;        //设置访问片内的xdata速度,赋值为0表示用最快速度访问,不增加额外的等待时间
        set_usb_OUT_callback(USBLIB_OUT_Callback); //设置 USB 中断服务程序可以调用的回调函数        


        usb_init();    //USB初始化
        EA = 1;        //总中断允许位打开

        while(1)
        {
//                        printf_usb("Hello World !\r\n");
                        /*        
                        if(bUsbOutReady)        //查询是否有接收到数据
                        {
                                if (UsbOutBuffer[0] == 6)
                                                printf_usb("Hello World !\r\n");
                                                //接收到数据6后打印“HelloWorld!”
                                else if(UsbOutBuffer[0] == 7)
                                                printf_usb("China !\r\n");
                                                //接收到数据7后打印“China!”
                                usb_OUT_done();        //当前包的数据处理完成
                                //查询方式处理USB接收的数据
                                //当前包的数据处理完成

                        }
                        */
        }
}


TEST3.zip

49.35 KB, 下载次数: 24

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-06-15 09:46:00

733

主题

1万

回帖

1万

积分

管理员

积分
16603
发表于 2025-4-9 19:35:57 | 显示全部楼层
有客服反馈

第三个实验发送China,出来的是乱码,已跟陈工反馈。
陈工说单片机收到7后就会发送一串数据,这串数据的
第一个字节"H"对应的ASCII码是 48,  最后一个字节是 F0。
当第二次输出数据时,串口助手将最后一个字节跟
第二次发送的第一个字节拼接起来解码“F0 48”
是中文“餒”的Unicode码,
于是第二次输出的第一个字符就显示“餒”。
所以要在代码中多添加一行: printf_usb("\r\n");

截图202504091934572987.jpg

截图202504091935114537.jpg
已验证并成功解决
截图202504091935542138.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2025-06-14 12:40:19

25

主题

407

回帖

2525

积分

超级版主

积分
2525
发表于 2025-4-10 11:27:57 | 显示全部楼层
更多设置--- 去掉智能处理文本接收窗口中被分割的汉字字符
也可以解决这个问题:
截图202504101125335751.jpg

截图202504101125037964.jpg

电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 04:37 , Processed in 0.231942 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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