单片机原理及应用实践教程 课件全套 徐锋 第1-8章 单片机基本原理 -单片机应用系统设计_第1页
单片机原理及应用实践教程 课件全套 徐锋 第1-8章 单片机基本原理 -单片机应用系统设计_第2页
单片机原理及应用实践教程 课件全套 徐锋 第1-8章 单片机基本原理 -单片机应用系统设计_第3页
单片机原理及应用实践教程 课件全套 徐锋 第1-8章 单片机基本原理 -单片机应用系统设计_第4页
单片机原理及应用实践教程 课件全套 徐锋 第1-8章 单片机基本原理 -单片机应用系统设计_第5页
已阅读5页,还剩460页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学习内容单片机基本原理单片机程序设计I/O口控制与Proteus仿真定时/计数器与中断串口通信I/O口扩展及应用单片机与D/A转换、A/D转换单片机应用系统设计学习目的通过本课程的学习,使学生从理论与实践相结合的角度,掌握单片机的核心硬件架构、指令系统与汇编程序设计方法,理解存储器、I/O接口、中断与定时器等关键模块的工作原理,培养学生单片机应用系统的软硬件设计、调试与开发能力,以及综合运用单片机知识解决实际工程问题的能力,服务于应用型人才的培养目标。第一章

单片机基本原理目录CONTENTS01单片机概述定义、发展历程、分类与典型应用场景04引脚与功能主要引脚定义、时钟与时序电路03单片机的“语言”——二进制计算机底层逻辑探秘:原码、反码与补码原理028051单片机组成内部结构、存储器组织与I/O口原理05复位与工作条件复位电路、时钟电路与最小系统06课程总结与回顾本章核心知识点梳理与关键技术难点回顾学习目标01认知基础·发展脉络了解单片机的定义、诞生背景与发展历程,掌握单片机技术在当前电子工程领域的技术现状与演进趋势。02分类梳理·应用场景掌握单片机的常见分类方式(如按位数、指令集、存储器结构等),熟悉单片机在工业控制、消费电子、智能设备等领域的典型应用。03结构解析·8051内核深入理解8051单片机的内部结构组成,包括CPU、存储器、I/O口、定时器等核心模块的协同工作原理。04引脚功能·最小系统熟练掌握8051单片机主要引脚的功能定义(电源、时钟、复位、I/O、控制引脚等),理解时钟电路与复位电路的工作机制。1.1单片机概述▍单片机的定义单片机(SingleChipMicrocomputer),又称微控制单元(MCU)或嵌入式微控制器。它是一种将计算机系统的主要功能部件高度集成在一块芯片上的微型计算机。一句话总结:单片机=完整的、超小型计算机系统CPU中央处理器负责指令执行、逻辑运算与系统控制的核心单元。RAM随机存储器用于临时存储运行中的数据和变量,掉电数据丢失。ROM程序存储器永久存储用户编写的程序代码,掉电数据不会丢失。定时/计数器实现精确定时、频率测量或对外部事件进行计数。中断控制器实时响应并处理内部/外部的紧急事件,提高运行效率。I/O输入输出口单片机与传感器、执行器等外部设备交互数据的通道。单片机的技术特点高集成度将CPU、RAM、ROM等核心部件集成于单芯片,体积小,重量轻,便于嵌入式安装。高可靠性内部采用总线结构,大幅减少外部连线;抗干扰能力强,适合工业现场等恶劣环境。高性价比在单芯片上集成了大量常用功能模块,功能强大但价格低廉,非常易于产品化落地。控制功能强指令系统丰富,拥有强大的位处理和I/O口逻辑操作能力,特别适合各类工业控制场景。易于开发系统扩展和配置规范,软硬件接口标准化程度高,容易构成各种规模的嵌入式应用系统。单片机的广泛应用单片机已渗透到我们生活的方方面面,作为核心计算单元驱动着现代智能设备的运行。实时工控·工业自动化产线智慧生活·智能家居中控智能仪表领域数字万用表、医疗监测仪、示波器等高精度测量设备的核心控制。网络通信设备路由器、交换机、Modem等网络设备的数据处理与协议解析。卫星导航系统GPS定位终端、无人机飞控系统、车载导航的实时路径规划。智能家用电器智能冰箱、变频空调、全自动洗衣机的程序控制与状态监测。便携消费电子智能手机周边、智能手环、教育机器人及各类智能玩具。万物互联(IoT)智能传感器节点、环境监测模块、全屋智能家居控制中心。计算机的经典模型:冯·诺依曼结构💡“计算机之父”的核心贡献•提出了“程序存储+二进制运算”的核心思想。•奠定了现代计算机的经典结构,包含五大基本组成部分。🔧五大核心组成部件运算器ALU负责算术与逻辑运算控制器CU指挥各部件协调工作存储器Memory存储程序指令与数据输入设备向计算机输入信息输出设备输出处理结果信息图示:冯·诺依曼模型单片机:冯·诺依曼结构的微型实现01/核心原理·一脉相承现代计算机(包括单片机)的基本工作原理高度统一,都是基于“存储程序”和“程序控制”这两大核心思想构建的,这是所有可编程计算设备的底层逻辑基石。02/技术定义·微型本质超大规模集成电路(VLSI)一个高度集成的可编程半导体芯片,集成度极高。完整的冯·诺依曼系统具备运算、控制、存储、输入输出等完整的计算机功能。单硅片的微型化集成将冯·诺依曼模型的五大核心部件浓缩在单一硅片之上。计算机为何使用二进制?物理实现简单数字电路中,用高低电平两种状态就可以完美表示0和1,硬件实现成本低且稳定。逻辑运算基础二进制与布尔代数完美契合,是构建与、或、非等逻辑门电路,进而实现复杂运算的核心基础。抗干扰可靠性高系统仅需识别两个稳定状态,受环境噪音和电压波动的干扰较小,数据传输与存储的出错率更低。图示:半加法器逻辑门电路(异或门&与门)带符号数的表示:原码、反码、补码核心问题:如何在计算机的二进制世界中高效表示并运算负数?原码•规则:最高位为符号位(0=正/1=负),其余位为数值绝对值。•局限:“0”有+0和-0两种冗余表示;减法运算需单独设计逻辑。反码•正数:反码与原码完全相同。•负数:符号位保持不变,对原码的数值位按位取反。•局限:仍存在正负零的双重表示问题。补码•地位:计算机中带符号数运算的绝对标准。•规则:正数同原码;负数为其“反码加1”。•优势:统一了“0”的表示;将减法转换为加法运算,简化硬件。8位二进制数的世界▎核心范围定义-128~+127共256个离散整数值在计算机系统中,8位带符号数统一采用补码进行存储与运算。这一设计完美解决了原码表示中“+0”与“-0”并存的逻辑歧义,实现了零的唯一表示(00000000),并有效扩展了负数的表示边界。▎原码/反码/补码对照表真值原码(Bin)反码(Bin)补码(Bin/Hex)+127011111110111111101111111(7FH)+1000000010000000100000001(01H)±0100000001111111100000000(00H)-1100000011111111011111111(FFH)-12711111111B10000000B100000001(81H)

