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 不要交换次序
}
}
实验一: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库文件的使用方法。希望这个实验能够为后续更复杂的项目开发打下坚实的基础。
[本文内容由国芯人工智能辅助生成,仅供参考] 实验二: 查询方式,查询到电脑命令后,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 库函数内部会自动处理。
}
}
}
实验三: 中断方式,单片机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]