wpwksfgi 发表于 2026-2-25 07:10:55

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

新人第一次发帖,还请各位大佬多多指教~~

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

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

在第3集:开发环境的搭建上
https://www.stcaimcu.com/forum.php?mod=image&aid=132302&size=300x300&key=3e4a2514addfa1a5&nocache=yes&type=fixnone
我直接点击这个keil项目工程出现了

这个页面点击“仅此一次”后仍无法正确打开keil软件
tip:我已经下在了C251的keil,自己的电脑上同时安装的有keil C51 和keil ARM,安装在同一目录下
电脑重启后仍无法打开
最后通过一个小办法解决
1.先打开keil 5
2.选择project
3.opean project
4.选择目录

5.回到keil软件
6.点击“魔术棒”中的device选择对应的芯片

这样就应该可以正常使用keil软件了

当然最后也成功编译了


第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中我也去寻找了一下

也没有发现这款芯片

第5集:c语言运算符


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



第6集:LED闪烁


课后练习:

#include <STC32G.H>// STC32G12K128芯片的官方头文件// 引脚定义:LED接P1.0,可根据实际硬件修改#define LED_PIN P1_0// 时间参数定义(单位:ms),可根据需求调整#define SHORT_TIME100// 短亮/短间隔时间#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语言程序设计现代方法》这本书中对数组的讲解






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





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

提供一个无源蜂鸣器的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集:数码管使用

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

两者有一定的差异

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

大家可以参考一下

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


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


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



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

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

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

第14集:矩阵按键

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


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

第15集:外部中断



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


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

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

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

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





芯Skye 发表于 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

https://v.stcai.com/sv/44b59184-197d39b65f2/44b59184-197d39b65f2.mp4
上面是 小李 演示:STC32G12K128, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成

https://v.stcai.com/sv/4912a53-196e6d92db9/4912a53-196e6d92db9.mp4
上面是 姚工 演示:STC32G12K128, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成


wpwksfgi 发表于 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中我也去寻找了一下

也没有发现这款芯片

wpwksfgi 发表于 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_TIME100// 短亮/短间隔时间#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();    }}


经验证编译通过

wpwksfgi 发表于 2026-2-25 09:01:51

第7集:按键点灯


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






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

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

wpwksfgi 发表于 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;// 发声结束后置高电平}


以上是发声函数


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

wpwksfgi 发表于 2026-2-25 09:03:16

第10集:数码管使用

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

两者有一定的差异

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

大家可以参考一下

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


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

wpwksfgi 发表于 2026-2-25 09:03:46

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



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

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

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

wpwksfgi 发表于 2026-2-25 09:04:20

第14集:矩阵按键

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


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

wpwksfgi 发表于 2026-2-25 09:04:49

第15集:外部中断



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


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

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

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

祝大家在学习单片机的路上一路顺利。
页: [1]
查看完整版本: 《32位8051单片机原理及C语言程序设计视频教程》学习中疑问和思考