注:-128是补码的特殊值,没有对应的原码和反码表示。-128-无--无-

10000000B(80H)单片机发展简史01/初始完善阶段(1971-1982)1971·Intel4004:世界首个4位微处理器,集成度约2000晶体管,开启了微处理时代。1974·TITMS1000:首个通用微控制器系列,内置ROM/RAM,专为工业与消费控制场景设计。1983-1989年为单片机巩固发展期,16位机(如MCS-96、MSP430等)涌现,8051系列持续迭代,性能、集成度大幅提升,拓展至高端测控领域。02/巩固发展阶段(1983-1989)03/全面发展阶段(1990至今)位数演进:4位→8位→16位→32位→64位

应用扩展:工业控制→消费电子→物联网(IoT)→AI边缘计算核心趋势:性能飞跃从单一的逻辑控制芯片,演变为具备高算力、低功耗的智能系统核心。常见的单片机类型51单片机经典的8位单片机,是嵌入式学习的入门基础,市场保有量大,资料丰富,适合初学者打牢根基。Arduino单片机基于AVR内核,以简单易用的IDE和丰富的扩展库闻名。无需复杂配置,非常适合快速原型验证与创意实现。DSP数字信号处理器专为高速数字信号处理设计,拥有强大的运算能力。广泛应用于音频处理、图像处理、通信等对实时性要求高的领域。STM32单片机基于ARMCortex-M内核的32位单片机,性能强大且外设资源极其丰富。是当前工业控制与嵌入式开发的主流首选。1.2单片机的内部结构51单片机组成CPU(中央处理器)负责指令的读取、译码和执行,是单片机的运算与控制核心。程序存储器(ROM/Flash)非易失性存储介质,专门用于存储用户编写的应用程序代码。数据存储器(RAM)易失性存储器,用于暂存程序运行过程中产生的临时变量和数据。特殊功能寄存器(SFR)映射内部硬件状态,通过读写SFR可控制定时器、串口、I/O等功能模块。I/O端口(P0-P3)包含P0、P1、P2、P3共4个8位双向端口,是单片机与外部设备通信的物理接口。定时器/计数器核心外设之一,可实现精确的定时延时,或对外部脉冲信号进行计数统计。串行通信口(UART)实现单片机与计算机或其他外设的异步串行数据传输,是调试与通信的重要通道。中断系统支持响应内部或外部的紧急事件请求,暂停当前任务转而去处理中断服务程序。时钟电路ROM/EPROM/FLASHRAM128B+特殊功能寄存器(21个)定时/计数器(1个)全双工串口(1个)中断系统

(5中断源1优先级)总线控制P0、P1、P2、P3口1.2.151单片机基本组成结构1.2.251单片机内部结构8051单片机的基本组成结构1.运算器算术逻辑单元(ALU)为核心累加器ACC:存储操作数、中间结果寄存器B:乘除运算专用暂存器、程序状态字(PSW)功能:算术运算、逻辑运算、位运算、数据传输程序状态字(PSW)CY进位/借位标志AC辅助进位标志F0用户标志位RS1工作寄存器组选择RS0工作寄存器组选择OV溢出标志-保留P奇偶标志PSW.7PSW.6PSW.5PSW.4PSW.3PSW.2PSW.1PSW.0CYACF0RS1RS0OV-P表1.2PSW标志位CY与ACCY(进位/借位标志)加减运算最高位有进位/借位时置位操作中作为累加位AC(辅助进位标志)低4位向高4位进位/借位时置用于BCD码调整RS1、RS0与工作寄存器组RS1RS0工作寄存器组000组(00H-07H)011组(08H-0FH)102组(10H-17H)113组(18H-1FH)

表1.3工作寄存器组OV溢出标志与P奇偶标志V(溢出标志)有符号数运算溢出标志超出-128~+127范围时置P(奇偶标志)累加器中1的个数为奇数时置用于串行通信奇偶校验2.控制器定时与控制电路

指令寄存器IR、指令译码器ID

程序计数器PC

堆栈指针SP、数据指针DPTR功能:取指、译码、产生控制信号3.片内存储器哈佛结构:程序与数据物理独立8051:4KBROM+256BRAM128B数据存储器128B特殊功能寄存器不同芯片的ROM类型8031无ROM,8751有EPROM等(1)片内程序存储器工作寄存器区(00H~1FH)

可位寻址区(20H~2FH)

