《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开始。
祝大家在学习单片机的路上一路顺利。
要 做到 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之图形化程序自动生成
第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语言程序设计现代方法》这本书中对数组的讲解
这里提供完整章节供大家参考学习
ch12.ppt (758 KB, 下载次数: 0)
第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;// 发声结束后置高电平}
以上是发声函数
在代码中添加这部分
在通过调用该函数实现无源蜂鸣器的发声,主要是利用单片机输出特定频率的方波实现发声,但比较占用系统资源
第10集:数码管使用
数码管可以 静态使用 和动态使用
两者有一定的差异
这是一张简表简单描述一下两种的区别
大家可以参考一下
提供张电路图使用74HC245芯片
该电路图已在实物中得已验证
第11, 12集:定时器,计数器
定时器,计数器听起来像是两个部件,实际为一个
对内为定时
对外为计数
定时器:是通过对晶振的计数实现定数
计数器:对外部输入的波形实现计数
同过计数可以拓展中断方式,将外部的其中一个中断和计数器组合可以实现拓展多个外部中断源
第14集:矩阵按键
结合下面这张电路图总结一下
单片机如何判断是哪个按键被按下:通过先横向扫描,再纵向扫描。或是先纵后横。
在中学时学到过笛卡尔平面直角坐标系
知道X,Y坐标就可以锁定唯一的一个点
在这里也是类似的 第15集:外部中断
我理解的中断就是老师上课时通过举手打断老师讲课,待老师处理完后继续讲课。
不知道我这样的理解是否正确,还望指点。
建议大家学习该芯片时,一定要结合基础硬件,一边看视频一边操作。
不推荐想我一样“纸上谈兵”通过书籍,和模拟软件去猜想。
多多实践。
在其中的理解可能存在偏差,希望大家理性看待,多多指正,谢谢。
感谢STC公司,我学习单片机中,认识的第一家公司,从STC89C52RC开始。
祝大家在学习单片机的路上一路顺利。
页:
[1]