【实验箱已送】STC32学习打卡
本帖最后由 STCAI-32位8051 于 2023-8-16 11:22 编辑2023/8/9 开始打卡冲哥STC32系列视频
今年智能车负压电磁组选用的芯片就是stc32g12k128这款32位MCU,
算是已经初步接触到了这款芯片,但仍处于刚刚了解的阶段,于是希望在视频学习中再深入了解下
顺带,顺带带走STC32G12K128-实验箱-V9.6{:4_164:}{:4_164:}{:4_164:}
欢迎楼主继续打卡学习,分享学习感受
优秀的打卡贴会优先获赠实验箱包邮
【第一集】心得体会
主要内容:初步认识单片机,了解单片机的一些功能及应用;并解答了一些初学者的常见问题,给出一些学习建议
在本集视频中了解到单片机的定义及基本组成:单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
并了解到单片机几种常见的封装:PCIP、QFN、LQFP等
【第二集】心得体会
主要内容:介绍STC32实验箱-v9.4的硬件外设,并拓展了一些外设的原理、功能及实际应用,最后简要浏览了小STC32的片上资源
static/image/hrline/5.gif
【1】红外发射模块
【2】红外接收 - 红外遥控
【3】电压比较器 - 可以作为一种触发条件,以一个参考电压为基准,输入的电平信号大于它触发/小于它触发
【4】数码管 - 可以显示数字/字母
【5】万能板 - 拓展用,拓展一些芯片,和中间单片机引出的引脚飞线使用。
【6】NTC - 测量温度 (模拟),输出连续的电压信号,需要使用ADC进行模数转换
【7】18B20 - 测量温度(数字),测量准确但无法连续采值,且速度比NTC要慢
【8】ADC按键 - 1个I/O口(有ADC功能)即可读取多个按键,节省IO,按键较多IO口较少时可以采用这一方案
【9】基准电压 - 可能是个可调的稳压,给上面的ADC按键提供参考电压
【10】PWM 模拟DAC-数模转换,生成波形,输出特定电平等
【11】24C02 - 2Kbit的串行EEPROM存储芯片,可以实现掉电存储
【12】矩阵键盘 - 只需要将每行每列接入IO,即可读取对应键值,节省IO资源
【13】独立按键 - 1个I/O读取1个按键
【14】lcd接口 - LCD12864的接口,STC有个软件可以模拟LCD12864(手边没有LCD,可以暂时用软件模拟查看显示效果)
【15】LED指示灯 -指示开发板是否正常供电/运行
【16】USB - 供电/烧录程序
【17】RS232 - 经典接口,现在使用需要USB-232的转接线。
【18】flash扩展 - 存放数据(容量较大)
【19】调试接口 - 连接STC烧录/调试器
【20】蜂鸣器 - 常用于发出提示音
最后简单介绍了一下STC32的片上资源:串口、定时器、DMA等
static/image/hrline/5.gif
课后作业:【举出传感器实际应用的案例】
NTC传感器:测量温度(恒温)
红外接受发射模块:红外遥控(电视空调遥控器)
【第三集】心得体会
主要内容:1、STC-ISP软件的下载 2、STC32手册的下载 3、PDF阅读器的下载 4、搭建C251开发环境(keil) 5、配套例程下载 6、第一个工程的编译和下载
static/image/hrline/2.gif
【1】STC-ISP下载
STC-ISP是STC家专用的烧录程序,不仅阔以烧录程序还集成了很多开发工具:虚拟显示功能、生成范例程序、驱动安装等
可以直接从STC的网站下载:STC-ISP下载传送门:深圳国芯人工智能有限公司-工具软件 (stcai.com)
【2】【3】STC32手册和PDF阅读器在之前就下载使用过了,就不详述了
补充:这里冲哥提供了一个阅读手册的方法:一般手册都是成百上千页的文档,从头到尾翻找效率较低,所以可以借助PDF软件列出的大纲/目录,准确查找到文档中所需的部分
【4】C251环境搭建
下载C251版本的keil安装包,按照手册步骤安装,激活
【5】程序包下载
可以通过STC-ISP里的资料下载板块直接下载STC32配套例程
【6】第一个工程的编译和下载
步骤总结:预先安装stc32g12k128支持包,并从STC-ISP内的Keil仿真板块下载安装STC32的usb下载驱动
用keil打开例程后,在option for Target中选择单片机型号,并勾选编译输出Hex文件选项,点击build编译
连接试验箱并打开STC-ISP烧录软件,打开由keil编译生成的hex文件,调整芯片信号、串口、IRC频率后点击下载即可
本帖最后由 ANop 于 2023-8-10 10:24 编辑
【第四集】 心得体会
主要内容:点亮LED灯
static/image/hrline/4.gif
原理
GPIO可以通过软件读取其输入电平或控制其输出高低电平。
将各部分按照顺序依次连接:GPIO-发光二极管-限流电阻-5v
这是通过控制GPIO输出高低电平即可控制LED亮灭
此种位共阳极开漏输出控制LED,还有一种是共阴极推挽输出控制LED(由于IO负载能力有限,建议使用第一种方式)
程序编写
1、新建Keil工程
新建projects-Target目录下添加.c文件,点击options for target设置芯片型号,并在output板块中勾选输出hex文件这一选项
2、编写程序
**********************************************************
#incude "stc.h"
#include "usb.h"
char *USER_DEVICEDESC = NULL;char *USER_PRODUCTDESC = NULL;char *USER_STCISPCMD = "@STCISP#";/*定义P0、P4、P6特殊功能寄存器*/
sfr P0 = 0x80;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P4 = 0x80;
sfr P4M1 = 0x93;
sfr P4M0 = 0x94;
sfr P6 = 0x80;
sfr P6M1 = 0x93;
sfr P6M0 = 0x94;
/*对单个IO口进行位定义*/
sbit P40 = P4^0;
sbit P60 = P6^0;
void main()
{
/*通过配置PxM0、PxM1,设置GPIO功能模式等*/
P0M0 = 0x00;
P0M1 = 0x00; //0x00:将Px配置为准双向口
P4M0 = 0x00;
P4M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
usb_init();
EA = 1;
while(1)
{
//将4.0、6.0口置0,点亮LED
P40 = 0;
P60 = 0;
}
}
void sys_init() //函数定义
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P3M0=0x00;
P3M1=0x00;
P3M0 &=~0x03;
P3M1 |=0x03;
//设置USB使用的时钟源
IRC48MCR = 0x80; //使能内部48M高速IRC
while (!(IRC48MCR & 0x01));//等待时钟稳定
}
************************************************************
static/image/hrline/4.gif
4、编译生成hex文件使用STC-ISP烧录(USB-CDC/虚拟串口,不停电下载)新建3个变量char *USER_DEVICEDESC = NULL; char *USER_PRODUCTDESC = NULL; char *USER_STCISPCMD = "@STCISP#";并将char* USER_STCISPCMD 的值设为自定义的命令 默认为@STCISP#
在main 函数中 添加usb_init() 初始化函数
打开中断 EA=1;
复制例程中的sys_init()函数到本工程中,并在main函数中调用。
【第五集】心得体会
主要内容:详细讲解了数制、c语言中常用的运算符及数据类型,并演示了c语言中printf的实现
一、printf的实现
主函数中添加
if(DeviceState !=DEVSTATE_CONFIGURED) //判断USB是否连接成功
continue;
if(bUsbOutReady)
{
usb_OUT_done(); //接收应答(固定格式)
printf("室内温度:%.2f\r\n",11.2);
}
二、常见运算符
算术运算符
1、加(+)减(-)乘(*)除(/)
2、模(余)运算符(%):不允许出现浮点型,余数正负取决于被除数正负
3、自增(++i,--i;i++,i--)
位运算符
1、右移(>>)、左移(<<)最低为补0
2、按位与(&)
3、按位或(|)
4、按位异或(^)
5、取反(~)
赋值运算符
1、+= 加赋值(a+=3 等价于 a=a+3)
2、-= 减赋值
3、*= 乘赋值
4、/= 除赋值
5、%= 求余赋值
6、&= 按位与赋值
7、|= 按位或赋值
8、^=按位异或赋值
9、<<=左移位赋值(>>=右移位赋值)
三、基本的数据类型
【第六集】心得体会
主要内容:花式点亮LED灯,在程序编写过程中,学会使用函数,并形成模块编程的思维,提高程序的可读性和可维护性
一、LED闪烁
#include "com/stc.h"
#include "usb.h"
sfr P0 = 0x80;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P4 = 0x80;
sfr P4M1 = 0x93;
sfr P4M0 = 0x94;
sfr P6 = 0x80;
sfr P6M1 = 0x93;
sfr P6M0 = 0x94;
/*对单个IO口进行位定义*/
sbit P40 = P4^0;
sbit P60 = P6^0;
#defineMAIN_Fosc 24000000UL //定义一个IRC系统时钟
void delay_ms(u16 ms)//u16 在stc.h中进行了定义
{
unsigned int i;
do
{
i=MAIN_Fosc/6000; //计算出1ms需要循环段次数
while(--i);
} while(--ms);
}
void main()
{
/*通过配置PxM0、PxM1,设置GPIO功能模式等*/
P0M0 = 0x00;
P0M1 = 0x00; //0x00:将Px配置为准双向口
P4M0 = 0x00;
P4M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
while(1)
{
//将4.0、6.0口置0,点亮LED
P40 = 0;
P60 = 0;
delay_ms(20);
P40 = 1;
P60 = 1;
delay_ms(20);
}
}
第六集(下)
二、函数的使用
在模块化编程里,函数使用分为如下三步:
1:函数定义
返回值 函数名称(入口参数)
{
函数要执行的功能;
return 返回值;(无返回值可不写)
}
@返回值:没有返回值就是 void
@函数名称:避开关键词,不重复,非特殊字符随便取
@入口参数:类型 + 名称,多个参数“,“分开,空就写 void
2.函数声明
返回值函数名称(入口参数);
3.函数调用
函数名称(入口参数):
三、新建文件,使用模块化编程
新建 xxx.c 和 xxx.h 文件,代表一个功能块。
xxx.h 格式:
#ifndef __XXX_H
#define __XXX_H
调用头文件
函数声明...
#endif
xxx.c 格式
#include"xxx.h"
函数定义
【第七集】心得体会
主要内容:学习使用独立按键,并使用按键控制LED灯。
在本节课中介绍了两种按键效果
第一种:按下按键即执行
if(KEY == 0)
{
Delay_ms(10);
if(KEY ==0)
{
执行功能
}
}
第二种:按下按键松手后再执行
if(KEY == 0)
{
Delay_ms(10);
if(KEY ==0)
{
while(KEY==0); //松手检测
执行功能
}
}
由于按键按下/弹起时存在机械抖动,高低电平跳变,可以在程序中添加短暂延时(delay_ms)进行软件消抖
数组的使用:
数组使用分为如下两步:
1.声明及初始化
类型名称[长度]={数值};<--直接定义,也阔以声明后再赋初值
例如:
usigned char x={23,43,41};
2.使用
赋值:名称[索引]= 数值
调用:名称[索引]
索引从0开始
{:4_166:}
【第八集】心得体会
主要内容:认识蜂鸣器,了解控制方法及基本控制电路,并学习编写蜂鸣器控制程序
static/image/hrline/2.gif
1、认识蜂鸣器
分为有源蜂鸣器和无源蜂鸣器,有源蜂鸣器内置震荡源,通电可直接发声,但无源蜂鸣器可通过程序控制音高
2、控制原理/基本电路
控制P54印引脚,高电平蜂鸣器关闭,低电平蜂鸣器开启
#define buzzer P54
if(key == 0)
{
delay_ms(10);
if(key == 0)
{
buzzer = !buzzer//点击按键蜂鸣器开,再点关。
while(key == 0);
}
}
3、冲哥程序复现