找回密码
 立即注册
查看: 56|回复: 2

8H8K64U Printf_USB 打卡

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-27 09:44:17

25

主题

252

回帖

2089

积分

超级版主

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

1、官网中  USB库文件下载:https://www.stcai.com/khs
截图202504271306449284.jpg

下载后解压文件,
2、新建keil C51 工程文件
截图202504271352171629.jpg

3、添加USB库文件 :   解压文件中 找到 并 复制库函数文件到你的项目文件夹中。双击 Source Group 1,找到库文件:stc_usb_cdc_8h_data_bl51.LIB进行添加:
截图202504271354493758.jpg

截图202504271355217669.jpg


4、参考数据手册 学习手敲代码,保存 .c 格式文件,双击 添加到”Source Group 1”中 。编译。
截图202504271412274553.jpg

代码:



#include "stc8h.h"  //头文件不分大小写,但关键字分大小写
#include "ai_usb.h" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库

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

5、下载程序文件
截图202504271411341531.jpg

6、实验现象
截图202504271410453930.jpg

7、测试文件 STC8H8K64U Printf_USB.zip (96.66 KB, 下载次数: 0)
QQ:3398500488
微信号:18106296592(小刘)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-27 09:44:17

25

主题

252

回帖

2089

积分

超级版主

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

程序代码:

#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 模块
    EA = 1; //使能全局中断
while(1)
{
     if(bUsbOutReady)
   {
//查询方式:USB-Device 单片机查询是否有接收完成的 USB 主机送来的数据包
//“bUsbOutReady”:主机发送给 HID/CDC 设备的数据状态标志。
//USB 库中有定义 bUsbOutReady 位变量,查询方式必须调用一次“usb_OUT_done();”
//状态位为 1 表示,主机发送给 HID/CDC 设备数据已完成,
//设备已成功接收一包数据,等待对数据继续处理。
    if(UsbOutBuffer[0]==7)
    printf_usb("HelloWorld!\r\n");    //接收到的数据包的第 0 个字节是 7,打印“HelloWorld!”
    else if(UsbOutBuffer[0]==8)
    printf_usb("China!\r\n");          //接收到的数据包的第 0 个字节是 8 后,打印“China!”
    usb_OUT_done(); //USB 查询方式,Device 单片机通知【主机可以发下一个数据包】
//当使用査询方式 if(bUsbOutReady),查询调用 USB 库函数时,在数据处理完成后,
//必须调用一次“usb_OUT_done();”,这样才能接收下一包数据。
//如果是使用中断方式调用 USB 库函数,用户程序不需要调用“usb_OUT_done();”
//中断方式,USB 库函数内部会自动处理。
    }
}
}


编译
截图202504281417445726.jpg

实验现象
截图202504281417207146.jpg

QQ:3398500488
微信号:18106296592(小刘)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-04-27 09:44:17

25

主题

252

回帖

2089

积分

超级版主

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

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


编译:
截图202504281451079977.jpg


实验现象:
截图202504281452195573.jpg

QQ:3398500488
微信号:18106296592(小刘)
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 22:08 , Processed in 0.117574 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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