找回密码
 立即注册
楼主: 爱吃西红柿

《STC 32 G单片机视频开发教程打卡》

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-04-18 11:38:43
已绑定手机

47

主题

96

回帖

355

积分

中级会员

积分
355
发表于 2024-7-30 09:59:17 | 显示全部楼层
本帖最后由 爱吃西红柿 于 2024-7-30 10:01 编辑

《第十一节打卡》
中断是指在主程序执行过程中,若中断发生,先处理中断函数,再返回主程序继续执行。定时器中断就是定时产生中断,例如在背书时定时去查看锅里的汤。
定时器具有多个优点,如实现硬件计时、固定时间完成操作、替代长时间的delay以提高CPU运行效率等。同时,定时器实际上是定时器和计数器的统称,本节课主要探讨定时器功能,下节课再讲计数器。
接着,详细讲解了STC32G单片机定时器的使用原理。以使用T0实现1毫秒中断为例,首先要设置其为定时器或计数器,通过在寄存器TMOD中设置相应的CT位来选择,这里将T0CT位写0设置为定时器。其次,在定时器模式下设置不分频或12分频,通过AUXR中的T0X12位控制,默认是12分频。然后,设置定时器的工作模式,在TMOD寄存器中通过T0M1和T0M0位选择,本节课主要设置为16位自动重载模式。此外,使用定时器还需注意TF0中断标志位和TR0启动位,以及总中断允许EA和定时器0中断允许ET0。
在计算定时时间时,需要参考系统时钟、分频设置以及相关公式。可以通过手册中的示例和定时器计算器来确定具体的定时时间。
随后,进行了实际的编程操作。在上节课代码的基础上,插入定时器相关代码。首先设置TMOD为16位自动重载模式,然后计算并设置TL0和TH0的值以实现1毫秒定时,启动定时器TR0,使能定时器中断ET0,并编写定时器中断函数。在移植代码过程中,将数码管刷新等相关功能放入中断函数中,同时注意去除多余的代码和处理按键函数中的问题。通过编译和下载,成功实现了定时器的功能,解决了数码管闪烁的问题。
此外,还介绍了使用ISP软件快速计算定时器参数的方法,选择系统频率、定时器编号、定时时间、工作模式等,软件会生成初始化函数和中断函数,方便快捷。
课堂笔记:
中断概念:主程序执行时,中断发生先处理中断函数,再返回主程序。
定时器作用:硬件计时、固定操作、替代delay提高CPU效率。
STC32G定时器使用:
设置为定时器或计数器:TMOD寄存器中CT位,0为定时器。
定时器模式分频:AUXR中T0X12位,0为12分频。
工作模式:TMOD中T0M1和T0M0位,选择16位自动重载模式。
注意事项:TF0中断标志、TR0启动位、EA和ET0。
定时时间计算:参考系统时钟、分频和公式。
编程操作:
设置TMOD、TL0、TH0、TR0、ET0。
编写定时器中断函数。
移植相关功能代码,处理按键函数。
ISP软件计算定时器参数:选择系统频率、定时器、定时时间、模式等。
Snipaste_2024-07-30_09-59-24.png

Snipaste_2024-07-30_10-01-57.png

Snipaste_2024-07-30_10-02-09.png



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-04-18 11:38:43
已绑定手机

47

主题

96

回帖

355

积分

中级会员

积分
355
发表于 2024-7-30 09:59:24 | 显示全部楼层
本帖最后由 爱吃西红柿 于 2024-7-30 10:33 编辑