数据缓冲区(30H~7FH)堆栈区(由SP动态管理)8051单片机的内部结构(2)片内数据存储器片内数据存储器的容量为128B,地址范围为00H~7FH。使用时可分为4个区,即工作寄存器区、可位寻址区、数据缓冲区和堆栈区。(3)特殊功能寄存器(SFR)地址80H~FFH(高128B)只能直接寻址特别地,既可字节寻址又可位寻址的条件:地址末位为0H或8H包括:P0~P3、PSW、ACC、B、IE、IP、TMOD、TCON、SCON、SBUF、TH0/TL0、TH1/TL1、DPTR、SP、PCON等DPTR与SP数据指针DPTR:16位,由DPH和DPL组成

访问片外64KBRAM/ROM堆栈指针SP:8位,指向栈顶入栈:SP+1→压入数据出栈:弹出数据→SP-1程序计数器PC16位,指向下一条指令地址自动递增或通过跳转/调用指令修改,不可直接编程寻址范围:64KB1.程序存储器配置EA=1:先片内(0000H~0FFFH)

后片外(1000H~FFFFH)EA=0:全片外(0000H开始)特殊单元:

0000H~0020H:复位入口

0003H~002AH:中断入口地址区1.2.351单片机的存储器(a)程序存储器地址(b)特殊单元2.数据存储器配置8051单片机的128B片内数据存储器在使用时可分为4个区,即工作寄存器区、可位寻址区、数据缓冲区和堆栈区。8051单片机数据存储器配置(1)工作寄存器区。地址为00H~1FH,每个工作寄存器组都包含8个8位寄存器,它们提供了高速的数据存储和访问,可以在程序执行过程中频繁地读写数据。组号RS1RS0R7R6R5R4R3R2R1R000007H06HO5H04H03H02H01H00H1010FH0EH0DH0CH0BH0AH09H08H21017H16H15H14H13H12H11H10H3111FH1EH1DH1CH1BH1AH19H18H寄存器组(2)可位寻址区(20H~2FH)16字节,128位,每位可单独访问加上SFR中的83位,共211个可寻址位每个字节地址都有对应的位地址8051单片机的21个特殊功能寄存器中有11个是可以位寻址的可位寻址区(20H~2FH)

字节地址位地址D7D6D5D4D3D2D1D020H07H06H05H04H03H02H01H00H21H0FH0EH0DH0CH0BH0AH09H08H22H17H16H15H14H13H12H11H10H23H1FH1EH1DH1CH1BH1AH19H18H24H27H26H25H24H23H22H21H20H25H2FH2EH2DH2CH2BH2AH29H28H26H37H36H35H34H33H32H31H30H27H3FH3EH3DH3CH3BH3AH39H38H28H47H46H45H44H43H42H41H40H29H4FH4EH4DH4CH4BH4AH49H48H2AH57H56H55H54H53H52H51H50H2BH5FH5EH5DH5CH5BH5AH59H58H2CH67H66H65H64H63H62H61H60H2DH6FH6EH6DH6CH6BH6AH69H68H2EH77H76H75H74H73H72H71H70H2FH7FH7EH7DH7CH7BH7AH79H78H数据缓冲区与堆栈区数据缓冲区:30H~7FH(80B)自由存储变量、数组、中间结果堆栈区SP指向栈顶

复位后SP=07H建议设为30H以上避免冲突后进先出(LIFO)

1.2.4I/O口结构原理INT0:0003H~000AHT0:000BH~0012HINT1:0013H~001AHT1:001BH~0022H串口:0023H~002AH通常存放LJMP指令跳转至实际服务程序P1口结构准双向口读锁存器vs读引脚输入前必须先写“1”

P1口某只引脚的内部结构P0口结构作GPIO:开漏输出,需上拉电阻

作地址/数据总线:真正双向口控制信号C控制MUX切换

P0口某只引脚的内部结构P2口结构准双向口作GPIO或高8位地址总线控制信号C切换MUX

P2口某只引脚的内部结构P3口结构准双向口第一功能:GPIO第二功能如表所示

P3口某只引脚的内部结构端口引脚功能名称功能说明P3.0RXD串行数据接收P3.1TXD串行数据发送P3.2外部中断0申请P3.3外部中断1申请P3.4T0定时/计数器0的外部输入P3.5T1定时/计数器1的外部输入P3.6外部RAM写选通P3.7外部RAM读选通

1.2.551单片机引脚功能总线型8051单片机引脚排列(40引脚)

四个8位端口:P0、P1、P2、P3(共32引脚)控制引脚:ALE、PSEN、EA、RST时钟引脚:XTAL1、XTAL2电源引脚:VCC、VSS总线型8051单片机的引脚排列

ALE/PROG引脚ALE/PROG——地址锁存控制

系统扩展时锁存P0口输出的低8位地址

以晶振频率的1/6输出固定正脉冲,可用作外部时钟

内部Flash编程时输入编程脉冲

访问片外数据存储器时会跳过一个ALE脉冲

PSEN与EA引脚PSEN:片外程序存储器读选通(低电平有效)EA/VPP

EA=高电平:从片内程序存储器开始读

EA=低电平:仅访问外部程序存储器

编程时接高电压(VPP)

RST与时钟引脚RST/VPD:高电平持续两个机器周期以上→复位

电源故障时可作为备用电源输入XTAL1/XTAL2:内部时钟:外接晶振和电容

外部时钟:接外部时钟信号

1.2.651单片机的时钟与时序1.时钟电路内部时钟源和外部时钟源内部高增益反相放大器+外部晶振→自激振荡器常用晶振:12MHz、11.0592MHz

时钟源可选:内部振荡器+晶振外部时钟源输入2.时序振荡周期:晶振频率的倒数时钟周期:振荡周期×2机器周期:12个振荡周期(6个时钟周期)指令周期:1~4个机器周期

例:12MHz晶振→机器周期=1μs8051时钟信号双周期指令的时序单周期指令的时序单周期指令:一个机器周期内完成双周期指令:两个机器周期,ALE信号有效4次访问片外数据存储器时,ALE信号可能出现非周期现象访问片外数据存储器的双周期指令的时序

1.2.751单片机的复位复位目的:使单片机或系统中的其他部件进入确定的初始状态。

复位触发条件:

