找回密码
 立即注册
查看: 94|回复: 9

《32位8051单片机原理及C语言程序设计视频教程》学习中疑问和思考

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 07:10:55 | 显示全部楼层 |阅读模式
新人第一次发帖,还请各位大佬多多指教~~

按照教学视频一步步学习,希望早日收到实验箱,进一步学习

由于我手上没有STC32G12K128这款芯片所以我大部分是结合STC15芯片进行学习的,在此遇到了不少问题

在第3集:开发环境的搭建上

我直接点击这个keil项目工程出现了
屏幕截图 2026-02-24 180105.png
这个页面点击“仅此一次”后仍无法正确打开keil软件
tip:我已经下在了C251的keil,自己的电脑上同时安装的有keil C51 和keil ARM,安装在同一目录下
电脑重启后仍无法打开
最后通过一个小办法解决
1.先打开keil 5
2.选择project
3.opean project
4.选择目录
屏幕截图 2026-02-24 181610.png
5.回到keil软件
6.点击“魔术棒”中的device选择对应的芯片
屏幕截图 2026-02-24 181836.png
这样就应该可以正常使用keil软件了

当然最后也成功编译了
屏幕截图 2026-02-24 182048.png

第4集:建立工程
由于我的电脑上安装的keil 版本比较多可能会遇到这个问题,大家遇到这个问题可以参考一下我的

屏幕截图 2026-02-24 182523.png
看到我这里是没有STC的芯片的
tip:我已经正确安装了STC的pack包了,虽然当时的我是没有发现的,还是重新安装了一下的
屏幕截图 2026-02-24 182709.png
需要这样去选择STC
屏幕截图 2026-02-24 182854.png
这样子就可以正常的去新建工程了

在点灯过程中
屏幕截图 2026-02-24 183309.png
就遇到到了一些情况
这是我还没有打开main.c文件时出现的
点击main.c文件后编译就变得正常了
屏幕截图 2026-02-24 183611.png
这是和视频中代码完全相同的代码:



#include "stc.h"
#include "usb.h"

#define MAIN_Fosc       24000000L   //¶¨ÒåÖ÷ʱÖÓ

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //ÉèÖÃ×Ô¶¯¸´Î»µ½ISPÇøµÄÓû§½Ó¿ÚÃüÁî

void sys_init()
{
    WTST = 0;  //ÉèÖóÌÐòÖ¸ÁîÑÓʱ²ÎÊý£¬¸³ÖµÎª0¿É½«CPUÖ´ÐÐÖ¸ÁîµÄËÙ¶ÈÉèÖÃΪ×î¿ì
    EAXFR = 1; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
    CKCON = 0; //Ìá¸ß·ÃÎÊXRAMËÙ¶È

    P0M1 = 0x00;   P0M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P1M1 = 0x00;   P1M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P2M1 = 0x00;   P2M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P3M1 = 0x00;   P3M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P4M1 = 0x00;   P4M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P5M1 = 0x00;   P5M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P6M1 = 0x00;   P6M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú

    //====== USB ³õʼ»¯ ======
    P3M0 &= ~0x03;
    P3M1 |= 0x03;
   
    IRC48MCR = 0x80;
    while (!(IRC48MCR & 0x01));
   
    USBCLK = 0x00;
    USBCON = 0x90;
    //========================
}

//========================================================================
// º¯Êý: void delay_ms(u8 ms)
// ÃèÊö: ÑÓʱº¯Êý¡£
// ²ÎÊý: ms,ÒªÑÓʱµÄmsÊý, ÕâÀïÖ»Ö§³Ö1~255ms. ×Ô¶¯ÊÊÓ¦Ö÷ʱÖÓ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2021-3-9
// ±¸×¢:
//========================================================================
void delay_ms(u8 ms)
{
     u16 i;
     do{
          i = MAIN_Fosc / 6000;
          while(--i);   //6T per loop
     }while(--ms);
}