《第十二节打卡》
课程首先通过实例引入计数器的概念,如通过在马达背后加装码盘或使用编码器来输出脉冲,从而实现对转动圈数或液体流量等的计算,这些能够输出高低电平变化脉冲的设备都可以使用计数器功能。
接着详细讲解了计数器的配置。以定时器T1为例,将T1CT位写1,设置为计数器模式。T1GATE位写0,使TR1启动后能正常计数。THE和TL1组成16位计数器,达到最大值65535溢出后会将初始值重新写入,实现自动重载。
在实际使用计数器时,参考了手册中的示例代码。将TMOD设置为外部脉冲模式,即0X40,将THE和TL1初始值设为0XFF,启动定时器TR1,使能定时器中断ET1和总中断EA。通过按钮模拟外部脉冲输入,同时注意要打开内部上拉电阻。在编写中断服务函数时,要注意命名规范,避免使用编译器不支持的汉字命名。
随后进行了计数器的应用实践,如参加大学生电子设计竞赛中的直流电机测速题目。分析题目需求,需要数码管显示、内部定时器定时2秒和外部计数器计数脉冲。通过M法测速,即在固定时间内统计编码器脉冲个数来计算速度。
在编程实现过程中,利用上节课的1毫秒定时器,每2000次达到2秒定时。当2秒定时到,读取TH1和TL1的值计算脉冲数,并将计数器清零重新计数,最后在数码管上显示脉冲数值。但在实现过程中也遇到了一些问题,如初始显示错误、按键响应不准确等,通过修改代码解决了这些问题。
课堂笔记:
计数器用途:通过在马达加装码盘或编码器等输出脉冲,计算转动圈数、流量等。
计数器配置:
T1CT位写1,设置为计数器模式。
T1GATE位写0,使TR1启动后正常计数。
THE和TL1组成16位计数器,自动重载。
使用方法:
参考手册示例,设置TMOD、THE、TL1、TR1、ET1、EA等。
按钮模拟脉冲输入,打开内部上拉电阻。
注意中断服务函数命名规范。
应用:直流电机测速,用数码管、定时器和计数器实现。
固定时间统计脉冲个数计算速度。
编程实现2秒定时、读取计算脉冲数、数码管显示。
回顾本次学习,深刻体会到计数器在实际应用中的重要性和灵活性。
在理解计数器的配置和工作原理时,需要对寄存器的位功能和相关设置有清晰的认识,这需要仔细阅读手册和进行实践操作。在编程实现应用时,要根据具体需求合理设计代码结构,处理好定时、计数和显示等功能的协同工作。

Snipaste_2024-07-30_10-24-18.png

Snipaste_2024-07-30_10-24-32.png

Snipaste_2024-07-30_10-24-48.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-04-18 11:38:43
已绑定手机

47

主题

96

回帖

355

积分

中级会员

积分
355
发表于 2024-7-30 10:02:45 | 显示全部楼层
本帖最后由 爱吃西红柿 于 2024-7-30 10:33 编辑

《第十三节打卡》