1.通过RST引脚实现。

2.需保持两个机器周期以上的高电平。例如:12MHz晶振时,高电平需持续≥2μs单片机的复位一般有三种方式:上电自动复位、按键电平复位和外部脉冲复位(a)上电复位电路(b)按键复位电路

复位后的程序执行起点关键寄存器变化:PC=0000H程序从0000H单元开始执行。复位后的存储器与寄存器状态片内数据存储器:初始为随机值运行中复位→不改变数据存储器内容

·P0~P3=FFH(可输入/输出)·SP=07H(第一个堆栈内容写入08H)·IP、IE、PCON有效位=0

中断:低优先级、关闭

串行通信:波特率不加倍·PSW=00H(当前工作寄存器组0)特殊功能寄存器:

8051单片机复位后各寄存器的内容寄存器复位后内容寄存器复位后内容寄存器复位后内容寄存器复位后的内容ACC00HB00HPSW00HSP00HTL000HTH000HTL100HTH100HDPTR0000HP0~P3FFHSCON00HTMOD00HIPxxx00000BIE0xx00000BPCON0xxx0000BTCON00H感谢观看THANKSFORWATCHING第二章

单片机程序设计目录CONTENTS01汇编程序设计基础指令格式、寻址方式、8051指令系统与伪指令04单片机开发平台硬件平台与KeilμVision软件开发平台03C51程序设计数据类型、运算量、绝对地址访问、运算符与函数028051单片机组成汇编程序设计方法及任务训练05工程实践复位电路、时钟电路与最小系统06课程总结与回顾本章核心知识点梳理与关键技术难点回顾学习目标01指令系统掌握·汇编基础理解51单片机汇编指令的格式、分类与寻址方式,掌握常用伪指令及汇编程序设计方法。02

C51语言应用·编程进阶掌握C51语言的数据类型、运算量、绝对地址访问及函数结构,能够编写简单C51程序。03开发平台熟练·工具链整合熟悉单片机硬件开发平台与KeilμVision软件平台,能够独立完成项目创建、编译、调试与下载。。04工程实践落地·双语言编程通过汇编程序训练与第一个C51程序任务,具备初步的单片机程序设计与调试能力。机器语言:二进制代码,机器直接执行汇编语言:用助记符表示指令,如MOV、ADD特点:与硬件紧密相关,执行效率高适合底层驱动、电机控制、传感器接口等与高级语言对比:C语言更抽象,汇编更直接控制硬件2.1单片机汇编程序设计汇编语言与机器语言格式:[标号:]助记符[目的操作数,源操作数][注释]示例:LOOP:MOVA,#7FH;A←7FH字段说明:

标号:地址标志,如LOOP

助记符:操作类型,如MOV

操作数:数据或地址,如A、#7FH注释:以“;”开头注意:强调标号后必须加冒号,注释提高可读性。2.1.151单片机汇编指令格式操作数类型:

A、Rn、@Ri、direct、#data、#data16、bit、addr11/16、rel

等符号说明:@:间接寻址#:立即数(X):X中的内容→:传送方向立即数表示:二进制:10001111B十进制:88D或66十六进制:78H、0A8HASCII:'A'操作数类型与符号2.1.2寻址方式概述

理解寻址方式的两个角度1.直接vs间接2.寻址空间:RAM、ROM、SFR分类:

数的寻址:立即、寄存器、存储器(直接、间接、变址)、位寻址指令的寻址:绝对寻址、相对寻址1.立即数寻址(直接+ROM)

操作数为常数,只能作为源操作数格式:#data示例:MOVA,#20H功能:将立即数20H存入累加器A注:区分“#20H”与“20H”的区别(常数vs地址)。2.寄存器数寻址(直接+RAM)操作数在寄存器中,如R0~R7、A、DPTR示例:MOVA,R0

功能:将R0中的内容传送到A3.存储器数寻址——直接寻址直接寻址(直接+RAM)指令中直接给出存储单元地址

示例:MOVA,20H

功能:将片内RAM20H单元内容传送到ASFR也可直接使用名称,如MOVA,P0注:“20H”是地址,不是立即数存储器数寻址——寄存器间接寻址寄存器间接寻址(间接+RAM)地址存放在寄存器中,格式:@Ri、@DPTR示例:MOVA,@R1若R1=80H,片内RAM80H单元内容=20H,则A=20H注:R0、R1用于片内RAM,DPTR用于片外。变址寻址(间接+ROM)地址=基址+变址基址:DPTR或PC变址:A示例:MOVCA,@A+DPTR若DPTR=2000H,A=05H,则访问程序存储器2005H单元4.位寻址(直接+RAM)操作数为位地址

示例:MOVC,30H

位地址表示方式:直接地址:50H

字节地址带位:30H.6SFR带位:P1.1

