kaily 发表于 2025-9-15 15:33:39

STC8H-实验指导书:实验内容与源代码

                                               STC8H          实验指导书


《STC8H-实验指导书》目前收录了22个大类目的实验:每项实验都经过全流程的验证,实验文档包含但不限于实验介绍、原理图、源代码、实验过程、实验现象。
2 实验2.1 实验一:printf_usb("Hello World !\r\n"),第一个完整的C语言程序2.2 实验二:查询方式,查询到电脑命令后,printfusb(Hello World!\rn")或其他2.3 实验三:中断方式,单片机USB中断接收服务函数收到命令后,printf usb("HelloWorld!\rn")或其他2.4 点灯实验一:点亮LED灯,继续完成前面的工程项目2.5 点灯实验二:让LED灯闪烁起来2.6 点灯实验三:通过USB-CDC方式控制STC8H8K64U进行LED点灯2.7 点灯实验四:使用STC8H8K64U内置USB直接仿真流水灯2.8 I/O口实验 -- I/O口读取按键状态并点灯   2.8.5 实验1 -- 位操作,用USB直接仿真来调试   2.8.6 实验1A -- 使用【AiCube】项目助手实现”位操作,用USB仿真来点灯”   2.8.7 实验2 -- 整组8位端口操作,用USB直接仿真来调试   2.8.8 实验2A -- 使用【AiCube】项目助手实现”整组8位端口操作,用USB仿真来点灯“   2.8.9 实验3 -- 用USB-CDC读取按键状态在串口助手显示并点亮LED灯   2.8.10 实验3A -- 使用【AiCube】项目助手实现”用USB-CDC读取按键状态在串口助手显示并点亮LED灯   2.8.11 实验4 -- 用USB-CDC读取按键状态,在ISP软件的【开天斧/居龙刀-LED-DIP64(6)】 虚拟显示   2.8.12 实验4A -- 使用【AiCube】项目助手实现”用USB-CDC读取按键状态,并在【开天斧/居龙刀-LED-DIP64(6)】 虚拟显示   2.8.13 实验5 -- I/O口行列按键扫描,蜂鸣器发声实战2.9 传统外部中断实验 -- INT0,INT1,INT2,INT3   2.9.1中断实验1(外部中断INTO/P3.2,INT1/P3.3控制点灯并USB仿真)   2.9.2 中断实验2(单片机主动触发外部中断INT2/P3.6,INT3/P3.7控制点灯并USB仿真)2.10 定时器实验 -- 定时器0/1,16位定时器       2.10.1 定时器0/1,16位定时器实验(定时器中断点灯并通过USB-CDC端口输出信息)       2.10.2 使用【AiCube】工具实现:定时器0/1,16位定时器实验(定时器中断点灯并通过USB-CDC端口输出信息       2.10.3 定时器0/1,INTO/INT1,中断组合应用实验,演示程序2.11 大型综合实战 -- 课程设计:时钟+数码管+矩阵按键+蜂鸣器发声2.12 RTC实验       2.12.1RTC实验(拓展学习之使用RTC功能设定闹钟)       2.12.2 使用【AiCube】助手实现RTC实验(测试RTC,使用USB-CDC打印年/月/日/时/分/秒)2.13 串口实验 -- 串口通讯(硬件UART1与电脑收发通讯)2.14 串口实验 -- 串口通讯(硬件UART2与UART3收发通讯)2.15 串口实验 -- 串口通讯(硬件UART2与UART3数据透传)2.16 串口实验 -- 串口1_2_3_4(中断设置标志位,主循环查询),演示实验2.17 串口实验 -- 串口1_2_3_4+定时器0_1_3_4+外部中断INT0_1_2_3(中断设置标志位,主循环查询),演示实验2.18 串口实验 -- 串口通讯(串口通讯,串口绘图,ADC检测按键,ADC热敏电阻测温)2.19 大型综合实战 -- 模拟RTC时钟+数码管+ADC检测按键(查询)2.20 ADC实验 -- 数码管+ NTC热敏电阻+ADC测温(中断方式)2.21 大型综合实战 -- 课程设计:硬件SPI读写串行Flash2.22 SPI实验 -- 硬件SPI驱动OLED显示图片、图形、字符
文档目录中有用【AiCube】助手生成的实验项目:2.8.6   实验1A -- 使用【AiCube】项目助手实现”位操作,用USB仿真来点灯”2.8.8   实验2A -- 使用【AiCube】项目助手实现”整组8位端口操作,用USB仿真来点灯”2.8.10 实验3A -- 使用【AiCube】项目助手实现”用USB-CDC读取按键状态在串口助手显示并点亮LED灯”2.8.12 实验4A -- 使用【AiCube】项目助手实现”用USB-CDC读取按键状态,并在【开天斧/居龙刀-LED-DIP64(6)】 虚拟显示”2.10.2 使用【AiCube】工具实现:定时器0/1,24位定时器实验(定时器中断点灯并通过USB-CDC端口输出信息2.12.2 使用【AiCube】助手实现:RTC实验(测试RTC,使用USB-CDC打印年/月/日/时/分/秒)由于这些实验例程是用当时版本的【AiCube】助手生成,大家可以用现在最新版本的【AiCube】助手按文档中流程操作,这里就不打包这类实验的项目源代码。
现将目录中实验的源代码按《STC8H-实验指导书》目录顺序,分楼陆续上传至本帖,以供大家参考和交流。

kaily 发表于 2025-9-15 15:47:20

2.1          实验一:printf_usb("HelloWorld !\r\n"),第一个完整的C语言程序                  看下面的程序,其实还是那个熟悉的标准C语言的printf(),只是到了单片机C语言中,变成了printf_usb()
2.1.1            printf( ),printf_usb( )实验程序代码#include"stc8h.h"            //头文件不分大小写,但关键字分大小写#include"ai_usb.h"            //USB库和USB虚拟设备的头文件,需要在项目文件中添加对应的USB库                                        //由于在USB库函数的代码中已经定义了,不停电ISP下载命令字”@STCISP#”,                                        //只需要在下载软件的“收到用户命令后复位到ISP监控程序区”选项卡中进行相应的设置,                                        //即可实现USB不停电ISP下载功能,或串口不停电ISP下载功能。
voidmain(void){    P_SW2 |= 0x80;   //允许访问扩展的特殊寄存器,XFR
    usb_init();             //初始化USB模块,并且会将【P3.0, P3.1】初始化为高阻输入,不影响USB【D-, D+】通讯    EA = 1;               //使能总中断
    while (1)    {      printf_usb("Hello World !\r\n");                              //直接打印输出 “HelloWorld !” 到主机相应软件的USB【CDC/HID-串口助手】                              //\r是回车,跳到行首,\n是换行,就是换到下一行;\r\n不要交换次序    }}以上是完整的第一个程序代码

kaily 发表于 2025-9-15 15:58:54

2.2          实验二:查询方式,查询到电脑命令后,printf_usb("Hello World!\r\n")或其他                     看下面的程序,其实还是那个熟悉的标准C语言的printf(),只是到了单片机C语言中,变成了printf_usb()
2.2.1            printf( ),printf_usb( )实验程序代码
#include"stc8h.h"       //头文件不分大小写,但关键字分大小写#include"ai_usb.h"   //USB库和USB虚拟设备的头文件,需要在项目文件中添加对应的USB库                                 //由于在USB库函数的代码中已经定义了,不停电ISP下载命令字”@STCISP#”,                                 //只需要在下载软件的“收到用户命令后复位到ISP监控程序区”选项卡中进行相应的设置,                                 //即可实现USB不停电ISP下载功能,或串口不停电ISP下载功能。void main(void){    P_SW2 |= 0x80;   //允许访问扩展的特殊寄存器,XFR

    usb_init();             //初始化USB模块                              //初始化USB模块,并且会将【P3.0, P3.1】初始化为高阻输入,不影响USB【D-, D+】通讯

    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库函数内部会自动处理。      }    }}




kaily 发表于 2025-9-15 16:15:44

2.3          实验三:中断方式,单片机USB中断接收服务函数收到命令后,
                           printf_usb("HelloWorld !\r\n")或其他                      看下面的程序,其实还是那个熟悉的标准C语言的printf(),只是到了单片机C语言中,变成了printf_usb()
2.3.1            printf( ),printf_usb( )实验程序代码
#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){    P_SW2 |= 0x80;   //允许访问扩展的特殊寄存器,XFR
    usb_init();             //初始化USB模块                              //初始化USB模块,并且会将【P3.0, P3.1】初始化为高阻输入,不影响USB【D-, D+】通讯
    set_usb_OUT_callback(USBLIB_OUT_Callback);//设置USB中断服务程序可以调用的回调函数    //此处 USBLIB_OUT_Callback是前面用户自己编写的任务函数的函数名/地址,供USB库函数回调
    EA = 1;               //使能全局中断
    while (1);}以上是完整的第一个程序代码