一、课程回顾与总结
在前 12 节课中,我们接触了单片机的 GPIO 和 TIMER 定时器等功能,通过一系列实验熟悉了程序编写的方法和逻辑,实现了诸如点亮 LED、数码管显示、按键控制等功能。然而,之前的程序编写较为凌乱,缺乏规范性和模块化,这节课正是为了解决这个问题。
二、模块化编程
功能模块划分
将单片机的外设划分为四个主要模块:LED 和数码管、按键、蜂鸣器、定时器/计数器。
每个模块对应一个.c 和.h 文件,便于管理和维护。
函数注释与关键字
为函数添加详细的注释,包括函数名称、功能、入口参数、返回参数、当前版本、作者和修改日期等信息,方便他人理解。
可以自定义关键字,提高编程效率。
修饰符EXTERN的使用
EXTERN用于声明变量或函数是在别处定义的,要在此处引用。
可以在一个.c 文件中声明EXTERN变量,然后在其他.c 文件中通过#include包含对应的.h 文件来引用该变量。
位寻址变量BDATA
可以单独控制变量的每一位,方便对单个引脚进行操作。
三、工程文件编写
创建程序文件的步骤
新建文件并保存。
添加到工程。
添加引用路径。
引脚定义
使用#define对引脚进行定义,便于修改和移植。
函数声明与定义
在.h 文件中进行函数声明,在.c 文件中进行函数定义,并添加函数头注释。
四、各模块的具体实现
LED 和数码管模块
共用 P6 端口,在定时器中断中刷新数码管和 LED 显示。
定义静态变量控制数码管的刷新。
通过位寻址变量单独控制 LED 和数码管的每一位。
按键模块
新建k.c和k.h文件。
定义按键使用的引脚。
实现按键的消抖、按下瞬间检测、松开检测、单机、长按等功能。
通过循环和状态判断来处理按键状态,返回不同的状态值。
蜂鸣器模块
新建beep.c和beep.h文件。
定义蜂鸣器的控制函数,包括打开、关闭和运行函数。
通过计时变量控制蜂鸣器的响鸣时间。
定时器模块
新建time0.c和time0.h文件。
完善定时器的初始化和中断处理函数。
使用静态变量和标志位实现精确的定时控制,避免使用延时函数。
五、学习心得与体会
通过本次课程的学习,深刻认识到模块化编程和规范工程文件编写的重要性。
模块化编程使得代码结构更加清晰,易于维护和扩展。每个模块都具有明确的功能和接口,减少了代码之间的耦合性,提高了代码的复用性。在实际编程中,能够更加专注于每个模块的具体实现,而不必担心对其他部分的影响。
工程文件的编写规范有助于提高团队协作效率,方便他人理解和使用自己编写的代码。同时,合理的引脚定义和函数声明使得代码的修改和移植更加便捷。
然而,在学习过程中也遇到了一些问题和挑战。例如,对于EXTERN修饰符和位寻址变量的使用,需要更加深入地理解其原理和应用场景,避免出现错误。在按键模块的状态判断和处理中,逻辑较为复杂,需要仔细思考和调试,确保按键功能的准确性和稳定性。
在未来的学习和实践中,将继续加强对模块化编程的练习,不断优化代码结构和功能实现。同时,注重代码的规范性和可读性,提高编程水平和效率。
课堂笔记
模块化编程
划分模块:LED 和数码管、按键、蜂鸣器、定时器/计数器。
每个模块对应.c 和.h 文件。
函数注释:名称、功能、入口参数、返回参数、版本、作者、修改日期。
关键字:可自定义,方便编程。
EXTERN修饰符
声明变量或函数在别处定义,此处引用。
示例:在 a.c 中声明EXTERN int v,在 b.h 中声明EXTERN,在 a.c 中#include "b.h"引用。
位寻址变量BDATA
单独控制变量的每一位。
示例:BDATA LED; SBIT LED0 = LED^0;
工程文件编写
新建文件并保存。
添加到工程。
添加引用路径。
引脚定义
#define SEG_PIN P6
函数声明与定义
-.h 文件中声明,.c 文件中定义。
函数头注释:名称、功能、入口参数、返回参数、版本、作者、修改日期。
LED 和数码管模块
共用 P6 端口,定时器中断刷新。
静态变量控制刷新。
位寻址控制位。
按键模块
k.c和k.h文件。
引脚定义:#define KEY_PIN P3。
按键状态:未按下、消抖、单击、单机结束、长按、长按结束、松开。
状态判断通过循环和时间计数。
蜂鸣器模块
beep.c和beep.h文件。
函数:打开(入口参数:时间)、关闭、运行。
运行通过计时变量控制。
定时器模块
time0.c和time0.h文件。
完善初始化和中断处理。
避免使用延时函数,使用静态变量和标志位控制定时。

Snipaste_2024-07-30_10-24-48.png

Snipaste_2024-07-30_10-28-00.png

Snipaste_2024-07-30_10-28-10.png

Snipaste_2024-07-30_10-29-17.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-04-18 11:38:43
已绑定手机

47

主题

96

回帖

355

积分

中级会员

积分
355
发表于 2024-7-30 10:02:51 | 显示全部楼层
本帖最后由 爱吃西红柿 于 2024-7-30 10:34 编辑