位符号:TR151单片机有位处理器,适合布尔运算5.指令寻址(绝对寻址与相对寻址)绝对寻址:提供16位或11位目的地址如LJMPaddr16相对寻址:当前PC+偏移量rel如SJMPrel(rel范围:-128~+127)计算示例:1230H:SJMP46H→PC=1230H+2+46H=1278H2.1.38051汇编指令系统格式:MOV目的操作数,源操作数常见组合:·MOVA,Rn·MOVRn,#data·MOVdirect,A·MOV@Ri,direct·MOVDPTR,#data16注意:不能同时出现两个Rn或两个@Ri1.片内RAM传送指令MOV2.片外RAM与ROM传送指令MOVX(片外RAM):·MOVXA,@DPTR·MOVX@Ri,AMOVC(程序存储器):·MOVCA,@A+DPTR·MOVCA,@A+PC示例:将程序存储器1011H内容传送到片内30HMOVC用于查表,MOVX用于扩展RAM。3.程序存储器传送指令MOVC程序存储器传送指令只有两条:一条用DPTR基址变址寻址;一条用PC基址变址寻址(地址增长)①MOVCA,@A+DPTR;A←(A+DPTR),读程序存储器。②MOVCA,@A+PC;A←(A+PC

)将程序存储器单元送到片内数据存储器单元MOVR7,#255DEL1:MOVR6,#255DEL2:DJNZR6,DEL2DJNZR7,DEL1延时≈0.13秒4.减1不为零转移指令DJNZ减1不为零转移指令DJNZ格式:DJNZRn,relDJNZdirect,rel功能:先减1,若不为零则转移延时示例(12MHz晶振,1μs/机器周期):```asmMOVR7,#255DEL1:MOVR6,#255DEL2:DJNZR6,DEL2DJNZR7,DEL1```延时≈0.13秒2.1.4伪指令伪指令:控制汇编过程,不生成机器码常见伪指令:ORG、DB、END示例:ORG1000HDB34H,0DEH,"A","B"END功能:定义起始地址、存储数据、结束汇编常用伪指令详解伪指令功能示例:ORG设置起始地址ORG0030HDB定义字节数据DB12H,"A"END结束汇编ENDORG可多次使用,地址由小到大END只能有一个,后续代码不处理2.1.5汇编程序设计步骤1.分析问题,明确目标2.建立数学模型3.绘制流程图4.编写代码5.调试完善算法+数据结构=程序程序结构——顺序与分支顺序结构:按地址顺序执行分支结构:根据条件选择执行路径流程图符号:开始框、判断框、处理框、流向线顺序结构的流程图基本双分支结构的流程图程序结构——循环与子程序循环结构:重复执行某段代码示例:DJNZR6,DE2子程序:模块化复用代码

使用RET返回

注意现场保护(PUSH/POP)(a)先循环后判断(b)先判断后循环子程序参数传递方式传递方式适用场景寄存器:数据量小MOVA,#data存储器:数据量大参数表+指针堆栈:子程序嵌套PUSH/POP汇编程序示例ORG0000HLJMPMAINORG0030HMAIN:SETBP1.0CALLDEL1SCLRP1.0CALLDEL1SAJMPMAIN功能:输出周期为2s的方波信号2.2C51程序设计C语言特点:

·简洁、运算符丰富、数据结构灵活

·可结构化、模块化编程

·可移植性强、目标代码高效C语言=高级语言+低级硬件控制能力C程序结构与规则每个变量先声明后使用语句以分号结尾注释://或/**/花括号对齐,层次清晰一个程序必须有一个main()函数C51语言C51与标准C的区别数据类型无位类型支持bit,sbit,sfr存储器访问通用支持多种存储类型中断服务不支持支持interrupt主函数可返回通常死循环C51语言优点编程时无须考虑不同存储器的寻址和数据类型等细节问题。具有良好的模块化结构。丰富的子程序库可供直接引用。C51语言和汇编语言可以交叉使用。2.2.2C51语言的数据类型C51语言的基本数据类型有字符型char、短整型short、整型int、长整型long、浮点型float和双精度型double基本数据类型名称长度取值范围unsignedchar无符号字符型1字节0~255signedchar有符号字符型1字节-128~+127unsignedint无符号整型2字节0~65535signedint有符号整型2字节-32768~+32767unsignedlong无符号长整型4字节0~4294967295signedlong有符号长整型4字节-2147483648~+2147483647float浮点型4字节±1.175494E-38~±3.402823E+38bit位型1位0或1sbit特殊位型1位0或1sfr8位特殊功能寄存器1字节0~255sfr1616位特殊功能寄存器2字节0~65535C51的基本数据类型

C51语言的组合数据类型

(1)数组:一维数组,字符数组。(2)结构。将若干不同类型的变量结合在一起而形成的一种数据集合体。组成结构的各个变量称为结构元素或成员。(3)联合体。各个变量在内存中都从同一个地址开始存储(4)枚举。列出该类型变量的所有可取值。

组合数据类型——数组

一维数组定义:类型数组名[常量表达式];初始化:charNavi[6]={'F','L','O','W','E','R'};引用:数组名[下标],下标从0开始字符数组可用字符串初始化:charstr[10]="Hello";

结构体、联合体、枚举类型关键字内存分配结构体(struct)

各成员独立分配联合体(union)

所有成员共享同一地址枚举(enum)

整型常量集合示例:struct{inta;charb;}s1;union{inti;floatf;}u1;enumweek{Sun,Mon,Tue};

C51扩展类型bit:可移位地址的位变量sbit:固定地址的位变量(如P1.0)sfr:8位特殊功能寄存器Sfr16:16位特殊功能寄存器(如DPTR)示例:sfrP1=0x90;sbitLED=P1^0;bitflag=0;

数据类型转换

隐式转换优先级:bit→char→int→long→float↓unsigned

强制转换:使用(类型)进行人为转换示例:unsignedchara=100;intb=a+1000;//自动转为intfloatc=(float)a/3.14;```2.2.3C51语言的运算量整型常量:

十进制:123,-56十六进制:0x12长整型:123L浮点型常量:定点形式:0.123指数形式:123.456e-31.常量——整型与浮点型字符常量与字符串常量

字符常量:单引号,如'a',占1字节字符串常量:双引号,如"A",占2字节(含\0)字符ASCII码值!33048149957A65B66a97b98转义字符含

义ASCII码(十六进制数)\

0空字符(null)00H\

n换行符(LF)0AH\

r回车符(CR)0DH\

t水平制表符(HT)09H\

b退格符(BS)08H\

f换页符(FF)0CH\

‘单引号27H\

”双引号22H\

\反斜杠5CH2.变量

[存储种类]数据类型[存储类型]变量名[=初值];示例:autounsignedchardatavar1=10;staticintxdatavar2;externfloatvar3;定义格式

存储种类

种类关键字作用域生命周期

自动auto函数内函数调用期间外部extern多文件程序全程静态static函数内/文件内程序全程寄存器register函数内函数调用期间register变量建议编译器存入寄存器,不保证一定分配存储器类型描