kaily 发表于 2025-9-15 16:23:04

2.4         点灯实验一:点亮LED灯,继续完成前面的工程项目

2.4.1         原理介绍                            STC8H8K64U实验箱原理图                           
I/O口P4.0控制PNP三极管的通断,控制这8个灯的整体供电。
如果P4.0输出1,则PNP三极管不导通,这8个灯都不会获得电源,都不会有电流流过,都不会被点亮。如果P4.0输出0,则PNP三极管导通,这8个灯才有可能会流过电流,才有可能会被点亮。如果P4.0输出0,PNP三极管导通,特定LED灯的控制I/O口如输出0,则该LED灯会有电流流过,会被点亮。
如P6.0输出0,LED60灯就会被点亮;如P6.0输出1,LED60灯就会熄灭;如P6.1输出0,LED61灯就会被点亮;如P6.1输出1,LED61灯就会熄灭;如P6.2输出0,LED62灯就会被点亮;如P6.2输出1,LED62灯就会熄灭;如P6.3输出0,LED63灯就会被点亮;如P6.3输出1,LED63灯就会熄灭;如P6.4输出0,LED64灯就会被点亮;如P6.4输出1,LED64灯就会熄灭;如P6.5输出0,LED65灯就会被点亮;如P6.5输出1,LED65灯就会熄灭;如P6.6输出0,LED66灯就会被点亮;如P6.6输出1,LED66灯就会熄灭;如P6.7输出0,LED67灯就会被点亮;如P6.7输出1,LED67灯就会熄灭
如P6口对外全部送0,则这8个灯全亮;如P6口对外全部送1,则这8个灯全灭
如果P4.0输出1,则PNP三极管不导通,不管P6口对外全部送0或送1,这8个灯都不会有电流流过,都不会亮。P4.0控制PNP三极管,作为这8个LED指示灯的总电源开关。

