




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理思考:如何利用已学知识设计一个房屋简易防贼装置??保安?机关?机械?捕鼠器1捕鼠器2
电子?计算机?
第0章
绪论1计算机的问世2计算机经历了五个时代3微型计算机结构框图及单片机定义4
单片机的发展状况5为什么学及如何学1946年情人节,世界上第一台电子计算机诞生
1.计算机的问世17468个电子管、6万个电阻器1万个电容器、6千个开关重30吨,占地170平方米耗电174千瓦每次一开机,整个费城西区的电灯都为之黯然失色每15分钟就可能烧掉一支真空管每秒只能运行5千次加法运算电子管计算机晶体管计算机集成电路计算机大规模、超大规模集成电路计算机智能计算机ENIAC—ElectronicNumericalIntegrator1947年贝尔实验室发明了晶体管第一个半导体集成电路1958年
2计算机经历了五个时代计算机巨型机微型机通用微机单片机通用单片机专用单片机小型机集成在同一块芯片上——单片机微型计算机由运算器、控制器、存储器、输入设备和输出设备五大部分组成存储器(ROM、RAM)I/O接口I/O设备(输入/输出)地址总线(AB)数据总线
(DB)控制总线(CB)CPU运算器控制器冯.诺依曼3微型计算机结构框图及单片机定义单片机是早期SingleChipMicrocomputer的直译,它忠实地反映了早期单片微机的形态和本质。它是一种把处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口等功能集成到一块芯片上的小而完善的计算机系统。单片机也被称为微控制(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。单片机定义单片机芯片开关输入LED显示数码管显示串行模块键盘输入鼠标输入CRT或LED显示器输出主机内有CPU、存储器、I/O接口等部件单片机与PC机的比较单片机与PC机的比较单片机是特殊的计算机!
1.单片机的特点(1)控制性能好、可靠性高
可对I/O端口直接操作,位操作能力更是其它计算机无法比拟的。由于CPU、存储器及I/O接口集成在同一芯片内,数据在传送时受干扰的影响较小,且不易受环境条件的影响。(2)体积小、价格低、易于产品化
应用系统的印制板减小、接插件减少、安装简单方便。4单片机的特点及应用领域单片机在哪里?——电冰箱输入设备(箭头指向单片机):加、减按钮输出设备(箭头指向设备):4个指示灯、电磁线圈的驱动电路单片机在哪里?——电磁炉单片机就好像核心控制者,统管着液晶屏、USB口、存储器、DAC及驱动电路、按钮等外部设备,并有序地在这些设备中传递、交换数据或信号。单片机在哪里?——MP3播放机台灯单片机在哪里?——台灯一辆轿车有几十个单片机单片机在哪里?——汽车单片机在哪里?下面开启单片机应用之毁三观系列以上为常规单片机应用你们口袋里就装了很多计算机--单片机单片机在哪里?——SIM卡SIM卡是带有微处理器的芯片,内有5个模块,每个模块对应一个功能:CPU(8位/16位/32位)、程序存储器ROM、工作存储器RAM、数据存储器EEPROM和串行通信单元。SIM卡在与手机连接时,最少需要5个连接线:*电源(Vcc)*时钟(CLK)*数据I/O口(Data)*复位(RST)*接地端(GND)单片机在哪里?——饭卡单片机在哪里?——银行卡单片机还隐藏在我们日常生活的许多电子产品中,如鼠标、遥控器、洗衣机、机器人等。综观这些电子产品都有一个特点,它们都有输入或输出设备。比如鼠标的按键、遥控器的按键等是输入设备;洗衣机的电机、机器人的执行机构是输出设备。形形色色的输入设备和输出设备都在单片机的控制下协调工作。更多单片机2025/4/1622单片机技术的应用遍布国民经济与人民生活的各个领域1.单片机的发展过程
(1)低性能8位单片机阶段
1976年,Intel公司推出了MCS-48系列单片机。8位CPU、1K字节ROM、64字节RAM、27根I/O线和1个8位定时/计数器。
特点:存储器容量小,寻址范围小(不大于4K),无串行接口,指令系统功能不强。
4单片机的发展状况
特点:结构体系完善,性能已大大提高,面向控制的特点进一步突出。现在MCS-51已成为公认的单片机经典机种。
1980年,Intel公司推出了MCS-51系列单片机:8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。
(2)高性能8位单片机阶段5单片机的发展状况
(3)
8位单片机巩固发展及16位单片机、32位单片机推出阶段。
特点:片内面向测控系统电路增强,使之可以方便灵活地用于复杂的自动测控系统及设备。“微控制器”的称谓更能反应单片机的本质。1982年,Intel推出MCS-96系列单片机。芯片内集成:16位CPU、8K字节ROM、232字节RAM、5个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K。片上还有8路10位ADC、1路PWM输出及高速I/O部件等。MCS-51系列单片机的缺点:时钟利用率不高。(需要至少12个以上的时钟脉冲才能执行完一条指令);片内不包含ADC、DAC、WATCHDOG、PWM、CAN控制器等。故现在有些公司对MCS51单片机进行了设计改造,使新一代的MCS-51兼容单片机具有了高速、高效工作的特性,并在51系列芯片中集成了许多新的功能特性(如A/D、D/A等)。国内人们广泛使用MCS-51系列单片机。因此我们需要学好、掌握MCS51系列单片机技术。2.单片机产品近况
ATMEL公司融入Flash存储器技术的AT89系列宏晶科技公司的STC单片机
Philips公司的80C51、80C552系列
华邦公司的W78C51、W77C51高速低价系列
ADI公司的ADμC8xx高精度ADC系列
LG公司的GMS90/97低压高速系列
Maxim公司的DS89C420高速(50MIPS)系列
Cygnal公司的C8051F系列高速SOC单片机
51系列产品繁多,已推出的主要产品有:非51结构单片机新品不断推出,给用户提供了更为广泛的选择空间,近年来推出的非51系列的主要产品有:
Intel的MCS-96系列16位单片机ATMEL公司的AVR单片机,是流行的Arduino的控制器
Microchip的PIC系列RISC单片机
TI的MSP430F系列16位低功耗单片机
ST的STM32系列32位单片机STM32单片机介绍其实,51单片机太弱了……51STM32体系8位32位主频1.2~33MHz(12MHz)72MHz
ROM/FLASH4k512K
RAM128
64K中断源6个60定时器2个11个UART1个5个A/D、D/A无3个12位A/D、2个12位D/A典型芯片对比51存活的原因:便宜单片机的应用正从根本上改变着传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分控制功能,现在已能使用单片微机通过软件方法实现了。这种以软件取代硬件,并能提高系统性能的控制技术,称之为微控制技术。这标志着一种全新概念的建立。5为什么学及如何学(对于普通人)学习单片机是理解工业社会的一种途径如何利用已学知识设计一个简易防贼装置??实践是学习单片机技术的必由之路!5为什么学及如何学(对于开发者)善用开发板6为什么学及如何学Keil6为什么学及如何学关于编程语言问题1.机器语言在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。缺点:程序不易看懂,不便于记忆,容易出错。目前,用于程序设计的语言基本上分为三种:6为什么学及如何学2.汇编语言用助记符表示的指令称为符号语言或汇编语言。汇编语言程序(源程序)需要“汇编”(由专门的汇编程序完成)才能转换成机器语言。得到的机器语言程序称为目标程序。
特点:是面向机器的语言,必须对硬件有一定的了解。助记符指令和机器指令一一对应。能直接管理和控制硬件设备(功能部件)。6为什么学及如何学3.高级语言高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。常用的高级语言,如BASIC、FORTRAN、C语言等。
特点:通用性强,直观、易懂、易学、可读性好。计算机不能直接识别和执行。(需要进行编译)发展很快。易懂、易学?while(x--){for(i=120;i>0;i--);}111011110001111110101010000001100111000000000001000111100100101011000000000101111111010111100011101101110100111001010000000000100000011101110000111011000000011110111MOVA,R7DECR7MOVR2,0x06JNZC:000ADECR6ORLA,R2JZC:0018MOVR5,#0x78MOVA,R5SETBCSUBBA,#0x00JCDelayMS(C:0003)DECR5SJMPC:000F机器语言、汇编、C语言对比1.1计算机中的数制及编码1.2C语言基础第一章
单片机与C语言基础1.1计算机中的数制及编码十进制数十进制数有两个主要特点:
(1)有10个不同的数字符号:0、1、2、…、9;
(2)低位向高位进位的规律是“逢十进一”。因此,同一个数字符号在不同的数位所代表的数值是不同的。如555.5中4个5分别代表500、50、5和0.5,这个数可以写成555.5=5×102+5×101+5×100+5×10-1
式中的10称为十进制的基数,102、101、100、10-1称为各数位的权。二进制数
例如,二进制数1011.01可表示为(1011.01)2=1×23+0×22+1×21+1×20+0×2-1+1×2-2
在二进制数中,只有两个不同数码:0和1,进位规律为“逢二进一”。
一般,在二进制数末尾加b表示其进制:(1011)2=1011B十六进制
一般,在十六进制数开头加0x表示其进制,或末尾加H:(F5E)16=0xF5E=0F5EH在十六进制中,有0、1、2、…、9、A、B、C、D、E、F共16个不同的数码,进位方法是“逢十六进一”。例如,(3A8.0D)16可表示为(3A8.0D)16=3×162+10×161+8×160+0×16-1+13×16-2
各种进位制的对应关系十进制二进制八进制十六进制十进制二进制八进制十六进制000091001119111110101012A2102211101113B3113312110014C41004413110115D51015514111016E61106615111117F7111771610000201081000108不同进制间的相互转换二、十六进制转换成十进制例1
将数(10.101)2,(2D.A4)16转换为十进制。(10.101)2=1×21+0×20+1×2-1+0×2-2+1×2-3=2.625(2D.A4)16=2×161+13×160+10×16-1+4×16-2=45.64062二进制与十六进制之间的相互转换00101011.011010002B.68即(101011.01101)2=(2B.68)16
由于24=16,故可采用“合四为一”的原则,即从小数点开始分别向左、右两边各以4位为一组进行二—十六换算:若不足4位的以0补足,便可将二进制数转换为十六进制数。反之,采用“一分为四”的原则,每位十六进制数用四位二进制数表示,就可将十六进制数转换为二进制数。例5将(101011.01101)2转换为十六进制数。例6将(123.45)16转换成二进制数。123.45000100100011.01000101即(123.45)16=(100100011.01000101)2
例7将(110101.011)2转换为十六进制数。00110101.011035.6即(110101.011)2=(35.6)16
计算机与二进制数
在计算机中只能使用二进制数。指令、数据、字符和地址的表示以及它们的存储、处理和传送,都是以二进制的形式进行。没有二进制也就没有电子计算机。因为:(1)二进制数在物理上最容易实现。例如,可以只用高、低两个电平表示"1"和"0",也可以用脉冲的有无或者脉冲的正负极性表示它们。(2)二进制数用来表示的二进制数的编码、计数、加减运算规则简单。(3)二进制数的两个符号"1"和"0"正好与逻辑命题的"真"和"假"相对应,为计算机实现逻辑运算和程序中的逻辑判断提供了便利的条件。硬盘中的数据示意黑客帝国片段1.位(Bit)指二进制的位。2.字节(Byte)8位二进制数称为一个字节。3.字(Word)字是一台计算机上所能并行处理的二进制数,字的位数称为字长。字长是字节的整数倍。如:STM32单片机字长为32位。计算机中二进制数的单位定义变量:int
num;//定义了一个整型变量,名字为numint
a,b,c;//同时定义了多个整型变量,名字分别是a、b和c变量赋值1.先定义再赋值,如:int
num;num=100;2.定义的同时赋值,如:int
num=100;变量及赋值1.2C语言基础实际上编译器的工作分为两个步骤,先是预处理(Preprocess),然后才是编译。宏定义属于预处理步骤,简单的说,预处理会根据宏定义进行替换。比如:#defineN20inta[N];相当于int
a[20];宏定义计算机中所有的指令、符号都是二进制数。为了表示字符等符号,需要将符号进行编码,这样计算机才能进行存储和处理。ASCII码是“美国信息交换标准代码”的简称。
ASCII码数据类型(1) 基本类型基本类型主要包括字符型、整型和浮点型。字符型包括char和unsginedchar型,它们都是占一个字节空间。无符号字符类型unsignedchar的数值范围是0~255,有符号字符类型signedchar,也简称为char,它的数值范围是-128~+127。整型数据是指不带小数的数值。(1) 基本类型浮点型数据是指带小数的数值。整型数据是指不带小数的数值。(2)构造类型为了满足需要定义多种类型变量的需求,C语言设置了struct关键字,它拥有自定义类型的能力。比如可以采用两个double型组成的结构体变量:struct
complex_struct{doublex,y;};结构体变量的初始化以及成员的访问用点运算符来访问,比如:
complex_struct.x
=
1.0;
complex_struct.y
=
2.0;
(2)构造类型除了上面定义结构体类似使用的方法,C语言还提供了一种采用关键字“typedef”定义结构体的方法。举例来说:1. typedefstruct2. {3. doublex,y;4. }complex_def;5. 6. complex_defcomplex_struct;(3)指针类型指针变量可以被赋予不同的指针值,可以通过指针变量改变指向(即保存了谁的地址)和间接操作。比如:1.int
i;
3.charc;2.int*pi=&i; 4.char*pc=&c;*就表示是指针变量,而&是取地址运算符,&i表示取变量i的地址。int
*pi=&i;表示定义指针变量pi,并用i的地址来初始化pi,也就是pi指向了i。如果我们要获取指针变量所指向的值,则要再次利用*号,比如:1.*pi=*pi+10;基本运算运算符主要包括:(1)算术运算符,(2)赋值运算符,(3)关系运算符,(4)逻辑运算符等。&&表示逻辑与,即为and。当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
(0表示false/假,非零的表示True/真)。比如
:12&&23的结果是1(true)12&&-1
的结果是1(true)123&&0的结果是0(false)||
表示逻辑或,即为“or”。
当两个条件中有任一个条件满足,||
的运算结果就为“真”。比如
:12||1
=1(true)12||0
=1(true)0||0
=0(false)逻辑运算、按位逻辑运算&表示按位与。每一位进行与操作,符合1&1=1,1&0=0,0&0=0
。例如,15&127=15因为127=
(01111111)2,15=
(00001111)2。(0111
1111)2&(0000
1111)2=(00001111)2=15|表示按位或。每一位进行或操作,符合1|1=1,1|0=1,0|0=0
。例如,128|127=255.128=(10000000)2127=(01111111)2(高位用0补齐)
所以128|127=(11111111)2=255逻辑运算、按位逻辑运算^
表示按位异或。当对应位不同的为真,相同为假。符合1^1=0,1^0=1,0^0=0。例如:5^7=0101^0111=0010~表示按位取反。按对应的二进制数逐位进行取反。符合~1=0,~0=1。逻辑运算、按位逻辑运算分支和循环语句(1) if语句if(表达式1){执行代码块1;}……elseif(表达式m){执行代码块m;}……else{执行代码块n;}分支和循环语句(1) while循环while(表达式){语句;}do{语句;}while(表达式);(2) do-while循环for(表达式1;表达式2;表达式3){
语句;}(3)
for循环例:for(i=1;i<=n;++i)result=result*i;函数在C语言中使用使用数学函数:#include<math.h>#include<stdio.h>intmain(void){ doublepi=3.1416;
printf("sin(pi/2)=%f\n",sin(pi/2)); return0;}函数:可以把一个规模较大的问题分解成若干个较小的组件,这些小组件可以被重复使用。使用只要给sin函数输入相应的参数,就可以得到正确的结果,而不用管具体如何实现的。使用时只需在开头包含响应头文件:“#include<math.h>”。编写和使用函数定义一个函数square,用来计算任意整数的平方。然后,使用该函数计算从1到10所有整数的平方。#include<stdio.h>intsquare(int);voidmain(){intx;for(x=1;x<=10;x++)printf("%d",square(x));}intsquare(inty){returny*y;}声明函数使用函数(调用函数)定义函数1491625364964811001.硬件实验平台2.教程配套资料3.KeilMDK及安装4.编译及烧录程序第二章
开发环境1.硬件实验平台介绍硬件实验平台包括STM32开发板、J-Link仿真器、电源适配器、USB转232模块,直流有刷电机。STM32开发板J-Link开发者在PC电脑上完成程序编写、编译后,将得到单片机可以运行的二进制文件,并通过J-Link烧录到单片机上才能最终运行。J-Link驱动安装J-Link驱动位于配套资料包中:“4.软件包”文件夹中的“Setup_JLinkARM_V412.exe”文件,点击安装。USB转232模块USB转232模块——负责电脑与单片机开发板之间的通信USB转232模块驱动安装USB转232模块驱动位于配套资料包中:“4.软件包”“USB转串口驱动(64位).exe”或“USB转串口驱动(32位).exe”,2.教程配套资料2.1 文档资料STM32单片机学习中最为重要的资料:《STM32固件库使用手册(中文翻译版)》,详细介绍了官方定义STM32的标准库函数STM32中文参考手册:详细解释了STM32单片机存储器和外设等各部分的详细信息《芯片数据手册》,英文Datasheet:包含STM32单片机技术特征的基本描述,包含产品的基本配置(如内置Flash和RAM的容量、外设的数量等),管脚的数量和分配,电气特性,封装信息等。2.1.1 STM32F103标准函数库手册开发STM32单片机程序常见方法:直接操作寄存器的方法标准库函数方法HAL库函数方法实际:所有的单片机控制都可以通过直接操作寄存器的方法来实现!问题:寄存器复杂:数量众多,难以记忆(STM32具有数百个寄存器);不同单片机的寄存器名称、结构并不相同。开发的程序包含大量的寄存器名称英文缩写,可读性差。标准库函数方法:标准库函数方法:将这些寄存器底层操作都封装起来,提供一整套标准库函数供开发者调用。控制一个单片机引脚输出低电平
1.voidGPIO_ResetBits(GPIOTypeDef*GPIOx,uint16_tGPIO_Pin)2.{ 3.GPIOx->BRR=GPIO_Pin;4.}只需要调用GPIO_ResetBits()函数就可以控制一个单片机引脚输出低电平标准库函数举例标准函数库手册中关于ADC_DeInit的介绍HAL库函数方法:意法半导体新推出的开发方法,专用开发软件生成程序优点:简单、方便缺点:通用性很差,不能用于除STM32之外单片机。2.1.2 STM32中文参考手册需要时再查找STM32中文参考手册目录2.2 开发板电路原理图看不懂???读懂电路图必备知识——网络标号电路图中两点具有相同网络标号,就表示:这两点在实际电路中是由导线连接在一起的,即使原理图中没有导线示意。通过网络标号这种方式,可以省略很多导线,从而使电路图看起来不会过于凌乱。但初学者由于不明白此概念而导致困惑。读懂电路图必备知识——网络标号读懂电路图必备知识——数据手册12V转5V电路不是我们看不懂电路图中的模块、芯片,而是因为我们不了解这些模块、芯片,所以看不懂电路图。读懂电路图必备知识——数据手册LM2596数据手册读懂电路图必备知识——对应实物电路图与实物电路中的电机接口M23KeilMDK及安装Keil5的安装Keil5安装文件位于配套资料包中:“4.工具软件包”中的“mdk514.exe”,Keil5的破解Keil5破解方法:“4.工具软件包”中的“如何破解Keil.docx”Keil5破解文件:“4.工具软件包”中的keygen_new(2032).rar破解时需以管理员身份运行Keil54如何编译及烧录程序将单片机开发板与J-Link的连接4.2 配置J-Link4.3 编译程序学习单片机就是学习外设的使用!第三章 通用输入及输出(GPIO)1.GPIO简介2.GPIO输出实验3.GPIO输入实验第三章 通用输入及输出(GPIO)1.GPIO简介通用输入输出——GPIO(General-purposeinput/output)输出:控制引脚输出高电平还是低电平,代表逻辑1和逻辑0输入:检测引脚的电平是低还是高STM32F103RCT6单片机STM32F103RCT6单片机通过分组命名进行区分,从A到G分组:每组0至15共16个引脚,即PA0-PA15、PB0-PB15……1) 输入浮空(GPIO_Mode_IN_FLOATING):该模式下输入电平必须有外部电路确定,根据具体电路,需加外部上拉电阻或下拉电阻2) 输入上拉(GPIO_Mode_IPU):打开IO内部的上拉电阻3) 输入下拉(GPIO_Mode_IPD):打开IO内部的下拉电阻4) 模拟输入(GPIO_Mode_AIN):输入传统的模拟量信号5) 开漏输出(GPIO_Mode_Out_OD):输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行.适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。6) 推挽输出(GPIO_Mode_Out_PP):可以提高输出功率,能更好驱动外部的设备,该模式下输出电阻小,带负载能力强7) 复用推挽输出(GPIO_Mode_AF_OD)8) 复用开漏输出(GPIO_Mode_AF_PP)GPIO八种模式不用记!2.GPIO输出实验演示。。。实验原理电路原理图软件原理#include
"stm32f10x.h"//标准外设库头文件
int
main(void)
{
/*********************
LED配置开始*******************************/
//配置GPIO
GPIO_InitTypeDef
GPIO_Initstructure;
//定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//使能GPIOC时钟
GPIO_Initstructure.GPIO_Mode
=
GPIO_Mode_Out_PP;
//配置为输出模式
GPIO_Initstructure.GPIO_Pin
=
GPIO_Pin_11;
//灯LED2对应引脚为PC11
GPIO_Initstructure.GPIO_Speed
=
GPIO_Speed_50MHz;
//GPIO速度50MHz
GPIO_Init(GPIOC,&GPIO_Initstructure);//用GPIO_InITstructure结构体参数,初始化GPIO
/**********************LED配置结束******************************/
while
(1)//死循环,让程序持续运行
{
GPIO_SetBits(GPIOC,GPIO_Pin_11);
}
}软件原理定义变量GPIO_Initstructure,类型为GPIO_InitTypeDef软件原理STM32单片机的外设默认关闭以降低功耗本实验中使用了组别C的GPIO引脚PC11,所以要通过开启GPIOC的时钟来激活C组GPIO如何使能D组GPIO?TIM2呢?软件原理成员变量1:GPIO_Mode定义工作在推挽输出模式成员变量2:GPIO_Pin定义引脚号,本实验中使用的是PC11,属于组别C的GPIO第11号引脚成员变量3:GPIO_Speed,它配置的是GPIO引脚电平最快的切换速度,一般可以配置为50MHz、20MHz等。软件原理第9-11行程序虽然对GPIO_Initstructure成员变量进行了赋值,但其实并没有正在发挥作用。函数GPIO_Init负责初始化GPIO相关的寄存器。第一个参数GPIOC,确定了第二个参数是对C组GPIO相应寄存器进行设置。第二个参数“&GPIO_Initstructure”前面的“&”表示取结构体变量GPIO_Initstructure的地址。指针指针复习指针变量可以被赋予不同的指针值,可以通过指针变量改变指向(即保存了谁的地址)和间接操作。比如:1.int
i;
3.charc;2.int*pi=&i; 4.char*pc=&c;*就表示是指针变量,而&是取地址运算符,&i表示取变量i的地址。int
*pi=&i;表示定义指针变量pi,并用i的地址来初始化pi,也就是pi指向了i。软件原理第9-11行程序虽然对GPIO_Initstructure成员变量进行了赋值,但其实并没有正在发挥作用。函数GPIO_Init负责初始化GPIO相关的寄存器。第一个参数GPIOC,确定了第二个参数是对C组GPIO相应寄存器进行设置。第二个参数“&GPIO_Initstructure”前面的“&”表示取结构体变量GPIO_Initstructure的地址。配置程序小结#include
"stm32f10x.h"//标准外设库头文件
int
main(void)
{
/*********************
LED配置开始*******************************/
//配置GPIO
GPIO_InitTypeDef
GPIO_Initstructure;
//定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//使能GPIOC时钟
GPIO_Initstructure.GPIO_Mode
=
GPIO_Mode_Out_PP;
//配置为输出模式
GPIO_Initstructure.GPIO_Pin
=
GPIO_Pin_11;
//灯LED2对应引脚为PC11
GPIO_Initstructure.GPIO_Speed
=
GPIO_Speed_50MHz;
//GPIO速度50MHz
GPIO_Init(GPIOC,&GPIO_Initstructure);//用GPIO_InITstructure结构体参数,初始化GPIO
上述配置部分程序:开启C组GPIO时钟,使能GPIOC;并将C组第11号GPIO引脚指定为GPIO_Mode_Out_PP工作方式,速度为GPIO_Speed_50MHz。控制部分软件原理while(1)无限循环避免单片机程序跑飞GPIO_SetBits(GPIOC,GPIO_Pin_11)使对应端口输出高电平输出低电平:GPIO_ResetBits函数软件原理#include
"stm32f10x.h"//标准外设库头文件
int
main(void)
{
/*********************
LED配置开始*******************************/
//配置GPIO
GPIO_InitTypeDef
GPIO_Initstructure;
//定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//使能GPIOC时钟
GPIO_Initstructure.GPIO_Mode
=
GPIO_Mode_Out_PP;
//配置为输出模式
GPIO_Initstructure.GPIO_Pin
=
GPIO_Pin_11;
//灯LED2对应引脚为PC11
GPIO_Initstructure.GPIO_Speed
=
GPIO_Speed_50MHz;
//GPIO速度50MHz
GPIO_Init(GPIOC,&GPIO_Initstructure);//用GPIO_InITstructure结构体参数,初始化GPIO
/**********************LED配置结束******************************/
while
(1)//死循环,让程序持续运行
{
GPIO_SetBits(GPIOC,GPIO_Pin_11);
}
}程序考核任务提示:使GPIO输出低电平的库函数为GPIO_ResetBits在理解开发板原理图基础上,修改程序点亮灯LED4(更进一步:流水灯)3.GPIO输入实验演示输出:控制引脚输出高电平还是低电平,代表逻辑1和逻辑0输入:检测引脚的电平是低还是高按下USER1按键时,开发板上LED2点亮了再次按下USER2按键后,LED2又熄灭实验原理电路原理图当按键没被按下时,PC12引脚电平为高电平(3.3V)当按键按下后,PC12引脚电平为低电平(0V)软件原理#include
"stm32f10x.h"//标准外设库头文件
int
main(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;
//定义GPIO结构体
/*********************
LED2配置*******************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Mode
=
GPIO_Mode_Out_PP;
//配置为输出模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed
=
GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//调用库函数GPIO_Init()初始化GPIO
/**********************按键USER1配置******************************/
GPIO_InitStructure.GPIO_Mode
=
GPIO_Mode_IPU;//配置为上拉输入
GPIO_InitStructure.GPIO_Pin
=
GPIO_Pin_12;
GPIO_Init(GPIOC,
&GPIO_InitStructure);
/**********************按键USER2配置******************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,
ENABLE);
GPIO_InitStructure.GPIO_Mode
=
GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin
=
GPIO_Pin_9;
GPIO_Init(GPIOB,
&GPIO_InitStructure);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)==0)//如果USER1按下,即判断PC12输入电平是否为低电平
{
GPIO_SetBits(GPIOC,GPIO_Pin_11);//PC11输出高电平,点亮LED2
}
else
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0)//如果USER2按下,即判断PB11输入电平是否为低电平
{
GPIO_ResetBits(GPIOC,GPIO_Pin_11);
//PC11输出低电平,熄灭LED2
}
}
软件原理将PC12和PB9引脚配置为上拉输入模式因为C组GPIO时钟已经在第7行使能了,这里无需再次配置。配置部分包含GPIO输出部分和输入部分。输出部分在上一节已经介绍过,不再赘述。输入部分是两个按键(“USER1”和“USER2”按键)对应引脚的配置:(1)使能相应时钟(2)配置模式。控制部分原理关注点:GPIO_ReadInputDataBitGPIO_ReadInputDataBitGPIO_ReadInputDataBit:读取引脚的输入电平输入引脚为高电平:函数将返回1,输入引脚为低电平:则返回0。
程序考核任务修改程序,用按键USER3点亮LED灯LED3,按键USER4熄灭LED3。(更进一步:用按键控制流水灯流动方向)本章实验步骤及现象上一章已经学过?按下USER1按键时,开发板上LED2点亮了再次按下USER2按键后,LED2又熄灭硬件原理电路原理图当按键没被按下时,PC12引脚电平为高电平(3.3V)当按键按下后,PC12引脚电平为低电平(0V)#include
"stm32f10x.h"//标准外设库头文件
int
main(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;
//定义GPIO结构体
/*********************
LED2配置*******************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Mode
=
GPIO_Mode_Out_PP;
//配置为输出模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed
=
GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//调用库函数GPIO_Init()初始化GPIO
/**********************按键USER1配置******************************/
GPIO_InitStructure.GPIO_Mode
=
GPIO_Mode_IPU;//配置为上拉输入
GPIO_InitStructure.GPIO_Pin
=
GPIO_Pin_12;
GPIO_Init(GPIOC,
&GPIO_InitStructure);
/**********************按键USER2配置******************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,
ENABLE);
GPIO_InitStructure.GPIO_Mode
=
GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin
=
GPIO_Pin_9;
GPIO_Init(GPIOB,
&GPIO_InitStructure);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)==0)//如果USER1按下,即判断PC12输入电平是否为低电平
{
GPIO_SetBits(GPIOC,GPIO_Pin_11);//PC11输出高电平,点亮LED2
}
else
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==0)//如果USER2按下,即判断PB11输入电平是否为低电平
{
GPIO_ResetBits(GPIOC,GPIO_Pin_11);
//PC11输出低电平,熄灭LED2
}
}
上一章实验复习在main函数中加入一个死循环,不停检测USER1按键状态,再根据这个状态切换LED2的亮灭。这种方法称之为“查询”方式。这一章学习更高效的方法:中断法1.中断基础知识2.实验步骤及现象3.实验原理第四章 中断中断:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。1.中断基础知识正常函数调用流程voidFun1(){ ……}voidFun2(){ ……}voidFun3(){ ……}voidmain(){ Fun1(); Fun2();}“Fun3”虽然定义了,但是并不会起任何作用中断响应流程注意:中断函数不需要别的程序主动调用,满足一定条件时自动执行中断产生时间不确定,不像普通函数调用那样发生在预定的时间。中断:当出现合适条件时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。使用中断的条件:允许的中断通道有中断发生定义好的中断服务函数一旦满足,自动执行STM32中断系统STM32单片机支持84个中断通道,包括16个内核中断和68个可屏蔽中断通道那么多中断,谁先谁后?日常生活中,我们会不停的接收到各种中断信号,比如前面提到的烧水壶水烧开的信号、手机闹铃、火灾警报等等不同信号优先级是不同的NVIC嵌套向量中断控制器管理中断通道的模块——嵌套向量中断控制器NVICNVIC作用:控制中断的抢占优先级和响应优先级抢占优先级:一个低抢占优先级的中断程序,暂停来响应这个新的高抢占式优先级的中断,即所谓的中断嵌套。比如上课可能会被电话中断,但接电话过程中突发火灾会停止电话,而抓紧逃生。抢先优先级响应优先级:也叫“亚优先级”或“副优先级”响应优先级高的中断不会打断正在执行的响应优先级低的中断,只是优先响应前者。比如开会发言,下属已经开始发言,出于尊重,领导听完下属发言后再发言。例如,当抢占优先级相同、响应优先级不同的两个中断同时到达时,则优先处理响应优先级高的中断,处理完之后,再处理响应优先级低的。抢占优先级要高于响应优先级,故响应优先级也称之为“副优先级”。响应优先级优先级举例中断抢占优先级响应优先级A00B10C11假设有三个中断A、B、C,它们各自的优先级如下(编号越小,优先级越高):若正在执行C的中断服务函数,则它能被抢占优先级更高的A打断,由于B和C的抢占优先级相同,所以C不能被B打断。如果B和C的中断是同时到达的,则会优先响应B的中断服务函数。NVIC优先级分组STM32中可以有5种配置方式来确定不同中断的优先级,即STM32单片机可以分为0-4种优先级分组优先级分组抢占优先级响应优先级NVIC_PriorityGroup_00级抢占优先级0-15级响应优先级NVIC_PriorityGroup_10-1级抢占优先级0-7级响应优先级NVIC_PriorityGroup_20-3级抢占优先级0-3级响应优先级NVIC_PriorityGroup_30-7级抢占优先级0-1级响应优先级NVIC_PriorityGroup_40-15级抢占优先级0级响应优先级2.实验步骤及现象按下USER1按键时,开发板上LED2点亮了再次按下USER2按键后,LED2又熄灭硬件原理STM32单片机支持19个外部中断/事件请求(称之为“中断线”)但STM32单片机所有引脚(超过19个),都可以作为外部中断解决办法:多个引脚共用一个中断线STM32F103支持的19个中断线包括:中断线0~15:对应外部IO的输入中断中断线16:连接到PVD输出中断线17:连接到RTC闹钟事件中断线18:连接到USB唤醒事件中断线19:连接到以太网唤醒事件硬件原理只有15个中断线,如何应对所有GPIO引脚?每个中断线对应着7个GPIO端口所有GPIO组别的第0号引脚都可以触发外部中断线EXTI0通过配置来决定那个GPIO组别硬件原理使用中断两个基本条件:单片机允许的中断通道有中断发生有定义好的中断服务函数外部中断线中断通道中断服务函数名称中断线0EXTI0EXTI0_IRQHandler中断线1EXTI1EXTI1_IRQHandler中断线2EXTI2EXTI2_IRQHandler中断线3EXTI3EXTI3_IRQHandler中断线4EXTI4EXTI4_IRQHandler中断线5-9EXTI9_5EXTI9_5_IRQHandler中断线10-15EXTI15_10EXTI15_10_IRQHandler中断通道和中断服务函数按键“USER1”使用引脚PC12,其对应的中断服务函数是哪个?软件原理配置部分定义三个结构体,GPIO_InitTypeDef已讲过,用于GPIO配置的另外两个结构体将在后续中断配置中使用到,稍后进行具体讲解软件原理配置部分9-24行对引脚PC11、PC12的配置第19行中逻辑“或”操作,其含义是同时开启C组GPIO时钟和AFIO复用时钟因为PC12引脚这里除了IO功能,它还作为外部中断使用,所以需要开启AFIO复用时钟。软件原理配置部分定义中断线映射,将中断线12的中断源选择为C组GPIO端口,即PC12GPIO与外部中断线映射关系软件原理配置部分EXTI_Line:中断线号,使用PC12,设为EXTI_Line12EXTI_Mode:EXTI_Mode_Interrupt或EXTI_Mode_Event,作为外部中断设为EXTI_Mode_InterruptEXTI_Trigger:触发模式,EXTI_Trigger_Falling或EXTI_Trigger_Rising;按键没有摁下时PC12电平为高电平,摁下是电平变为低电平,选择下降沿触发EXTI_Trigger_Falling。EXTI_LineCmd:是否激活使能,ENABLE(使能)或DISABLE(失能)。软件原理NVIC配置中断优先级优先级分组抢占优先级响应优先级NVIC_PriorityGroup_00级抢占优先级0-15级响应优先级NVIC_PriorityGroup_10-1级抢占优先级0-7级响应优先级NVIC_PriorityGroup_20-3级抢占优先级0-3级响应优先级NVIC_PriorityGroup_30-7级抢占优先级0-1级响应优先级NVIC_PriorityGroup_40-15级抢占优先级0级响应优先级软件原理NVIC配置中断优先级在设定了NVIC分组基础上,37-41行先填充了结构体NVIC_Initstructure的参数,再在42行通过NVIC_Init将该结构体的参数配置到单片机寄存器,从而真正生效NVIC_InitstructureNVIC_Initstructure成员变量NVIC_IRQChannel:配置中断通道;PC12根据前面表格,使用的中断通道应为EXTI15_10。部分NVIC_IRQChannel可选值NVIC_Initstructure成员变量NVIC_IRQChannelPreemptionPriority:抢占优先级成员变量NVIC_IRQChannelSubPriority:响应优先级NVIC_PriorityGroup_4分组:抢占优先级可以为0-15,响应优先级只能为0。都为设0表示目前使用的中断为最高优先级。本实验只使用了一个中断,即使将优先级定为更低的优先级也不影响使用。但是如果比较复杂的单片机应用中有多个中断,开发者必须仔细安排好不同中断的优先级。小结PC12的中断模式设置为下降沿触发,使引脚PC12作为外部中断程序选择了NVIC分组,将PC12对应的外部中断配置好了优先级,并使能了该中断配置完成后,一旦PC12由高电平转换为低电平,CPU将自动执行对应的中断服务函数死循环与上一章GPIO实验不同,此循环中没有任何程序语句。CPU单纯等待中断发生,一旦相应外部中断产生即开始自动调用中断服务函数。复杂些的工程中,可以在死循环中执行其他程序,而不用不停查询按键状态。中断服务函数经过相应配置,按下“USER1”按键时,系统即进入EXTI15_10_IRQHandler中断服务函数。中断服务函数中断服务函数EXTI15_10_IRQHandler是中断线10至中断线15共同的中断服务函数,使用EXTI_GetITStatus函数判断是否中断线12(PC12)发生了中断。函数返回值为SET表示相应中断线发生中断,否则返回值为RESET。第50行等同于:“if(EXTI_GetITStatus(EXTI_Line12)==SET)”中断服务函数实现通过按键切换LED的效果:第一次摁下“USER1”键时,LED2被点亮;再次摁下“USER1”键,LED2被熄灭flagLed:用于记录LED灯状态的全局变量中断服务函数使用EXTI_ClearITPendingBit清除外部中断线12的中断标志位:避免CPU误认为中断线1再次发生了中断程序考核任务修改程序:使用外部中断方式,实现用按键USER2完成LED灯LED4状态的切换:第一次按下点亮LED4,再次按下熄灭LED4,以此类推……USART简介串口发送实验串口接收实验第五章同异步串行收发器(USART)计算机如何Say“Hi”?收到下列信息代表什么含义?计算机如何Say“Hi”?如果事先约定好,把3.3V看成逻辑1,0V看成逻辑0,每1秒传输一位,信息以一个字节(8位)为单位传输:电压变化为二进制的“01001000”,对应十六进制0x48,对应十进制72。ASCII码,大写字母“H”的ASCII码是72。当再接收到代表“i”的二进制“01011001”时,就接收到信息“Hi”了。通过上述简化例子,可知:在通信之前通行双方应该约定一定的规则(通信协议)
以字节为单位传输,每秒传输一个逻辑位……每秒传输多少个逻辑位也称之为波特率,表示串行数据的传输速率。1.USART简介同/异步串行收/发器(USART),简称串口:实现通信功能的外设,具有同步和异步模式。异步传输:主机只管发送数据,从机不一定在主机发送数据的同时接收数据,收发不一定同步。主要使用方式。
邮递员向邮箱投递了一封信,或许你三天后才打开拿出来。同步传输就是指收发数据是同步进行的。USART使用注意事项使用简单:用户只需要将信息以字节为单位输入USART即可完成发送,接收时对于用户来说也是收到完整的一个个字节。不需要分析电平变化。只需要关注接收(RX)、发送(TX)和地(GND):发送对接收,接收对发送,即可实现相互通信。2.串口发送实验2.串口发送实验实验原理两种232连接座以及引脚编号:公头(左)和母座(右)实际工程中常会根据一些通信标准将STM32串口的电压进行转换后再通信,从而达到延长通信距离、增强抗干扰性等目的。这里我们要介绍一种常见的串口通信标准——RS232,除此之外,工业中常用的串口通信标准还有RS485、RS422等。实验原理两种232连接座以及引脚编号:公头(左)和母座(右)引脚编号引脚定义说明1DCD载波检测2RXD接收数据3TXD发送数据4DTR数据终端准备好5GND信号地6DSR数据准备好7RTS请求发送8CTS清除发送9RI振铃提示实验原理RS232能够延长通信距离、增强抗干扰性,因为,RS232增强了传输信号的电压。单片机输出的通信电平称之为“TTL电平”,转换之后称之为“232电平”。TTL电平:3.3V表示高电平(逻辑1),0V表示低电平(逻辑0)。232电平则规定逻辑1为-3V~-15V,逻辑0为+3~+15V,-3V~+3V之间的电压则为非法状态。实验原理电平状态电压0+3~+15V1-15~-3V非法状态-3~+3V232电平232发送信号过程——(1)单片机的串口(USART)会将要发送的一个字节(共8位,D0-D7表示)处理成串行一位一位的TTL电平信号(2)该信号通过收发器(MAX232等芯片)再转换为232电平信号,最终传输至接收设备。STM32单片机接收信号的流程则刚好反过来。实验原理0x4801001000单片机的USART相关引脚实验原理芯片数据手册中PA9和PA10引脚说明实验原理串口电平转换电路实验原理软件原理定义了一个USART_InitTypeDef类型结构体,用于后续的串口配置开启了GPIOA、复用时钟AFIO和串口USART1的时钟,参数中“|”表示按位运算的或逻辑运算,意思是这几个时钟同时被激活使能PA9和PA10作为串口1的收发引脚,因此激活GPIOA的时钟这两个引脚这里不是作为GPIO(通用输入输出),而是作为串口的相关引脚,因此还使能了复用时钟AFIO软件原理将相应串口的设置恢复为默认值,即串口复位PA9用作发送引脚,配置为复用推挽输出模式;PA10用作接收引脚,配置为浮空输入模式软件原理成员变量1:USART_BaudRate是串口波特率,表示了串行数据的传输速率。通信双方波特率应该一致,否则通信将失败。成员变量2:USART_HardwareFlowControl,硬件流控制是专门用于连续数据流速率的控制,防止收发缓存溢出的一种手段,一般都选择选择无硬件流控制,即USART_HardwareFlowControl_None软件原理成员变量3:USART_Mode串口模式选择,串口可以选择配置为发送模式(USART_Mode_Tx)或接收模式(USART_Mode_Rx),第31行设既可以接收又可以发送。软件原理成员变量4,5,6:USART_Parity、USART_StopBits、USART_WordLength分别为奇偶校验位,停止位,字长。两个串口设备相互通信时奇偶校验、停止位和字长都应该一致,否则通信将失败。第32-34行将这几个变量设置为最常见的无奇偶校验位、一位停止位和8位字长。第35行将填充完员变量的结构体USART_Initstructure的成结构体成员变量设置到相应寄存器,真正发挥作用。软件原理USART_Cmd函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全生产制度汇编
- 睡眠健康课件图
- 吉林省长春吉大附中力旺实验中学2026届中考语文仿真试卷含解析
- 药店危险品培训管理制度
- 图书室读物入库管理制度
- (2025年)浙江省金华市辅警协警笔试笔试模拟考试试题含答案
- 静脉药物推注的安全观察要点
- 静脉输注并发症预防策略
- 尿失禁患者护理干预策略查房
- 术后恢复期患者评估护理查房
- 江西省宜春市各县区乡镇行政村村庄村名明细及行政区划代码
- 露天煤矿生产安全安全事故应急预案
- 土木工程概论全套课件完整版电子教案最新板
- 超星尔雅学习通《声光影的内心感动电影视听语言(四川大学)》章节测试答案
- 上教社深圳版小学英语1-6年级单词汇总
- 微生物细胞的破碎表现和测定
- 医养结合养老院项目可行性研究报告写作参考范文
- 四川省房屋建筑工程和市政基础设施工程竣工验收报告.docx四川省房屋建筑工程和市政基础设施工程竣工验收报告
- 物理9-速度变化快慢的描述――加速度(习题)导学案
- 电化学储能项目建设工程监理组织与规划(参考)
- 高低压配电柜安装方案
评论
0/150
提交评论