述data变量位于片内RAM低128B空间,直接寻址访问,速度快bdata变量位于片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问idata变量位于片内RAM256B空间,用Ri寄存器间接寻址访问pdata变量位于片外RAM低256B空间,用Ri间接访问xdata变量位于片外RAM64KB空间,用DPTR间接访问code变量位于程序存储器ROM64KB空间,基址变址寻址访问C51的存储器类型描述存储器类型存储器类型示例chardatavar1;//片内低128Bintidatavar2;//片内256Bfloatxdatavar4;//片外RAMintcodevar5;//程序存储器unsignedcharbdatavar6;//可位寻址区省略存储器类型时,按默认存储模式分配指针变量概述指针:变量的地址·指针变量:存储地址的变量取地址运算符:&指针运算符:*示例:inta=10;int*p=&a;//p指向a*p=20;//修改a的值为20指针变量定义一般形式:数据类型[存储器类型]*指针变量名;示例:int*p1;//一般指针(3B)chardata*p3;//指向片内data区(1B)floatxdata*p4;//指向片外xdata区(2B)带存储器类型的指针占用更少内存指针应用示例示例intx=5,y;int*ptr;//定义指针变量ptr=&x;//ptr指向xy=*ptr;//y=5*ptr=10;//x=10指针使用前必须指向有效地址

指针类型必须与指向变量类型一致C51扩展变量类型1.指针变量的应用2.特殊功能寄存器变量(sfr/sfr16)

sfr:8位特殊功能寄存器sfr16:16位特殊功能寄存器

地址为直接地址形式3.位变量(bit/sbit)bit类型:定义一般位变量

sbit类型:定义可位寻址字节中的位3.C51存储模式small(data):

变量在片内RAM,速度快Compact(pdata):

变量在片外低256Blarge(xdata)

:变量在片外64KB示例#pragmacompact//设置模式intfunc1(intx)large//函数单独指定{return(x+1);}2.2.4绝对地址访问——宏定义使用absacc.h

头文件中的宏:宏的功能XBYTE[addr]访问xdata区字节XWORD[addr]访问xdata区字DBYTE[addr]访问data区字节示例#include<absacc.h>ucharvar1=XBYTE[0x0005];//读xdata0005HXWORD[0x0002]=0x1234;//写xdata0002H字绝对地址访问——指针与关键字at指针方式:uchar

xdata*dp;dp=0x1000;*dp=0xFF;at关键字(全局变量):datacharx1_at_0x40;//data区40Hxdataintx2_at_0x2000;//xdata区2000H2.2.5运算符、表达式、语句的关系语句=表达式+分号表达式=操作数+运算符示例:c=a+b;//完整语句a+b//表达式,无分号三者的关系是编程基础2.算术运算符Ⅰ.运算符格式:变量=表达式;运算符名称或含义+加或取正值运算符-减或取负值运算符*乘运算符/除运算符%取余运算符1.赋值运算符4.逻辑运算符运算符名称或含义>

大于<

小于>=大于等于<=小于等于==等于!=不等于“逻辑与”的格式:条件式1&&条件式2。当条件式1与条件式2都为真时,结果为真,否则为假。“逻辑或”的格式:条件式1||条件式2。当条件式1与条件式2都为假时,结果为假,否则为真。“逻辑非”的格式:!条件式。当条件式原来为真时,逻辑非后结果为假;当条件式原来为假时,逻辑非后结果为真。例如,若a=8,b=3,c=0,则!a为假,a&&b为真,3.关系运算符运算符名称或含义||逻辑或&&逻辑与!逻辑非示例:if((a>b)&&(b<c)){...}6.复合赋值运算符a+=6相当于a=a+6a*=5相当于a=a*5b&=0x55相当于b=b&0x55

x>>=2相当于x=x>>25.位运算符示例:a=0x54,b=0x3B·a&b=0x10·a|b=0x7F·a<<2=0x50运算符名称或含义&按位与|按位或^按位异或~按位取反<<

左移>>

右移运算符名称或含义运算符名称或含义+=加法赋值-+减法赋值*=乘法赋值/=除法赋值%=取模赋值&=逻辑与赋值<<=左移位赋值>>=右移位赋值|=逻辑或赋值^=逻辑异或赋值~=逻辑非赋值

8.条件运算符7.逗号运算符逗号运算符:x=(a=3,6*3);//x=18条件运算符(唯一三目运算符):max=(a>b)?a:b;指针运算符:int*p=&x;//&取地址*p=10;//*访问内容表达式1,表达式2,…,表达式n逻辑表达式?表达式1:表达式29.指针与地址运算符运算符优先级要点1.括号()最高2.单目!~*&3.算术*/%高于+-4.关系><>=<=高于==!=5.逻辑&&高于||6.赋值较低不确定时加括号:if((a>b)&&(b<c))Ⅱ.表达式Ⅲ.语句分类表达式语句a=3+2;空语句;复合语句{a=1;b=2;}选择语句if,switch循环语句while,for,do-while跳转语句break,continue,return1.If语句三种格式格式1:

if(表达式)语句;格式2:

if(表达式)语句1;else语句2;格式3(多分支):if(表达式1)语句1;elseif(表达式2)语句2;else语句n;2.switch/case语句switch(表达式){case常量1:语句1;break;case常量2:语句2;break;default:{语句n+1};}特点:表达式为整型或字符型case常量必须唯一break防止“穿透”3.While语句while(表达式){

语句;//循环体}特点:先判断,后执行。条件不满足时循环体可能一次都不执行。示例:1~100累加和inti=1,s=0;while(i<=100){s=s+i;

i++;}4.do-while语句格式:do{

语句;//循环体}while(表达式);特点:先执行,后判断。循环体至少执行一次。示例:1~100累加和inti=1,s=0;do{s=s+i;i++;}while(i<=100);5.for语句格式:for(表达式1;表达式2;表达式3){

语句;//循环体}表达式1:初值表达式

表达式2:条件表达式

表达式3:更新表达式示例:1~100累加和inti,s=0;for(i=1;i<=100;i++)s=s+i;6.break和continue语句作用break跳出整个循环(终止循环)continue结束本次循环,继续下一次判断示例:面积>100时跳出for(r=1;r<=10;r++){area=p*r*r;if(area>100)break;}continue示例:输出不能被3整除的数if(i%3==0)continue;printf("%d",i);7.goto

、return与函数调用语句goto语句(慎用):goto

语句标号;语句标号:语句;return语句:return;//无返回值return(表达式);//带回返回值goto可能降低程序可读性,结构化编程中尽量少用函数调用语句的格式:函数名(实参列表);2.2.6函数函数的分类:由来源分为标准库函数/用户自定义函数返回值分为有返回值/无返回值(void)参数分为有参函数/无参函数main函数特点:程序入口,不能被其他函数调用成功执行返回1,否则返回0函数的定义格式函数类型函数名(形参列表)[reentrant][interruptm][usingn]{

局部变量定义;

函数体;}示例:intadd(inta,intb){returna+b;}函数的调用与声明调用格式:函数名(实参列表);声明格式:[extern]函数类型函数名(形参列表);外部函数声明示例:externserial_initial();//函数在另一个文件中voidmain(){

serial_initial();}函数的嵌套与递归嵌套:函数A调用函数B递归:函数直接或间接调用自身重入函数(reentrant):intfact(intn)reentrant{if(n==0)return1;elsereturnn*fact(n-1);}递归需有终止条件,避免无限调用I/O函数——printf格式:printf("格式控制字符串",输出列表);常用格式字符:格式字符数据类型输出格式dint带符号十进制数uint无符号十进制数oint无符号八进制数xint无符号十六进制数,用“a~f”表示Xint无符号十六进制数,用“A~F”表示ffloat带符号十进制数浮点数,形式为[-]dddd.dddde,Efloat带符号十进制数浮点数,形式为[-]d.ddddEddg,Gfloat自动选择e或f格式中更紧凑的一种输出格式cchar单个字符s指针指向一个带结束符的字符串p指针带存储器批示符和偏移量的指针,形式为M:aaaa其中,M可分别为:C(code),D(data),I(idata),P(pdata)。如M如M为a,则表示的是指针偏移量I/O函数——scanf格式:scanf("格式控制字符串",地址列表);注意事项:地址列表需使用&取地址输入格式需与控制字符串匹配示例:inta,b;scanf("%d,%d",&a,&b);使用printf/scanf前需包含#include<stdio.h>中断服务程序(interrupt)格式:void函数名()interruptm[usingn]{//中断处理代码}M中断源取值:0——外部中断01——定时/计数器T0中断2——外部中断13——定时/计数器T1中断4——串口中断5——定时/计数器T2中断中断服务程序注意事项1.无参数传递,不能有参数声明2.无返回值,建议定义为void3.不能直接调用,由硬件触发4.使用usingn指定工作寄存器组(n=0~3)5.编译器自动在8m+3处生成中断向量示例:voidint0()interrupt0using1{intx;x++;}2.3单片机开发平台主控芯片:STC89C52/STC12系列

兼容标准8051指令8KBISPFlash12MHz晶振,1机器周期=1μs最小系统组成:时钟电路+复位电路+电源单片机不能正常工作时:检查电源、晶振、复位电平2.3.1硬件开发平台开发板模块介绍2.3.2软件开发平台由德国Keil公司出品,集成C编译器、宏汇编、连接器、调试器,支持众多单片机型号μVisionforWindows(32/64位)主要功能:编辑源程序编译生成hex文件仿真调试1.Keil2.STC-ISP烧录工具烧录步骤:1.选择单片机型号(如STC89C52RC)2.打开.hex文件3.选择COM串口号4.单击“Download/下载”使用CH340驱动时需安装USB驱动下载前关闭串口调试助手(避免冲突)3.串口调试助手功能:显示单片机与计算机的交互信息设置要点:选择正确串口号设置波特率数据位=8位字符格式发送(或十六进制)电平转换:RS-232:使用MAX232USB转TTL:使用CH340C2.4工程实践任务:两个8位无符号数求和代码(mcu203.asm):ORG0000HMOVA,#01HMOVB,#02HADDA,BSJMP$END操作步骤:1.Keil中新建项目2.添加.asm源文件3.编译生成hex文件4.仿真运行,观察A和B寄存器Keil调试方法(一)单步执行:快捷键F11(Step)逐条执行指令,可进入子程序内部过程单步:快捷键F10(StepOver)将子程序/函数作为一条语句全速执行运行到光标行:光标定位到目标行选择“RuntoCursorline”全速运行时遇到断点会停止Keil调试方法(二)修改程序流程:1.退出调试环境2.修改源程序3.重新编译、链接4.再次进入调试Keil调试窗口:输出窗口(OutputWindow)观察窗口寄存器窗口存储器窗口(MemoryWindow)存储器窗口的使用查看指定地址:

在MemoryWindow中输入地址表达式C:程序存储器(code)D:片内数据存储器(data)I:间接寻址片内RAM(idata)X:片外数据存储器(xdata)示例:D:0→片内RAM从0H开始X:0x2000→片外RAM从2000H开始汇编程序调试示例ORG0000HMOVR0,#00HMOVDPTR,#2000HLOOP:MOVA,#00HMOVX@DPTR,AINCDPTRINCR0CJNER0,#00H,LOOPSJMP$调试前/后观察X:0x2000区域的变化任务:将片外RAM2000H~20FFH单元内容改为00H任务2——第一个C51程序目标:通过串口输出“hello”信息//mcu205.c#include<reg52.h>#include<stdio.h>voidmain(void){SCON=0x52;//串口初始化

TMOD=0x20;TH1=0xF3;//2400bit/s@12MHzTR1=1;