kaily 发表于 2025-9-15 16:34:13

2.5         点灯实验二:让LED灯闪烁起来

2.5.1         原理介绍
                            STC8H8K64U实验箱原理图
                           
I/O口P4.0控制PNP三极管的通断,控制这8个灯的整体供电。
如果P4.0输出1,则PNP三极管不导通,这8个灯都不会获得电源,都不会有电流流过,都不会被点亮。如果P4.0输出0,则PNP三极管导通,这8个灯才有可能会流过电流,才有可能会被点亮。如果P4.0输出0,PNP三极管导通,特定LED灯的控制I/O口如输出0,则该LED灯会有电流流过,会被点亮。
如P6.0输出0,LED60灯就会被点亮;如P6.0输出1,LED60灯就会熄灭;如P6.1输出0,LED61灯就会被点亮;如P6.1输出1,LED61灯就会熄灭;如P6.2输出0,LED62灯就会被点亮;如P6.2输出1,LED62灯就会熄灭;如P6.3输出0,LED63灯就会被点亮;如P6.3输出1,LED63灯就会熄灭;如P6.4输出0,LED64灯就会被点亮;如P6.4输出1,LED64灯就会熄灭;如P6.5输出0,LED65灯就会被点亮;如P6.5输出1,LED65灯就会熄灭;如P6.6输出0,LED66灯就会被点亮;如P6.6输出1,LED66灯就会熄灭;如P6.7输出0,LED67灯就会被点亮;如P6.7输出1,LED67灯就会熄灭
如P6口对外全部送0,则这8个灯全亮;如P6口对外全部送1,则这8个灯全灭
如果P4.0输出1,则PNP三极管不导通,不管P6口对外全部送0或送1,这8个灯都不会有电流流过,都不会亮。
P4.0控制PNP三极管,作为这8个LED指示灯的总电源开关。



kaily 发表于 2025-9-15 16:41:24

