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

8H8K64U Printf_USB 打卡

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 4 天前 | 显示全部楼层 |阅读模式
实验一:printf_usb("Hello World !\r\n"), 第一个完整的C语言

一、步骤
1、首先新建STC8H8K64U 1文件夹,创建Project工程文件
截图202504271450477361.jpg
给文件起名称“STC8H8K64U”
截图202504271459359241.jpg

选择“STC MCU Database” 和“STC8H8K64U Series”,点击“OK”
截图202504271500166411.jpg

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

双击Source group,选中 “main.c”点击add。
截图202504271507206026.jpg

写入printf_USB程序
截图202504271515498677.jpg


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

截图202504271444038937.jpg

3、解压缩,复制stc_usb_cdc_8h_data_bl51.LlB到STC8H8K64U 1文件夹里
截图202504271445392179.jpg
截图202504271511411241.jpg
在KEIL工程中双击Source group,选中.LIB文件,点击Add。
截图202504271512426588.jpg
截图202504271515109753.jpg

4、在Output上勾选“Create HEX File”
截图202504271527129848.jpg

在Disable Waming Numbers里填16即可让警告显示0。
截图202504271529351181.jpg

点击编译,0错误0警告
截图202504271547254536.jpg


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

三、源代码

#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 不要交换次序
        }
}






热线19952583534
www.STCAI.com
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 4 天前 | 显示全部楼层
实验一: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”文件中编写以下代码:
  1. c
  2. include
  3. include "stcusbcdc8h.h"
  4. void main(void) {
  5.     USBInit();  // 初始化USB
  6.     while (1) {
  7.         printfusb("Hello World !\r\n");  // 通过USB输出字符串
  8.         delayms(1000);  // 延时1秒
  9.     }
  10. }
复制代码

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库文件的使用方法。希望这个实验能够为后续更复杂的项目开发打下坚实的基础。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 4 天前 | 显示全部楼层
实验二: 查询方式,查询到电脑命令后,printf_usb("Hello World !\r\n")或其他


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

1、实验截图
截图202504271723364207.jpg


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


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[0]==6)
    printf_usb("HelloWorld!\r\n");
    //接收到的数据包的第 0 个字节是 6,打印“HelloWorld!”
    else if(UsbOutBuffer[0]==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 库函数内部会自动处理。
  }
}
}





热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 3 天前 | 显示全部楼层
实验三: 中断方式,单片机USB中断接收服务函数收到命令后,
            printf_usb("Hello World !\r\n")或其他

1、实验截图
截图202504280845514681.jpg

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

截图202504280845599564.jpg

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[0] == 6)
          printf_usb("Hello World !\r\n");         //接收到数据 6 后,直接打印输出“Hello World !”到主机相应软件的 USB【CDC/HID-串口助手】  
                                                                                 // \r 是回车,跳到行首,\n 是换行,就是换到下一行;\r\n 不要交换次序
          else if (UsbOutBuffer[0] == 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);
         }

热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 21:03 , Processed in 0.132480 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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