void main()
{
    sys_init();  //ϵͳ³õʼ»¯
    usb_init();  //USB CDC ½Ó¿ÚÅäÖÃ
    EA = 1;
   
    while (1)
    {
        if(DeviceState != DEVSTATE_CONFIGURED)  //µÈ´ýUSBÍê³ÉÅäÖÃ
            continue;
               
        if (bUsbOutReady)
        {
            usb_OUT_done();    //½ÓÊÕÓ¦´ð£¨¹Ì¶¨¸ñʽ£©
            
            printf("OutNumber=0x%X\r\n",OutNumber);  //ʹÓà printf º¯Êý´òÓ¡½ÓÊÕÊý¾Ý³¤¶È

            memcpy(UsbInBuffer, UsbOutBuffer, OutNumber);  //½«½ÓÊÕÊý¾Ý(UsbOutBuffer)£¬¸´ÖƵ½·¢ËÍ»º³åÇø(UsbInBuffer)
            usb_IN(OutNumber);      //ԭ··µ»Ø, ÓÃÓÚ²âÊÔ
        }
    }
}


我看到延时函数就有了其它的想法
能否用STC-ISP的软件去计算延时
屏幕截图 2026-02-24 184028.png
所以进行了尝试
指令集一定要选对
我的图中选择的是正确的
将代码替换原代码,得到一下代码:

#include "stc.h"
#include "usb.h"

#define MAIN_Fosc       24000000L   //¶¨ÒåÖ÷ʱÖÓ

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //ÉèÖÃ×Ô¶¯¸´Î»µ½ISPÇøµÄÓû§½Ó¿ÚÃüÁî

void sys_init()
{
    WTST = 0;  //ÉèÖóÌÐòÖ¸ÁîÑÓʱ²ÎÊý£¬¸³ÖµÎª0¿É½«CPUÖ´ÐÐÖ¸ÁîµÄËÙ¶ÈÉèÖÃΪ×î¿ì
    EAXFR = 1; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
    CKCON = 0; //Ìá¸ß·ÃÎÊXRAMËÙ¶È

    P0M1 = 0x00;   P0M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P1M1 = 0x00;   P1M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P2M1 = 0x00;   P2M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P3M1 = 0x00;   P3M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P4M1 = 0x00;   P4M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P5M1 = 0x00;   P5M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P6M1 = 0x00;   P6M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú

    //====== USB ³õʼ»¯ ======
    P3M0 &= ~0x03;
    P3M1 |= 0x03;
   
    IRC48MCR = 0x80;
    while (!(IRC48MCR & 0x01));
   
    USBCLK = 0x00;
    USBCON = 0x90;
    //========================
}

//========================================================================
// º¯Êý: void delay_ms(u8 ms)
// ÃèÊö: ÑÓʱº¯Êý¡£
// ²ÎÊý: ms,ÒªÑÓʱµÄmsÊý, ÕâÀïÖ»Ö§³Ö1~255ms. ×Ô¶¯ÊÊÓ¦Ö÷ʱÖÓ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2021-3-9
// ±¸×¢:
//========================================================================
void delay_ms(u8 ms)
{
     unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 1657UL;
        while (i) i--;
}

void main()
{
    sys_init();  //ϵͳ³õʼ»¯
    usb_init();  //USB CDC ½Ó¿ÚÅäÖÃ
    EA = 1;
   
    while (1)
    {
        if(DeviceState != DEVSTATE_CONFIGURED)  //µÈ´ýUSBÍê³ÉÅäÖÃ
            continue;
               
        if (bUsbOutReady)
        {
            usb_OUT_done();    //½ÓÊÕÓ¦´ð£¨¹Ì¶¨¸ñʽ£©
            
            printf("OutNumber=0x%X\r\n",OutNumber);  //ʹÓà printf º¯Êý´òÓ¡½ÓÊÕÊý¾Ý³¤¶È

            memcpy(UsbInBuffer, UsbOutBuffer, OutNumber);  //½«½ÓÊÕÊý¾Ý(UsbOutBuffer)£¬¸´ÖƵ½·¢ËÍ»º³åÇø(UsbInBuffer)
            usb_IN(OutNumber);      //ԭ··µ»Ø, ÓÃÓÚ²âÊÔ
        }
    }
}