2.6      点灯实验三:通过USB-CDC方式控制STC8H8K64U进行LED点灯

2.6.1          原理介绍                        STC8H8K64U实验箱原理图                        
I/O口P4.0控制PNP三极管的通断,控制这8个灯的整体供电。如果P4.0输出1,则PNP三极管不导通,这8个灯都不会获得电源,都不会有电流流过,都不会被点亮。如果P4.0输出0,则PNP三极管导通,这8个灯才有可能会流过电流,才有可能会被点亮。如果P4.0输出0,PNP三极管导通,特定LED灯的控制I/O口如输出0,则该LED灯会有电流流过,会被点亮。
如P6.0输出0,LED60灯就会被点亮;如P6.0输出1,LED60灯就会熄灭;如P6.1输出0,LED61灯就会被点亮;如P6.1输出1,LED61灯就会熄灭;如P6.2输出0,LED62灯就会被点亮;如P6.2输出1,LED62灯就会熄灭;如P6.3输出0,LED63灯就会被点亮;如P6.3输出1,LED63灯就会熄灭;如P6.4输出0,LED64灯就会被点亮;如P6.4输出1,LED64灯就会熄灭;如P6.5输出0,LED65灯就会被点亮;如P6.5输出1,LED65灯就会熄灭;如P6.6输出0,LED66灯就会被点亮;如P6.6输出1,LED66灯就会熄灭;如P6.7输出0,LED67灯就会被点亮;如P6.7输出1,LED67灯就会熄灭
如P6口对外全部送0,则这8个灯全亮;如P6口对外全部送1,则这8个灯全灭
如果P4.0输出1,则PNP三极管不导通,不管P6口对外全部送0或送1,这8个灯都不会有电流流过,都不会亮。P4.0控制PNP三极管,作为这8个LED指示灯的总电源开关。

kaily 发表于 2025-9-15 16:52:12

2.7      点灯实验四:使用STC8H8K64U内置USB直接仿真流水灯

2.7.1         原理介绍                         STC8H8K64U实验箱原理图
                        
I/O口P4.0控制PNP三极管的通断,控制这8个灯的整体供电。如果P4.0输出1,则PNP三极管不导通,这8个灯都不会获得电源,都不会有电流流过,都不会被点亮。如果P4.0输出0,则PNP三极管导通,这8个灯才有可能会流过电流,才有可能会被点亮。
如果P4.0输出0,PNP三极管导通,特定LED灯的控制I/O口如输出0,则该LED灯会有电流流过,会被点亮。如P6.0输出0,LED60灯就会被点亮;如P6.0输出1,LED60灯就会熄灭;如P6.1输出0,LED61灯就会被点亮;如P6.1输出1,LED61灯就会熄灭;如P6.2输出0,LED62灯就会被点亮;如P6.2输出1,LED62灯就会熄灭;如P6.3输出0,LED63灯就会被点亮;如P6.3输出1,LED63灯就会熄灭;如P6.4输出0,LED64灯就会被点亮;如P6.4输出1,LED64灯就会熄灭;如P6.5输出0,LED65灯就会被点亮;如P6.5输出1,LED65灯就会熄灭;如P6.6输出0,LED66灯就会被点亮;如P6.6输出1,LED66灯就会熄灭;如P6.7输出0,LED67灯就会被点亮;如P6.7输出1,LED67灯就会熄灭
如P6口对外全部送0,则这8个灯全亮;如P6口对外全部送1,则这8个灯全灭
如果P4.0输出1,则PNP三极管不导通,不管P6口对外全部送0或送1,这8个灯都不会有电流流过,都不会亮。P4.0控制PNP三极管,作为这8个LED指示灯的总电源开关。
流水灯实验现象:

kaily 发表于 2025-9-15 17:59:41

2.8      I/O口实验-- I/O口读取按键状态并点灯

