单片机接口与应用-课件汇总全套ppt完整版课件最全教学教程整套课件全书电子教案

上传人:青*** 文档编号:242900503 上传时间:2024-09-11 格式:PPTX 页数:274 大小:4.30MB
返回 下载 相关 举报
单片机接口与应用-课件汇总全套ppt完整版课件最全教学教程整套课件全书电子教案_第1页
第1页 / 共274页
单片机接口与应用-课件汇总全套ppt完整版课件最全教学教程整套课件全书电子教案_第2页
第2页 / 共274页
单片机接口与应用-课件汇总全套ppt完整版课件最全教学教程整套课件全书电子教案_第3页
第3页 / 共274页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2021/12/10,#,单片机接口与应用,第一章 单片机基本组成,第二章,C51,程序设计,第三章 片内接口,1.1,单片机的基本概念,1.1.1,单片机的定义,单片机是把,CPU,、存储器、定时器,/,计数器、中断系统和多种,I/O,接口电路与总线控制电路制作在一块芯片上的超大规模集成电路,。,单片机使用时,通常是处于测控系统的核心地位并嵌入其中,所以国际上通常把单片机称为嵌入式控制器(,Embedded Microcontroller Unit,,,EMCU,),或微控制器(,Microcontroller Unit,,,MCU,)。我国习惯于使用“单片机”这一名称。,1.1.2 51,系列单片机,出现较早也是最成熟的单片机为,Intel,公司的,MCS-51,系列,如,Intel8031,、,Intel8051,、,Intel 8751,等型号,该系列单片机字长为,8,位,具有完善的结构和优越的性能、较高的性价比和要求较低的开发环境。,STC,系列单片机为宏晶科技公司生产的增强型,51,单片机,具有,多,种型号。本书在介绍经典,MCS-51,单片机的同时,也介绍了,STC,增强型单片机。,1.1.3,单片机应用,1,智能仪器仪表,2,机电一体化产品,3,实时控制,4,分布式控制系统,5,家居生活,1.2,单片机基本组成,图,1-1,单片机内部组成框图,1.2.1,内部总线,总线(,BUS,)是传输信息的公共导线。在单片机内部使用的总线称为内部总线,。,地址总线(,Address Bus,,,AB,)用于传输地址信息,。,数据总线(,Data Bus,,,DB,)是用于,CPU,与存储器之间或,CPU,与,I/O,接口之间进行数据传送的一组信号线。,控制总线(,Control Bus,,,CB,)是一组控制命令信号线,是,CPU,决定对外部器件作什么操作的命令线。,1.2.2,中央处理器,中央处理器是单片机的核心,简称,CPU,,其作用是读入和分析每条指令,根据每条指令的功能要求,完成运算和控制操作。,单片机应用程序经编译器编译,将生成可执行代码。把,PC,和单片机系统连接好后,运行程序下载软件,例如,STC,单片机的,STC_ISP,软件,就能够把程序代码下载到单片机片内,ROM,中。单片机在复位后,,CPU,自动从,ROM,中逐条取出程序代码并执行。,1.2.31.2.4,程序存储器,存储器(,Memory,)用来存放程序和数据。分为只读存储器(,ROM,)和随机存储器(,RAM,)两大类。,ROM,对数据只能读出不能写入,断电后其中的数据不会丢失。因此一般用来存放程序代码和常数。,RAM,对数据既能读出也能写入,断电后其中的内容全部丢失。单片机中的,RAM,常用于存放变量和中间计算结果。,1.2.5 I/O,接口,I/O,接口是连接,CPU,与外设的中间电路。,I/O,接口与外部设备间交换的信号,通常有以下,4,种类型:,数字量:二进制表示的数据,如:字节数据、,ASCII,码。,模拟量:随时间连续变化的物理量,如:电压、电流、湿度、压力、流量。,开关量:二进制“,0,”和“,1,”描述的状态,如:开,/,关、启,/,停、通,/,断。,脉冲量:上下沿跳变的信号。,MCS-51,片内集成有,P0P3,共,4,个并行接,I/O,口,1.2.61.2.9,串行通信接口,简称串口,其特征是用单根导线传输数据。,MCS-51,片内集成有一个全双工的串行异步通信接口(,UART,),。,定时器,/,计数器,,,具有完成硬件定时、对外部脉冲信号进行捕捉与计数、产生周期脉冲信号输出等功能。,MCS-51,片内集成有,2,个,16,位定时器,/,计数器,T0,、,T1,。,中断控制系统,,,实现单片机对异步事件的处理机制。,MCS-51,有,5,个中断源。,时钟发生器,,,用来产生单片机工作所需要的时钟信号。,1.3.1,数制,十进制数,:,十进制数的每一位有,0,9,十种数码,基数为,10,,高位权是低位权的,10,倍,加减运算的法则为“逢十进一,借一当十”,后缀为,D,,可省略。,二进制数,:,二进制数的每一位有,0,和,1,两种数码,基数为,2,,高位权是低位权的,2,倍,加减运算的法则为“逢二进一,借一当二”,后缀为,B,。,十六进制数,:,十六进制数的每一位有,0,、,1,、,2,、,3,、,4,、,5,、,6,、,7,、,8,、,9,、,A,、,B,、,C,、,D,、,E,、,F,十六种数码,其中,A,、,B,、,C,、,D,、,E,、,F,所代表的数分别相当于十进制的,10,、,11,、,12,、,13,、,14,、,15,。基数为,16,,高位权是低位权的,16,倍,加减运算的法则为“逢十六进一,借一当十六”,后缀为,H,。,1.3.2,数制转换,二进制数转换为十六进制数,二进制数转换为十六进制数采用“合四为一法”,即从右向左,每四位二进制数转换为一位十六进制数,最高位不足四位用,0,补齐,就可得到十六进制数。,例如,把二进制数,1011010110010011111B,转换为十六进制数:,0101 1010 1100 1001 1111B=5AC9FH,十六进制数转换为二进制数,十六进制数转换为二进制数采用“一分为四法”,即从左向右,每一位十六进制数转换为四位二进制数。,例如,把十六进制数,6C7BH,转换为二进制数:,6C7BH=0110 1100 0111 1011B,1.3.3,无符号数和有符号数,无符号数,:,如果一个数的所有数位都是数值位,没有符号位,则该数就是无符号数。,例如,,8,位无符号数的,8,个位都是数值位,表示的数的范围为,0000 0000B,1111 1111B,,即,0,255,。同样,,16,位无符号数的,16,个位都是数值位,所以它可表示的数的范围为,0000H,FFFFH,,即,0,65535,。,有符号数,:,有符号数就是有符号位的数。有符号数以其二进制数的最高位作为符号位,且,0,表示“,”,,1,表示“”。例如,对于,8,位二进制数,,00000001B,表示,+1,,,11111111B,表示,-1,。对于,16,位二进制数,,0001H,表示,+1,,,FFFFH,表示,-1,。,1.4 MCS-51,的,CPU,图,1-2 MCS-51 CPU,的组成,1.4.1,控制器,1,程序计数器,PC,:,PC,用来存放下一条指令的地址,具有自动加,1,的功能。应用程序通过编译软件编译后,生成单片机指令码,并预先写入程序存储器,ROM,中。单片机运行后,,CPU,逐条从,ROM,中取出指令码并执行。,2,指令寄存器,IR,:,CPU,从,ROM,取出指令后,就将指令码暂存于,IR,中,等待译码。,3,指令译码器,ID,:,ID,是对指令寄存器,IR,中的指令进行译码,将指令码变为执行此指令所需要的电信号。,4,数据指针,DPTR:,指针是存放地址的寄存器。数据指针,DPTR,,用于存放数据的地址。,5,堆栈指针,SP:SP,用于,指示出堆栈顶部在内部,RAM,块中的位置,。,1.4.2,运算器,1,算术逻辑单元,ALU,:,由加法器和其它逻辑电路等组成,完成数据的算术逻辑运算、循环移位、位操作等,参加运算的两个操作数,一个由,ACC,通过暂存器,2,提供,另外一个由暂存器,1,提供,运算结果送回,ACC,,状态送,PSW,。,2,累加器,ACC,:,是一个,8,位寄存器,简记为,A,,它通过暂存器与,ALU,传送信息,用来存放一个操作数或中间结果。,3,程序状态字,PSW,:,也是一个,8,位寄存器,用于存储程序运行过程中的各种状态信息。,4,其他部件,:,暂存器用来存放中间结果,,B,寄存器用于乘法和除法时,提供一个操作数,对于其他指令,只用作暂存器。,5.,位处理器,在,MCS-51,的,ALU,中,与字节处理器相对应,还特别设置了一个结构完整、功能极强的位处理器。,MCS-51,指令系统中的位处理指令集(,17,条位操作指令)、存储器中的位地址空间,以及借用程序状态寄存器,PSW,中的进位标志位,CY,作为位操作的累加器,构成了,MCS-51,的为处理器。位处理器可对直接寻址的位变量进行位处理,如置位、清零、取反、测试转移以及逻辑与、逻辑或等位操作,使用户在编程时可以利用指令完成原来要用硬件电路来完成的功能,并可方便地设置标志位等,给面向控制的实际应用带来了方便。,1.5 MCS-51,存储器,1.MCS-51,的,RAM,分区,1,低,128,字节,RAM,区,低,128,字节,RAM,也称通用,RAM,区。通用,RAM,区又可分为工作寄存器组区,位寻址区和用户,RAM,区。,工作寄存器组区:该区地址为,00H1FH,,共,32,字节,分为,4,组,每组称为一个工作组。每个工作组都包含,8,个,8,位工作寄存器,编号都是,R0 R7,。工作组,0,是最常用的寄存器组。通过切换工作组,可以提高程序运行效率。,C51,编程时,一般不需要指定工作组,编译器会自动为程序和函数分配它们。,位寻址区:该区地址为,20H 2FH,,共,16,个字节。这个区域的存储单元既可以按字节存取,也可以按位存取。,用户,RAM,区:该区地址为,30HFFH,,用于暂存各种变量和临时数据,也能用作函数调用时所使用的堆栈区。,2,高,128,字节,RAM,区,MCS-52,扩展有高,128,字节,RAM,,地址范围是,80HFFH,。,高,128,字节,RAM,只能间接寻址。,C51,编程时,存储于该区的变量需要使用,idata,存储器类型进行变量声明。,3,特殊功能寄存器区,特殊功能寄存器,SFR,是用来对片内各功能模块进行管理、控制、监视的控制寄存器和状态寄存器。,MCS-52,的,SFR,区与内部高,128,字节,RAM,区的地址范围重合,但二者在物理上是独立的。,2. STC90C516RD+,片内集成的,ROM,和,RAM,地址空间,1.6 MCS-51,单片机外部引脚,在,at89x52.h,头文件中,把,P0,、,P1,、,P2,、,P3,的位寄存器分别定义为,P0_0P0_7,、,P1_0P1_7,、,P2_0P2_7,、,P3_0P3_7,,见表,1-6,。,1.7 MCS-51,最小系统,最小系统是单片机可以运行程序的基本电路,包括单片机、电源、振荡电路、复位电路四部分。,MCS-51,的最小系统如图,1-8,所示,MCS-51,单片机的时序,MCS-51,的时序单位共有,4,个,从小到大依次是:节拍、状态、机器周期和指令周期。,晶体振荡信号的一个周期称为节拍,用,P,表示。该周期是单片机时钟脉冲频率的倒数,是最基本、最小的定时信号,又称为振荡周期或单片机的时钟周期。,状态周期由振荡脉冲二分频后得到,用,S,表示。这样,一个状态包含两个节拍,前半周期对应的节拍叫节拍,1,,记作,P1,;后半周期对应的节拍叫节拍,2,,记作,P2,,如图,1-12,所示。,CPU,以时钟,P1,、,P2,为基本节拍,指挥单片机的各个部分协调工作。,CPU,完成一个基本操作所需要的时间称为机器周期。,CPU,的基本操作指的是读取指令、存储器读,/,写、对数据进行处理等操作。,MCS-51,采用定时控制方式,具有固定的机器周期。一个机器周期的宽度为,6,个状态,依次记作,S1,S6,。由于一个状态又包括两个节拍,因此,一个机器周期总共有,12,个节拍,分别记作,S1P1,、,S1P2,、,、,S6P1,、,S6P2,,见图,1-12,。由于一个机器周期共有,12,个振荡脉冲周期,因此机器周期就是振荡脉冲的,12,分频。,单片机执行一条指令所需要的时间称为指令周期。,MCS-51,大多数指令的指令周期由一个机器周期或两个机器周期组成,只有乘法、除法指令需要,4,机器周期。以两个机器周期的指令周期为例,各时序单位之间的关系见图,1-12,。,MCS-51,单片机复位电路,51,单片机的复位电路如图,1-13,、,1-14,所示,第二章,C51,程序设计,C51,是面向,51,系列单片机的,C,语言。与汇编语言相比,,C51,有如下优点:,对单片机指令系统不要求了解,就可以直接编程操作单片机;,寄存器分配、存储器的寻址以及数据类型等细节完全由编译器自动管理;,有多种结构化控制语句,满足结构化设计要求;,库中提供许多标准子程序,具有较强的数据处理能力,使用方便;,具有方便的模块化编程技术,使已编好的程序很容易移植。,2.1 C51,的基本数据类型,2.1.1,位类型(,bit,,,sbit,),位类型是,C51,扩充的数据类型,用于访问,51,单片机中的可寻址的位单元。,C51,支持两种位类型:,bit,型和,sbit,型。,bit,用于在可位寻址的,RAM,区定义位变量,位地址范围是,00H7FH,,共,128,个可寻址位。例如:,bit aflag;,定义了一个名为,aflag,的位变量,编译时编译器会把,aflag,定位于,20H2FH,的,RAM,区,sbit,用于在,SFR,区定义位变量,位地址范围是,80HF7H,。,SFR,区的字节地址范围是,80HFFH,,但只有若干个字节单元可以位寻址,见图,2-2,。例如:字节地址为,80H,的,SFR,单元的位地址为,80H87H,。例如:,sbit P0_0 = 0x80;,定义了一个名为,P0_0,的,sbit,型位变量,,P0_0,的位地址为,80H,,即,sfr,中,P0,寄存器的第,0,位。,使用,sbit,型位变量能够方便地对单片机并口的某一单个位进行操作。在“,at89x52.h,”文件中,已经包含了对,P0P3,口所有单个位的定义,。,C51,编程时,若在程序开头使用“,#include,”语句,就可以直接引用,P0_0,、,P0_1,、,P3_7,这些位变量,而不必再进行定义。例如,要向,P1.1,引脚输出,0,,可编程如下:,#include/#include,为,C51,编译器的包含命令,/,其它语句,P1_1 = 0,;,2.1.2,特殊功能寄存器型(,sfr,,,sfr16,),sfr,用于定义位于,SFR,区的字节单元,利用它可以访问,SFR,区所有的单字节特殊功能寄存器。,sfr16,用于定义,SFR,区的双字节单元,利用它可以访问,SFR,区所有两个字节的特殊功能寄存器。,由于在“,at89x52.h,”、“,reg52.h,”这样的头文件中,已经包含了,51,、,52,子系列单片机所有,sfr,型变量的定义,所以,应用程序在包含了这样的头文件后,就可以直接引用所有,sfr,型变量的名称,如,P0,、,T0,、,SBUF,,等等,而不需再去定义它们。例如,要向,P0,端口输出,75H,,可编程如下:,#include/#include,为,C51,编译器的包含命令,/,其它语句,P0 = 0x75,;,/,向,P0,端口写入数据,75H,并输出到,P0.0P0.7,2.1.32.1.7,字符型,指针型,字符型数据的长度为一个字节,用于存放一个单字节数据。,整型数据的长度为两个字节,用于存放一个双字节数据。,长整型数据的长度为四个字节,用于存放一个四字节数据。,浮点型数据(,float,)是长度为四字节,的实数,指针型(,*,),,与之,对应的是指针变量。指针变量中存放的是数据的地址。,2.2.1,数组与字符串,相同类型的数据排列形成的有限集合就是数组。,在信息处理时常常用到以,ASCII,字符或扩展,ASCII,字符组成的字符串。,C,语言规定字符串以,0,作为结束符,,0,的,ASCII,码值为,00H,。,数值、字符串定义举例,int a10;/,定义整型数组,a,,所有,10,个元素的初值都为,0,int b10=1,2,3,4;/,定义整型数组,b,,前,4,个元素的值为,1,2,3,4,,余下的为,0,char c =1,2,3,4;/,定义字符型数组,c,,赋值了全部元素,数组长度可以省略,char d25;/,定义,2,行,5,列字符型数组,d,,所有,10,个元素的初值都为,0,char s =a,b,c,d;/,定义字符型数组,s,,元素为,a,b,c,d,char str = abcd;/,定义字符串,str,,元素为,a,b,c,d, 0,2.3,常量、变量,常量,:,是在程序,运行时,其值不能改变的量,变量,:,是在程序运行时其值可以改变的量,存储种类,:,是指变量在程序中的作用域,数据类型说明符用于声明变量的数据类型,存储器类型用于声明变量的存储单元应定位于单片机的哪一个存储区,,如图,2-4,2.4 C51,的运算符,C51,支持,的算术运算符有,+,、,-,、,*,、,/,、,%,、,+,、,-,,见图,2-5,。,C51,支持的关系运算符与逻辑运算符有,、,=,、,=,、,=,、,!=,、,|,、,&,、,!,。这些运算符及示例语句见图,2-6,。,位操作运算符对操作对象按位进行运算,包括位与(,&,)、位或(,|,)、位非(,)、位异或(,)、左移(,)六种,如图,2-7,所示。,特殊运算符包括各种赋值运算符,问号运算符,逗号运算符,地址及指针运算符等,其类型及示例如图,2-8,所示。,2.5 C51,的表达式和语句,1,if,语句,C51,的,if,语句有,if,、,if-else,、,if-else-if,三种形式。,见,图,2-9,2,switch,语句,switch,语句,的一般形式和,执行流程如,下,图所示,3. while,语句,一般形式为:,while(,表达式,),语句体;,do-while,语句,的,形式为:,do,语句体;,while(,表达式,),;,两种,while,语句的执行流程,如下图,4. for,语句,一般形式为:,for(exp1,;,exp2,;,exp3),语句体;,for,语句执行流程,如下,图,5,转移语句,包括:,(,1,),goto,语句,:使程序无条件转移到标号语句处,(,2,),break,语句:,作用是跳出,switch,语句或跳出本层循环,转去执行后续的程序,(,3,),continue,语句:作用是,结束本次循环,转入下一次循环条件的判断与执行,(,4,),return,语句:,return,语句只能出现在被调函数中,用于返回主调函数,其格式是:,return,(表达式);,其中,表达式为函数的返回值,2.6,函数,C51,函数定义的形式如下:,类型说明符 函数名,(,形式参数表,),类型说明;,语句;,函数调用的一般形式为:,函数名,(,实际参数表,),;,函数的编写与调试,示例,1,编写程序,在,Keil uV4,中输入以下程序,保存为类型名为,c,的文件,如,123.c,#include,int n;/,定义,int,型全程变量,n,/*,延时函数*,/,void delay(int n),int i;,for(i=0;in;i+);,/*,主函数*,/,main(),n = 20000;,while(1)/,主循环,P1_1 = 1;/,向,P1.1,引脚输出高电平,delay(n);/,延时,P1_1 = 0;/,向,P1.1,引脚输出低电平,delay(n);/,延时,delay(n);/,延时,2.,编译程序,(,1,)创建项目。,在,Keil uV4,中创建一个项目,确定项目名称,如,abc,(,2,)为项目选择单片机型号。这里选择,Atmel,公司的,AT89S52,(,3,)为项目添加,C51,文件,即把,123.c,添加到项目,abc,中,(,4,)设置编译后输出,HEX,文件,(,5,)按,F7,编译程序,3,调试程序,在,Keil uV4,的,Debug,菜单中,包含了多个用于调试源程序的选项。如:,Ctrl+F5,用于启动和终止调试,,F5,用于运行程序,,F10,为单步运行程序,,Ctrl+F10,为运行到光标所在行,,F9,为设置,/,清除断点。,Keil uV4,还具有查看单片机片内各种寄存器、,I/O,端口状态、程序中的各变量值,其,逻辑分析器,能够显示来自,I/O,引脚的信号波形。,4,下载到单片机,(,1,)首先在,PC,上安装,STC,单片机自动编程器的,USB,驱动程序,,如,CH340,驱动程序,。,(,2,)将编程器与,PC,通过,USB,线连接,连接后,PC,将为该设备分配一个虚拟串口。,(,3,)把编程器的,GND,、,RXD,、,TXD,、,5V0,分别与单片机芯片的,GND,、,P3.1,、,P3.0,、,VCC,连接,运行,STC-ISP,程序,选择单片机芯片型号。,(,4,)打开程序文件,如,abc.HEX,。,(,5,)选择串口,下载。,(,6,)下载成功后,程序即自动运行。若用杜邦线把,P1.1,引脚与一只,LED,连接,可以观察到,LED,闪烁,第三章 单片机片内接口,3.1,并行接口,MCS-51,单片机有,P0,、,P1,、,P2,、,P3,共,4,组并行,I/O,端口,每组端口都是,8,位准双向口,共,32,根引脚。,并口要点:,并行接口可以同时输入,/,输出,8,位数据。,准双向口,:,CPU,在读取,准双向口,输入的数据前,应向该接口输出高电平。但由于单片机复位时已经置,P0,、,P1,、,P2,、,P3,为高电平,所以把它们作为输入接口时,,CPU,就不需要再进行输出高电平的操作了。,3.1.1 P0,口,P0,口要点:,P0,口主要用作普通,I/O,接口,在一些应用中,需要对,P0,口的引脚外接上拉电阻。,CPU,访问P0的C51例句:,bit b;,char c;,c = P0;/字节访问:CPU读P0口引脚(P0.7P0.0)状态并存入字符型变量c,P0 = P0;/,字节访问:,CPU,读,P0,口各引脚锁存器,取反后输出到,P0.7P0.0,引脚,b = P0_0;/,位访问:,CPU,读,P0.0,引脚状态并存入位变量,b,P0_0 = P0_0;/,位访问:,CPU,读,P0.0,锁存器状态,取反后,输出到,P0.0,引脚,3.1.2 P1,口,P1,口要点,P1,是一个,8,位准双向口,它只作通用的,I/O,口使用,其访问方式与,P0,口相同,访问,P1,口的例句,:,char c1,c2;,bit b1,b2;,c1 = P1; /,字节访问:读,P1,口引脚(,P1.7P1.0,)状态并送入变量,c1,c2 = P1;/,字节访问:读,P1,口引脚(,P1.7P1.0,)状态,位取反后送入变量,c2,P1 = P1;/,字节访问:读,P1,口各锁存器,各位取反后输出到,P1,各引脚,P1 /,字节访问:读,P1,口各锁存器,同,0x01,按位与后输出到,P1,各引脚,P1_1 = P1_1;/,位访问:读,P1.1,锁存器,取反后,输出到,P1.1,引脚,b1 = P1_5;/,位访问:读,P1.5,引脚状态并送入变量,b1,b2 = P1_7;/,位访问:读,P1.7,引脚状态,取反后送入变量,b2,3.1.3 P2,口,P2,口,要点:,P2,主要,作为准双向通用,I/O,口使用,3.1.4 P3,口,P3,口,要点:,P3,的第二功能很重要,但对于不使用第二功能的引脚,仍可,作为准双向通用,I/O,口使用,3.1.5,并口应用举例,【例,3-1,】 用,P0.6,、,P0.7,引脚分别控制,2,只发光二极管,LED1,、,LED2,。控制方式为:,LED1,点亮、,LED2,熄灭;延时;,LED1,熄灭、,LED2,点亮;如此循环。,【例,3-2,】,用,P1.0,、,P1.1,引脚连接按钮,S1,、,S2,输入,用,P2.7,控制一只晶体管的导通与截止,该晶体管驱动一只小型直流继电器,K1,。控制要求是:按下,S1,后,,K1,通电;按下,S2,后,,K1,断电。,C51,程序如下。,#include,main(),while(1),bit run;/,定义位变量,指示,K1,状态,if(P1_0 = 0)run=1;/,按下,S1,,,run=1,if(P1_1 = 0)run=0;/,按下,S2,,,run=0,if(run=1)P2_7 = 0;/run=1,,,P2.7,输出低电平,,K1,通电,else P2_7 = 1;/run=0,,,P2.7,输出高电平,,K1,断电,【例,3-3,】,用,P2,口通过,ULN2003,驱动芯片控制一只小型步进电机运行,且通过软件延时实现电机通电相序的变换。试绘出控制电路并编写,C51,程序。,C51,程序如下。,#include,main(),while(1),int i;/,定义变量,i,,用于延时,for(P2=0x80,P0=0x80,i=0;i1000;i+);/A,通电,,LED,显示,延时,for(P2=0x40,P0=0x40,i=0;i1000;i+);/B,通电,,LED,显示,延时,for(P2=0x20,P0=0x20,i=0;i1000;i+);/C,通电,,LED,显示,延时,for(P2=0x10,P0=0x10,i=0;i1000;i+);/D,通电,,LED,显示,延时,3.2,中断,3.2.1,中断源,2,中断信号的产生,下面是,MCS-52,各中断信号的产生方式。,(,1,),INT0,中断:若预置,IT0=0,,当,P3.2/,引脚出现低电平时向,CPU,请求,INT0,中断;若预置,IT0=1,,当,P3.2/,引脚出现下降沿时向,CPU,请求,INT0,中断。,(,2,),INT1,中断:若预置,IT1=0,,当,P3.3/,引脚出现低电平时向,CPU,请求,INT1,中断;若预置,IT1=1,,当,P3.3/,引脚出现下降沿时向,CPU,请求,INT1,中断。,(,3,),T0,中断:当,T0,溢出标志,TF0=1,时,向,CPU,请求,T0,中断。,(,4,),T1,中断:当,T1,溢出标志,TF1=1,时,向,CPU,请求,T1,中断。,(,5,)串口中断:当串口发送中断标志,TI=1,、或串口接收中断标志,RI=1,时,向,CPU,请求串口中断。,(,6,),T2,中断:当,T2,溢出标志,TF2=1,、或,T2,外部标志,EXF2=1,时,向,CPU,请求,T2,中断。,3,中断允许的设置,下面是,C51,设置开中断和关中断的语句。,EX0 = 1; /*,开,INT0,中断*,/EX0 = 0;/*,关,INT0,中断*,/,EX1 = 1; /*,开,INT1,中断*,/EX1 = 0;/*,关,INT1,中断*,/,ET0 = 1; /*,开,T0,中断*,/ET0 = 0;/*,关,T0,中断*,/,ET1 = 1; /*,开,T1,中断*,/ET1 = 0;/*,关,T1,中断*,/,ES = 1; /*,开串口中断*,/ES = 0;/*,关串口中断*,/,ET2 = 1;/*,开,T2,中断*,/ET0 = 0;/*,关,T2,中断*,/,EA = 1; /*,开,CPU,中断*,/EA = 0;/*,关,CPU,中断*,/,3.2.2,中断优先级,MCS-52,所有的中断都具有,2,个中断优先级:,0,为低优先级,,1,为高优先级。每个中断的优先级均可用软件设置。,例如:,PX0 = 1; /*,设,INT0,中断为高优先级,*/,PX0 = 0;/*,设,INT0,中断为低优先级,*/,PX1 = 1; /*,设,INT1,中断为高优先级,*/,PX1 = 0;/*,设,INT1,中断为低优先级,*/,PT0 = 1; /*,设,T0,中断为高优先级,*/,PT0 = 0;/*,设,T0,中断为低优先级,*/,PT1 = 1; /*,设,T1,中断为高优先级,*/,PT1 = 0;/*,设,T1,中断为低优先级,*/,PT2 = 1; /*,设,T2,中断为高优先级,*/,PT2 = 0;/*,设,T2,中断为低优先级,*/,PS = 1; /*,设串口中断为高优先级,*/,PS = 0;/*,设串口中断为低优先级,*/,中断,查询次序由高到低排列:,INT0,,,T0,,,INT1,,,T1,,,UART,,,T2,3.2.3,中断服务函数,在,C51,中,中断服务程序是用中断服务函数来实现的,它的常用形式如下:,void,函数名,(void) interrupt,中断号,语句;,3.2.4,中断应用举例,【例,3-4,】,用单片机自测,INT0,、,INT1,中断优先顺序。,方法是把,P3.2/,与,P1.0,连接,把,P3.3/,与,P1.1,连接,,P0,与一只七段数码管,7-Seg,连接,主程序使,7-Seg,显示字型,P,,,INT0,中断服务程序使,7-Seg,显示字型,0,,,INT1,中断服务程序使,7-Seg,显示字型,1,。试绘出电路图、编写,C51,程序并进行测试。,#include,#include,volatile unsigned int i1,i2; /,编译器不对,volatile,型变量进行优化,main(),IT0 = IT1 = 1;/,置,INT0,、,INT1,下降沿触发中断,EX0 = 1;/,开,INT0,中断,删除此句禁止,INT0,中断请求,EX1 = 1;/,开,INT1,中断,删除此句禁止,INT1,中断请求,EA = 1; /,开,CPU,中断,删除此句禁止,CPU,响应中断,while(1)/,主循环,unsigned int i; /,用于延时,P0 = 0x8c;/7-Seg,显示,P,for(i=0;i65535;i+);/,延时,P1 = 0xFC;/,同时拉低,P1.0,、,P1.1,,输出到,P3.2,、,P3.3,,以触发中断,_nop_();_nop_();_nop_();_nop_();/,维持低电平,4,个机器周期,P1 = 0xFF;/,同时拉高,P1.0,,,P1.1,,输出到,P3.2,、,P3.3,/*INT0,中断服务程序*,/,void INT0_isr( ) interrupt 0/*INT0,中断号为,0*/,P0 = 0xc0;/7-SEG,显示,0,for(i2=0;i250000;i2+);/,延时,/*INT1,中断服务程序*,/,void INT1_isr( ) interrupt 2/*INT0,中断号为,2*/,P0 = 0xf9;/7-SEG,显示,1,for(i1=0;i150000;i1+);/,延时,3.3,定时器,/,计数器,3.3.1,定时器,/,计数器的结构,1,TCON,寄存器,TCON,是定时器控制寄存器,它的高,4,位用于控制,T0,、,T1,。,TCON,的格式为:,TF1,:,T1,溢出标志位。,T1,被允许计数以后,从初值开始加,1,计数。当最高位产生溢出时由硬件置位,TF1,,向,CPU,请求中断;,TF1,一直保持到,CPU,响应中断时,才由硬件清零(,TF1,也可由程序查询清零)。,TR1,:,T1,运行控制位。该位由软件置位和清零。当,TR1=1,时,启动,T1,开始计数;当,TR1=0,时,停止,T1,计数。,TF0,:,T0,溢出标志位,功能和,TF1,类似。,TR0,:,T0,运行控制位,功能和,TR1,类似。,2,TMOD,寄存器,GATE,:门控位。,GATE=0,时,,T0,、,T1,只分别由,TR0,、,TR1,来控制运行与停止;,GATE=1,时,用程序设置,TR0,或,TR1,为,1,,并且外部中断引脚(,P3.2/INT0,引脚与,T0,配合,,P3.3/INT1,引脚与,T1,配合)也为高电平时,才能启动,T0,或,T1,计数。,C/T,:定时,/,计数模式选择位。,C/T=0,为定时模式,即定时器对,CPU,内部的机器周期脉冲信号计数;,C/=1,为计数模式,即定时器对外部引脚(,P3.4/T0,、,P3.5/T1,)脉冲信号计数。,M1,、,M0,:工作方式设置位。,M1M0=00,:方式,0,,,13,位定时器,/,计数器;,M1M0=01,:方式,1,,,16,位定时器,/,计数器;,M1M0=10,:方式,2,,,8,位自动重装定时器,/,计数器;,M1M0=11,:方式,3,,,T0,分成两个,8,位的定时器,/,计数器。,3.3.2,定时器,/,计数器的工作方式,1.,方式,1,方式,1,为,16,位计数方式。,T0,的,16,位计数器由,TL0,和,TH0,组成。,TL0,溢出时,向,TH0,进位,,TH0,溢出时,置位,TF0,标志,向,CPU,发出中断请求。图,3-16,是,T0,工作在方式,1,的逻辑结构图,,T1,与之类似,2,.,方式,2,方式,2,为,8,位自动重装计数方式,各控制信号的作用与方式,1,相同。方式,2,下,,TL0,作,8,位计数器使用,,TH0,作为,8,位常数缓冲器,保存计数初值。当,TL0,计数产生溢出时,在把,TF0,置,1,的同时,将保存在,TH0,中的计数初值自动装入,TL0,,使,TL0,再次从该初值加,1,计数,如此循环。由于是,8,位的计数器,所以计数值达到,2,8,=256,就产生溢出。图,3-17,是,T0,工作在方式,2,的逻辑结构图,,T1,与之类似。,3,.,方式,3,方式,3,只适用于,T0,。此时,,T0,被分为两个独立的,8,位计数器,TL0,和,TH0,。其中,,TL0,占用,T0,的控制位、引脚和中断源。除计数位数不同于方式,1,外,其功能和操作与方式,1,完全相同,可定时也可计数。,TH0,占用,T1,的控制位,TF1,和,TR1,,同时还占用了,T1,的中断源,其启,/,停仅受,TR1,控制。,TH0,只能用作,8,位定时器,不能对外部脉冲计数。在这种情况下,,T1,一般用作串口波特率发生器。,3.3.3 T0,、,T1,应用举例,【例,3-5,】,设单片机晶振频率为,12MHz,,编写,C51,程序,用,T0,定时中断使,P1.0,引脚输出,1kHz,的脉冲方波,再用,T1,定时中断使,P1.1,引脚输出,10kHz,的脉冲方波。,1,定时器计数初值计算,T0,、,T1,用作定时器时,计数脉冲频率为,fosc/12,。设定时器的溢出频率为,f,,则定时器的计数次数,n= fosc/12/f,。定时器的计数初值就等于,256,(对于,8,位计数器)或,65536,(对于,16,位计数)减去分频数,即:,2.,程序框图,3.,程序,#include,#define FOSC 12000000L/,晶体振荡频率,#define N_T20KHZ (256-FOSC/12/20000)/T1,初值,#define N_TH2KHZ (65536-FOSC/12/2000)/256/TH0,初值,#define N_TL2KHZ (65536-FOSC/12/2000)%256/TL0,初值,main(),TMOD = 0x01;/T0,方式,1,:,TMOD |= 0x20;/T1,方式,2,:,TH1 = N_T20KHZ;/,装,T1,计数初值,EA = ET0 = ET1 = 1;/,开,CPU,、,T0,、,T1,中断,TR0 = TR1 = 1;/,启动定时器,T0,、,T1,while(1),void t0_isr()interrupt 1,TH0 = N_TH2KHZ;/,装计数初值高,8,位,TL0 = N_TL2KHZ; /,装计数初值低,8,位,P1_0=P1_0;/P1.0,取反后输出,void t1_isr()interrupt 3,P1_1=P1_1;/P1.1,取反后输出,【例,3-6,】,设单片机晶振频率为,12MHz,,用,T0,定时产生,1,秒钟的定时间隔,并通过,P0,控制一只共阳极七段数码管,显示秒钟的个位数。试绘出硬件电路并编写,C51,程序。,1,硬件电路,2,程序设计,#include,#define FOSC 12000000L/,晶体振荡频率,#define N_TH50ms (65536-FOSC/12*50/1000)/256/50ms(20Hz)TH0,初值,#define N_TL50ms (65536-FOSC/12*50/1000)%256/50ms(20Hz)TL0,初值,#define N_1sec 1000/50/1sec T0,中断次数,main(),TMOD = 0x01;/T0,方式,1: ,TR0 = 1;/,启动定时器,EA = ET0 = 1;/,开,CPU,、,T0,中断,while(1),code unsigned char SegDat=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/09,void t0_isr()interrupt 1,static int n_t0,n_sec;,TH0 = N_TH50ms;/,装计数初值高,8,位,TL0 = N_TL50ms;/,装计数初值低,8,位,if(+n_t0 = N_1sec),n_t0 = 0;,P0=SegDatn_sec;/P0,输出,显示,if(+n_sec = 10)n_sec = 0;,【例,3-7,】 用单片机的,P3.4/T0,引脚对一只,NPN,型光电开关的输出脉冲进行计数,并通过,P0,控制一只七段数码管,显示脉冲数的个位数。试绘出硬件电路并编写,C51,程序。,1.,光电开关工作原理,2.,硬件电路,3.,程序设计,#include,code unsigned char SegDat=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/09,main(),TMOD = 0x05;/T0,方式,1,,对外部脉冲计数,: ,TR0 = 1;/,启动,T0,while(1),unsigned int i;,i = TH0*256+TL0; /,读取,TH0,、,TL0,并合成为无符号,16,位整数,i %=10; /i,对,10,取余数,得到,i,的个位数,P0=SegDati; /P0,输出,显示,i,的字型,for(i=0;i30000;i+);/,为显示延时一段时间,/*,如果没有光电开关,可以把,P1.0,与,P3.4,连接,并加入以下语句,P1_0 = 0;,for(i=0;i10;i+);,P1_0 = 1;,*/,【例,3-8,】,用单片机的,P2.7,引脚通过,ULN2003,的一个通道控制一只直流电机的运行,并用,T0,定时器使,P2.7,引脚输出周期为,2ms,的,PWM,波形,设每个波形的前,1.5ms,为高电平,后,0.5ms,为低电平。试设计硬件电路并编写,C51,程序。,1,直流电机的驱动,2,控制电路,3.,程序设计,#include,#define FOSC 12000000L/,晶体振荡频率,#define N_T0d1ms (256-FOSC/12/10000)/0.1ms(10000Hz)TH0,初值,main(),TMOD = 0x02;/T0,方式,2: ,TH0 = N_T0d1ms;/,装,T0,计数初值预存于,TH0,TR0 = 1;/,启动,T0,EA = ET0 = 1;/,开,CPU,、,T0,中断,while(1),void t0_isr()interrupt 1/T0,中断号,=1,static char n_t0;/T0,中断次数,P2_7=(n_t0 15) ? 1 : 0;/,向,P2.7,输出,PWM,波形,if(+n_t0 = 20)n_t0=0;/PWM,周期,=20,次,0.1ms=2ms,3.4,串行接口,3.4.1,串行通信基本概念,1.,并行通信与串行通信,2.,异步通信方式,3,.,异步通信帧格式,异步通信的字符帧由起始位、数据位、校验位和停止位组成,见图,3-29,。,起始位,:位于字符帧开头,只占一位,为逻辑,0,低电平,用于向接收设备表示发送端开始发送一帧信息。,数据位,:紧跟起始位之后,根据通信约定可取,58,位,低位在前、高位在后。,奇偶校验位,:位于数据位之后,用于数据位的奇偶校验。奇偶校验有奇校验、偶校验和无校验三种方式,若选择无校验方式,则通信时不发送该位。,停止位,:位于字符帧的最后,为逻辑,1,的高电平,根据通信约定可取,1,位、,1.5,位或,2,位。用于向接收端表示一帧字符信息已经发送完,也为发送下一帧做准备。,从起始位开始到停止位结束的全部内容称之为一帧。两相邻帧之间可以没有空闲位,也可以有若干空闲位,3.4.2 51,单片机串口结构及串口寄存器,1,SBUF,寄存器,SBUF,是串口寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址,但不会出现冲突,因为它们当中一个只能被,CPU,读出数据,另一个只能被,CPU,写入数据。当,CPU,向,SBUF,写入时,数据进入发送,SBUF,,同时启动串行发送;当,CPU,读,SBUF,时,实际上是读接收,SBUF,中的数据,2,SCON,寄存器,串口控制寄存器,SCON,的格式为:,SM2,:多机通信控制位。在方式,0,时,,SM2,应为,0,。在方式,1,中,如果,SM2,位为,1,,则只有接收到有效停止位时,,RI,才置,1,。在方式,2,或方式,3,时,当,SM2=1,且接收到的第,9,位数据,RB8=1,时,置位,RI,;否则不置位,RI,REN,:接收允许控制位。由软件置位以允许串口接收,又由软件清,0,来禁止串口接收。,TB8,:是要发送数据的第,9,位。在方式,2,或方式,3,中,,TB8,为要发送的第,9,位数据,根据需要由软件置,1,或清,0,。例如,可以约定,TB8,作为奇偶校验位,或者在多机通信中用它作为区别地址帧或数据帧的标志位。,RB8,:接收到的数据的第,9,位。在方式,0,中不使用,RB8,。在方式,1,中,若,SM2=0,,,RB8,为接收到的停止位。在方式,2,或方式,3,中,,RB8,为接收到的第,9,位数据。,TI,:发送中断标志。在方式,0,中,当第,8,位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。,TI,置位既表示一帧信息发送结束,同时也请求串口中断,可根据需要,用程序查询的方式获得数据已经发送完毕的信息,或者用中断的方式来发送下一个数据。,TI,必须用软件清,0,。,RI,:接收中断标志位。在方式,0,,当接收完第,8,位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于,SM2,的说明)。,RI,置位表示一帧数据接收完毕,可以用程序查询的方式获知或者用中断的办法获知。,RI,必须用软件清,0,。,3,PCON,寄存器中的,SMOD,位,SMOD,是电源控制寄存器,PCON,中的最高位,用于设置串口方式,1,、方式,2,、方式,3,的波特率是否加倍:,SMOD=1,,波特率加倍;,SMOD=0,,波特率不加倍。,3.4.3,串口工作方式,方式,0,当,SM0=SM1=0,时,串口工作于方式,0,,为移位寄存器输入,/,输出方式。这种方式常用于外接移位寄存器扩展并行,I/O,接口。,方式,1,当,SM0=0,、,SM1=1,时,串口工作于方式,1,,为波特率可变的,10,位异步串行通信方式。一帧信息包括,1,个起始位,,8,个数据位和,1,个停止位。,通常单片机与单片机串口通信,单片机与计算机串口通信,都选择方式,1,。,方式,2,当,SM0=1,、,SM1=0,时,串口工作于方式,2,,为固定波特率的,11,位,UART,方式。它比方式,1,增加了一位可程控为,1,或,0,的第,9,位数据。,方式,3,当,SM0=SM1=1,时,串口工作于方式,3,,为波特率可变的,11,位,UART,方式。除波特率外,其余与方式,2,相同,。,3.4.4,串口接收,/,发送编程举例,【例,3-9,】,在直流电机的,PWM,控制中,用单片机的串口接收,PWM,波形中高电平的时间值,以改变,PWM,脉冲的占空比。已知单片机晶振频率为,11.0592MHz,,串口通信参数为:波特率,=9600,,数据位,=8,,无奇偶校验,停止位,=1,。试编写,C51,程序,。,1,PWM,调速的实现,例,3-8,的程序设计实现了用,T0,定时中断输出,PWM,波形,但要实现电机的速度调节,还需要适时地改变,PWM,波形中高电平或低电平所占的时间值。本例中单片机通过串口接收的方法获得,PWM,波形中高电平所占的时间值,并把它存储于全程变量,PWM_ON,中,以供,T0,中断服务函数使用。,2,程序设计,#include,#define FOSC 11059200L/,晶体振荡频率,#define N_T0d1ms (256-FOSC/12/10000)/0.1ms(10000Hz)TH0,初值,char PWN_ON = 10;/,全程变量,,PWM,高电平时间值,main(),/*,设置,T0,方式,2,,,0.1ms,定时,*/,TMOD = 0x02;/T0,方式,2:,TH0 = N_T0d1ms;/,装,T0,计数初值预存于,TH0,TR0 = 1;/,启动,T0,EA = ET0 = 1;/,开,CPU,、,T0,中断,/*,设置串口:波特率,=9600,,数据位,=8,,无奇偶校验,停止位,=1*/,TMOD |=0x20;/T1,方式,2,,,8,位自动重装,TH1 = 0xFD;/9600bps,,,T1,定时初值,SM0=0,SM1=1;/,设定串口方式,1,:,REN=1;/
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!