国学芯用 发表于 2025-4-27 15:42:38

8H8K64U Printf_USB 打卡

实验一:printf_usb("Hello World !\r\n"), 第一个完整的C语言

一、步骤
1、首先新建STC8H8K64U 1文件夹,创建Project工程文件

给文件起名称“STC8H8K64U”


选择“STC MCU Database” 和“STC8H8K64U Series”,点击“OK”


新建空白文件,命名为main.c,点击保存。


双击Source group,选中 “main.c”点击add。


写入printf_USB程序



2、到官网库函数下载USB库文件
https://www.stcai.com/khs



3、解压缩,复制stc_usb_cdc_8h_data_bl51.LlB到STC8H8K64U 1文件夹里


在KEIL工程中双击Source group,选中.LIB文件,点击Add。



4、在Output上勾选“Create HEX File”


在Disable Waming Numbers里填16即可让警告显示0。


点击编译,0错误0警告



二、连接STC8H8K64U实验箱,
      现象:串口一直打印“Hello World!”


三、源代码

#include "stc8h.h"//头文件不分大小写,但关键字分大小写
#include "ai_usb.h" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
//由于在 USB 库函数的代码中已经定义了,不停电 ISP 下载命令字”@STCISP#”,
//只需要在下载软件的“收到用户命令后复位到 ISP 监控程序区”选项卡中进行相应的设置,
//即可实现 USB 不停电 ISP 下载功能,或串口不停电 ISP 下载功能。

void main(void)
{
//      EAXFR=1;         //允许访问扩展的特殊寄存器,XFR
//      WTST = 0;          //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
//      CKCON = 0;      //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
      
      P_SW2 |= 0x80;//使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
      usb_init();                //初始化 USB 模块,并且会将【P3.0, P3.1】初始化为高阻输入,不影响 USB【D-, D+】通讯
      EA=1;                        //使能总中断
      
      while(1)
      {
      printf_usb("Hello World !\r\n"); //直接打印输出 “Hello World !” 到主机相应软件的 USB【CDC/HID-串口助手】
                // \r 是回车,跳到行首,\n 是换行,就是换到下一行;\r\n 不要交换次序
      }
}






国芯人工智能 发表于 2025-4-27 15:43:00

实验一:printfusb("Hello World !\r\n"),第一个完整的C语言程序

1. 创建工程文件

首先,我们需要创建一个新的工程文件。以下是具体步骤:

1. 新建文件夹:在本地磁盘上新建一个文件夹,命名为“STC8H8K64U1”。
2. 创建工程:打开开发环境(如Keil uVision),选择“Project” -> “New uVision Project”,在弹出的对话框中选择刚刚创建的文件夹,并为工程文件命名,例如“HelloWorld”。
3. 选择MCU型号:在接下来的对话框中,选择“STC MCU Database”,然后在系列中选择“STC8H8K64U Series”,点击“OK”完成MCU型号的选择。

2. 添加源文件

1. 新建源文件:在工程中右键点击“Source Group 1”,选择“Add New Item to Group 'Source Group 1'”,在弹出的对话框中选择“C File (.c)”,并命名为“main.c”,然后点击“保存”。
2. 添加源文件到工程:双击“Source Group 1”,在弹出的对话框中选中刚刚创建的“main.c”文件,点击“Add”将其添加到工程中。

3. 编写程序

在“main.c”文件中编写以下代码:

c
include
include "stcusbcdc8h.h"

void main(void) {
    USBInit();// 初始化USB
    while (1) {
      printfusb("Hello World !\r\n");// 通过USB输出字符串
      delayms(1000);// 延时1秒
    }
}

4. 下载并配置USB库文件

1. 下载USB库文件:访问STC官网(https://www.stcai.com/khs),下载适用于STC8H8K64U的USB库文件。
2. 解压缩并复制库文件:将下载的压缩包解压,找到“stcusbcdc8hdatabl51.lib”文件,将其复制到工程文件夹中。
3. 配置库文件路径:在开发环境中,右键点击工程名称,选择“Options for Target 'Target 1'”,在弹出的对话框中选择“C/C++”选项卡,在“Include Paths”中添加库文件的路径。

5. 编译与下载

1. 编译工程:点击“Build”按钮,编译整个工程。确保没有错误和警告。
2. 下载程序到MCU:使用STC-ISP工具将编译生成的HEX文件下载到STC8H8K64U单片机中。

6. 运行与验证

1. 连接USB:将单片机通过USB线连接到电脑。
2. 查看输出:打开串口调试工具(如Tera Term),选择对应的COM端口,设置波特率为115200,查看是否能够接收到“Hello World !”字符串。

总结

通过以上步骤,我们成功地在STC8H8K64U单片机上实现了通过USB输出“Hello World !”字符串的功能。这个实验不仅帮助我们熟悉了STC8H8K64U的基本开发流程,还掌握了USB库文件的使用方法。希望这个实验能够为后续更复杂的项目开发打下坚实的基础。

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

国学芯用 发表于 2025-4-27 17:29:56

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


创建工程文件详情步骤参考实验一

1、实验截图



2、实验效果
点击6按钮,单片机收到 16 进制数6后,回送“Hello World!”给 USB 主机显示。
点击7按钮,单片机收到 16 进制数 7后,回送“China!”给 USB 主机显示。



3、源代码
#include "ai8051u.h" //头文件不分大小写,但关键字分大小写
#include "ai_usb.h"//USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
//由于在 USB 库函数的代码中已经定义了,不停电 ISP 下载命令字”@STCISP#”,
//只需要在下载软件的“收到用户命令后复位到 ISP 监控程序区”选项卡中进行相应的设置,
//即可实现 USB 不停电 ISP 下载功能,或串口不停电 ISP 下载功能。
void main(void)
{
//EAXFR = 1;               //允许访问扩展的特殊寄存器,XFR
//WTST = 0;               //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
//CKCON = 0;               //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
               
    P_SW2 |= 0x80;          //使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
    usb_init();                //初始化 USB 模块
    EA = 1;                        //使能全局中断
      
   while(1)
{
    if(bUsbOutReady)
    {
    //查询方式:USB-Device 单片机查询是否有接收完成的 USB 主机送来的数据包
    //“bUsbOutReady”:主机发送给 HID/CDC 设备的数据状态标志。
    //USB 库中有定义 bUsbOutReady 位变量,查询方式必须调用一次“usb_OUT_done();”
    //状态位为 1 表示,主机发送给 HID/CDC 设备数据已完成,
    //设备已成功接收一包数据,等待对数据继续处理。
    if(UsbOutBuffer==6)
    printf_usb("HelloWorld!\r\n");
    //接收到的数据包的第 0 个字节是 6,打印“HelloWorld!”
    else if(UsbOutBuffer==7)
    printf_usb("China!\r\n");
    //接收到的数据包的第 0 个字节是 7 后,打印“China!”
    usb_OUT_done(); //USB 查询方式,Device 单片机通知【主机可以发下一个数据包】
    //当使用査询方式 if(bUsbOutReady),查询调用 USB 库函数时,在数据处理完成后,
    //必须调用一次“usb_OUT_done();”,这样才能接收下一包数据。
    //如果是使用中断方式调用 USB 库函数,用户程序不需要调用“usb_OUT_done();”
    //中断方式,USB 库函数内部会自动处理。
}
}
}





国学芯用 发表于 2025-4-28 08:49:07

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

1、实验截图


2、实验效果
点击6按钮,单片机收到 16 进制数6后,回送“Hello World!”给 USB 主机显示。
点击7按钮,单片机收到 16 进制数 7后,回送“China!”给 USB 主机显示。



3、源代码
#include "stc8h.h" //头文件不分大小写,但关键字分大小写
#include "ai_usb.h" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
                   //由于在 USB 库函数的代码中已经定义了,不停电 ISP 下载命令字”@STCISP#”,
                   //只需要在下载软件的“收到用户命令后复位到 ISP 监控程序区”选项卡中进行相应的设置,
                  //即可实现 USB 不停电 ISP 下载功能,或串口不停电 ISP 下载功能。
               // USB 接收中断服务程序中,调用用户实际需要执行的服务程序,
               // 简称回调函数,用户根据实际应用场景需求编写
         void USBLIB_OUT_Callback(void)//用户希望 USB 库函数,中断方式回调执行的用户自己编写的任务函数,简称回调函数
      {
          if (UsbOutBuffer == 6)
          printf_usb("Hello World !\r\n");         //接收到数据 6 后,直接打印输出“Hello World !”到主机相应软件的 USB【CDC/HID-串口助手】
                                                                                 // \r 是回车,跳到行首,\n 是换行,就是换到下一行;\r\n 不要交换次序
          else if (UsbOutBuffer == 7)
          printf_usb("China !\r\n"); //接收到数据 7 后,直接打印输出 “China !” 到主机相应软件的 USB【CDC/HID-串口助手】”
      }
               
               
          void main(void)
         {
          //EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
          //WTST = 0; //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
          //CKCON = 0; //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
          P_SW2 |= 0x80;//使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭      
          usb_init(); //初始化 USB 模块
          set_usb_OUT_callback(USBLIB_OUT_Callback); //设置 USB 中断服务程序可以调用的回调函数
                                                    //此处 USBLIB_OUT_Callback 是前面用户自己编写的任务函数的函数名/地址,供 USB 库函数回调
          EA = 1; //使能全局中断
          while (1);
         }

页: [1]
查看完整版本: 8H8K64U Printf_USB 打卡