延时还是正确的,编码顺利通过
屏幕截图 2026-02-24 184307.png
有一个警告但苦于没有硬件,不知道有没有影响,大家可以帮我试一下。



这个Proteus中我也去寻找了一下
屏幕截图 2026-02-24 185320.png
也没有发现这款芯片

第5集:c语言运算符


大体和基本C语言没有区别
屏幕截图 2026-02-24 185445.png


第6集:LED闪烁
屏幕截图 2026-02-24 201024.png

课后练习:

#include <STC32G.H>  // STC32G12K128芯片的官方头文件// 引脚定义:LED接P1.0,可根据实际硬件修改#define LED_PIN P1_0// 时间参数定义(单位:ms),可根据需求调整#define SHORT_TIME  100  // 短亮/短间隔时间#define LONG_TIME   300  // 长亮/组间间隔时间/** * @brief 毫秒级延时函数(STC32G 1T模式,11.0592MHz晶振) * @param ms 延时毫秒数 */void Delay_ms(unsigned int ms) {    unsigned int i, j;    for(i = ms; i > 0; i--)        for(j = 11059; j > 0; j--);  // 适配11.0592MHz晶振的延时校准}/** * @brief LED控制函数 * @param state 0=点亮,1=熄灭 */void LED_Control(unsigned char state) {    LED_PIN = state;  // 假设低电平点亮,高电平熄灭;若相反则改为 LED_PIN = !state}/** * @brief 闪烁一次(亮->灭) * @param on_time 点亮时间(ms),off_time 熄灭时间(ms) */void LED_Flash(unsigned int on_time, unsigned int off_time) {    LED_Control(0);   // 点亮LED    Delay_ms(on_time);    LED_Control(1);   // 熄灭LED    Delay_ms(off_time);}/** * @brief SOS灯光核心逻辑:三短→三长→三短 */void SOS_Flash(void) {    // 第一部分:三短闪(短亮+短间隔)    unsigned char i;    for(i = 0; i < 3; i++) {        LED_Flash(SHORT_TIME, SHORT_TIME);    }    Delay_ms(LONG_TIME - SHORT_TIME);  // 补全组间间隔(抵消最后一次短间隔)    // 第二部分:三长闪(长亮+短间隔)    for(i = 0; i < 3; i++) {        LED_Flash(LONG_TIME, SHORT_TIME);    }    Delay_ms(LONG_TIME - SHORT_TIME);  // 补全组间间隔    // 第三部分:三短闪(短亮+短间隔)    for(i = 0; i < 3; i++) {        LED_Flash(SHORT_TIME, SHORT_TIME);    }    Delay_ms(LONG_TIME);  // 一轮SOS结束后,长间隔再重复}/** * @brief 主函数:初始化+循环执行SOS */void main(void) {    // 初始化:P1.0设为推挽输出模式(STC32G默认准双向,需手动配置)    P1M0 |= 0x01;  // P1.0推挽输出模式(M0=1, M1=0)    P1M1 &= ~0x01;        LED_Control(1);  // 初始状态:熄灭LED    // 主循环:无限重复SOS灯光    while(1) {        SOS_Flash();    }}


经验证编译通过




第7集:按键点灯


其中提到了数组的用法,感觉不太详细,这里引用《c语言程序设计现代方法》这本书中对数组的讲解


屏幕截图 2026-02-24 202151.png

屏幕截图 2026-02-24 202253.png

这里提供完整章节供大家参考学习

ch12.ppt (758 KB, 下载次数: 0)

屏幕截图 2026-02-24 202744.png

视频中使用的应该是有源蜂鸣器

提供一个无源蜂鸣器的c语言函数