printf("hello,welcometo8051MCUcourse!\n");while(1);}波特率需与上位机串口助手设置一致串口初始化说明UART设置:工作方式1(10位异步通信)

定时器T1方式2(8位自动重装)初始化代码:SCON=0x52;//方式1,允许接收TMOD=0x20;//T1方式2TH1=0xF3;//2400bps@12MHzTR1=1;//启动T1使用printf前必须完成串口初始化使用自定义头文件简化代码:将串口初始化封装在uart51.h中//mcu206.c#include<uart51.h>intmain(void){

uart_Init();//串口初始化

printf("hello,welcometo8051MCUcourse!\n");while(1);}优点:

代码简洁便于复用头文件可嵌套(uart51.h已包含stdio.h)printf格式输出示例带格式的printf://mcu207.c#include<uart51.h>intmain(void){inti;

uart_Init();

i=6+13*5;

printf("What's6+13*5?\n");

printf("Theansweris:%d\n",i);while(1);}输出结果:Theansweris:71%d指定输出十进制整数图形输出示例用printf输出简单图形://mcu208.c#include<uart51.h>intmain(void){

uart_Init();

printf("******\n");

printf("***\n");while(1);}输出效果:```*********```可用于调试时输出状态信息感谢观看THANKSFORWATCHING第三章

I/O口控制与Proteus仿真目录CONTENTS0151单片机基础与I/O口认知通用I/O口结构、引脚功能与工作原理04按键输入与上位机交互独立按键反馈、scanf函数、串口上位机控制03I/O口基础输出与PWM控制闪烁灯实现、PWM调光调速核心原理与编程02Proteus仿真软件实操工程新建、电路绘制、程序载入与仿真运行05直流电机驱动与运动控制电机基础分类、驱动电路搭建、启停与PWM调速06综合项目实践三轮小车运动控制、核心知识点复盘与重难点梳理学习目标01基础认知掌握了解单片机技术发展与应用,熟练掌握51单片机通用I/O口的功能原理,精通I/O口输入、输出的编程与实操方法。02仿真工具精通熟练使用Proteus软件完成单片机电路设计、程序下载与全程仿真调试,具备独立搭建仿真工程的能力。03核心技术吃透深度理解PWM脉宽调制概念,掌握PWM信号输出、占空比调节的实现方法,熟练运用scanf函数完成串口数据交互。04工程实践落地掌握直流电机驱动逻辑、PWM无级调速控制,能够结合I/O口、按键、通信、电机模块,完成三轮小车运动控制等综合工程项目设计与仿真实现。

4个8位GPIO:P0、P1、P2、P3可作输入/输出,支持位操作AT89C52:40引脚,32个I/O口本章重点:P1口的输入识别与输出控制3.151单片机I/O口概述AT89C52的引脚准双向口,复位时锁存器为“1”作为输入:先写“1”,再读引脚作为输出:直接输出高低电平示例:P1_0=1;//输出高电平I/O口的输入/输出设置英国LabCenterElectronics公司开发支持多种单片机系统仿真(8051、AVR、PIC等)包含ISIS(原理图设计)和ARES(PCB设计)优势:无需硬件即可完成电路设计与功能验证3.2Proteus软件简介1.新建电路,选择元件2.放置元件,调整属性3.连接导线(直接或总线方式)4.加载hex文件,运行仿真ProteusISIS工作流程启动ISIS,新建项目使用“PickDevices”选择元件(如AT89C51)放置元件、电源、地连接导线,使用标签和总线加载程序文件(.hex)运行仿真,观察LED、按键等响应Proteus基本操作演示放置元器件及构建电路Proteus中部分常见的元件及相关名称元件名称中文名说明元件名称中文名说明7407驱动门BATTERY电池/电池组1N914二极管CAP电容74Ls00与非门CAPACITOR电容器74LS04非门CLOCK时钟信号源74LS08与门CRYSTAL晶振74LS390TTL双十进制计数器FUSE保险丝7SEG7段式数码管开始字符LAMP灯LED发光二极管POT-HG三引线可变电阻器LM2行16列液晶RES电阻MOTOR马达RESISTOR电阻器SWITCH开关RESPACK排阻BUTTON按钮805151系列单片机Inductor电感ARMARM系列Speakers

&

Sounders扬声器PICPIC系列单片机ALTERNATOR交流发电机AVRAVR系列单片机连接导线使用标签和总线注意:在一个电路图中,标签名相同的导线在逻辑上是连接在一起的。为总线上的导线添加标签为导线添加标签,移动鼠标到需要加标签的导线上并右击“String”输入框中输入该导线的标签名。加载程序文件加载的程序只能是hex类型的可执行文件,可以在Keil软件中设计、生成hex文件3.3工程实践任务1流水灯仿真(Proteus)任务2闪烁灯与PWM控制任务3循环计数控制运行时间任务4上位机控制任务5直流电动机及其驱动任务6PWM调速任务7——按键输入控制电机任务8*——三轮小车运动控制

使用示波器观察PWM波形使用逻辑分析仪查看多路信号

调试方法:检查hex文件是否加载检查电源、地连接单步运行观察I/O状态Proteus仿真调试技巧整体步骤:构建流水灯电路(图3.12)

编写闪烁程序(mcu301.c)软件延时实现150ms闪烁加载hex文件,仿真运行任务1流水灯仿真(Proteus)构建流水灯电路任务1流水灯仿真(Proteus)任务要点:编写闪烁程序(mcu301.c)软件延时实现150ms闪烁加载hex文件,仿真运行任务1流水灯仿真(Proteus)#include#defineucharunsignedchar#defineuintunsignedintsbitLED=P2^0;//延时

voidDelayMS(uintx){uchari;while(x--){for(i=0;i<120;i++);}}//主函数voidmain(){while(1){LED=~LED;DelayMS(150);}12MHz晶振→1机器周期=1μs

汇编与C语言延时实现while(1)无限循环控制LED闪烁注意:循环体多条语句需加花括号软件延时与while循环

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论