版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目一、单片机最小系统的设计能力目标1、能根据单片机的引脚功能设计出最小系统的硬件电路图。2、会使用常用的仪表,能够识别和检测元器件。3、能焊接和拆卸元器件。4、能够掌握KEIL软件的基本使用。5、能够检修最小系统的硬件故障。6、能够掌握编程器的使用。知识目标1、了解单片机的基本组成、分类、发展。2、单片机的引脚功能、外围器件的连接。3、单片机的时序、存储器配置。4、单片机最小系统的检测。任务一认识单片机最小系统
一、初识单片机单片机全称单片微型计算机(SingChipMicrocomputer),又称MCU(MicroControllerUnit),就是将CPU、系统时钟、RAM、ROM、定时器/计数器和多种I/O接口电路都集成在一块芯片上的微型计算机,典型的单片机结构框图如下:MCS-51系列单片机包括下列型号:1、8031、8051、8751、8951四种型号的单片机通常称为8051子系列,区别仅仅在于:8031没有片内程序存储器,8051内含4KB的ROM,8751片内有4K的EPROM,8951片内有4K的E2PROM。2、8032、8052、8752、8952是8031、8051、8751、8951的增强型,内部RAM为256字节,片内程序存储器为8KB,比8051子系列各增加了一倍,同时还增加了一个定时器/计数器和一个中断源。3、80C31、80C51、87C51、89C51是8051子系列的CHMOS芯片,两者功能兼容。CHMOS型芯片的基本特点是功耗低。二、认识单片机的硬件电路1、单片机的外观及引脚排列VCC:单片机电源输入端,接+5VGND:单片机的地线,接地。XTAL1、XTAL2:用于产生单片机工作所需的时钟信号,只要接上晶振、电容就可以了。RST:复位信号输入端,用于通电时对单片机内部寄存器进行初始化,只需接上相应的电阻、电容。/EA:通常直接将该引脚与电源VCC相连。2、单片机最小系统电路图
所谓单片机最小系统,是指在尽可能少的外部电路条件下,形成一个可以独立工作的单片机系统,也就是说为了保证单片机能够工作,所必须的最小系统配置。1、首先,要保证各电路能够工作,必须要有电源;2、其次单片机是数字电路,其工作离不开时钟,因此必须给单片机配置时钟电路;3、另外为保证单片机可靠工作,还须配置复位电路;4、在以上3个必要条件的基础上加上应用系统所需的控制电路。电源时钟电路复位电路外围控制电路3、控制程序介绍#include<reg51.h>sbitLED=P0^0;main(){unsignedinti;while(1) {LED=0;for(i=0;i<20000;i++);LED=1;for(i=0;i<20000;i++);} }包含针对51系列单片机的基本声明用符号LED来表示P0.0引脚定义一个用于延时的变量将P0.0设置为低电平,点亮发光管变量i从0加到20000,完成延时将P0.0设置为高电平,熄灭发光管变量i从0加到20000,完成延时任务二认识MCS-51单片机结构
一、单片机的内部结构二、CPU的结构
CPU是单片机的核心,MCS-51系列单片机内含一个高性能的8位中央处理器。CPU的作用是从ROM中读取指令并进行分析,然后根据指令的功能控制单片机的功能部件执行指定的操作。CPU由运算器和控制器两大功能部件组成。1、运算器
运算器的主要功能是进行算术运算和逻辑运算,由算术逻辑运算部件ALU、暂存器及部分特殊功能寄存器组成。
在ALU进行运算时,通常会用到ACC、B、PSW三个特殊功能寄存器。
ACC寄存器(简称累加器A):用于向ALU提供操作数和存放运算结果,还可实现与程序存储器、片外数据存储器及I/O接口的数据传递,是使用最频繁的寄存器。
B寄存器:在乘除运算时存放另外一个操作数,乘除运算完成后,存放运算的一部分结果,如果不进行乘除运算,B寄存器可作为一般寄存器使用。
PSW寄存器:又称为程序状态字寄存器,当加、减、乘、除等指令执行完后,用来存储相应的状态信息,PSW是一个8位的寄存器,各位的定义如下:CY:进位标志,进行运算时,如果操作结果在最高位有进位或借位,CY=1,否则CY=0。AC:辅助进位标志,如果操作结果的低4位有进位或借位,AC=1,否则AC=0。F0:用户标志位,其功能由用户自行定义,用户可通过软件对它置位、复位或测试。RS1、RS0:工作寄存器选择位,用于选择工作寄存器R0~R7的实际位置,取值为00~11,具体说明见后面的章节。OV:溢出标志,如果两个操作数的运算结果超出了运算范围,OV=1,否则OV=0。P:奇偶标志位,如果累加器A中1的个数为奇数,P=1,否则P=0。2、控制器
控制器的作用是控制单片机各部件的协调动作,由程序计数器PC、指令寄存器IR、指令译码器ID、堆栈指针SP、数据指针DPTR、定时与控制逻辑电路等组成。
程序计数器PC是一个16位的计数器,它总是存放着下一条指令所在的16位地址,单片机运行过程中,CPU总是根据PC所指定的地址从程序存储器中取出指令,然后分析执行,同时PC的值自动加1,为读取下一条指令作准备。单片机上电或复位时,PC自动清0,从地址0000H开始取指执行。
指令寄存器IR用来保存正在执行的指令代码。若要执行一条指令,首先要把它从程序存储器取到指令寄存器中。
定时与控制逻辑电路是CPU的核心部件,用来控制取指令、分析指令、存取操作数等操作。它向其它部件发出各种操作控制信号,协调各部件的工作。
数据指针DPTR是一个16位的寄存器,由DPH(数据指针的高8位)和DPL(数据指针的低8位)组成,既能作为一个16位寄存器使用,也可作为两个独立的8位寄存器使用,DPTR通常用于存放外部数据存储器的单元地址。
堆栈指针SP用于指示堆栈顶部在内部RAM中的位置,当数据压入堆栈时,SP首先自动加1,然后存入数据;当数据从堆栈中弹出时,首先将SP指针所指地址的内容弹出,然后SP自动减1。
三、MCS-51单片机的引脚
1、电源类引脚
VCC(40脚):单片机工作电源的输入端,+5V。VSS(20脚):电源的接地端。2、时钟振荡引脚
XTALl(19脚)、XTAL2(18脚):其内部是一个振荡电路,通常在这两个管脚之间接6~12MHz的石英晶振和30PF左右的电容。单片机的时序单位
时钟周期:又称振荡周期,是最小的时序单位。如果时钟频率fosc=12MHz,则时钟周期=1/fosc=0.0833us。
状态周期:连续的两个时钟脉冲称为一个状态,即一个状态周期=2个时钟周期。
机器周期:1个机器周期由6个状态周期即12个时钟周期组成,是单片机完成某种基本操作的时间单位,如果时钟频率fosc=12MHZ,则机器周期=12/fosc=1us。
指令周期:执行一条指令所需的时间。一个指令周期由1~4个机器周期组成,依据指令的不同而不同。3、控制信号引脚
RST:复位信号输入端。MCS-51单片机的复位靠外部电路实现,复位信号由RST(RESET)引脚输入,高电平有效,复位后程序从0000H地址单元开始执行。ALE:地址锁存允许信号。在访问外部存储器时,8051通过P0口输出片外存储器的低8位地址,ALE用于将片外存储器的低8位地址锁存到外部地址锁存器中。
/PSEN:外部程序存储器ROM的读选通信号。在访问外部ROM时,引脚产生负脉冲,用于选通片外程序存储器。
/EA:高电平时,对于低4KB程序存储器的读操作,将针对片内ROM进行,当地址范围超出低4KB时,读操作将自动切换到片外程序存储器中进行;低电平时,片内的程序存储器被屏蔽,对ROM的读操作限定在外部程序存储器。
4、并行I/O口
单片机内部有P0、P1、P2、P3四个8位双向I/O口,外设与这些端口可以直接相连,无需另外的接口芯片。P0~P3既可以按字节输入或输出,也可以按位进行输入或输出,共32条口线,其控制十分灵活方便。各个端口的结构、功能有所不同。P0口的基本功能是数据的输入与输出,此外在扩展程序存储器、外部数据存储器或I/O口时,作为数据总线和低8位地址总线。
是P0口作为输出口使用时需加上拉电阻,;P0作为输入口使用时,必须首先写端口输出‘1’.P1口只能作为通用I/O口,内部结构如图所示,由于内部有上拉电阻,因此输出时无需加上拉电阻,但输入时,同P0口一样,必须向端口输出‘1’,
P2口既可以作为通用I/O口,在扩展程序存储器、外部数据存储器或I/O口时,也可作为地址总线的高8位。作为I/O口使用时,用法与P1口一样。P3口除了双向输入/输出口功能外,还具有第二功能,其内部结构如图所示。其输入/输出的用法同P1口。任务三认识单片机的存储器
8051单片机的存储器从物理上分为四个存储空间:片内程序存储器、片外程序存储器、片内数据存储器、片外数据存储器。从用户角度看,8051单片机的存储器可分为三个逻辑空间:片内、片外统一编址的64KB(0000H~FFFFH)程序存储器空间。
片内256B数据存储空间,其地址为00H~FFH,其中80H~FFH内仅二十几个字节单元的特殊功能寄存器。
片外64KBRAM数据存储空间,其地址为0000H~FFFFH。一、程序存储器
用于存放程序、表格、常量。MCS-51单片机有64KB程序存储空间,地址范围为0000H~FFFFH,/EA引脚用来选择低地址(0000H~0FFFH/0000H~1FFFH)空间是用片内的程序存储器还是片外的程序存储器。二、片内数据存储器
51子系列只有128字节的片内RAM,地址范围00H-7FH;52子系列除了以上128字节的片内RAM外,还拥有80H-FFH之间的128字节的片内RAM。
片内RAM按其功能可分为4个不同的区域:(1)工作寄存器区(00-1FH)(2)位寻址空间(20H-2FH)(3)用户RAM区(30H-7FH)(4)间接寻址区(80H-FFH)工作寄存器区又分四组,依次为第0~3组,每组有8个单元,用R0~R7作为单元的编号。某一时刻,只能选中一组工作寄存器,被选中的组称为当前组。当前组的选择由程序状态字PSW中的RS0、RS1位决定。位寻址空间共16个字节,每个字节8位,共128位,每位都有一个独立的编号(称为位地址),位地址范围为00~7FH。用户对该区域的访问是按字节方式寻址的,通常用来存放参与运算的数据或运算的中间结果,另外也常把堆栈开辟在该区域。间接寻址区共128字节,80C32、80C52、89C52等型号的单片机才有。对该区域数据的读写必须采用间接寻址方式。三、外部数据存储器
MCS-51单片机具有扩展64KB外部数据存储器和I/O端口的能力,外部数据存储器和外部I/O口采用统一编址,用MOVX指令对其进行读/写。如果片内I/O口或数据存储器的资源不能满足应用系统的要求,用户可以扩展I/O口或外部数据存储器。
8XX51单片机共有21个字节的特殊功能寄存器SFR,用来设置片内电路的运行方式,记录电路的运行状态。另外,并行I/O口和串行I/O端口也是特殊功能寄存器,对这些寄存器的读/写,能够实现从相应I/O端口的输入/输出操作。21个特殊功能寄存器不连续地分布在80H-FFH的地址空间中,其中地址能够被8整除的特殊功能寄存器具有位寻址能力,可直接用指令将该寄存器的某位置1或清0。任务四单片机最小系统的制作一、最小系统的硬件电路二、输入源程序、产生目标代码
硬件电路安装完成后,还必须编写控制发光二极管闪烁的程序。单片机程序通常使用汇编语言或C语言编写,无论使用哪一种语言编写,都需将源程序转换为目标代码。KeilC51是目前最为流行的51系列单片机C语言软件开发系统,集成了文件编辑、编译连接、项目管理、软件仿真调试等多种功能。1、Keil的启动。2、新建一个项目并选择单片机的型号。3、创建一个新的源程序文件,并将该源文件添加到项目中。4、设置目标文件的存放位置。5、编译项目并创建HEX文件。三、编程器的使用
当我们将硬件电路、控制程序调试好以后,必须把源程序的目标代码写入单片机芯片中,才能将单片机芯片插入电路板的单片机插座上,上电运行。要将目标代码写入单片机芯片中,离不开编程器。EasyPRO800编程器的外观
2、烧录器件的步骤(1)硬件准备在确保正确安装了通用编程器应用软件,以及USB驱动程序之后,连接好电源适配器及USB通讯线。此时编程器的红色电源指示灯点亮,指示连接正常,绿色编程结果指示灯点亮,指示编程器处于等待编程状态。(2)插入芯片按编程器锁紧座旁所标示的方式正确放置芯片。(3)选择目标芯片型号(4)装入目标文件(5)目标代码写入四、调试方法与步骤1、通电前应仔细检查线路板上元器件的连线是否正确、焊点之间有无短路等问题。2、用万用表测量电源与地线之间的电阻,如果电阻为0或很小,说明有短路现象,应将问题解决后才能加上5V电源。3、最小系统通电后,如果发光二极管不能按要求闪烁,应检查RST引脚的状态,上电或复位按钮压下时该引脚应为高电平,复位结束后该引脚应为低电平,如果RST引脚始终为高电平,说明单片机一直处在复位状态;反之如果在上电或复位时RST引脚不能出现高电平,说明单片机没有复位。以上两种情况单片机都无法正常工作,此时应仔细检查复位电路。4、检查/EA引脚的状态,正常工作时该引脚应该为高电平,如果该引脚虚焊或漏焊,单片机也无法正常工作。5、用示波器观察XTAL2引脚的波形,如果看不到如图所示的波形,说明振荡电路没有正常工作,此时应检查晶振、电容的连接是否正确。
项目一、抢答器的设计能力目标1、能够使用单片机C语言编写控制程序。2、能够熟练使用Keil软件来仿真调试单片机程序。3、能够熟练使用Proteus仿真软件来仿真单片机系统。4、能够根据P0-P3的功能特点,完成简单的单片机应用系统的设计与调试。知识目标1、了解单片机P0-P3口的内部结构及使用方法。2、掌握单片机C语言的编程特点。3、MCS-51单片机的中断系统,外部中断的应用。4、KEIL软件调方式程序的方法。5、PROTEUS仿真单片机硬件电路。任务一认识单片机C语言一、C语言特点目前单片机C语言已非常流行,绝大部分单片机应用系统可直接用C语言来编写,与汇编语言相比,用C语言开发单片机具有如下特点:1、开发速度优于汇编语言;2、软件的可读性和可维护性显著改善;3、提供了库函数包含许多标准子程序,具有较强的数据处理能力;4、关键字及控制转移方式更接近人的思维方式;5、方便进行多人联合开发,进行模块化软件设计;6、C语言本身并不依赖于机器硬件系统,移植方便;7、适合运行嵌入式实时操作系统。二、C51的数据类型
我们用变量去描述一个现实中的数据时,应根据需要选择变量类型。对于C51来讲,不管采用哪一种数据类型,虽然源程序看起来是一样的,但最终形成目标代码的长度和运行速度相差非常大。三、C51的数据存储类型与8051存储器结构MCS-51系列单片机将程序存储器(ROM)和数据存储器(RAM)分开,并有各自的寻址机构和寻址方式。8051单片机在物理上有四个存储空间:片内程序存储器空间:0000H-0FFFH片外程序存储器空间:1000H-FFFFH(/EA=1)0000H-FFFFH(/EA=0)片内数据存储器空间:00H-1FH:通用工作寄存器区20H-2FH:位寻址空间30H-7FH:用户RAM区80H-FFH:特殊功能寄存器区/间接寻址区片外数据存储器空间:0000H-FFFFHC51中变量定义的格式:
数据类型[存储类型]变量名1[,变量名2]…[,变量名n];例:chardatatemp;bitbdataflags;ucharbdataspeed;ucharidatalen;ucharcodeseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};
如果变量定义时省去存储类型说明,编译时会自动选择默认的存储类型,而默认的存储类型由存储模式确定。在C51中有SMALL、COMPACT、LARGE三种存储模式,在KEIL环境中,可以通过目标工具选项设置选择所需的存储模式。
四、定义8051特殊功能寄存器及I/O口1、定义8051特殊功能寄存器(1)、对特殊功能寄存器的访问sfrSFR名=SFR地址;例:sfrTMOD=0x89;(2)、对于SFR的16位数据的访问
sfr1616位SFR名=低8位SFR地址;例:sfr16DPTR=0x82;(3)、SFR中的某位进行访问
sbitSFR位名=SFR名^i;例:sbitTR0=TCON^4;
sbitSFR位名=SFR地址^i;
例:sbitTR0=0x88^4;
sbitSFR位名=位地址;例:sbitTR0=0x8C;(4)、可位寻址对象的定义可位寻址对象指既可以字节寻址,又可位寻址的对象,位于片内RAM的20H~2FH中。一般先定义变量的数据类型,数据类型可以是字符型、整型、长整型等,其存储器类型必须定义为bdata,然后使用sbit定义该变量中可单独寻址访问的位。例:charbdatastate;sbitstate_7=state^7;main(){state=5;state_7=1;}2、定义8051并行接口(1)、片内并行口的定义8051单片机带有4个8位并行口,即SFR中的P0、P1、P2、P3口,对它的定义在reg51.h已存在,可直接对其引用,例:P2=0xFE;Key=P1;如果要单独对某位进行操作,可在程序的开头加上位寄存器定义,例如:sbitP1_0=P1^0;在随后的程序中即可对这些位进行访问。例如:while(P1_0==1);(2)、定义片外并行口对于MCS-51单片机外扩展的I/O口,例8255、8155等,则根据其硬件译码地址,将其视为片外数据存储器的一个单元,使用#define语句定义格式如下:
#defineI/O口名称XBYTE[I/O口地址]其中,XBYTE表示绝对存储器访问的宏,在文件absacc.h中定义,方括号中[]中是存储器的绝对地址。在使用这种格式定义之前,应加上语句:
#include<absacc.h>例如:在系统中扩充的USB接口芯片,其命令口地址为0xBDF1,数据口地址为0xBDF0,可以这样定义:#include<absacc.h>#defineCMDPORTXBYTE[0xBDF1]#defineDATPORTXBYTE[0xBDF0]五、认识C51的内部函数及常用的宏
C51运行库提供了100多个预定义函数和宏,用户可以在自己的C程序中使用这些函数和宏。1、内部函数c51编译器支持许多内部库函数,内部函数产生的在线嵌入代码与调用函数产生的代码相比,执行速度快,效率高。常用的内部函数如下:_crol_(v,n):将无符号字符变量v循环左移n位._cror_(v,n):将无符号字符变量v循环右移n位._irol_(v,n):将无符号整型变量v循环左移n位._iror_(v,n):将无符号整型变量v循环右移n位._nop_():延时一个机器周期,相当于NOP指令。2、绝对存储器访问宏
C51标准库包含了可以访问显式存储地址的宏,可以像使用数组一样使用这些宏:1、CBYTE允许用户访问程序存储器中指定地址单元。例:id=CBYTE[0X200];2、XBYTE允许用户访问外部数据存储器中指定地址单元。例:XBYTE[0X100]=d;3、DBYTE允许用户访问片内数据存储器中指定地址单元。
以上宏在ABSACC.H文件中定义,为了使用这些宏,必须在程序开始时加上:#include<absacc.h>任务二、P0~P3口应用举例1、硬件电路
[案例1]设计一电路,监视开关S0-S3的状态,当某开关闭合时,对应的发光二极管点亮,如开关断开时,发光二极管熄灭。P0口作为输出口P1口作为输入口2、设计思想
将开关S0-S3接在P1.0-P1.3引脚,当某个开关Si接通时,对应的引脚P1.i为低电平,如果我们向P0.i引脚输出低电平,发光二极管Di就能被点亮;当开关Ki断开时,由于P1口内部具有上拉电阻,对应引脚P1.i为高电平,如果我们向P0.i引脚输出高电平,发光二极管Di熄灭。因此我们只要读取P1口低四位的状态并传送给P0口即可。3、程序清单#include<reg51.h>sbitP10=P1^0;…………sbitP03=P0^3;voidmain(void){P1=P1|0x0f;while(1){P00=P10;P01=P11; P02=P12;P03=P13;}}定义所用的I/O口引脚将P1口置1,作输入口使用
直接将P1.0的状态送到P0.0
[案例2]如图所示,由P0口控制发光二极管D1-D8,首先点亮D1,延时0.5秒后,熄灭D1点亮D2,到D8点亮并熄灭后,再点亮D1,这样不断循环。1、设计思想
我们可以定义一个变量led,初值为0XFE(11111110B),当led送到P0口时,D1被点亮,延时后,将led改为0XFD(11111101B)送P0口,则D1熄灭,D2点亮,这样即能产生发光管流动的感觉。变量led由0XFE→0XFD→……0X7F→0XFE可通过移位操作来实现,可调用C51的内部函数“_crol_(c,n);”,该函数的功能是将字符型变量c循环左移n位,其功能是将第0位移入第1位,第1位移入第2位……第6位移到第7位,最终将第7位移到第0位。2、程序清单#include<reg51.h>#include<intrins.h>#defineucharunsignedcharvoiddelay(ucharn){…………}voidmain(void){ucharled=0xfe;while(1){P0=led;delay(100);led=_crol_(led,1);}}延时程序,n:入口参数,单位:2毫秒左右。首先点亮LED1。将led左循环移位一次。延时。led送P0口。[案例3]如图所示,用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作为报警信号,要求1KHz的信号响200ms,500Hz的信号响400ms,两种信号交替产生,P1.1接一个控制开关,当开关合上时产生报警,当开关断开时停止报警。1、设计思想500Hz的信号周期为2ms,信号电平为每1ms变反一次;1KHz的信号周期为1ms,信号电平为500us取反一次。因此只要编写一个延时程序,当入口参数n=1时,延时时间为500us,n=2时,延时时间为1000us。每次调用延时函数后就对P1.0求反,即可产生频率为1KHz或500Hz的方波。以上过程连续循环200次,就能使1KHz的声音持续100ms,500Hz的声音持续200ms。
500500123200100010004122002、程序清单sbitS1=P1^1;sbitSPK=P1^0;voidmain(void){ucharm,n;S1=1;while(1){while(S1==0)for(n=1;n<=2;n++)for(m=0;m<200;m++){delay(n);SPK=~SPK;}}}S1控制是否产生报警声用来产生方波P1.1作为输入口时先置1只有S1接通时,才产生报警n=1:1KHz;n=2:500Hz循环200次,延时500us或1ms
,P1.0求反,产生方波,[案例4]设计一个流水灯控制器,发光管的变化方式、变化速度各有四档,可用按钮K13、K14进行选择。1、设计思想如图所示,开关K13、K14分别接到P2.4、P2.5引脚,当有键被按下时,对应引脚为低电平,按键释放时,又恢复为高电平,因此通过检测该引脚电平的高低就能判别当前是否有键被按下。根据要求,我们可以设计如表2-4所示四种方式的控制字。变量mode用来选择当前的工作方式,其值在0-3之间,受按钮K13控制;变量i用来记录当前的输出位置,其值在0-7之间,每次输出后自动指向下一位置。
为了控制发光管移动速度,我们定义一个表示速度等级的变量speed,取值范围在0-3之间,受按钮K14控制。2、程序清单voidmain(void){uchari=0;ucharmode=0; ucharspeed=0; while(1){for(i=0;i<8;i++) {P0=tab[mode][i]; if(K13==0) {mode=mode++; mode=mode&0x03;}elseif(K14==0) {speed=speed++; speed=speed&0x03; }delay(50+speed*50);}}}通电后的默认方式为0、默认速度等级0每种方式有8个控制字从当前模式中取控制字输出
K13按下,修改当前工作模式K14按下,修改当前速度等级延时由speed指定的时间任务五认识MCS-51单片机的中断系统
一、中断的概念当CPU正在执行某段程序时,外部发生了某一事件请求CPU迅速去处理,于是CPU暂时中断当前程序的执行,转去处理发生的事件,处理完成后,再回到原来被中断的地方,继续执行被中断的程序,这一过程称为中断。在中断系统中,把引起中断的设备或事件称为中断源;由中断源向CPU发出的中断请求称为中断请求信号;
CPU接收中断请求而暂停现行程序的执行,转去为服务对象服务称为中断响应;为服务对象服务的程序称为中断服务程序;
现行程序暂停时的PC值称为断点;
从中断服务程序返回到断点处称为中断返回;当有多个中断源同时向CPU申请中断时,CPU优先响应最紧急的中断请求,处理完毕再响应优先级别较低的中断请求,这种预先安排的响应次序称为中断优先级。1、使CPU的工作效率大为提高
CPU和外部设备通过中断方式交换信息,可以避免不必要的等待和查询,CPU可启动多个外设与它并行工作,对各个外设实行统一管理,分时服务,从而大大提高了CPU的工作效率。2、增强了实时控制及应急处理能力在实时控制系统中,被控制对象的参数变化必须及时采集、处理,并转化为相应的控制动作,对系统进行调节;数据的越限、系统的故障信息也必须被计算机及时发现,以便报警。有了中断功能后,系统的失常和故障都可通过中断立刻通知CPU,使它能够迅速采集实时数据和故障信息,并对系统做出应急处理。计算机采用中断技术后的优点二、MCS-51单片机的中断系统
(一)中断源
MCS-51系列单片机中,基本型8XX51有5个中断源,增强型8XX52有6个中断源,它们在程序存储器中各有固定的中断服务程序入口地址(又称中断向量地址),当CPU响应中断时,硬件自动形成各自的入口地址,由此进入中断服务程序,从而实现正确的转移。(二)中断控制寄存器1、中断的允许和禁止——中断控制寄存器IE8XX51/52的每个中断源对应于IE寄存器的一位,如果允许该中断源中断,则该位置1,禁止该中断源中断,则该位清0。另外还有一位CPU是否响应中断的总控位。ES:串行口中断允许位,ES=1,允许;ES=0,禁止。ET0/ET1/ET2:定时器中断允许位,为1,允许;为0,禁止。EX0/EX1:外部中断允许位,为1,允许;为0,禁止。EA:中断总控开关。EA=1,CPU开中断;EA=0,CPU关中断。2、中断请求标志及外部中断方式选择寄存器TCONTF1、TF0、IE1、IE0分别为中断源T1、T0、/INT1、/INT0的中断请求标志,如果中断源有中断请求,相应的中断标志置1;没有中断请求,相应标志位为0。IT0、IT1分别为外部中断/INT0、/INT1的中断触发方式选择,如果选择下降沿触发IT应设置为1;如果选择低电平触发,IT应设置为0。TR1、TR0为定时器T1、T0工作的启动和停止位,与中断无关,请参阅项目三。3、中断优先级管理寄存器IP
8XX51/52中断源优先级由IP寄存器管理,一个中断源对应一位,如果对应位置1,该中断源为高优先级;如果对应位为0,则为低优先级。
当某一时刻有多个中断源提出中断请求时,CPU首先响应高优先级的请求;一个低优先级的中断可能被高优先级的中断所中断,但不能被另一个低优先级的中断所中断。一个高优先级的中断不能被其他中断所中断。
当某几个中断源在IP寄存器中的相应位同为1或同为0时,CPU的查询顺序为:/INT0→定时器T0→/INT1→定时器T1→串行口→定时器T2(三)中断的响应过程单片机在每个机器周期顺序采样每个中断源,在下一个机器周期按优先级顺序检测中断标志,如果发现某个中断标志为1,将在接下来的机器周期按优先级进行处理。中断系统通过硬件自动将当前的PC值压入堆栈,以保护断点,再将相应的中断服务程序的入口地址装入PC,使CPU转到中断服务程序的入口处开始执行程序。中断服务程序从向量地址开始,一直到返回指令RETI为止,RETI指令一方面告诉中断系统该中断服务程序已执行完毕,另一方面把压入堆栈的断点地址从堆栈中弹出,装入程序计数器PC,使程序返回到被中断的程序的断点处继续执行。(四)中断程序的设计用户对中断的控制和管理,实际是围绕寄存器IE、TCON、IP、SCON进行的,这几个寄存器在单片机复位时是清零的,因此必须根据需要对这几个寄存器的相关位进行设置。编写中断服务程序时应注意:(1)开中断总控开关EA,置位中断源的中断允许位;(2)根据外部中断请求信号/INT0、/INT1的特性选择中断触发方式,是低电平触发还是下降沿触发;(3)如果有多个中断源中断,应设置中断优先级,预置IP。
使用C51可以编写出高效的中断服务程序,中断服务程序定义为函数,函数的定义如下:
void函数名(void)interruptn[usingm]其中,interruptn表示将函数声明为中断服务函数,n为中断号,通常取以下值:
0:外中断01:定时/计数器T0中断2:外中断3:定时/计数器T1中断4:串行口发送与接收中断5:定时/计数器T2中断
usingm:定义中断函数使用的工作寄存器组,m的取值范围为0-3,可以默认。它对目标代码的影响是:函数的入口处将切换到m指定的寄存器组,函数退出时,原寄存器组恢复,选不同的工作寄存器组,可方便实现寄存器组的现场保护。[案例1]如图所示,P0口控制发光二极管D1~D8每隔一段时间左移或右移一位,当单脉冲按钮PLUSE按下时,单脉冲电路将产生一个负脉冲作为中断请求信号,控制发光二极管的移动方向。
voidmain(void){ucharled;EX0=1;IT0=1;EA=1;led=0xfe;while(1){P0=led;delay(250);if(dir)led=_crol_(led,1);elseled=_cror_(led,1);}}
voidchdir(void)interrupt0{dir=~dir;}允许外部中断0中断负跳变触发CPU开中断如果dir标志为1,左移否则右移外部中断0服务程序
每次中断,将方向标志求反
从表面上看,主程序和中断服务程序似乎没有关系,当按下PLUSE键时,将产生中断请求,由于中断号为0,当前中断又是开放的,CPU自动会找到属性为“interrupt0”的函数运行,即进入外部中断0的服务程序,将变量dir(设进入中断前取值为0)取反,当CPU回到主程序再次检测dir时,其值已变为1,D1-D8因此开始左移。任务六设计动态LED显示器一、认识LED显示器在单片机应用系统中,常用的显示器主要有LED数码管显示器及LCD液晶显示器。LED显示器由于亮度高、价格低、寿命长、对电流、电压要求低,与单片机的连接方便等优点,得到了非常广泛的应用。
LED显示器由7个条形发光二极管及一个小圆点发光二极管组成,每个发光二极管又称为字段,根据各字段的亮暗组合成相应的字符。
根据内部的连接方式可分成共阳极型和共阴极型图。共阳极LED数码管的阳极连在一起,接正电压,当某个发光二极管的阴极为低电平时,该二极管所表示的字段被点亮;共阴极LED数码管的阴极连在一起接地,当某个发光二极管的阳极为高电平时,对应字段被点亮。
数码管不同的亮暗组合就能形成不同的字形,这种组合称之为字形码,共阳极和共阴极的字形码是不同的,对应的字形码如表2-7所示。
二、动态显示方式动态显示方式是应用最为广泛的一种显示方式,其接口电路是把所有数码管的8个字段a~g、dp的同名端并联在一起,由一个8位的字段输出口控制;而每一个数码管的公共极(位选线)各自独立地受位选口控制,实现各位的分时点亮。[案例2]在4位动态LED显示器上显示“1234”
想要在显示屏上显示1234,可先通过P0口送出“4”的字形码0x99,并向P2.3~P2.0引脚送出1110B,使三极管Q1导通,从而在最右侧的共阳数码管LED1上显示“4”,然后向P0口送出“3”的字形码0xb0,并向P2.3~P2.0引脚送出1101B,将数字“3”显示在LED2上,依次类推,“2”、“1”可分别显示在LED3、LED4上。
由此可知,每次只有一个数码管被点亮,但由于人眼有视觉暂留现象,只要以较快的速度令4个数码管依次轮流点亮,看起来会觉得4个数码管同时被点亮了,这种显示方法称为动态扫描显示法。ucharcodesegtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c};uchardbuf[4]={4,3,2,1};voiddisp(void){ucharn,bsel;bsel=0xfe; for(n=0;n<4;n++){P2=bsel;P0=segtab[dbuf[n]]; bsel=_crol_(bsel,1);delay(); P0=0xff; }}字符0~F的字形码表显示缓存,存放要显示的字符首先点亮最低位bsel送位选口
根据显示缓冲单元的数据查出字形码准备显示下一位延时1ms熄灭数码管任务七电子计数器的设计
设计一个计数器,其计数范围为-999~+999,通电后4位LED显示000,如果K13键按下,计数器加1,K14键按下,计数器减1。
上图中的按键为机械弹性开关,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间,会出现电压抖动,如下图所示。
为了保证按键识别的正确、可靠,在电压信号抖动的情况下不能认为按键已闭合。为此需进行去抖动处理。去抖动有硬件与软件两种方法。
硬件去抖动就是加去抖动电路,从根本上避免抖动的产生;
软件去抖动则采用时间延迟以躲过抖动阶段,等信号稳定后再进行检测。为了简化设计、降低成本,单片机应用系统一般采用软件方法。程序一旦检测到按键输入端口为低电平,随即延时10ms-20ms左右,避开抖动阶段,再检测输入端口是否仍然为低电平,如果为高,则认为无键被按下,否则说明有键按下,进一步判断是哪一个键被按下,并作相应的处理。电子计数器的流程图
voidmain(void){uchari;intcount=0; unsignedintt; while(1){disp();if((P2&0x30)!=0x30){for(i=0;i<10;i++)disp();if((P2&0x30)!=0x30) {if(K13==0) {count++; if(count>999)count=-999; } else {count--; if(count<-999)count=999; }
计数器的初始值为0显示计数器的当前值如果有键有铵下
延时去抖动
抖动延时后,按钮依然按着
是加1键K13计数变量加1否则,是减1键K14计数变量减1if(count>=0) {dbuf[3]=0x10; t=count;}else {dbuf[3]=0x11; t=-count;}dbuf[2]=t/100;dbuf[1]=(t%100)/10;dbuf[0]=t%10;while((P2&0x30)!=0x30)disp();}}}}如果计数值大于等于0最高位"+"号不显示最高位显示"-"求出计数值的绝对值
将计数值转换成三位BCD码送显示缓存等待按键释放如果计数值小于0任务八、设计行列式键盘
一、行列式键盘的基本原理键盘是计算机系统中不可缺少的输入设备,矩阵式键盘也称为行列式键盘,其结构如下图所示。图中有4根行线和4根列线,按键跨接在行线和列线上。4×4的行列结构可以构成16个按键的键盘,与独立式键盘相比,按键数量相同时占用口线少,因此适用于按键数量较多的场合。扫描法的步骤1、判断有无键闭合使行线P2.0-P2.3都输出0,检测列线P2.4-P2.7是否全为1。如果有键被按下,就会有某一根列线变为0,从而使P2.4-P2.7不为全1;如果P2.4-P2.7为全1,说明无键闭合。使行线P2.0--P2.3都输出0
检测列线P2.4-P2.7是否为全12、消除键抖动在检测到有键闭合后,需延时10-20ms,避开抖动阶段,然后再检测P2.4-P2.7是否为全1。如果为全1,作无键闭合处理,否则,则进一步检测闭合键键号。3、确定闭合键键号
如果有键按下,再逐行逐列地扫描,以检测出所按键的键号。先使行线P2.0-P2.3=0111,分别检测P2.4-2.7。如果P2.4为0,则为0号键按下了;如果P2.5为0,则为1号键按下了。如果P2.4-P2.7都为1,说明P2.0这一行上没有键被按下,再使P2.0-P2.3=1011,并逐列检查。这样依次地逐行逐列地扫描,直至找到闭合键为止。
01111111101111011101键盘扫描程序流程图
uchargetkey(){uchari;ucharkey=0;ucharscode,recode;P2=0xf0;if((P2&0xf0)!=0xf0){for(i=1;i<20;i++)disp();P2=0xf0;if((P2&0xf0)!=0xf0){scode=0xfe;while((scode&0x10)!=0){P2=scode;if((P2&0xf0)!=0xf0){recode=P2&0xf0;scode=0x10;设初始键值为0低四位行线输出全为0如果有键被压下去抖动延时低四位行线输出全为0如果仍有键被压下准备将四位行线逐位输出低如果扫描没有结束将当前行线设为低如果该行上有键被压下读取列线的值准备扫描是那一列为低while(scode!=0)if(recode&scode==0){while((P2&0xf0)!=0xf0){disp();P2=0xf0;}return(key);}else{scode=scode<<1;key++;}}else{scode=_crol_(scode,1);key=key+4;}准备扫描是那一列为低如果当前列为低等待按键释放返回键值否则,准备扫描下一列键值加1否则,如果该行无键被按下准备对下一行扫描键值加4当前列有键按下无键按下当前行有键按下无键按下任务九、设计抢答器
设计一个抢答器,当开始键PLUSE按下时,数码管显示0,此时才允许抢答,K13-K14哪一个键先按下,数码管便显示键号,同时蜂鸣器发出“嘟”的声响。1、硬件电路的设计
如图所示,由74LS00的两个与门U1A、U1B构成单脉冲电路,当PLUSE键按下时,产生单脉冲控制抢答开始;K13~K16的键号用一位共阳数码管显示;P1.0产生方波,通过三极管Q1驱动蜂鸣器发出提示音。2、抢答器的软件设计系统上电后,首先完成初始化,在数码管上显示‘P’,然后等待PLUSE的按下,PLUSE按下后,数码管显示‘0’,并等待K13-K16的按下,只要P2.4-P2.7有一个引脚为低电平,则逐位扫描出按键的键号,送数码管显示,同时控制蜂鸣器发出500ms的提示音,然后再等待PLUSE按下,重新开始下一轮抢答。3、抢答器流程图
voidmain(void){ucharkey;uchari;P2=P2|0xf0; P2=P2&0xfe;P0=segtab[0x10]; start=0;EX0=1; IT0=1; EA=1; P2口高四位置1,设置为输入方式允许最低位数码管显示数码管显示'P'当前PLUSE键按下标志清0允许外部中断0中断触发方式为负跳变单片机开中断while(1){while(start==0);start=0; P0=segtab[0]; while((P2&0xf0)==0xf0);key=P2&0xf0;for(i=1;i<5;i++){if((key&0x10)==0)break;key=key>>1;}P0=segtab[i]; for(i=0;i<200;i++){delay();SPK=~SPK;}}}等待按下PLUSE键
start标志清0,为下次抢答作准备按下PLUSE键后,数码管显示0等待K13~K15抢答键按下读取P2口高四位的状态逐位检测所按键的键号数码管显示按键的键号产生100个周期为2ms左右的方波延时1ms产生方波voidint0(void)interrupt0//中断函数{start=1;}//start标志置13、调试方法与步骤
编译后进入调试方式全速运行程序,如果不能实现抢答器的预定功能,可按以下步骤检查:(1)如果运行后数码管无显示或显示的不是‘P’,应检查数码管电路及字形码表及相关程序。(2)如果数码管显示‘P’后,按下PLUSE键,不能显示‘0’,应检查外部中断初始化程序及中断服务程序是否有问题。(3)当数码管显示‘0’时,按下K13-K16后显示的键号不对,应检查相关的检测程序。(4)如果蜂鸣器无提示音产生,应检查产生方波的程序及相关的线路。项目三电子钟的设计能力目标1、能够使用单片机的定时器/计数器实现定时、计数等应用。2、能够完成电子钟硬件电路与控制程序的设计、制作与调试。知识目标1、了解单片机定时器/计数器的内部结构。2、掌握单片机定时器的各种工作方式及特点、应用场合。3、掌握定时器中断服务程序的编写。任务一、认识单片机的定时器/计数器一、定时器/计数器及其应用在单片机应用系统中,定时或计数是必不可少的。例如:测量一个脉冲信号的频率、周期,或者统计一段时间里电机转动了多少圈等。常用的定时方法有:1、软件定时软件定时是依靠执行一段程序来实现的,这段程序本身没有具体的意义,通过选择恰当的指令及循环次数实现所需的定时,由于执行每条指令都需一定的时间,执行这段程序所需总的时间就是定时时间。软件定时的特点是无需硬件电路,但定时期间CPU被占用,增加了CPU的开销,因此定时时间不宜过长,而且定时期间如果发生中断,定时时间就会出现误差。3、可编程定时器定时这种定时方法是通过对系统时钟脉冲的计数来实现的。通过程序来设置计数初值,改变计数初值也就改变了定时时间,使用起来非常灵活。由于定时器可以与CPU并行工作,因此不影响CPU的效率,且定时时间精确。2、硬件定时
硬件定时通常由小规模集成电路555外加电阻、电容构成,电路简单,不占CPU资源,但定时时间的调节不够灵活方便。(一)定时器/计数器概述在51系列单片机中有两个16位的加法计数器,分别叫做T0和T1。在计数脉冲的作用下,其计数值不断加1,在此过程中,计数器可能产生溢出,产生溢出后,可以向CPU发出中断请求。如果计数脉冲来自系统时钟,称之为“定时器”,每个机器周期计数器加1;如果计数脉冲来自外部电路,称之为“计数器”一旦计数器产生溢出,TF0变为1,向CPU发出中断请求二、定时器/计数器的控制寄存器
1、定时器控制寄存器TCONTF0/TF1:定时器/计数器T1和T0的溢出中断标志。为1,表示定时器/计数器的计数值已由全1变为全0,正向CPU发中断请求。TR0/TR1:定时器/计数器T0和T1的启停控制位:为0时,定时器/计数器停止工作;为1时,启动定时器/计数器工作。
2、定时方式寄存器TMOD
选择定时/计数器的工作方式,M1M0=00,方式001,方式110,方式211,方式3定时方式/计数方式的选择控制位。为0,选定时方式,计数脉冲来自系统时钟的12分频;为1,选计数方式,计数脉冲来自外部电路当GATE=0时,只要TR0=1,与门的输出就为1,计数开始。如果GATE为1,只有TR0=1,并且/INT0=1时,才允许计数。C/T=0,选择定时方式C/T=1,选择计数方式GATE=0时,由TR0控制计数器启停GATE=1时,由TR0和INT0一同控制启停TR0=1时,启动定时器定时器溢出时,TF0置1三、T0、T1的工作方式1、方式0方式0的计数器由13位构成,其中高8位在TH中,低5位在TL中。当计数器产生溢出时,TF位被置1,向CPU发出中断请求。在方式0下,计数器产生溢出时,不能进行初始计数值的自动重装(有关自动重装的问题参见方式2),所以方式0不能用于精确定时。方式0的所有功能都可以用方式1代替,方式0的存在,是因为兼容早期的MCS-48单片机的原因,所以一般不使用方式0。2、方式1方式1与方式0工作形态基本相同,只是方式1的计数器由16位构成,其中高8位在TH中,低8位在TL中,当计数器产生溢出时,TF位被置1,向CPU发出中断请求。在方式1下,计数器产生溢出时,也不能进行初始计数值的自动重装,所以方式1也不能用于精确定时。3、方式2方式2是可以自动重装的工作方式:初始化时一般将8位计数初值同时放入TH、TL中,其中,TH存放的是初值的备份,TL用来计数,当8位计数器TL产生溢出时,除了可以向CPU发中断请求外,单片机的硬件部分还立即把TH中的备份送入TL中。由于重新赋值是硬件自动进行的,所以避免了重新赋值的时间不一,所以方式2可以用于精确定时。4、方式3
T1经常用于串行口的波特率发生器,为了让系统中保持两个计数器,可以让T0工作在方式3,这时T0被分成两个8位计数器,分别位于TH0和TL0中,其中TL0使用T0的中断、启动控制资源,而TH0则借用T1的中断、启动控制资源,而且TH0只能工作在定时方式下,不能工作在计数方式下。(四)时间常数的计算如果单片机需要进行周期性的工作,就应该让定时器/计数器T0或T1工作在定时方式,并且给T0或T1赋以一个初始计数值,在T0或T1被启动后,每个机器周期使计数器中的计数值加1,计数器产生溢出后,将再次给计数器赋值(该值被称为时间常数)。显然计数器溢出时间(又称定时时间)与时间常数直接相关:时间常数越大,定时时间就越短;时间常数越小,定时时间就越长。同时系统时钟的频率也直接影响定时时间的长短,时钟的频率越高,定时时间越短;时钟的频率越低,定时时间越长。设系统时钟的频率为fosc,计数器的初始值为N,定时器工作于方式1,则定时时间:
T=(216-N)×12/fosc(1)如果定时器工作于方式2或方式3,定时时间为:
T=(28-N)×12/fosc(2)
当初始值N=0时,如果fosc=12MHZ,最大定时时间为:方式1为:Tmax=216×12/fosc=65536us=65.536ms方式2、方式3为:Tmax=28×12/fosc=256us根据定时时间T,及公式(1)、(2)分别可以求出初值N为:方式1:N=216-T×fosc/12(3)方式2、方式3:N=28-T×fosc/12(4)如果fosc=12MHZ,以上公式可简化为方式1:N=216-T
方式2、方式3:N=28-T
例如:系统的时钟频率是12MHz,在方式1下,如果希望定时器/计数器T0的定时时间T为10ms,则初值N=216-T=65536-10000=55536如何将55536给两个8位寄存器TH0、TL0赋值呢?可将十进制数55536转换成四位十六进制数,将高2位送TH0,低2位送TL0。更简单的方法是:对于16位计数器来讲,216等效为0,对于8位计数器,28等效为0,这样公式(3)、(4)可简化为N=-T,直接用下面两条语句就可以完成计数器初值的设置:TH0=-10000/256;//取-N的高8位TL0=-10000%256;//取-N的低8位
例如:设系统的时钟频率是12MHz,定时器工作于方式2,定时时间200us。根据前面分析,N=-T=-200,可直接用以下语句实现:TH0=-200;TL0=-200;任务二、定时器应用[案例1]设时钟频率fosc=12MHz,用定时器T0在P1.0脚产生频率为20Hz的方波。
设计思想:在使用定时器/计数器时,首先应根据要求对工作方式进行初始化,然后计算出初始值。初始化的步骤通常是:
(1)向TMOD寄存器写入工作方式控制字。
(2)将计数器的初值写入TH0、TL0/TH1、TL1。
(3)启动定时器/计数器:将TR0/TR1置1。(4)如果采用中断方式,还应将ET0/ET1、EA置1。
本题中,方波的频率为20HZ,对应的周期为50ms,如果将定时时间设置为25ms,每隔25ms将P1.0脚取反即可产生如图3-3所示的方波。因为定时时间为25ms,如果采用方式2或方式3,其定时的最大时间不超过256us,因此选方式1比较恰当,根据前面的分析,计数器初值N=-25000。本例题是定时而非计数,且无需/INT0脚参与启停控制,故C/T=0,GATE为0,这样TMOD取0x01。ˉvoidmain(void){TMOD=0x01; TH0=-25000/256; TL0=-25000%256;TR0=1; ET0=1; EA=1; while(1);}voidtimer0(void)interrupt1{TH0=-25000/256; TL0=-25000%256;P10=~P10;}T0工作于定时方式1定时时间为25ms启动定时器T0允许定时器T0中断单片机开中断定时器T0中断服务程序重新装入时间常数P1.0求反[案例2]如图所示,P0口接8只发光二极管,编程使发光管轮流点亮,点亮时间为500ms,要求使用定时器T0来控制,设晶振为12MHz。
设计思想
我们可将P0口的初值设置为0xFE,对应于发光管D1亮,每隔500ms将P0的值循环左移一位,这一周期性的定时作业用T0来完成。当时钟频率为12MHZ时,在定时器的4种工作方式中,方式1的最大溢出时间最长,但即使在方式1,最大的溢出时间也只有65.536ms,所以我们不能在每次中断时都执行上述移位操作。可以这样处理:将定时器T0的溢出时间设定为50ms,累计满10次中断正好500ms,才允许程序执行1次移位动作。
主函数ucharcount=0;//50ms定时中断次数计数器voidmain(void){led=0xfe;TMOD=0x01;//T0工作于方式1TH0=-50000/256;//定时时间为50msTL0=-50000%256;ET0=1;//允许T0中断TR0=1;//启动T0定时EA=1;//CPU开中断while(1);}voidtime0(void)interrupt1{TH0=-50000/256;TL0=-50000%256;count++;if(count==10){count=0;led=_crol_(led,1);P0=led;}}定时器T0中断服务程序重新装入时间常数每中断一次,计数器加110次中断为0.5秒满10次变量led左移1位送P0口[案例3]用定时器的计数方式实现外部中断。如图所示,P0口控制8只发光管轮流点亮,发光管点亮时间为500ms,单脉冲电路控制发光管的移动方向,按下单脉冲按钮,发光管左移,再按下发光管右移。设计思想:当定时器/计数器工作于计数方式2时,如果将计数器的初值设置为全1,只要在计数输入端(T0或T1)送入一个计数脉冲,就可使计数器产生溢出中断。如果将外部中断请求作为计数脉冲输入,就可利用计数中断的名义去完成外部中断服务。当应用中外部中断请求较多时,而单片机内部的定时器/计数器还有富余时,可采用这种方法来扩展外部中断。因此本例的实质是将定时器的计数输入端T1扩展为外部中断请求输入,来控制发光管的移动方向。
具体方法:
1、初始化定时器/计数器T1计数工作方式2,即每次溢出中断后能自动装入计数初值。2、计数器TH1、TL1的初值预置为0FFH。3、程序中设置一个位变量,每当计数器T1产生溢出中断时求反,发光管左移还是右移取决于该变量是0还是1。
voidmain(void){DIR=0;led=0xfe;TMOD=0x61;TH0=-50000/256;TL0=-50000%256;TH1=0xff; TL1=0xff;ET0=1;ET1=1; TR0=1;TR1=1; EA=1;while(1);}T0为定时方式0,T1为计数方式2定时时间为50msT1的初值为0xff允许T0、T1中断启动T0定时启动T1计数CPU开中断
voidtime0(void)interrupt1{TH0=-50000/256;TL0=-50000%256;count++;if(count==10){count=0; if(DIR==1) led=_crol_(led,1); else led=_cror_(led,1); P0=led;}}重新装入时间常数满10次为0.5秒计数器清0DIR为1左移DIR为0右移每中断一次,计数器加1定时器T0中断服务程序
voidtime1(void)interrupt3{DIR=~DIR; }每次按下按钮产生T1的溢出中断,将DIR求反定时器T1中断服务程序[案例4]用定时器来控制数码管的动态显示。设计思想:
前面我们介绍LED动态显示程序时,每一位点亮后都需延时1ms左右,由于使用的是软件延时,大大降低了CPU的效率,而且当CPU因处理某件事务在一段时间内无法调用显示程序时,LED显示器将会出现黑屏或产生
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冷链物流冷库运维技师考试试卷及答案
- 2025年六安市叶集区就业见习基地及见习岗位10人(第二批)笔试历年参考题库附带答案详解
- 2025年三门峡黄河明珠(集团)有限公司公开招聘高校毕业生8人笔试历年参考题库附带答案详解
- 2025山东日照力诚人力资源有限公司招聘劳务外包人员20人笔试历年参考题库附带答案详解
- 2025安徽庐江县乡村振兴投资有限公司招聘10人笔试历年参考题库附带答案详解
- 2025国家电投集团水电产业平台公司筹备组人员选聘18人笔试历年参考题库附带答案详解
- 2025四川达州市某国有企业招聘2人笔试历年参考题库附带答案详解
- 2025四川成都交通投资集团有限公司蓉聘行动·立园满园春季招聘6人笔试历年参考题库附带答案详解
- 2025四川九州光电子技术有限公司招聘行政专员等岗位2人笔试历年参考题库附带答案详解
- 2025内蒙古锡林郭勒锡林浩特市给排水有限责任公司见习人员招聘10人笔试历年参考题库附带答案详解
- 2025中国未来交通产业发展全景图及趋势研究报告
- 安全管理与应急处理课件
- 企业所得税筹划研究-以一心堂药业为例
- 派安普利单抗注射液-临床用药解读
- 2025昌吉州科技馆招牌编制外聘用人员(3人)考试参考试题及答案解析
- 共用支架施工方案
- 村镇建设科培训课件
- 药物作用机制-洞察及研究
- 物业营销溢价方案(3篇)
- 2025年浙江省中考科学试题卷(含答案解析)
- 太原市城市供热收费管理办法
评论
0/150
提交评论