《2022年MCS单片机讲义C语言编程,清华大学出版社 .pdf》由会员分享,可在线阅读,更多相关《2022年MCS单片机讲义C语言编程,清华大学出版社 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第二章MCS-51系列单片机结构2.1 MCS-51单片机基本结构在学习单片机的内部结构之前, 先了解下现在正在使用的计算机的几大组成部,计算机有五个组成部份:运算器:用于实现算术和逻辑运算。计算机的运算和处理都在这里进行;控制器:是计算机的控制指挥部件, 使计算机各部份能自动协调的工作;存储器:用于存放程序和数据,又分为内存储器和外存储器;输入设备:用于将程序和数据输入到计算机;输出设备:用于把计算机数据, 计算或加工的结果以用户需要的形式显示或保存;通常把运算器和控制器合在一起称为中央处理器(Central Processing Unit ), 简称 CPU 。而把外存储器、输入设备和输出
2、设备合在一起称之为计算机的外部设备。2.1.1MCS-51单片机结构简介单片机( Microcontroller,又称微控制器)是在一块硅片上集成了各种部件的微型计算机。这些部件包括中央处理器CPU 、数据存储器 RAM 、程序存储器ROM 、定时器 / 计数器和多种 I/O 接口电路。典型的 MCS-51系列单片机由下图2.1 所示的器件组成:图 2.1 MCS-51 单片机结构框图中央处理器:中央处理器 (CPU)是整个单片机的核心部件,是8 位数据宽度的处理器,能处理 8 位二进制数据或代码, CPU 负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。数据存储
3、器 (RAM) :名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 8051内部有 128个 8 位用户数据存储单元和128 个专用寄存器单元,它们是统一编址的, 专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的的RAM 只有 128 个,可存放读写的数据,运算的中间结果或用户定义的字型表。程序存储器 (ROM) :8051共有 4096个 8 位掩膜 ROM ,用于存放用户程序,原始
4、数据或表格。定时/ 计数器:8051有两个 16 位的可编程定时 / 计数器,以实现定时或计数产生中断用于控制程序转向。并行输入输出 (I/O) 口:8051共有 4 组 8 位 I/O 口(P0、 P1、P2或 P3),用于对外部数据的传输。全双工串行口:8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。中断系统:8051具备较完善的中断功能,有两个外中断、两个定时/ 计数器中断和一个串行中断,可满足不同的控制要求,并具有2 级的优先级别选择。时钟电路:8051 内置最高频率达12MHz的时钟电路,用于产生整个单片机运
5、行的脉冲时序,但 8051 单片机需外置振荡电容。2.1.2MCS-51单片机内部结构单片机的结构有两种类型, 一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard) 结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。INTEL的 MCS-51系列单片机采用的是哈佛结构的形式, 而后续产品 16 位的 MCS-96系列单片机则采用普林斯顿结构。图 2.2 是 MCS-51系列单片机的内部结构示意图。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整
6、理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 图 2.2 MCS-51 系列单片机的内部结构图MCS-51 系列单片机的基本性能完全相同,其特点如下:8 位 CPU ;片内振荡器及时钟电路;32 根 I/O 线;外部存储器寻址范围ROM 、RAM 各 64K;2 个 16位的定时器 / 计数器;5 个中断源, 2 个中断优先级;全双工串行口;布尔处理器。2.2 MCS-51单片机引脚功能MCS-51 是标准的 40引脚双列直插式集成电路芯片, 引脚分布如图 2.3 :名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
7、 - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 图 2.3 MCS-51 单片机引脚分布图引脚的功能简要说明如下:1 电源引脚 VCC和 GND VCC (40):电源端, +5V输入。GND (20):接地端。2时钟电路引脚 XTAL1和 XTAL2 XTAL1 (19):片内振荡电路的输入端。XTAL2 (18):片内振荡电路的输出端。8051的时钟有两种方式, 一种是片内时钟方式, 需在18和19脚外接石英晶体(2-12MHz)和振荡电容, 振荡电容的值一般取 10pF-30Pf;另外一种是外部时钟
8、方式,即将 XTAL1 接地,外部时钟信号从 XTAL2 脚输入;如图 2.4 a. 内部时钟方式 b.外部时钟方式图 2.4 8051 的时钟方式3 控制信号引脚 RST 、ALE 、PSEN 和 EA RESET/Vpd (9)复位信号复用端:当 8051 通电,时钟电路开始工作, 在 RESET 引脚上出现 24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向 0000H ,P0-P3输出口全部为高电平, 堆栈指钟写入 07H ,其它专用寄存器被清“ 0”。RESET 由高电平下降为低电平后, 系统即从 0000H地址开始执行程序。 然而,初始复位不改变RAM (包括
9、工作寄存器R0-R7 )的状态。8051的复位方式可以是自动复位,也可以是手动复位,见图2.5。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - a. 上电自动复位 b.手动复位图 2.5 8051 复位电路此外, RESET/Vpd 还是一复用脚, Vcc 掉电期间,此脚可接上备用电源,以保证单片机内部 RAM 的数据不丢失。ALE/PROG(30)地址锁存允许信号端:ALE/PROG 当访问外部程序器时, ALE(地址锁存
10、) 的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个 1/6 时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。 更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。如果单片机带有片内EPROM,在编程其间,将用于输入编程脉冲。PSEN (29)程序存储允许输出信号端:当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的 16 位地址数据将出现在 P0和 P2口上,外部程序存储器则把指令数据放到P0口上,由 CPU 读入并执行。EA/Vpp(31)内外部程序存储器选通端:EA/Vpp,8051 和 8751 单片机,内置有 4k
11、B 的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据, 而超过 4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的8031,EA 端必须接地。在对片内 ROM 编程时, EA/Vpp脚还需加上 21V的编程电压。4 输入输出口8051有 4组 8 位 I/O 口:P0、P1、P2和 P3口,P1、P2和 P3为准双向口,P0口则为双向三态输入输出口,下面分别介绍这几个口线:1 P0端口( P0.0-P0.7 ):P0口是 8 位双向三态输入 / 输出接口,如图2.6 (a),P0 口其中一位的电路
12、图。P0口既可作地址 / 数据总线使用,又可作通用I/O 口用。连接外部存储器时,P0口一方面作为 8 位数据输入 / 输出口,另一方面用来输出外部存储器的低8 位地址。作输出口时,输出漏极开路,驱动NMOS 电路时应外接上拉电阻;作输入口之前,应先向锁存器写1,使输出的两个场效应管均关断,引脚处于“浮空”状态,这样才能做到高阻输入,以保证输入数据的正确。正是由于该端口用作 I/O 口,输入时应先写 1,故称为准双向口。 当 PO口作地址 / 数据总线使用时,就不能再把它当通用I/O 使用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
13、 - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - (a)P0口位结构(b)P1口位结构(c)P2口位结构(d)P3口位结构图 2.6 输入输出口位结构图2 P1端口(P1.0-P1.7 ):P1口是 8位准双向口,作通用输入 / 输出口使用,如图 2.6(b)所示。在输出驱动部分, P1口有别于 P0口,它接有内部上拉电阻。 P1口的每一位可以独立地定义为输入或者输出,因此,P1口既可以作为 8 位并行输入 / 输出口,又可作为 8 位输入 / 输出端。 CPU 既可以对 P1口进行字节操作,又可以进行位操作。当作输入方式时,该位
14、的锁存器必须预写1。3 P2端口(P2.0-P2.7 ):P2口是 8位准双向输入 / 输出接口,如图 2.6(c)所示。P2口可作通用 I/O口使用,与 P0口相同,当外接程序存储器时,P2口给出地址的高 8 位,此时不能作通用 I/O 口。当外接数据存储时,若RAM 小于 256B,用 R0 、R1作间接寄存器,只需 P0口送出地址低 8 位,P2口可以用作通用 I/O 口;若 RAM 大于 256B,必须用 16 位寄存器 DPTR 作间址寄存器,则P2口只能在一定限度内作一般I/O使用。4 P3端口(P3.0-P3.7 ):P3口也是一个 8 位的准双向输入 / 输出接口,如图 2.6
15、(d)所示。它具有多种功能。一方面与 P1口一样作为一般准双向输入/ 输出接口,具有字节操作和位操作二种工作方式; 另一方面 8 条输入 / 输出线可以独立地作为串行输入/ 输出口和其它控制信号线。P3端口用于一些特殊功能,具体的第二功能定义表21。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 表21 P3 端口引脚第二功能表口线第二功能信号名称P3.0RXD串行数据接收P3.1TXD串行数据发送P3.2INT0外中断 0P
16、3.3INT1外中断 1P3.4T0定时 /计数器 0 计数输入P3.5T1定时 /计数器 1 计数输入P3.6WR外部数据存储器写选通P3.7RD外部数据存储器读选通5 P0P3端口的负载能力及接口要求P0口的每一位输出可驱动8 个 LS TTL输入,但把它当通用口使用时,输出级是开漏电路, 故用它驱动 NMOS 输入时需外接上拉电阻; 把它当地址 / 数据总线时,则无需接外部上拉电阻。P1P3口的输出级接有内部上拉电阻, 它们的每一位输出可驱动4 个 LS TTL输入。CHMOS 端口只能提供几毫安的输出电流,故当作为输出口去驱动一个普通晶体管的基极时, 应在端口与晶体管基极间串联一个电阻
17、,以限制高电平输出时的电流。2.3 输入 / 输出实例流水灯硬件电路描述如下:8051单片机的 P1口的P1.0P1.7分别接有LED(D1 D8),当某一端口输出为“ 0”时,相应的 LED 点亮,P0.2、P0.3、P0.4、P0.5 分别接有四个按钮 K1-K4,按下按钮时,相应引脚被接地。现要求编写可键控的流水灯程序,当 K1按下时,开始流动, K2按下时停止流动,全部灯灭, K3使灯由 D1往D8 流动, K4使灯由 D8往D1 流动。2.3.1硬件设计分析通过对流水灯题目要求的分析,LED阳极连接正向电压,阴极连接P1端口。当 P1端口输出“ 0”时,LED上为正向电压, LED点
18、亮;当 P1端口输出“ 1”时,LED上无压差, LED熄灭;为了防止 LED过流烧毁,需串联限流电阻,限流电阻越小 LED越亮,也容易烧毁。按钮连接在 P0口上,当查询按钮状态时,如果按钮按下,其状态为“0”;如果按钮未按下,由于P0口无内部上拉电阻,端口悬浮,其状态不确定,所以在电路中,需要外部上拉电阻。复位电路采用手动复位电路,时钟电路采用内部时钟电路。根据流水灯题目要求硬件电路设计如图2.7 所示名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - -
19、 - - - - - - 1234Y11.0592MHZC133p FC322uFR21KSKE YVCCVCCD2LEDR31K12345678161514131211109RP1560D3LEDD4LEDD5LEDD6LEDD7LEDD8LEDD1LEDVCCR1470C233p FK1K2K3K4R41KR51KR61KVCCEA /VP31X119X218RESET9RD17WR16INT 012INT 113T014T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P212
20、2P2223P2324P2425P2526P2627P2728PSEN29AL E/P30TX D11RX D10U0805 1图 2.7 流水灯硬件电路2.3.2程序功能与实现下面首先给出程序,然后再进行分析。键控流水灯的程序#include reg51.h #include intrins.h #define uchar unsigned char void mDelay(unsigned int DelayTime) /延时函数unsigned int j=0; for(;DelayTime0;DelayTime-) for(j=0;j125;j+); uchar Key() /按键判断
21、函数,无按键按下返回0,否则返回键值。uchar KeyV; uchar tmp; P0=P0|0 x3c; /四个按键所接位置KeyV=P0; if(KeyV|0 xc3)= =0 xff) /无键按下return(0); mDelay(10); /延时,去键抖KeyV=P0; if(KeyV|0 xc3)= =0 xff) return(0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - else for(;) tmp
22、=P0; if(tmp|0 xc3)=0 xff) break; return(KeyV); void main() unsigned char OutData=0 xfe; bit UpDown=0; bit Start=0; uchar KValue; for(;) KValue=Key(); switch (KValue) case 0 xfb: /P0.2=0,Start Start=1; break; case 0 xf7: /P0.3=0,Stop Start=0; break; case 0 xef: /P0.4=0 Up UpDown=1; break; case 0 xdf:
23、 /P0.5=0 Down UpDown=0; break; if(Start) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - if(UpDown) OutData=_crol_(OutData,1); else OutData=_cror_(OutData,1); P1=OutData; else P1=0 xff; /否则灯全灭mDelay(1000); 2.3.3程序分析1. “文件包含”处理#include reg5
24、1.h #include intrins.h 程序的第一行是一个“文件包含”处理。所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有 2行,但C 编译器在处理的时候却要处理几十或几百行。这里程序中包含REG51.h 文件的目的是为了要使用 P1这个符号,即通知 C 编译器,程序中所写的 P1是指80C51 单片机的 P1端口而不是其它变量。打开reg51.h 可以看到这样的一些内容:/*- REG51.H Header file for generic 80C51 and 80C31 microcontroller. Copyright (c) 1988-20
25、01 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. -*/ /* BYTE Register */ sfr P0 = 0 x80; sfr P1 = 0 x90; sfr P2 = 0 xA0; sfr P3 = 0 xB0; sfr PSW = 0 xD0; sfr ACC = 0 xE0; sfr B = 0 xF0; sfr SP = 0 x81; sfr DPL = 0 x82; sfr DPH = 0 x83; sfr PCON = 0 x87; sfr TCON = 0 x88; sfr TMOD
26、 = 0 x89; sfr TL0 = 0 x8A; sfr TL1 = 0 x8B; sfr TH0 = 0 x8C; sfr TH1 = 0 x8D; sfr IE = 0 xA8; sfr IP = 0 xB8; sfr SCON = 0 x98; sfr SBUF = 0 x99; /* BIT Register */ /* PSW */ sbit CY = 0 xD7; sbit AC = 0 xD6; sbit F0 = 0 xD5; sbit RS1 = 0 xD4; sbit RS0 = 0 xD3; sbit OV = 0 xD2; sbit P = 0 xD0; /* TC
27、ON */ sbit TF1 = 0 x8F; sbit TR1 = 0 x8E; sbit TF0 = 0 x8D; sbit TR0 = 0 x8C; sbit IE1 = 0 x8B; sbit IT1 = 0 x8A; sbit IE0 = 0 x89; sbit IT0 = 0 x88; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - /* IE */ sbit EA = 0 xAF; sbit ES = 0 xA
28、C; sbit ET1 = 0 xAB; sbit EX1 = 0 xAA; sbit ET0 = 0 xA9; sbit EX0 = 0 xA8; /* IP */ sbit PS = 0 xBC; sbit PT1 = 0 xBB; sbit PX1 = 0 xBA; sbit PT0 = 0 xB9; sbit PX0 = 0 xB8; /* P3 */ sbit RD = 0 xB7; sbit WR = 0 xB6; sbit T1 = 0 xB5; sbit T0 = 0 xB4; sbit INT1 = 0 xB3; sbit INT0 = 0 xB2; sbit TXD = 0
29、 xB1; sbit RXD = 0 xB0; /* SCON */ sbit SM0 = 0 x9F; sbit SM1 = 0 x9E; sbit SM2 = 0 x9D; sbit REN = 0 x9C; sbit TB8 = 0 x9B; sbit RB8 = 0 x9A; sbit TI = 0 x99; sbit RI = 0 x98; 这里都是一些符号的定义, 即规定符号名与地址的对应关系。 注意其中有 sfr P1 = 0 x90; 这样的一行(上文中用黑体表示),即定义P1 与地址 0 x90 对应,P1 口的地址就是 0 x90(0 x90 是C 语言中十六进制数的写法,
30、相当于汇编语言中写 90H )。从这里还可以看到频繁出现的词:sfr 、sbit 。2. sfr 、sfr16 sfr 并非标准 C语言的关键字, 而是Keil 为能直接访问 80C51 中的SFR (特殊功能寄存器)而提供了一个新的关键词,同样提供sfr16 ,sfr16 占用两个内存单元,值域为 065535。sfr16 和sfr 一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器。其用法是:sfr 变量名 =地址值sfr16 变量名 =地址值3. sbit 在C语言里,如果直接写 P1_0 ,C 编译器并不能识别,而且P1_0 也不是一个合法的 C语言变量名,所以必须给它
31、们建立联系, 这里使用了 Keil C的关键字 sbit 来定义, sbit 是C51 中的一种扩充数据类型,利用它可以访问芯片内部的RAM 中的可寻址位或特殊功能寄存器中的可寻址位。sbit 的用法有三种:第一种方法: sbit 位变量名地址值第二种方法: sbit 位变量名 SFR 名称变量位地址值第三种方法: sbit 位变量名 SFR 地址值 变量位地址值如定义 PSW 中的OV 可以用以下三种方法:sbit OV=0 xd2 (1)说明: 0 xd2 是OV 的位地址值sbit OV=PSW2 (2)说明:其中 PSW 必须先用 sfr 定义好sbit OV=0 xD02 (3)说明
32、: 0 xD0 就是PSW 的地址值因此这里用 sbit P1_0=P10; 就是定义用符号 P1_0 来表示 P1.0 引脚,也可以起P10 一类的名字,只要下面程序中也随之更改就行了。关于特殊功能寄存器内容详细内容见下章。4. bit 位标量bit 位标量是 C51 编译器的一种扩充数据类型, 利用它可定义一个位标量, 但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0 就是1,类似一些高级语言中的 Boolean 类型中的 True 和False 。5. _crol_ ()、_cror_ ()_crol_ ()、_cror_ ()分别为字节左移和字节右移函数,使用它们需包含头文件 intrins.h。详情参阅 C51 库函数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -