冲哥STC32G单片机学习笔记
第一课:认识单片机
1.什么是单片机
具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM,多种I/O和中断系统、定时器/计数器等功能
2.单片机功能
基本就是一个功能减小的计算机,能写入用户程序,读取输入引脚的电压信号,能在引脚上输出特定的电平信号,能在特定引脚上输出电压信 号,能计算时间,能计数,做数学运算,逻辑运算、能顺序动作,能通信等功能
3.为什么选这款芯片
[*]最新
[*]功能全
[*]价格还行
楼主可继续打卡学习
发表更详细的上课感受
可获赠实验箱+包邮
https://www.stcaimcu.com/data/attachment/forum/202309/01/115316i6lvnrf0gcr7nfrg.png
第二课:了解硬件
这一课冲哥主要讲解了本系列课程所用到的开发板
外设很多,红外发送、接收,数码管,NTC,18B20,24C02,矩阵键盘,LCD,232,FLASH等。
基本I\O,ADC,DCA,PWM,I2C,SPI都有涉及,这下终于有个完整的视频可以对着文档走了。
之前看文档看的晕晕乎乎的,设这个寄存器那个寄存器的,头都大了。期待能入门学好单片机
第三课:开发环境搭建和程序下载
1. STC-ISP软件下载
这个软件是STC单片机必须的软件,下载地址:https://stcai.com/gjrj,下载完整版
2. STC32手册下载
手册里面有详细软件安装,添加项目和头文件图文步骤。
下载地址:https://www.stcai.com/filedownload/729692
3. PDF阅读器下载
4. C251环境搭建,是C251,不是C51,直接看手册安装
地址:https://www.keil.com/download/product/
5. 软件包下载地址
大概步骤:
1. 下载STC-ISP
2. 下载C251
3. 添加型号和头文件
4, 打开实验箱程序,运行编译
5. 烧录程序
实验箱 9.6 使用硬件 USB 接口下载。进入 USB 下载模式需要先按住实验箱上的 P3.2/INT0 按 键/接地,然后按一下 ON/OFF 电源按键/断电,接着松开 ON/OFF 电源按键/上电,最后可松开 P3.2/INT0 按键。正常情况下就能识别出“STC USB Writer (HID1)”设备。
详见:实验箱使用说明,https://www.stcai.com/filedownload/689637
本帖最后由 noonezero 于 2023-9-9 17:30 编辑
第四课:建立工程点亮第一颗LED
------------------------------------------------------------
补充说明,
USB自动下载头文件引入和视频中不一样了,具体可以见程序包中 76示例
具体可以看我附件程序,正常点灯,以后不用新建工程,直接复制一份用就可以
------------------------------------------------------------
1.新建工程注意事项
[*]新建以后要手动添加.c文件,加入项目
[*]勾选创建.hex文件,编码对应一致
[*]
2. 下载程序注意事项
[*]时钟频率暂时先选24M
[*]和第三课一样,记得识别出“STC USB Writer (HID1)”设备
3.I/O口模式设置
STC32G系列单片机所有I/O口均有四种工作模式,准双向口/弱上拉(旧C51只有这种模式),推挽输出/强上拉,高阻输入(电流既不能流入也不能流出),开漏输出。
根据寄存器控制引脚模式,下图代码中,就是准双向口
PnM1.x PnM0.x Pn.x口工作模式
0 0 准双向口
0 1 推挽输出
1 0 高阻输入
1 1 开漏输出
4. 点灯
[*]电路图
首先一个NPN三极管开关,低电压三极管导通,所以P4^0设置为0低电压
P6^0为二极管负极,需要设置为0
[*]代码:按电路图无需设置P0端口,可以正常点灯
// 设置P4端口以及端口模式配置寄存器
sfr P4 = 0xC0;
sfr P4M0 = 0xB4;
sfr P4M1 = 0xB3;
// 设置P6端口以及端口模式配置寄存器
sfr P6 = 0xE8;
sfr P6M0 = 0xCC;
sfr P6M1 = 0xCB;
// 设置P40 为P4组中第0位
sbit P40 = P4^0;
// 设置P60 为P6组中第0位
sbit P60 = P6^0;
void main()
{
// 设置P4为准双向口
P4M0 = 0x00;
P4M1 = 0x00;
// 设置P6为准双向口
P6M0 = 0x00;
P6M1 = 0x00;
// 第0位都设置低电平
P40 = 0;
P60 = 0;
while(1){
;
}
}
5. USB自动下崽(不是错别字)
大概写以下,具体需要看STC32G说明 5.14.2章节,具体页码185
[*]STC-ISP软件要最新版
[*]选择正确的单片机信号,32G的话看是
[*]打开“收到用户命令后复位到ISP监控程序区”选项页
[*]选择“USB(HID)模式”,并设置USB设备的VID和PID,STC范例中的VID为“34BF”,PID为“FF01”
[*]选择HEX模式或者文本模式
[*]自定义下载命令需要和代码中的自定义命令相一致
[*]选择好后STC-ISP下载软件便会自动发送复位命令,自动开始USB模式的ISP下载
[*]需要添加对应的代码库“stc_usb_hid.lib”到项目中,并设置自定义下载命令
**具体可以看演示程序76,平时用的时候直接复制一份,不用多次配置
6. CDC自动下载,以后补充
最后作业,点亮全部灯
P60 = 0; 改成 P6 = 0x00;应该就可以了
本帖最后由 noonezero 于 2023-9-5 17:45 编辑
第五课:C语言运算符和进制数入门
这节课主要讲了模拟串口输出,这个功能挺好,有问题可以直接调试输出,更方便查看对应变量的值。
剩下的就是C语言的基础知识,包括ASSI码表和格式化字符串,运算符,以及取值范围
还有进制之间的转换以下是补充的对应各种表,方便查看。
*取值范围,double应该是比float还大的,冲哥应该是写错了
也明白了,串口输出的hex数值与文本的对应关系
1. 实现模拟串口输出
if(DeviceState != DEVSTATE_CONFIGURED){
continue;
}
if(bUsbOutReady){
usb_OUT_done(); // 接收应答固定格式
}
常规用法:
printf("来了,老弟!");
printf("室内温度:%.2f\r\n", 11.2);
2. ASSI码表和格式化字符串
二进制十进制十六进制字符/缩写解释
00000000000NUL (NULL)空字符
00000001101SOH (Start Of Headling)标题开始
00000010202STX (Start Of Text)正文开始
00000011303ETX (End Of Text)正文结束
00000100404EOT (End Of Transmission)传输结束
00000101505ENQ (Enquiry)请求
00000110606ACK (Acknowledge)回应/响应/收到通知
00000111707BEL (Bell)响铃
00001000808BS (Backspace)退格
00001001909HT (Horizontal Tab)水平制表符
00001010100ALF/NL(Line Feed/New Line)换行键
00001011110BVT (Vertical Tab)垂直制表符
00001100120CFF/NP (Form Feed/New Page)换页键
00001101130DCR (Carriage Return)回车键
00001110140ESO (Shift Out)不用切换
00001111150FSI (Shift In)启用切换
000100001610DLE (Data Link Escape)数据链路转义
000100011711DC1/XON
(Device Control 1/Transmission On)设备控制1/传输开始
000100101812DC2 (Device Control 2)设备控制2
000100111913DC3/XOFF
(Device Control 3/Transmission Off)设备控制3/传输中断
000101002014DC4 (Device Control 4)设备控制4
000101012115NAK (Negative Acknowledge)无响应/非正常响应/拒绝接收
000101102216SYN (Synchronous Idle)同步空闲
000101112317ETB (End of Transmission Block)传输块结束/块传输终止
000110002418CAN (Cancel)取消
000110012519EM (End of Medium)已到介质末端/介质存储已满/介质中断
00011010261ASUB (Substitute)替补/替换
00011011271BESC (Escape)逃离/取消
00011100281CFS (File Separator)文件分割符
00011101291DGS (Group Separator)组分隔符/分组符
00011110301ERS (Record Separator)记录分离符
00011111311FUS (Unit Separator)单元分隔符
001000003220(Space)空格
001000013321!
001000103422"
001000113523#
001001003624$
001001013725%
001001103826&
001001113927'
001010004028(
001010014129)
00101010422A*
00101011432B+
00101100442C,
00101101452D-
00101110462E.
00101111472F/
0011000048300
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C\
01011101935D
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C|
011111011257D}
011111101267E~
011111111277FDEL (Delete)删除
[*]格式化字符
type 说明
%d, %i 以十进制输出一个整数
%o, %O 分别用大小写以八进制输出一个整数
%x, %X 分别用大小写以十六进制输出一个整数
%f 输出一个浮点数(单精度)
%c 输出一个字符
%s 输出一个字符串
%e 以科学计数法输出一个浮点数(双精度)
%g 自动选择合适的表示法输出(会自动去掉多余的零)
%u 输出一个无符号整数
%p 打印地址
%%, %” 打印百分号或引号
3. 进制转换
二进制 十进制 十六进制
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
4. 二进制的运算
加减乘除,取余等算术运算符,还有位与,位或,取反,以及位左移右移
5. C语言的取值范围
数据类型 Bits bytes value range
bit 1 0 / 1
char 8 1 -128 - 127
unsigned char 8 1 0 - 255
enum 8 / 16 1 / 2-128 - 127 / -32768 - 32767
short int 16 2 -32768 - 32767
unsigned short int 16 2 0 - 65535
int 16 2 -32768 - 32767
unsigned int 16 2 0 - 65535
long int 32 4 -2147483648 - 2147483647
unsigned long int 32 4 0 - 4294967295
float 32 4 -3.4*10^38~+3.4*10^38
double 64 8 -1.7*10^-308 - 1.7*10^308
sbit 1 0 / 1
sfr 8 1 0 - 255
sfr16 16 2 0 - 65535
第六课:LED闪烁和花式点灯
这节课主要讲了 delay() 函数的用法,借此引出如何自己编写函数
有了函数,就开始模块化编程,把同类型功能函数放在一起,单独新建一个 .c .h文件,哪个工程要用可以单独引入
1.while 和 do...while 的区别
2. 函数使用
[*]函数定义
返回值 函数名称( 形参 )
{
函数要执行的功能;
}
@返回值:没有返回值就是void
@函数名称:要避开关键字,不重复,非特殊字符
@形参:类型+名称,多个参数用 “,”分开
[*]函数声明
返回值 函数名称 ( 形参 );
[*]函数调用
函数名称( 实参 );
3. 模块化编程
xxoo.h文件格式
// 这里定义 __XXOO_H 是为了防止交叉引用,以及定义了这个,说明文件已经引用,无需再次引入
#ifndef __XXOO_H
#define __XXOO_H
调用头文件
函数声明
#endif
xxoo.c文件格式
#include "xxoo.h"
函数定义
**添加文件一定要记得引用路径添加到工程里
本帖最后由 noonezero 于 2023-9-9 21:24 编辑
第七课:按键点灯
这节课主要讲解了按键控制灯做不同状态,以下代码加自己理解实现,等板子回来在做验证
#include <STC32G.H>
#include <intrins.h>
#include "COMM/stc32_stc8_usb.h"
void sys_init();
//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
#define KEY1 P32
#define KEY2 P33
void Delay_ms(int x) //@24.000MHz
{
unsigned long edata i;
for(; x > 0; x--)
{
_nop_();
_nop_();
_nop_();
i = 5998UL;
while (i) i--;
}
}
void main()
{
u8 ledtype = 0x01;
P40 = 0;
sys_init();
usb_init();//USB初始化
EA = 1;
while(1){
/* 按键点亮熄灭*/
// 按键按下LED点亮,松开熄灭
// if(KEY1 == 0)
// {
// Delay_ms(10);// 软件消抖
// if(KEY1 == 0)
// {
// P6 = 0x00;
// }
// }
// else{
// P6 = 0xFF;
// }
// 按键按下LED熄灭,松开点亮
// if(KEY2 == 0)
// {
// Delay_ms(10);// 软件消抖
// if(KEY2 == 0)
// {
// P6 = 0xFF;
// }
// }
// else{
// P6 = 0x00;
// }
/* 按键按下一次,LED状态改变一次*/
// if(KEY1 == 0)
// {
// Delay_ms(10);// 软件消抖
// if(KEY1 == 0)
// {
// P6 = ~P6;
// }
// }
/* 按键按下一次,LED左移*/
if(KEY2 == 0)
{
Delay_ms(10);// 软件消抖
if(KEY2 == 0)
{
ledtype = ledtype << 1;
if(ledtype == 0x00)
{
ledtype = 0x01;
}
P6 = ~ledtype;
}
Delay_ms(500);// 软件消抖
}
}
}
void sys_init()
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
P1M1 = 0x32; P1M0 = 0x32; //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
}
本帖最后由 noonezero 于 2023-9-9 21:37 编辑
第八课:蜂鸣器的应用
通过按键实现开机,功能选择,功能选中功能。
第三个作业做错了,看作业视频 想简单了,确实
收到板子补
#include <STC32G.H>
#include <intrins.h>
#include "COMM/stc32_stc8_usb.h"
void sys_init();
//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
#define KEY1 P32
#define KEY2 P33
#define BEEP P54
void Delay_ms(int x) //@24.000MHz
{
unsigned long edata i;
for(; x > 0; x--)
{
_nop_();
_nop_();
_nop_();
i = 5998UL;
while (i) i--;
}
}
void main()
{
u8 ledtype = 0x01;
P40 = 0;
sys_init();
usb_init();//USB初始化
EA = 1;
while(1){
/* 按键点亮熄灭*/
// 按键按下LED点亮,松开熄灭
// if(KEY1 == 0)
// {
// BEEP = 0;
// Delay_ms(10);// 软件消抖
// if(KEY1 == 0)
// {
// P6 = 0x00;
// }
// BEEP = 1;
// }
// else{
// P6 = 0xFF;
// }
// 按键按下LED熄灭,松开点亮
// if(KEY2 == 0)
// {
// BEEP = 0;
// Delay_ms(10);// 软件消抖
// if(KEY2 == 0)
// {
// P6 = 0xFF;
// }
// BEEP = 1;
// }
// else{
// P6 = 0x00;
// }
/* 按键按下一次,LED状态改变一次*/
// if(KEY1 == 0)
// {
// BEEP = 0;
// Delay_ms(10);// 软件消抖
// if(KEY1 == 0)
// {
// P6 = ~P6;
// }
// BEEP = 1;
// }
/* 按键按下一次,LED状态改变一次*/
if(KEY2 == 0)
{
BEEP = 0;
Delay_ms(10);// 软件消抖
if(KEY2 == 0)
{
ledtype = ledtype << 1;
if(ledtype == 0x00)
{
ledtype = 0x01;
}
P6 = ~ledtype;
}
Delay_ms(500);// 软件消抖
BEEP = 1;
}
}
}
void sys_init()
{
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
P1M1 = 0x32; P1M0 = 0x32; //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
}
建议爱学习的小伙伴直接联系我们客服小姐姐,以便更快的获的实验箱,
同时也希望能看到小伙伴后面更详细的学习感悟,一起提升大家的学习热情
【免费+包邮】 送/申样/采购 可加 如下 QQ或微信联系
加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服曹经理QQ:1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服聂经理QQ:2593903262;微信:18106296598要求 【免费+包邮】 送, 还免费教仿真
加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593要求 【免费+包邮】 送, 还免费教仿真
加STC华北区客服石经理QQ: 1638975601 ;微信:19952583876要求 【免费+包邮】 送, 还免费教仿真
加STC华中区客服唐经理QQ:2571301708 ;微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
加STC东北区客服张经理QQ:3141888640 ;微信:19952583265 要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服张经理QQ:3141888640 ;微信:19952583265 要求 【免费+包邮】 送, 还免费教仿真
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)
【免费+包邮】 送/申样/采购传统电话热线:0513-55012928、0513-55012929、0513-55012966
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)