- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2026-02-25 09:00:13
已绑定手机
新手上路
- 积分
- 23
|
新人第一次发帖,还请各位大佬多多指教~~
按照教学视频一步步学习,希望早日收到实验箱,进一步学习
由于我手上没有STC32G12K128这款芯片所以我大部分是结合STC15芯片进行学习的,在此遇到了不少问题
在第3集:开发环境的搭建上

我直接点击这个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_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语言程序设计现代方法》这本书中对数组的讲解
这里提供完整章节供大家参考学习
ch12.ppt
(758 KB, 下载次数: 0)
视频中使用的应该是有源蜂鸣器
提供一个无源蜂鸣器的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开始。
祝大家在学习单片机的路上一路顺利。
|
-
-
|