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

8H8K64U Printf_USB 打卡

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-04-28 08:57:13
已绑定手机

5

主题

22

回帖

724

积分

版主

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

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

打开官方网站:https://www.stcai.com/
点“软件工具—库函数”
截图202504280900332011.jpg

双击 Source Group,找到库文件--STC-CDC库文件中对应的LIB函数进行添加
截图202504280901178819.jpg

编译成功:
截图202504280901377586.jpg

现象:
截图202504280901534371.jpg


回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 3 天前 | 显示全部楼层
实验一:printfusb("Hello World !\r\n"), 第一个完整的C语言程序

源代码分析:
  1. c
  2. include "stc8hh"  //头文件不分大小写,但关键字分大小写
  3. include "aiusbh" //USB 库和 USB 虚拟设备的头文件,需要在项目文件中添加对应的 USB 库
  4. void main(void)
  5. {
  6.     //        EAXFR=1;允许访问扩展的特殊寄存器,XFR
  7.    
  8.     //        WTST = 0;设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
  9.     //        CKCON = 0;设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
  10.     PSW2|=0X80;////使能可以访问扩展的特殊功能寄存器XFR,没有冲突不用关闭
  11.     usbinit();//初始化 USB 模块,并且会将【P30, P31】初始化为高阻输入,不影响 USB【D-, D+】通讯
  12.     EA=1;//使能总中断
  13. }
复制代码

代码解析:

1. 头文件引入:
#include "stc8hh":引入特定型号的单片机头文件,该文件包含了该型号单片机的所有寄存器定义和宏定义。需要注意的是,头文件名称不区分大小写,但C语言中的关键字是区分大小写的。
#include "aiusbh":引入USB库和USB虚拟设备的头文件,该库提供了USB通信的相关功能。在项目中需要确保该库文件已正确添加。

2. 主函数 main:
void main(void):主函数是程序的入口点,返回类型为 void,表示不返回任何值。
   
3. 特殊寄存器访问:
PSW2|=0X80;:通过设置 PSW2 寄存器的最高位(0X80),使能访问扩展的特殊功能寄存器(XFR)。这一操作通常在需要访问单片机扩展功能时使用,确保没有寄存器冲突时无需关闭。

4. USB模块初始化:
usbinit();:初始化USB模块。该函数会将 P30 和 P31 引脚初始化为高阻输入状态,以确保不影响 D- 和 D+ 的USB通信。

5. 总中断使能:
EA=1;:使能总中断。单片机的中断系统在默认情况下是关闭的,通过设置 EA 寄存器为 1,可以打开所有中断源,使单片机能够响应外部或内部的中断事件。

实验目的:

本实验的目的是通过编写一个简单的C语言程序,利用USB接口输出“Hello World !”字符串,从而熟悉单片机的基本编程流程、USB模块的初始化以及中断系统的使用。

实验步骤:

1. 环境搭建:
确保开发环境已正确配置,包括编译器、调试器和相关库文件。
在项目中添加 stc8hh 和 aiusbh 头文件,并确保路径正确。

2. 代码编写:
按照上述代码编写主函数,确保每个步骤的注释清晰,便于理解。

3. 编译与下载:
使用编译器将代码编译为可执行文件,并通过调试器将程序下载到单片机中。

4. 运行与调试:
运行程序,观察USB接口是否成功输出“Hello World !”字符串。
如果输出不正确,检查代码逻辑、硬件连接以及USB模块的配置。

注意事项:
寄存器访问: 在访问特殊功能寄存器时,确保正确设置相关位,避免与其他功能冲突。
USB初始化: USB模块的初始化是关键步骤,确保 P30 和 P31 引脚正确配置为高阻输入,避免影响通信。
中断使能: 在使能总中断前,确保所有相关中断源已正确配置,避免意外中断导致程序异常。

总结:

通过本实验,我们成功实现了一个简单的C语言程序,利用单片机USB接口输出“Hello World !”字符串。该实验不仅帮助我们熟悉了单片机的基本编程流程,还加深了对USB模块和中断系统的理解。在实际开发中,掌握这些基础知识和技能对于后续更复杂的项目开发具有重要意义。

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-04-28 08:57:13
已绑定手机

5

主题

22

回帖

724

积分

版主

积分
724
发表于 3 天前 | 显示全部楼层
实验二: 查询方式,查询到电脑命令后,printf_usb("Hello World !\r\n")或其他
前三个步骤可见实验一,将复制好的stc_usb_cdc_8h_xdata.LIB文件添加到Source Group1中


代码如下:
#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;
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 库函数内部会自动处理。
}
}
}

编译成功:
截图202504280915033524.jpg


现象:
截图202504280916171665.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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