关于32位8051实验箱-STC32G12K128学习记录
本帖最后由 zhangshiwei 于 2024-6-25 17:17 编辑2024.06.19
第一集课
熟悉什么是单片机,以及单片机的基本作用,开始了解STC单片机的使用方法;关于51单片机的学习方法和入门技巧。
1.单片机的定义
单片机又称微控制器(Microcontroller Unit,简称MCU),是采用超大规模集成电路技术把中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时/计数器、脉宽调制电路A/D转换器等功能电路集成到一块硅片上构成的一个小而完善的微型计算机系统。
单片机的实质就是用于控制目的的单片微型计算机,简称单片机。
2.关于总线的知识
单片机CPU与各部件之间采用三总线结构进行连接。总线是指计算机中CPU与各功能部件间传送信息的公共通道,包括地址总线AB(Address Bus)数据总线DB(Data Bus)和控制总线CB(Control Bus)三种。
地址总线:用于CPU向其它部件传送存储单元或I/O端口的地址信息,以进行指令或数据信息读取。
数据总线:用于在CPU与其它部件间传送指令或数据信息。
控制总线:用于在CPU与其它部件间传送控制或状态信息。
3.单片机的发展历程
(1)初级发展阶段
单片机集成规模比较小,功能比较简单,一般均把CPU、RAM,以及一些简单的I/O口集成到芯片中,这个时候还不算真正意义上的单片机。
Intel4004(1971年Intel公司研制的第一块4位微处理器芯片)
Intel8008(1972年Intel公司研制的第一代8位微处理器)
Intel8080 (1973年Intel公司研制的第二代高性能8位微处理器)
F8微处理器(Fairchild公司产品)
Z80微处理器(Zilog公司产品)
(2)中级发展阶段
单片机集成了CPU、存储器、I/O接口,定时/计数器,简单的中断系统还有时钟等部件,算是真正意义上的单片机,体积小,功能全。
Intel公司的MCS-48、 MCS-51系列
Zilog公司的Z8系列
Motorola公司的6801和6802系列
Rokwell公司的6501及6502系列
(3)高级发展阶段
单片机的功能越来越强大,性能也是得到了飞速发展,集成了很多的I/O口和中断系统,还自带有A/D转换功能,RAM与ROM的容量也是越来越大,寻址空间可以达到64KB。
美国Microchip公司的PIC系列单片机
MOTOROLA公司MC68HC系列单片机
ATMEL公司的AT89系列单片机
Intel公司的80960超级32位单片机。
宏晶科技的STC系列单片机具有自主知识产权,可以直接替换ATMEL等公司的产品。
4.单片机的故障排除
(1)单片机正常工作的三个条件
单片机工作的三个条件分别是电源、时钟晶振、复位。当单片机不能正常工作时,我们首先就要检查这三个条件,用电压表或者万用表检测他的电源和接地脚,检测两个引脚之间的电压是不是5V左右;对于时钟晶体振荡有没有正常工作,我们最好用示波器进行检测,看能否检测到相应频率的正弦波脉冲;复位检测比较简单,单片机的复位电平一般是高电平复位,单片机在接通电源的时候一般复位引脚上会出现5V左右的高电平,另外在按下复位按键时,复位引脚上也会出现高电平,用一般的电压表或者万用表都可以进行检测。
(2)单片机内部是否正常工作的检测
单片机内部有没有正常工作,我们主要是通过写入程序的方式来进行检测和排查。这个检测需要有“烧入”代码的硬件和软件才行,检测的原理就是通过“烧入”代码的硬件和软件,将一段带有检测功能的正常代码“烧入”到单片机。检查两个方面:第一就是能不能将目标代码正常写入单片机,不能正常写入单片机时,说明单片机已经损坏,需要更换同型号的单片机;第二就是目标代码可以正常写入单片机,写入后的效果是不是就是程序设定的功能,如果是说明单片机正常。
本帖最后由 zhangshiwei 于 2024-6-25 17:25 编辑
2024.06.19
第二集课
学习心得:
(1)熟悉8051实验箱的基本硬件资源和外设,了解一些外设在生活中的应用;
(2)关于单片机的硬件资源,一些内部的寄存器和定时器、计数器、基本的I/O口等等;
(3)针对这部分的内容,我打算在后面的课程学习中,能够理解基本的硬件资源和常用外设,同时操作基本的寄存器能够理解每一个参数值的作用,自己尝试编写简单的寄存器代码,进行debug之类的。
关于项目这块的话,我自己想要做一款温湿度采集装置,主要是会用ADC,数码管等相应的外设资源。
1.基本介绍
STC32G是STC新推出的32位单片机,也就是广义的32位的8051单片机。实际上使用的是Intel的C251架构,因此在编译器上KeilC51是编译不了STC32G的工程的,要使用KEILC251。优势的话最大的就是价格了,STC32G12K128目前推广价格在5块钱左右(当前时间哈),LQFP48的封装,128K的Flash,4+8K的RAM,带USB带CAN。而且本身LQFP48的封装,即便是ARM的架构,应用也不会太复杂。因此可能会替代很多低复杂度的32位ARM的场景。另外的话可以从51平台方便的过渡到这个平台,对于51使用者来说十分的友好。
STC32G12K128是STC公司推出的一款32位单片机芯片。作为一款低功耗、高性能的单片机,STC32G12K128在各种领域都有着广泛的应用。
首先,STC32G12K128具有强大的处理能力。它采用了32位的ARM Cortex-M3内核,主频高达72MHz,使其能够处理复杂的算法和高速数据传输,满足各种应用下的需求。同时,STC32G12K128还配备了128KB的Flash存储空间,可以储存大量的程序代码和数据,使得其可以应对更为复杂的应用场景。
其次,STC32G12K128具备丰富的外设资源。它拥有多达43个通用输入输出引脚,可以与各种外部模块进行连接,实现与其他设备的通信。此外,STC32G12K128还内置了多个模数转换器(ADC)、定时器/计数器和PWM输出通道,可实现对模拟信号的采集和处理,以及对外部设备的精确控制。
另外,STC32G12K128还支持多种通信接口。它内置了多个串行通信接口,如UART、I2C和SPI,方便与其他外部设备进行数据交互。此外,STC32G12K128还支持USB接口,可以快速实现与计算机的连接,方便进行软件调试和程序下载。
STC32G 系列单片机是不需要外部晶振和外部复位的单片机,是以超强抗干扰/超低价/高速/低功耗为目标的 32 位 8051 单片机,在相同的工作频率下,STC32G 系列单片机比传统的 8051 约快 70 倍。STC32G 系列单片机是 STC 生产的单时钟(1T)的单片机,是宽电压/高速/高可靠/低功耗/强抗静电/较强抗干扰的新一代 32 位 8051 单片机,超级加密。
2.最小系统
本帖最后由 zhangshiwei 于 2024-6-25 17:31 编辑
2024.06.19
第三集课
学习心得:了解开发环境的搭建和程序下载的操作
(1)关于STC-ISP软件的下载,相关的手册下载和熟悉,搭建基本的C251开发环境;
STC-ISP(烧录软件)最新版是一款专业的单片机烧录工具。STC-ISP官方版拥有串口助手、 波特率计时器等功能,可以帮助用户进行编程设置和制定芯片快速控制程序。通过STC-ISP软件用户能够将硬件设备的芯片重新编辑,可以有效的提高调试人员的编程效率。
1、8051单片机基本组成、性能特点及应用方法,基于Flash存储器的 2、ISP在系统中编程和IAP在应用中编程技术,结合目前流行的 3、Keil C51编译器环境,对STC15系列单片机采用C语言进行编程应用, 4、充分发挥C51技术优势,全面地展现STC15系列单片机本身特色, 5、如片内晶体振荡器时钟调整、将芯片配置成为具有仿真功能的单片机、 6、Keil uVision4环境下在线仿真调试、1T单周期指令高速执行、 7、I2C、SPI、ADC等片内资源以及多种片外扩展应用,为读者快速上手提供方便。(2)学会安装keil开发软件,了解关于C51、C251与MDK不同版本的兼容性安装方法,避免同类软件使用冲突;
搭建Keil开发环境
Keil C251是美国Keil公司(该公司2005年被ARM公司收购)出品的针对251微控制器系列兼容单片机C语言软件开发系统。与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。Keil C251是支持251微控制器体系结构的Keil开发工具,适合每个阶段的开发人员,不管是专业的应用工程师,还是刚学习嵌入式软件开发的学生。
扩展:Keil公司开发的ARM开发工具MDK(Microcontroller Development Kit),是用来开发基于ARM核的系列微控制器的嵌入式应用程序。
开发板配套资料包里面已经下载好了Keil C251安装文件,安装文件的位置在开发板资料包的“…\第2部分:开发软件工具\ 1 - KEIL C251安装软件”目录下。
(3)熟悉第一个程序例程,工程的熟悉和演示,尝试安装软件,编译工程;还有关于如何下载程序的办法和步骤。
安装ch341ser驱动
开发板上设计了USB转TTL电路,使用的USB转串口芯片是CH340,使用前需要安装驱动。
☆说明:如果计算机上已经安装了CH340的驱动,则无需再安装,可直接跳过此步骤。
CH340和CH341的驱动一样,开发板配套资料包里面已经下载好了驱动,驱动的位置在开发板资料包的“…\第2部分:开发软件工具\ 3 - CH340驱动程序(支持WIN10)” 目录下。
本帖最后由 zhangshiwei 于 2024-6-25 17:36 编辑
2024.06.19
第四集课
学习心得:开始创建工程,点亮第一课LED上集
(1)熟悉LED点亮的原理,关于单片机GPIO的工作原理和概述,GPIO为通用的输入输出端口,可以通过单片机读取输入电平或者控制输出高低电平;
(2)使用keil软件进行工程的创建,然后开始进行程序的编写,尝试编写基本的demo程序;
实验效果:
(3)根据寄存器找到对应需要配置的寄存器,在程序中进行合适的配置;像针对位定义的话,使用sbit进行声明;
第四集课
学习心得:开始创建工程,点亮第一课LED下集
(1)了解实现自动下载工程的方法和STC-ISP软件的配合使用;软件的相关设置
相关寄存器:
(2)导入指定的lib库文件,调整相关的函数定义,之后就继续编译工程;
程序对应寄存器手册编写:
(3)熟悉了如何使用寄存器单独点亮指定的LED灯,后续可以直接操作整个P0口将LED灯全部给点亮(相当于就是直接操作整个寄存器,而不是寄存器的其中一个位)。以及关于USB-CDC不停电下载的办法。
关于准双向口的概念和定义:
sfr P0 = 0X80;
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P4 = 0XC0;//初始化P4组GPIO引脚为GPIO功能
sfr P4M1 = 0XB3;
sfr P4M0 = 0XB4;
sfr P6 = 0XE8;//初始化P6组GPIO引脚为GPIO功能
//sfr P6M1 = 0XC8;
sfr P6M1 = 0XCB;
sfr P6M0 = 0XCC;
sbit P40 = P4^0;//三极管控制引脚
sbit P60 = P6^0;//LED控制引脚
void main()
{
//P0M0 = 0X00;
//P0M1 = 0X00;
P4M1 = 0X00;
P4M0 = 0X00;
P6M1 = 0X00;
P6M0 = 0X00;
while(1)
{
//P0++;
P40 = 0;//三极管引脚输出低电平
P60 = 0;//led0引脚输出低电平
}
}
本帖最后由 zhangshiwei 于 2024-6-25 17:44 编辑
2024.06.19
第五集课
学习心得:C语言的运算符和进制数概念上集
(1)第一个是理解了C语言中的printf函数的用法;以及关于printf函数输出的时候会使用到一些格式字符,能够直观的观察打印出来的数据;
C语言运算符号指的是运算符号。C语言中的符号分为10类:算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符和特殊运算符。
C语言中包含多种运算符,可执行多种运算。常见的运算符有赋值运算符、算术运算符、比较运算符、逻辑运算符、位运算符、三元运算符、类型转换运算符、sizeof运算符、const_cast运算符、dynamic_cast运算符、reinterpret_cast运算符、new和delete运算符等。
(2)关于2进制、10进制、16进制的概述和定义,以及进制间的相互转换;关于ASCII码的基本表述和如何使用计算器程序员进行进制数的转换;
第五集课
学习心得:C语言的运算符和进制数概念下集
进制数的概念:
C语言是一种广泛使用的编程语言,它的进制体系是程序员必须掌握的基础知识之一。在本文中,我们将深入探讨C语言的进制体系,包括二进制、十进制、八进制和十六进制。
二进制
进制是C语言中最基础的进制体系。它只包含两个数字0和1,用于表示计算机中的所有数据。在C语言中,我们可以使用0b或0B前缀来表示二进制数。例如,0b1010表示十进制数10。
进制数在计算机中的应用非常广泛,因为计算机中的所有数据都是以二进制的形式存储和处理的。
例如,计算机中的CPU和内存都是由许多二进制位组成的,每个二进制位只能表示0或1。
十进制
十进制是我们平时最常见的进制体系。它包含10个数字0-9,用于表示数值大小。在C语言中,我们可以直接使用普通的数字表示十进制数。例如,10表示十进制数10。
虽然十讲制是我们最为熟悉的讲制体系,但它在计算机中的应用相对较少。这是因为计算机中的数据处理都是以二进制的形式进行的,所以在计算机中使用十进制数进行计算会增加计算机的负担。
八进制
八进制是C语言中的一种进制体系,它包含8个数字0-7,用于表示数值大小。在C语言中,我们可以使用0前缀来表示八进制数。例如,010表示八进制数8。
八进制数在计算机中的应用相对较少,但在一些特殊的场合下还是会用到。例如,Unix操作系统中的文件权限就是使用八进制数表示的。
十六进制
十六进制是C语言中的一种进制体系,它包含16个数字0-9和A-F,用于表示数值大小。在C语言中我们可以使用0x或0X前缀来表示十六进制数。例如,0x10表示十进制数16。
(3)C语言的常用运算符表示方法和使用方法;关于端口定义的数值如何确定,可以通过确定每一位的方法,然后进行进制转换,得到最后的数值;
(4)数据的基本类型概述及用法。关于定义数据类型的关键字。
理解了使用printf输出函数进行数据打印的操作,同时关于常规的运算符进行了操作和理解,熟悉运算符的使用方法;最后就是关于数据类型的理解和用法。
本帖最后由 zhangshiwei 于 2024-6-25 17:50 编辑
2024.06.19
第六集课
学习心得:关于LED闪烁和花式点灯效果的设计上集
(1)基于delay函数实现LED的闪烁效果设计,关于延时的设计主要是利用delay延时函数;
一般来说,单片机延时函数是指用于在单片机程序中实现一定时间延迟的函数,这种函数在很多应用中都非常有用,比如LED闪烁、按键去抖、定时器初始化等。
下面是一个简单的单片机延时函数代码,以C语言为例:
#include
#include
// 定义延时函数
void delay(int milliseconds)
{
clock_t start_time = clock(); //获取开始时间
while (clock() < start_time + milliseconds); //等待时间过去
}
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("Delay %d ms\n", i);
delay(i); //调用延时函数,实现不同时间的延迟
}
return 0;
}在上面的代码中,delay()函数用于实现延时。函数的参数milliseconds表示需要延迟的时间,单位是毫秒。函数内部使用clock()函数获取当前的时钟时间,并在循环中等待直到时间达到指定的毫秒数。在主函数中,我们调用delay()函数来实现不同时间的延迟,并输出相应的信息。需要注意的是,在实际应用中,不同的单片机系统可能使用不同的硬件定时器或软件定时器来实现延时。因此,具体的延时函数实现方式可能会因单片机型号和开发环境而有所不同。在实际开发中,需要根据具体的单片机型号和开发环境来编写相应的延时函数代码。
(2)关于函数的使用,需要在C文件中进行函数的声明,然后h文件中进行头文件的定义;
第六集课
学习心得:关于LED闪烁和花式点灯效果的设计下集
(3)新建文件,进行模块化的编程设计
函数的使用在模块化编程里,函数使用分为如下三步:(1)函数定义(需要带类型)返回值 函数名称( 入口参数 )
{
函数要执行的功能
}
@返回值:没有返回值就是void
@函数名称:避开关键词(IDE中标蓝),不重复,非特殊字符随便取
@入口参数:类型+名称,多个参数“,”分开,空就写void(2)函数声明(需要带类型)返回值 函数名称( 入口参数 );(3)函数调用函数名称( 入口参数 );调用的时候就只需要入参数,不需要带类型新建文件,使用模块化编程新建xxx.c和xxx.h文件新建xxx.c和xxx.h文件,代表一个功能块。推荐一一对应。
点击新建,默认弹出的是text文件,未定义文件类型,点击保存,存储为math.c,并另存为math.h。总结:了解了关于while的循环结构使用;以及函数的使用(定义和声明、调用);学会了新建文件工程,添加路径的方法。关于SOS求救信号的函数编写(LED灯闪烁控制:三短三长三短)
zhangshiwei 发表于 2024-6-19 17:03
2024.06.19
第六集课
学习心得:关于LED闪烁和花式点灯效果的设计上集
这是USBCDC模拟串口输出? soma 发表于 2024-6-19 17:08
这是USBCDC模拟串口输出?
这个是使用GPIO控制电平就行LED灯的点亮 soma 发表于 2024-6-19 17:08
这是USBCDC模拟串口输出?
可以使用USB-CDC不停电的下载方式,可以方便下载程序;USB-CDC就是我们常见的虚拟串口 本帖最后由 zhangshiwei 于 2024-6-25 18:00 编辑
2024.06.19
第七集课
学习心得:使用按键点灯上集
(1)熟悉按键的基本原理和结构,了解了关于常开和常闭的概述,另外关于按键存在抖动的现象如何去消除和改善;
单片机按键去抖原理
单片机按键去抖的原理主要涉及到硬件消抖和软件消抖两种方法。
1.硬件消抖主要通过两种方式实现:
(1)RS触发器:利用RS触发器来吸收按键的抖动。一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。
(2)电容滤波:将电容并联在按键的两端,利用电容的放电的延时特性。将产生抖动的电平通过电容吸收掉,从而达到消抖的作用。
软件消抖则主要通过软件编程实现,其基本思路是对按键状态进行两次检测,并引入适当的延时,以忽略前沿抖动的影响。在代码中,通过对按键状态的连续两次检测,确认按键是否真正处于按下状态,从而避免误判。这种方法在实际应用中较为常见,且成本较低,易于实现。
按键消抖的必要性在于,由于机械触点的弹性作用,按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,因此在闭合及断开的瞬间均伴随有一连串的抖动。这种抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很“漫长”的过程,因为单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级。因此,为确保单片机对按键的一次闭合仅作一次处理,必须处理按键抖动问题。
/* 软件去抖 */
if (0 == K1 ) //如果有键按下
{
delay_ms(8); //延时一段时间去抖
if (0 == K1) //如果真的有键按下,检测到得是稳定闭合状态
{
。。。 //按键以后需要做的事情
}
while(!K1); //松手检测,如果按住不放则一直在循环里
}
实验程序设计如下
基本的功能实现是按下按键点亮LED灯,松开按键LED灯熄灭。
(2)通过在程序上设计条件判断语句,检测按键按下与没有按下时,需要执行的语句,并观察输出状态。
编程的思路:
1、定义按键管脚2、定义LED灯管脚3、定义按键的键值4、定义一个函数 来判断按键是否被按下5、先判断 按键是否被按下--> 在判断没有按下按键怎么样-->否则返回 没有按下第七集课
学习心得:使用按键点灯下集
关于移位操作的办法
关于数组的基本概述
在单片机编程Q中,数组是一种非常常见且有用的数据结构,用于存储和操作多个相同类型的元素。一个数组可以被认为是一个由相同类型的元素组成的集合,每个元素都被分配了一个唯一的索引值,通过该索引值可以访问和修改数组中的元素。
总结:学会了按键的用法,然后就是数组的定义和使用,如何利用数组进行LED灯的不同效果显示。
数组的概念和定义
我们知道,要想把数据放入内存,必须先要分配内存空间。放入4个整数,就得分配4个int类型的内存空间:
int a;这样,就在内存中分配了4个int类型的内存空间,共 4×4=16 个字节,并为它们起了一个名字,叫a。
我们把这样的一组数据的集合称为数组(Array),它所包含的每一个数据叫做数组元素(Element),所包含的数据的个数称为数组长度(Length),例如int a;就定义了一个长度为4的整型数组,名字是a。