《第十四节打卡》
一、矩阵按键介绍
与独立按键对比
独立按键:一个按键占用一个 I/O 口。
矩阵按键:将按键排成行列矩阵形式,可减少 I/O 口占用。
矩阵按键的优势
以较少的 I/O 口控制较多的按键。
例如:8 个 I/O 口可控制 16 个按键。
二、矩阵按键控制原理
按键检测原理
先将部分引脚输出低电平,部分输出高电平。
若有按键按下,高电平引脚会被拉低。
通过改变输出电平的引脚,结合行和列的状态,可判断按下的按键。
三、矩阵按键程序编写
功能函数
定义矩阵按键读取函数,返回按下按键的序号。
函数内通过三步操作判断按键状态:先输出特定电平,延时等待,读取引脚状态并计算。
优化函数
通过静态变量记录上一次按键状态,与当前状态对比,避免重复输出。
密码锁小练
需求:模拟密码锁,包括门锁状态指示(LED0)、数码管显示密码、矩阵按键输入密码、按键提示音(蜂鸣器)、密码判断。
实现:上电初始化门锁关闭、数码管显示“杠”;按键输入时将键值存入数码管显示数组,达到 8 位时判断密码;密码正确点亮 LED0,错误蜂鸣 2 秒;密码错误后数码管清空;增加自动关门、门内手动按钮、数码管省电等功能作为课后作业。
四、学习要点
理解矩阵按键的工作原理。
掌握矩阵按键读取程序的编写,包括状态判断和优化。
学会运用所学知识实现实际应用,如密码锁功能。
Snipaste_2024-07-30_10-30-32.png

Snipaste_2024-07-30_10-30-53.png



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-04-18 11:38:43
已绑定手机

47

主题

96

回帖

355

积分

中级会员

积分
355
发表于 2024-7-30 10:24:11 | 显示全部楼层
本帖最后由 爱吃西红柿 于 2024-7-30 10:34 编辑

《第十五节打卡》
一、中断和中断系统
中断的概念
当 CPU 处理某件事时,外界发生紧急事件,要求 CPU 暂停当前工作去处理紧急事件,处理完再回到中断处继续执行。
例如定时器中断,在主函数运行时产生中断信号,先执行中断函数功能,再返回主函数。
中断系统
实现中断功能的部件称为中断系统。
CPU 总是响应优先级别最高的中断请求。
正在处理低优先级中断时,若有更高优先级中断发生,会暂停低优先级中断去处理高优先级中断。
每个中断源可用软件控制开中断或关中断,中断优先级可软件设置,但部分中断优先级不可设置。
中断源
包括外部中断 0(INT0)、外部中断 1(INT1)等。
不同单片机型号的中断功能可能不同,使用时需对照手册确认。
二、外部中断
外部中断的原理
单片机引脚因外部因素导致电平变化(如高电平变低电平或低电平变高电平),捕获到变化后,单片机内部程序会暂时打断去执行中断,执行完再回到原程序。
不是任意引脚都能作为外部中断引脚,需使用标注有中断功能的特定引脚。
外部中断的用法
以 INT0 为例,通过操作 TCON 寄存器的 IT0 位选择触发方式(上升沿/下降沿或仅下降沿)。
需手动清零 IE0 标志位,防止上电误进中断。
通过 EX0 位控制外部中断 0 的允许与否。
编程实践
新建外部中断相关的.c 和.h 文件。
编写初始化函数,设置 IT0 为下降沿触发、EX0 允许中断、清零 IE0 标志位。
编写中断服务函数,在其中实现具体功能(如 LED 取反)。
与普通按键的区别
普通按键在程序执行过程中可能存在响应延迟,而外部中断能及时打断主函数运行,实现快速响应。
学习心得
通过本次学习,深刻理解了外部中断在单片机中的重要作用和工作原理。
在理解中断系统的优先级和控制机制时,需要清晰地把握各个寄存器位的功能和设置方法,这对于正确配置和使用中断至关重要。在编程实现外部中断时,要注意初始化相关的寄存器和标志位,确保中断的正常触发和响应。

Snipaste_2024-07-30_10-32-28.png

Snipaste_2024-07-30_10-32-39.png

Snipaste_2024-07-30_10-33-27.png

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-9 04:06 , Processed in 0.123357 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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