跟冲哥学习STC32G128K芯片打卡
2024年4月25日学习STC32G128K芯片记录第一课什么是单片机个人理解一个完善的微机系统,包括CPU运存存储多余的IO口为控制外设用。
一般单片机外貌
问一下AI 关于51单片机的特点,给的回答是
51单片机是一类基于Intel 8051微处理器内核设计的单片机,以其为基础发展出了众多兼容产品,形成了广泛的51单片机家族。这类单片机具有以下显著特点:
[*]兼容性:
[*]指令系统兼容:所有51系列单片机遵循相同的指令集架构(ISA),即与Intel 8051微处理器指令集兼容。这意味着为一个51单片机编写的程序可以无需或仅需少量修改就能在其他兼容的51单片机上运行,极大地增强了代码的移植性。
[*]结构简单且易于学习:
[*]冯·诺依曼结构:51单片机采用冯·诺依曼体系结构,程序存储器和数据存储器共享同一地址空间,CPU通过同一总线访问。这种结构简单明了,对于初学者而言易于理解。
[*]丰富的外设资源:
[*]I/O端口:通常提供多个双向输入/输出(I/O)端口,可以直接控制外部设备或读取传感器信号。
[*]定时/计数器:内置多个定时器/计数器,可用于实现延时、频率测量、脉冲计数、PWM生成等多种功能。(???需进一步了解,后续学习再了解)
[*]串行通信接口:具有全双工的串行通信单元(如UART),支持异步通信(如RS-232)和同步通信(如SPI、I²C),便于与其他设备进行数据交换。
[*]中断系统:配备完善的中断结构,支持多个中断源(如外部中断、定时器中断、串口中断等),并具有多级优先级,有利于实时响应外部事件。
[*]扩展性:
[*]并行总线扩展:通过并行总线可以连接外部存储器、扩展I/O口或其他外围设备,以满足更复杂应用的需求。
[*]串行总线扩展:支持如I²C、SPI等串行总线协议,便于连接低引脚数的外围设备。
[*]广泛的应用领域:
[*]教育:由于其结构简单、资源适中且教程资料丰富,51单片机常被用作高校电子工程、自动化等相关专业的单片机入门教学平台。
[*]工业控制:广泛应用于各类工业自动化设备,如电机控制、生产线监控、数据采集系统等。
[*]消费电子:在家电、玩具、智能仪器仪表等消费电子产品中充当控制核心。
[*]汽车电子:用于汽车配件如报警系统、胎压监测、车载娱乐设备等。
[*]通信设备:在简单通信设备、远程监控系统中实现数据处理和传输。
[*]低成本与低功耗:
[*]芯片尺寸小、价格低廉:得益于大规模集成电路技术的发展,51单片机芯片尺寸小、制造成本低,适用于大批量、低成本的嵌入式应用。
[*]低功耗型号:部分51单片机提供低功耗模式,适用于电池供电或对能耗敏感的场合。
[*]开发工具链成熟:
[*]广泛的开发工具支持:有多种集成开发环境(IDE)、编译器(如Keil C51、SDCC等)、调试器和仿真器可供选择,为开发人员提供了便捷的开发环境。
综上所述,51单片机以其良好的兼容性、结构简单、丰富的外设、易于学习和扩展、广泛的应用领域、低成本低功耗以及成熟的开发工具链等特点,成为了嵌入式系统设计中的重要选择,尤其在教育和入门级项目中具有较高的普及度。随着技术的发展,尽管市场上出现了更多高性能的单片机产品,但51单片机因其独特的市场定位和用户群体,仍保持着一定的市场份额和活跃度。随后第一课很笼统,但可以扩展学习了解到,其原理还是很复杂的,先学技术再说。
第二课外设
1. 数码管:每个管为1个灯,共8个灯
2. NTC测温:连续测温,模拟测温
3. 18B20: 不可连续测温,单个点,数字测温
4. ADC按键:采集模拟电压,判断数值,根据基准电压,0-4095线性变化 A是模拟 D是数字
5. PWM模拟DAC
6. 24C02 存储芯片
7. LCD接口屏幕
8. 蜂鸣是喇叭
学习的STC32G128K工作电压1.9-5.5V
课后作业思考:MP3应该是个不错的实践项目
第三课环境搭建
所需软件
1. STC-ISP
2. STC32手册
可找到示例程序,即IO控制方法,通过搜索,快速定位自己想要的位置。得多熟悉熟悉其原理
3. C251开发环境
安装Keil就可以。
4. 下载程序 先按住INT0 P3.2 打开开关上电可以识别为HID1模式,选择24M时钟,点击下载就可以直接下载
可自动识别单片机是否正确
本帖最后由 Rain_Personal 于 2024-5-15 20:18 编辑
第四课 新建工程并点亮LED灯
上节课未吃透所遇问题
打开工程后出现报错
重新调整后发现,需要在STCAi-ISP软件中添加Keil的型号和头文件具体流程为 Keil仿真设置---->添加型号和头文件到Keil中.... 看下图
1. LED点亮原理
LED灯两端的高低点评会点亮灯,板载资源中首先要通过P40输出低电平打开总开关,再通过P60输出低电平就可以点亮LED灯。
2. 代码编写
sfr特殊功能寄存器0x80~0xFF sbit????
P4M0 P4M1
0 0 准双向口
0 1 推挽输出
.......
定义寄存器
sfr P4 = 0xc0;
sbit P40 = P4^0;
设置输出模式 准双向口
P4M1 = 0x00; P4M0 = 0x00;
操作端口高低点评,点亮LED灯
打开总开关
P40 = 0;
亮LED灯
P60 = 0;
3. 程序下载的USB模式
首先需要安装驱动
跟随弹窗提示一步一步走下去就可以
向IAP_CONTR寄存器发送0x60可实现不停电进行ISP下载
USB-HID
需要包含关于usb的lib文件
相关代码
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速度
//====== USB 初始化 ======
P3M0 &= ~0x03;
P3M1 |= 0x03;
IRC48MCR = 0x80;
while (!(IRC48MCR & 0x01));
USBCLK = 0x00; // USB-CDC相关 HID需要禁用
USBCON = 0x90;// USB-CDC相关HID需要禁用
//========================
}
最后主函数中调用
sys_init();//系统初始化
usb_init();//USB CDC 接口配置
EA = 1; // 打开总中断
开启USB的下载功能
此外可以通过Include 加载头文件,就不需要使用sfr定义了。
本帖最后由 Rain_Personal 于 2024-5-15 20:21 编辑
第四课C语言入门 已经掌握相关编程语言再次复习一下
1. printf的格式化输出,串口通讯,万能的 print debug。
示例代码
printf("当前温度:%0.2f\r\n", 25)
其中的%后可跟数字有以下几个关键字符
示例中f表示单精度浮点输出
x.y 表示整数有x位,小数有y位有效数字,其他可用描述为
此外\r \n 为转义字符表示换行和回车。冲哥更加详细的描述了其不同系统中的应用
在Windows系统中我们输入回车时,输入的字符是\r\n,
unix系统中回车为\n,
而mac系统中回车的字符为\r.
2. 此外根据ASCⅡ可以说明串口中16进制与字符之间的关系
3. 使用程序员计算器可以不费脑子的计算各个进制之间的对应关系
4. 单片机编程中可以使用常规算数运算符 + - * /取余%此外支持C中的++ 和 -- 自增自减运算符
以往C语言中对于位运算使用较少
在单片机中使用位运算应该效率更高
右移(>>)左移(<<)
按位与(&)
按位或(|)
按位异或(^)
取反(~)
5. 数据类型
与传统C不同的是出现了sfr关键字 特殊寄存器、
要使用串口通讯需要选择CDC功能
本帖最后由 Rain_Personal 于 2024-4-25 21:56 编辑
第六课LED闪烁及花式点灯
1. 灯闪烁的原理是,通过延时函数,不断的开关LED灯,进而达到闪烁效果
2. 相关延时函数的代码为
#define MAIN_Fosc 24000000UL// 系统的晶振频率
voiddelay_ms(u16 ms) // 延时多少ms
{
u16 i;
do{
i = MAIN_Fosc / 6000; //6000是怎么确定的?都适用么?
while(--i);
}while(--ms);
}
#define X Y关键字可以将Y映射到X 即X就是Y;示例中MAIN_Fosc就是24000000UL。
不断的开关就需要循环结构,冲哥讲的是do{}while();和while{}
此外延伸出 自减符--的应用。
3. 模块化编程 C语言的语法
具体定义方法为:
////////////////////////////////
返回值 函数名称( 入口参数 )
{
函数要执行的功能
}
///////////////////////////////
其中
@返回值:没有返回值就是void
@函数名称:避开关键词,不重复,非特殊字符随便取
@入口参数:类型+名称,多个参数“,”分开,空就写void
函数的声明方法
///////////////////////////////
返回值 函数名称( 入口参数 );
///////////////////////////////
函数调用
///////////////////////////////
有返回值的
值 =函数名称( 入口参数 );
无返回值
函数名称( 入口参数 );
///////////////////////////////
C语言中一般将模块写为h和c文件,
其中h为头文件,主要是函数的声明
其格式为
#ifndef __XXX_H
#define __XXX_H
调用头文件
函数声明...
#endif
c为模块主体,是各个函数的实现方法
其格式为
#include “xxx.h”
函数定义
使用模块时,只要引入头文件就可以使用相关模块 Rain_Personal 发表于 2024-4-25 21:44
第六课LED闪烁及花式点灯
1. 灯闪烁的原理是,通过延时函数,不断的开关LED灯,进而达到闪烁效果
6000时根据单片机来确定的stc8不一样 soma 发表于 2024-4-25 22:47
6000时根据单片机来确定的stc8不一样
感谢答疑解惑,是不是跟指令集什么的有关呢? 第七课 按键点灯
1. 按键原理
按键存在常开开关和常闭开关。
例如SW17按键按下后,会把R10电阻的右侧电压拉低到GND,此时R82两端电压应该位VCC。
此外按键按下后会出现抖动情况。
出现抖动的原因为机械触电的弹性抖动,一个开关会在短时内出现电压不稳导致的,类似于接触不良,出现电阻变化。
2. 按键代码的实现过程
首先需要通过宏定义 定义KEY
#define KEY P32 //P32应该属于寄存器,相当于KEY就是寄存器的值
if( KEY == 0 ) // 第一次判断
{
Delay_ms(10);//可能会有抖动跳过抖动部分 10ms是随意数值?可否增加或者减少
if( KEY == 0 )// 再次判断
{
执行功能
}
}
3. 16位二进制,可以通过移位方法将某个端口变为0,点亮LED灯,通过按键将P6移位可以实现按键流水灯。
4. 数组的使用
将移位的数值直接存储值数组,通过索引为P6赋值,PS比较占用内存,不如移位好
本帖最后由 Rain_Personal 于 2024-4-26 20:06 编辑
第八课蜂鸣器的应用
1. 蜂鸣器分类
有源蜂鸣器自带震荡源,通电就会叫,比无源蜂鸣器会贵点
无源蜂鸣器无震荡源,通直流信号,不会叫
2. 控制原理
P54引脚
P54=!P54
3. 蜂鸣器的应用
通过全局变量区分开关模式还是运行模式
灯是低电平点亮,可通过取反~采用将1移位,修改亮灯状态