void BEEP_Sound(unsigned int time_ms) {    unsigned int t = 0;    unsigned int half_period = 1000 / (2 * BEEP_FREQ);  // 方波半周期(us)        if(time_ms == 0) {        BEEP_PIN = 1;  // 停止发声,置高电平        return;    }        // 生成方波:翻转引脚电平,持续指定时长    while(t < time_ms) {        BEEP_PIN = 0;        Delay_us(half_period);        BEEP_PIN = 1;        Delay_us(half_period);        t += 1;  // 每1ms累加一次    }    BEEP_PIN = 1;  // 发声结束后置高电平}


以上是发声函数


在代码中添加这部分
在通过调用该函数实现无源蜂鸣器的发声,主要是利用单片机输出特定频率的方波实现发声,但比较占用系统资源




第10集:数码管使用

数码管可以 静态使用 和动态使用

两者有一定的差异

这是一张简表简单描述一下两种的区别
屏幕截图 2026-02-24 203634.png
大家可以参考一下

提供张电路图使用74HC245芯片

屏幕截图 2026-02-24 203933.png
该电路图已在实物中得已验证


第11, 12集:定时器,计数器

屏幕截图 2026-02-24 204114.png

定时器,计数器听起来像是两个部件,实际为一个
对内为定时
对外为计数

定时器:是通过对晶振的计数实现定数
计数器:对外部输入的波形实现计数

同过计数可以拓展中断方式,将外部的其中一个中断和计数器组合可以实现拓展多个外部中断源

第14集:矩阵按键

结合下面这张电路图总结一下
屏幕截图 2026-02-24 204820.png

单片机如何判断是哪个按键被按下:通过先横向扫描,再纵向扫描。或是先纵后横。
在中学时学到过笛卡尔平面直角坐标系
知道X,Y坐标就可以锁定唯一的一个点
在这里也是类似的

第15集:外部中断

屏幕截图 2026-02-24 205254.png

我理解的中断就是老师上课时通过举手打断老师讲课,待老师处理完后继续讲课。
不知道我这样的理解是否正确,还望指点。


建议大家学习该芯片时,一定要结合基础硬件,一边看视频一边操作。
不推荐想我一样“纸上谈兵”通过书籍,和模拟软件去猜想。
多多实践。

在其中的理解可能存在偏差,希望大家理性看待,多多指正,谢谢。

感谢STC公司,我学习单片机中,认识的第一家公司,从STC89C52RC开始。

祝大家在学习单片机的路上一路顺利。





屏幕截图 2026-02-24 181107.png
截图202602242011012175.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:70
  • 最近打卡:2026-03-06 11:06:20

24

主题

90

回帖

927

积分

版主

积分
927
发表于 2026-2-25 08:32:44 | 显示全部楼层
要 做到 USB不停电下载
要 尝试 AiCube 图形化自动配置生成程序工具
推荐优先看的:  
printf_usb("Hello World !\r\n")
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html

下载 最新的 AiCube-ISP-V6.96S 或以上版本软件 !

深圳国芯人工智能有限公司-工具软件

下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !


下载 最新的 STC32G12K128 用户手册
https://www.stcaimcu.com/data/download/Datasheet/STC32G.pdf

下载 最新的 STC32G12K128 实验指导书
AiCube 图形化自动配置生成程序工具使用说明
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf


上面是 小李 演示:STC32G12K128, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成


上面是 姚工 演示:STC32G12K128, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 09:00:13 | 显示全部楼层
第4集:建立工程
由于我的电脑上安装的keil 版本比较多可能会遇到这个问题,大家遇到这个问题可以参考一下我的


看到我这里是没有STC的芯片的
tip:我已经正确安装了STC的pack包了,虽然当时的我是没有发现的,还是重新安装了一下的

需要这样去选择STC

这样子就可以正常的去新建工程了

在点灯过程中

就遇到到了一些情况
这是我还没有打开main.c文件时出现的
点击main.c文件后编译就变得正常了

这是和视频中代码完全相同的代码:



#include "stc.h"
#include "usb.h"

#define MAIN_Fosc       24000000L   //¶¨ÒåÖ÷ʱÖÓ

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //ÉèÖÃ×Ô¶¯¸´Î»µ½ISPÇøµÄÓû§½Ó¿ÚÃüÁî

void sys_init()
{
    WTST = 0;  //ÉèÖóÌÐòÖ¸ÁîÑÓʱ²ÎÊý£¬¸³ÖµÎª0¿É½«CPUÖ´ÐÐÖ¸ÁîµÄËÙ¶ÈÉèÖÃΪ×î¿ì
    EAXFR = 1; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
    CKCON = 0; //Ìá¸ß·ÃÎÊXRAMËÙ¶È

    P0M1 = 0x00;   P0M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P1M1 = 0x00;   P1M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P2M1 = 0x00;   P2M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P3M1 = 0x00;   P3M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P4M1 = 0x00;   P4M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P5M1 = 0x00;   P5M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P6M1 = 0x00;   P6M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú

    //====== USB ³õʼ»¯ ======
    P3M0 &= ~0x03;
    P3M1 |= 0x03;
   
    IRC48MCR = 0x80;
    while (!(IRC48MCR & 0x01));
   
    USBCLK = 0x00;
    USBCON = 0x90;
    //========================
}

//========================================================================
// º¯Êý: void delay_ms(u8 ms)
// ÃèÊö: ÑÓʱº¯Êý¡£
// ²ÎÊý: ms,ÒªÑÓʱµÄmsÊý, ÕâÀïÖ»Ö§³Ö1~255ms. ×Ô¶¯ÊÊÓ¦Ö÷ʱÖÓ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2021-3-9
// ±¸×¢:
//========================================================================
void delay_ms(u8 ms)
{
     u16 i;
     do{
          i = MAIN_Fosc / 6000;
          while(--i);   //6T per loop
     }while(--ms);
}

void main()
{
    sys_init();  //ϵͳ³õʼ»¯
    usb_init();  //USB CDC ½Ó¿ÚÅäÖÃ
    EA = 1;
   
    while (1)
    {
        if(DeviceState != DEVSTATE_CONFIGURED)  //µÈ´ýUSBÍê³ÉÅäÖÃ
            continue;
               
        if (bUsbOutReady)
        {
            usb_OUT_done();    //½ÓÊÕÓ¦´ð£¨¹Ì¶¨¸ñʽ£©
            
            printf("OutNumber=0x%X\r\n",OutNumber);  //ʹÓà printf º¯Êý´òÓ¡½ÓÊÕÊý¾Ý³¤¶È

            memcpy(UsbInBuffer, UsbOutBuffer, OutNumber);  //½«½ÓÊÕÊý¾Ý(UsbOutBuffer)£¬¸´ÖƵ½·¢ËÍ»º³åÇø(UsbInBuffer)
            usb_IN(OutNumber);      //ԭ··µ»Ø, ÓÃÓÚ²âÊÔ
        }
    }
}


我看到延时函数就有了其它的想法
能否用STC-ISP的软件去计算延时

所以进行了尝试
指令集一定要选对
我的图中选择的是正确的
将代码替换原代码,得到一下代码:

#include "stc.h"
#include "usb.h"

#define MAIN_Fosc       24000000L   //¶¨ÒåÖ÷ʱÖÓ

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //ÉèÖÃ×Ô¶¯¸´Î»µ½ISPÇøµÄÓû§½Ó¿ÚÃüÁî

void sys_init()
{
    WTST = 0;  //ÉèÖóÌÐòÖ¸ÁîÑÓʱ²ÎÊý£¬¸³ÖµÎª0¿É½«CPUÖ´ÐÐÖ¸ÁîµÄËÙ¶ÈÉèÖÃΪ×î¿ì
    EAXFR = 1; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
    CKCON = 0; //Ìá¸ß·ÃÎÊXRAMËÙ¶È

    P0M1 = 0x00;   P0M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P1M1 = 0x00;   P1M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P2M1 = 0x00;   P2M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P3M1 = 0x00;   P3M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P4M1 = 0x00;   P4M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P5M1 = 0x00;   P5M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P6M1 = 0x00;   P6M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú

    //====== USB ³õʼ»¯ ======
    P3M0 &= ~0x03;
    P3M1 |= 0x03;
   
    IRC48MCR = 0x80;
    while (!(IRC48MCR & 0x01));
   
    USBCLK = 0x00;
    USBCON = 0x90;
    //========================
}

//========================================================================
// º¯Êý: void delay_ms(u8 ms)
// ÃèÊö: ÑÓʱº¯Êý¡£
// ²ÎÊý: ms,ÒªÑÓʱµÄmsÊý, ÕâÀïÖ»Ö§³Ö1~255ms. ×Ô¶¯ÊÊÓ¦Ö÷ʱÖÓ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2021-3-9
// ±¸×¢:
//========================================================================
void delay_ms(u8 ms)
{
     unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 1657UL;
        while (i) i--;
}

void main()
{
    sys_init();  //ϵͳ³õʼ»¯
    usb_init();  //USB CDC ½Ó¿ÚÅäÖÃ
    EA = 1;
   
    while (1)
    {
        if(DeviceState != DEVSTATE_CONFIGURED)  //µÈ´ýUSBÍê³ÉÅäÖÃ
            continue;
               
        if (bUsbOutReady)
        {
            usb_OUT_done();    //½ÓÊÕÓ¦´ð£¨¹Ì¶¨¸ñʽ£©
            
            printf("OutNumber=0x%X\r\n",OutNumber);  //ʹÓà printf º¯Êý´òÓ¡½ÓÊÕÊý¾Ý³¤¶È

            memcpy(UsbInBuffer, UsbOutBuffer, OutNumber);  //½«½ÓÊÕÊý¾Ý(UsbOutBuffer)£¬¸´ÖƵ½·¢ËÍ»º³åÇø(UsbInBuffer)
            usb_IN(OutNumber);      //ԭ··µ»Ø, ÓÃÓÚ²âÊÔ
        }
    }
}



延时还是正确的,编码顺利通过

有一个警告但苦于没有硬件,不知道有没有影响,大家可以帮我试一下。



这个Proteus中我也去寻找了一下

也没有发现这款芯片
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 09:01:10 | 显示全部楼层
第5集:c语言运算符


大体和基本C语言没有区别



第6集:LED闪烁


课后练习:

#include <STC32G.H>  // STC32G12K128芯片的官方头文件// 引脚定义:LED接P1.0,可根据实际硬件修改#define LED_PIN P1_0// 时间参数定义(单位:ms),可根据需求调整#define SHORT_TIME  100  // 短亮/短间隔时间#define LONG_TIME   300  // 长亮/组间间隔时间/** * @brief 毫秒级延时函数(STC32G 1T模式,11.0592MHz晶振) * @param ms 延时毫秒数 */void Delay_ms(unsigned int ms) {    unsigned int i, j;    for(i = ms; i > 0; i--)        for(j = 11059; j > 0; j--);  // 适配11.0592MHz晶振的延时校准}/** * @brief LED控制函数 * @param state 0=点亮,1=熄灭 */void LED_Control(unsigned char state) {    LED_PIN = state;  // 假设低电平点亮,高电平熄灭;若相反则改为 LED_PIN = !state}/** * @brief 闪烁一次(亮->灭) * @param on_time 点亮时间(ms),off_time 熄灭时间(ms) */void LED_Flash(unsigned int on_time, unsigned int off_time) {    LED_Control(0);   // 点亮LED    Delay_ms(on_time);    LED_Control(1);   // 熄灭LED    Delay_ms(off_time);}/** * @brief SOS灯光核心逻辑:三短→三长→三短 */void SOS_Flash(void) {    // 第一部分:三短闪(短亮+短间隔)    unsigned char i;    for(i = 0; i < 3; i++) {        LED_Flash(SHORT_TIME, SHORT_TIME);    }    Delay_ms(LONG_TIME - SHORT_TIME);  // 补全组间间隔(抵消最后一次短间隔)    // 第二部分:三长闪(长亮+短间隔)    for(i = 0; i < 3; i++) {        LED_Flash(LONG_TIME, SHORT_TIME);    }    Delay_ms(LONG_TIME - SHORT_TIME);  // 补全组间间隔    // 第三部分:三短闪(短亮+短间隔)    for(i = 0; i < 3; i++) {        LED_Flash(SHORT_TIME, SHORT_TIME);    }    Delay_ms(LONG_TIME);  // 一轮SOS结束后,长间隔再重复}/** * @brief 主函数:初始化+循环执行SOS */void main(void) {    // 初始化:P1.0设为推挽输出模式(STC32G默认准双向,需手动配置)    P1M0 |= 0x01;  // P1.0推挽输出模式(M0=1, M1=0)    P1M1 &= ~0x01;        LED_Control(1);  // 初始状态:熄灭LED    // 主循环:无限重复SOS灯光    while(1) {        SOS_Flash();    }}


经验证编译通过
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 09:01:51 | 显示全部楼层
第7集:按键点灯


其中提到了数组的用法,感觉不太详细,这里引用《c语言程序设计现代方法》这本书中对数组的讲解






这里提供完整章节供大家参考学习

ch12.ppt (758 KB, 下载次数: 0)
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 09:02:42 | 显示全部楼层
第8集:蜂鸣器



视频中使用的应该是有源蜂鸣器

提供一个无源蜂鸣器的c语言函数

void BEEP_Sound(unsigned int time_ms) {    unsigned int t = 0;    unsigned int half_period = 1000 / (2 * BEEP_FREQ);  // 方波半周期(us)        if(time_ms == 0) {        BEEP_PIN = 1;  // 停止发声,置高电平        return;    }        // 生成方波:翻转引脚电平,持续指定时长    while(t < time_ms) {        BEEP_PIN = 0;        Delay_us(half_period);        BEEP_PIN = 1;        Delay_us(half_period);        t += 1;  // 每1ms累加一次    }    BEEP_PIN = 1;  // 发声结束后置高电平}


以上是发声函数


在代码中添加这部分
在通过调用该函数实现无源蜂鸣器的发声,主要是利用单片机输出特定频率的方波实现发声,但比较占用系统资源

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 09:03:16 | 显示全部楼层
第10集:数码管使用

数码管可以 静态使用 和动态使用

两者有一定的差异

这是一张简表简单描述一下两种的区别

大家可以参考一下

提供张电路图使用74HC245芯片


该电路图已在实物中得已验证
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 09:03:46 | 显示全部楼层
第11, 12集:定时器,计数器



定时器,计数器听起来像是两个部件,实际为一个
对内为定时
对外为计数

定时器:是通过对晶振的计数实现定数
计数器:对外部输入的波形实现计数

同过计数可以拓展中断方式,将外部的其中一个中断和计数器组合可以实现拓展多个外部中断源
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 09:04:20 | 显示全部楼层
第14集:矩阵按键

结合下面这张电路图总结一下


单片机如何判断是哪个按键被按下:通过先横向扫描,再纵向扫描。或是先纵后横。
在中学时学到过笛卡尔平面直角坐标系
知道X,Y坐标就可以锁定唯一的一个点
在这里也是类似的
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-02-25 09:00:13
已绑定手机

1

主题

8

回帖

23

积分

新手上路

积分
23
发表于 2026-2-25 09:04:49 | 显示全部楼层
第15集:外部中断



我理解的中断就是老师上课时通过举手打断老师讲课,待老师处理完后继续讲课。
不知道我这样的理解是否正确,还望指点。


建议大家学习该芯片时,一定要结合基础硬件,一边看视频一边操作。
不推荐想我一样“纸上谈兵”通过书籍,和模拟软件去猜想。
多多实践。

在其中的理解可能存在偏差,希望大家理性看待,多多指正,谢谢。

感谢STC公司,我学习单片机中,认识的第一家公司,从STC89C52RC开始。

祝大家在学习单片机的路上一路顺利。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 15:32 , Processed in 0.124683 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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