2.8.1      实验要求                        可以通过正确设置I/O口模式来读取实验箱上按键的电平,然后根据对应按键的电平来设置LED灯的点亮/熄灭状态。
2.8.2      实验建议                        STC8H8K64U系列单片机所有的I/O口均有4种工作模式:                            ü准双向口/弱上拉(标准8051输出口模式)                            ü强推挽输出/强上拉                            ü高阻输入(电流既不能流入也不能流出)                            ü开漏模式(如果打开内部上拉电阻,就相当于准双向口;如果不加上拉并对外置1,就相当于高阻输入)
                            1)高阻输入模式,内部配有6K上拉电阻;                                 为了读取外部状态,需要打开内部的6K上拉电阻。
                            2)开漏模式,内部同样配有6K上拉电阻;                                 打开内部6K上拉电阻后,其功能与准双向口/弱上拉模式相似。
                            3)读取I/O口的外部状态时,可以采用以下三种模式:                                 准双向口/弱上拉模式:                                 ===要确保对外输出锁存为1,关闭对内部对外强输出低的MOS管,                                        才能准确读到外部状态                                 ===如对外输出锁存为0,则外部被内部对外强输出低的MOS管拉低,                                        读到的是低电平,不能准确读到外部来的高输入/被内部拉低了
                                 高阻输入模式,每个 I/O 口都有独立的 6K 上拉电阻:                                 ===为了准确读取外部状态,需要打开内部的 6K 上拉电阻,或外部有上拉能力                                 ===内部的对外输出锁存器对此模式无效,对外无输出高/低的能力                                 ===电流流不进来,也留不出去,                                        高阻输入,无输出能力,不影响外部来的的输入状态
                                 开漏模式,每个 I/O 口都有独立的 6K 上拉电阻:                                        启用内部 6K 上拉电阻后,其功能与准双向口/弱上拉模式相似                                 ===要确保对外输出锁存为1,关闭对内部对外强输出低的MOS管,才能准确读到外部状态                                 ===如对外输出锁存为0,则外部被内部对外强输出低的MOS管拉低,                                        读到的是低电平,不能准确读到外部来的高输入/被内部拉低了
                            4)I/O口对外输出高或低电平时,可以采用以下三种模式:                                 Ø准双向口/弱上拉模式;                                     对外输出低时,相当于强推挽输出低                                 Ø强推挽输出模式;                                 Ø开漏模式;                                     在对外输出低电平时,表现为强推挽输出的低电平状态。                                     在对外输出高电平时,表现为高阻输入状态,此时电流流不进来也流不出去。                                     如果用来控制LED灯,因为无电流流动,所以LED灯不亮。
                            5)P3.2/P3.3/P3.4/P3.5端口均有按键,按下按键可接地,建议:                                 读取这些I/O口的状态,并将结果输出到P6.2/P6.3/P6.4/P6.5对应的指示灯上。
2.8.3         原理图

2.8.3.1            STC8H8K64U实验箱原理图

                                                   

2.8.3.2            认识STC8H8K64U实验箱
                           

2.8.5          实验1:位操作,用USB直接仿真来调试            单独读【P3.2/ P3.3 / P3.4 / P3.5】4个独立I/O的状态,输出到【P6.2 / P6.3 / P6.4 / P6.5】对应的指示灯
2.8.5.1            I/O口设置
                           将不同的I/O口设置为不同的模式,尝试不同情况下依然可以正常输入/输出。打开AiCube-ISP软件:                           Ü配置输出端口的P63、P64为推挽输出,P65为开漏输出(可以输出0点亮LED)                           
                           Ü输入配置                               ØP30、P31为高阻输入(因为跟USB复用,设置为高阻输入,不干扰USB的通讯控制)                               Ø设置P32为准双向口、P33为高阻输入、P34和P35为开漏模式(设置为1等效高阻输入)                               Ø开启P33、P34、P35的内部上拉电阻以稳定电平状态(不开启内部上拉电阻读外部状态,高阻输入/开漏模式,外部都需要有上拉电阻配合)                           

kaily 发表于 2025-9-16 09:20:45

2.8      I/O口实验-- I/O口读取按键状态并点灯

2.8.1      实验要求                        可以通过正确设置I/O口模式来读取实验箱上按键的电平,然后根据对应按键的电平来设置LED灯的点亮/熄灭状态。


2.8.7      实验2:整组8位端口操作,用USB直接仿真来调试
                   整组 读【P3.2/P3.3/P3.4/P3.5】这4个I/O的状态,一次性读全部P3口               整体 输出到【P6.2/P6.3/P6.4/P6.5】在的P6口对应的指示灯


页: [1] 2 3
查看完整版本: STC8H-实验指导书:实验内容与源代码