2009单片机应用与电子设计竞赛.ppt_第1页
2009单片机应用与电子设计竞赛.ppt_第2页
2009单片机应用与电子设计竞赛.ppt_第3页
2009单片机应用与电子设计竞赛.ppt_第4页
2009单片机应用与电子设计竞赛.ppt_第5页
已阅读5页,还剩147页未读 继续免费阅读

下载本文档

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

文档简介

51系列单片机应用与电子设计竞赛,2009年,第一部份51单片机及其资源,1、什么是单片机:单片机全称单片微型计算机。它是在同一块芯片上集成了一台微型计算机所需的CPU、存储器(ROM、RAM)、输入/输出部件和时钟等控制部件.不求规模大,力争小而全。2、单片机的特点单片机:把微处理器和少量RAM(128/256字节)、ROM(4-8K)以及I/O等有关电路集成在一片半导体芯片。,3、如何学习单片机,硬件:掌握单片机的硬件资源及外部扩展电路的方法,合理分配资源。软件:掌握单片机的指令功能、程序设计和调式方法,仿真软件的使用。具体方法:1、从最基本的典型电路-进行编程控制。2、对例题、子程序进行软件分析仿真-修改、扩充功能*在进行硬件资源分配时,应特别关注具有特殊功能的I/O。,MCS-51单片机系统结构,(一)、单片机硬件资源:面向控制的8位CPU;128/256字节的内部RAM;4K/8K的内部ROM;一组特殊功能寄存器(SFR);一个可位寻址的布尔处理机;32个I/O,其中P3口双功能;一个全双工的异步串行口;2/3个16位定时/计数器5/6个中断源,2个优先级;,单片机的关键引脚:1、电源Vcc(40)+5V,Vss(20)地。2、复位RST(9):RESET输入端,CPU初始化的硬件电路如右图,要求复位高电平t为2个以上机器周期。3、/EA(31):/EA为内部程序存储器和外部程序存储器选择端。EA为高时,访问内部程序存储器。EA为低时,访问外部程序存储器。4、晶体振荡:XTAL1(19)输入和XTAL2(18)输出。,5、P0口(32-39):是一个8位漏极开路型双向I/0口,需外部上拉电阻;访问外部存储器时,它是分时传送的低字节地址和数据;能以吸收电流的方式驱动八个LSTTL负载。6、P1口(1-8):有内部上拉电阻的8位准双向I/0口。外部可拉低但不能拉高,输入检测时应先置高。能以吸收电流的方式驱动四个LSTTL负载。7、P2口(21-28):除与P1相同外。P2口在访问外部存储器时,它输出高8位地址。8、P3口(10-17):第一功能与P1同。P3口还有第二功能。,P3口第二功能:P3.0RXD串口输入P3.1TXD串口输出P3.2/INT0外中断0输入P3.3/INT1外中断1输入P3.4T0定时/计数器0外部输入P3.5T1定时/计数器1外部输入P3.6/WR外部数据存储器写选通P3.7/RD外部数据存储器读选通,I/O口应注意问题,1、上电复位时所有I/O口全部位“1”,设计时应注意,必要时可用硬件反向或软件调整。2、I/O口的吸收电流与输出电流不同,注意其驱动能力,选用合理的驱动方式。,1、状态字PSW:CYACFORS1RS0OVP可单独位操作。CY:进位标志。最高位D7进位或借位时置1。AC:辅助进位标志。半进位D3FO:用户标志位。自定义。RS1RSO:选择工作寄存组OV:溢出标志位。P:奇偶校验。运算结果A的内容偶数个1时,P=0;奇数个1时,P=1,部分专用寄存器,2、堆栈及堆栈指针SP堆栈特殊的存储单元,主要用于保护数据。操作为压入、弹出,后进先出。堆栈的栈顶由SP决定。堆栈的地址随操作自动增加或减少。上电时SP值为07,在程序的初始化中注意设置SP。3、数据指针DPTR:16位数据指针,可分为DPH、DPL,作为地址寄存器,可寻址64K,常用于查表,有专门的指令。4、程序计数器PC:16位程序计数指针。每当从存储器中取出一条指令并加以执行时,PC的值自动加一,总是指向将要取出的下一条指令的地址。,通用数据寄存器:007FH,1、通用工作寄存器区:001FH4组(每组都称ROR7,由用户在程序中选择RS1RS0)0000070组080F1组1010172组181F3组*当应用程序有多个中断时特别有用,2、位寻址区20H2FH:可以8位一起操作,也可以按位操作。一般用作状态、标志。如:20H.0,20H.1,20H.2.20H.73、30H7FH:一般数据RAM,通常SP设在这区域(如30H),用户可任意使用。4、80HFFH:(8052、89C52才有)扩展RAM,不能直接寻址,须间接寻址。如:MOVR0,#90HMOVR0,A5、程序存储器0000FFFFH(*注意与/EA配合)内部00000FFFH(00001FFFH)外部1000FFFFH(2000FFFFH)*(尽量使用大容量CPU不外扩程序存储器)*特别要求:1、程序的第一条指令为0000H,6、中断服务程序的入口地址:0003H外部中断0(/INT0)000BH定时器0溢出中断0013H外部中断1(/INT1)001BH定时器1溢出中断0023H串行口中断002BH定时器2溢出中断(8052才有)7、外部数据存储器:最大64K(P0低位地址,P2高位地址)*综上所述,尽可使用更多资源的89C52CPU。,第二部份单片机应用系统的仿真调试,一、单片机仿真及平台介绍1、仿真与仿真机:仿真的主要目的是人工运行程序来排除错误。一个单片机应用系统包括单片机部份及为达到使用目的而设计的应用电路,仿真就是利用仿真机来代替电路板上(称目标机)的单片机,对应用电路部份进行测试、调试。仿真有软件仿真和硬件仿真两种,软件仿真用于用于排除软件错误;硬件仿真借助仿真机进行,用于排除一些硬件错误。,硬件仿真时仿真机代替目标机的CPU,由仿真机向目标机的应用电路部份提供各种信号、数据,进行调试。这种仿真可以通过单步、断点、连续运行等多种方法来运行程序,并能观察到单片机内部的变化,便于改正各种的错误。51单片机仿真软件有很多,最常用的有WAVE、KEIL、PROTEUS。根据多年使用和我校设备现状,建议使用WAVE仿真软件。,第三部分单片机的指令系统和软件编程,一、C语言和汇编语言在开发单片机时各有哪些优缺点?汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。,二、单片机开发采用哪种语言比较好?对于有复杂运算的用C语言较好;对于采集等时间要求严格的用汇编好。由于内部ROM、RAM等资源有限,使用C语言编写,一条指令编译后,生成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而汇编语言一条指令就对应一个机器码,每一步执行什么动作都很清楚,调试起来也比较方便。初学者还可以对单片机的执行有更深的了解,所以我们还是建议采用汇编语言比较好。*竞赛建议采用汇编语言和WAVE仿真平台(除非你十分熟悉C语言及其调试环境)。,单片机的指令系统和软件编程1、机器语言(机器码):二进制码(BIN)或16进制(HEX)二进制代码(11100101B,00110000B)16进制表示(E5H,30H)2、汇编语言:助记符(需要汇编成机器码)如:MOVA,30H二进制代码E530A-30HE5操作码30操作数30H源地址A目标地址,要使左图灯亮,程序应SETBP2.3;置某位为“1”,相当于接高电平(位操作,对某位或I/O口操作),要使右图灯亮,程序应CLRP2.2;清某位为“0”,相当于接低电平(位操作,对某位或I/O口操作)上两条指令是对I/O口位操作。51的所有I/O口都可以位操作,也可以整个I/O口8位同时操作。,P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0MOVP2,#00001000B或MOVP2,#08H*两个灯都亮时,注意观察两个LED的亮度,由此可知I/O口的输出电流和吸收电流不一样,产生频率1KHz的声音-晶振12M,LOOP:SETBP2.1;喇叭控制脚高延时500USCLRP2.1;喇叭控制脚低延时500US转到LOOP循环,在单片机指令中,循环左(右)移很容易搞错循环右移RRA;原来A=01011010B,右移后A=00101101B循环左移RLA;原来A=01011010B,左移后A=10110100B,较难掌握并容易错的指令,带进位循环右移RRCA;原来A=01011010B,进位位C=1,右移后A=10101101B,C=0;再移一次后,A=01010110B,C=1带进位循环左移RLCA;原来A=01001101B,进位位C=1,左移后A=10011011B,C=0;再移一次后,A=00110110B,C=1*注意RRA、RLA与RRCA、RLCA的区别,带进位循环左(右)移:,比较容易错的MOV指令,在MOV指令中,有一条指令也很容易出错:MOVA,RnRn为间接指令,只有两个R0、R1,本指令意思是以Rn中的数据作为地址,将该地址中的数送给A*MOVA,Rn不支持R2、R3,.,第三部分显示器及其显示方式,数码管显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称为共阳极;另一种是8个发光二极管的阴极都连在一起的,称为共阴极。,规则排列时数字的显示,MOVP2,#11110000B;送位控制I/O线MOVP0,#01H;显示测一段MOVP0,#02H;显示测一段MOVP0,#04H;显示测一段MOVP0,#08H;显示测一段MOVP0,#10H;显示测一段MOVP0,#20H;显示测一段MOVP0,#40H;显示测一段MOVP0,#80H;显示测一段,不规则排列时,可以通过送数,使每次亮一段(位)测得各段的值,然后进行编码。,画一个8字形,把测得的值标到对应的位置,便可得到字符编码,如:要得到1的字符码,1为B、C亮,则B+C=08H+40H=48H。同理可得其他各码。,数码管屏幕显示方式静态显示,1、静态显示在单片机应用系统中,显示器显示常用两种方法:静态显示和动态扫描显示。所谓静态显示,就是每个显示器都要单独一个具有锁存功能的器件,用于锁存笔划段字形代码。单片机只要把显示的字形代码送到接口电路(锁存器)就不用管它了,直到要显示新的数据时,再发送新的字形码,使用这种方法单片机软件简单,但成本高。(竞赛时可以选这种)*锁存的器件很多,如串并转换电路74LS16。,动态显示,2、动态扫描显示(产品开发采用这种方式)动态显示是单片机中应用最为广泛的一种显示方式之一。其接法是把所有显示器的8个笔划段A-H同名端连在一起,而每一个显示器的公共端各自独立地接一个I/O线控制(三极管)。CPU将字段输出口送字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于公共端,而这一端是由I/O控制的,所以我们就可以自行决定何时显示哪一位了。*而所谓动态扫描就是指采用分时的方法,轮流控制各个显示器的公共端,使各个显示器轮流点亮。动态显示每次只显示一个字。,显示1234方法如下:送显示1的代码到P0,送控制公共端的I/O线P2.x,延时几毫秒;送显示2的代码到P0,12341234在轮流显示过程中,每位显示器的显示时间是极为短暂的,但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要速度足够快,给人的印象就是一组稳定的显示数据1234,不会有闪烁感。,不论动态或静态显示,显示代码是编程时编好的。显示时根据数值取出来显示,常用查表指令。MOVDPTR,#DISPLAY_TABLEMOVCA,A+DPTR(查表指令)把数据指针(表指针)所指地址的内容送给累加器AAA+DPTR其中DPTR为表头指针,是一个16位的地址,由DPH和DPL组成(DPTR=DPH+DPL)。A为偏移量,这是因为有时数不是在表头而是在表中间,离表头有一定的偏移。*注意:MOVC与MOV指令的区别,第四部分标准输入设备-键盘,一、键盘接口与编程,键盘是由若干按键组成的开关矩阵,它是计算机最常用的输入设备。键盘有硬件译码和软件译码。硬件译码是采用译码电路进行译码,电路复杂,成本高,一般很少采用。软件译码直接采用软件来识别,不增加成本,一般单片机系统都采用软件来译码,它具有结构简单,使用灵活等特点。,按键开关的抖动问题由于按键是机械触点,当机械触点断开、闭合时,会有抖动,P1.0输入端的波形如图所示。这种抖动对于人感觉不到,但对计算机来说,则完全可以检测到,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。你只按了一次按键,可是计算机却已执行了多次。,为使CPU能正确地读出P1口的状态,对每一次按键只作一次响应,就必须考虑如何去除这些抖动,常用去抖动的方法:硬件方法和软件方法。硬件去抖动是加一些能延时的元器件,如电容,而单片机中常用软件法。软件去抖动就是在单片机获得P1.0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1.0口,如果仍为低,说明S1的确按下了,这实际上是避开了按键按下时(前沿)的抖动时间。而在检测到按键释放后(P1.0为高)再延时5到10毫秒,消除后沿的抖动,然后再对键值处理。,(1)矩阵式键盘的结构与工作原理:当需要的键数比较多时,为减少占用I/O口,通常将按键排列成矩阵。矩阵方式一个端口(如P1口)就可以构成4*4=16个按键,比直接将端口线用于键盘多出了一倍,线数越多,区别越明显,如:再多加一条线就可以构成20键的键盘,多出四个键;而直接用端口线则只能多出一个键。上图中,行所接的I/O口为输出,列所接的I/O口为输入,输入上拉电阻。,(2)矩阵式键盘按键识别法按键识别常用逐行查询法,可分两步进行:第一步判断键盘中有无键按下:将全部行线P1.0-P1.3置低电平,然后检测列线的状态。只要有一列为低电平,则键盘中有键被按下,若所有列线均为高电平,则键盘中无键按下。第二步判断闭合键所在的位置:确认有键按下后,依次将每根行线置为低电平,其它行线为高电平;逐行检测各列线的电平状态。若某列为低,则该列线与低电平的行线交叉处的按键就是闭合的按键。,行线:输出I/O低4位值P1.01110P1.11101P1.21011P1.30111列线:输入I/O高4位值P1.41110P1.51101P1.61011P1.70111输出0FEH,0FDH,0FBH,0F7H1=7E4=7=2=5=8=3=6=9=,第五部份中断,一、什么是中断:,当CPU正在处理某项事件时,外部或内部发生了紧急事件,要求CPU暂停正在处理的的工作转去处理紧急事件,待处理完以后回到原来被中断的地方,继续执行被中断的程序,这过程称中断。,计算机中断嵌套当CPU正在执行中断服务程序时,又有中断优先级更高的中断申请产生,这时CPU就会暂停当前的中断服务转而处理高级中断申请,待高级中断处理程序完毕,再返回原中断程序断点处继续执行,这一过程称为中断嵌套。,二、中断的优先级处理:单片机中断有优先级。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况。两个中断同时发生,CPU先响应优先级高的中断再响应优先级低的中断。当一个中断已产生,又有一个中断再产生时,如果再产生的中断优先级高于前一个中断,再产生的中断被响应,产生中断嵌套,否则再产生的中断被忽略。单片机的五个中断源的自然优先级外中断0定时器0外中断1定时器1串口,三、中断的响应过程和中断入口中断响应:中断响应可以分为几个步骤:1、保护断点,即保存下一个将要执行的指令地址,把这个地址送入堆栈。2、寻找中断入口,根据不同的中断源所产生的中断,查找不同的入口地址。以上两点是由计算机自动完成的,与编程者无关。3、执行中断处理程序(中断服务程序)。4、中断返回:执行完中断指令后,就从中断处返回到主程序继续执行。,中断入口:单片机五个中断源,有五个相应的地址。每个中断产生后CPU都到相应的地方(中断服务入口地址)去找处理这个中断的程序(中断服务入口地址)。当然在去之前要保存下一条将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。,中断请求源入口地址:外中断0IE0入口地址:0003H定时器0TF0入口地址:000BH外中断1IE1入口地址:0013H定时器1TF1入口地址:001BH串行口RI(TI)入口地址:0023H(编写程序时应把中断程序放在那儿,否则中断程序就不能被执行)每个地址只有8个单元,当中断程序大于8个单元时,就得放到其他地方,并在入口地址处放一条转移指令转到放程序的地方。,一个完整的主程序看起来应该是这样的:ORG0000HLJMPSTARTORG0003HLJMPEX0_INT;转外中断0ORG000BHLJMPT0_INT;转定时器0ORG0030HSTART:。这样写的目的是为了留出其他中断源的入口地址,如果没有这样,将把中断程序当主程序执行。当然,在程序中没用中断时,主程序可以直接从0000H开始。,四、MCS-51中断系统的结构:,中断有关的寄存器有4个:IE、IP、TCON和SCON,分别用来控制中断的开关、各种中断源的优先级和中断类型。上电复位后4个寄存器全部为零。,1、中断允许寄存器IE中断的允许或禁止是由可位寻址的中断允许寄存器IE来控制的,如果某位为“1”,对应的中断将被允许。IED7D6D5D4D3D2D1D0EAESET1EX1ET0EX0EA是总开关,如果它等于0,所有中断都不允许。ES串行口中断允许ET1定时器1中断允许EX1外中断1中断允许。ET0定时器0中断允许EX0外中断0中断允许。,2、五个中断优先级有一定的排序(由低位到高位依次降低)外中断0定时器0外中断1定时器1串口*这是自然优先级,上电时就这样排好,可以通过IP改变它。3、中断优先级控制寄存器IP中断优先级控制是由可位寻址的中断优先级寄存器IP来控制的,用来改变中断优先级。IP:D7D6D5D4D3D2D1D0-PSPT1PX1PT0PX0串口定时器1外中断1定时器0外中断0如果某位为1,则优先级最高,称高优先级。,TCON是定时/计数器控制寄存器,其中四位与中断有关TCON-D7D6D5D4D3D2D1D0TF1-TF0-IE1IT1IE0IT0IE0:外中断0请求标志位。当有外部中断请求时,由硬件自动置位IE0CPU响应中断后,硬件自动将IE0清0。IE1:外中断1中断请求标志位。(置1、清0同IE0)TF0:定时器T0的溢出中断标记。当T0计数产生溢出时,由硬件置位TF0。CPU响应中断后,硬件自动将TF0清0。TF1:定时器T1的溢出中断标记。(置1、清0同IF0),(2)SCON是串行口控制寄存器其中低2位锁存串行口的接收中断和发送中断标志TI、RI(串行口发送、接收中断)。执行中断服务程序后,硬件不会自动将TI、RI清0,程序员必须把它清0,重复产生中断。SCON-D7D6D5D4D3D2D1D0-TIRI5个中断请求源分为内部中断和外部中断外部中断请求源(2个):即外中断0和1,由外部引脚引入的,在单片机上有两个引脚,名称为INT0、INT1,也就是P3.2、P3.3这两个引脚。,内部中断请求源(3个):由内部定时器0、定时器1溢出、串行口发送、接收中断产生。五、外中断触发方式:两个外中断的触发方式由TCON寄存器中的IT0和IT1决定:IT0:INT0触发方式控制位。可由软件进行置位和复位,IT0=0,INT0为低电平触发方式,IT0=1,INT0为负跳变(下降沿)触发方式。IT1:INT1触发方式控制位。(置位、复位和触发方式与IT0同),五、多个外中断源的设计:当需要多个外中断时,可以用与的方式进行扩充,几个外中断接到一个外中断触发端,同时每个中断接到一个I/O口,当中断时查询I/O口得知哪个中断源触发。,六、中断优先级的归纳:优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即可以由程序员设定哪些中断是高优先级、哪些中断是低优先级。由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定。开机时,每个中断都处于同一级别的优先级,但我们可以用指令对优先级进行设置。中断优先级由中断优先级寄存器IP来改变,IP中某位设为1,相应的中断就是高优先级,否则就是低优先级。,七、中断响应过程:1、下列三种情况之一CPU不会立即响应中断:CPU正在处理一个同级或更高级别的中断请求。(自然优先级的局限)现行的机器周期不是当前正执行指令的最后一个周期。由于单片机有单周期、双周期、三周期指令,当前执行指令是单字节没问题,如果是双字节或三字节的,就要等整条指令都执行完了,才能响应中断。当前正执行的指令是返回指令RETI或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才应中断。,2、中断响应过程CPU响应中断时,首先把当前指令的下一条指令(就是中断返回后将要执行的指令)的地址送入堆栈,然后根据中断标记,到相应的中断入口地址去取指令,程序就转到中断入口处执行。*这些工作都是由硬件来完成的,不必我们去考虑。3、中断请求的撤除CPU响应中断请求后,在中断返回(执行RETI指令)前,必须撤除请求,否则会错误地再一次引起中断过程。,中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,这样程序就会从被中断打断的地方继续往下执行了。注意:CPU所做的保护工作是很有限的,只保护了一个地址,而其它的所有东西都不保护,如果你在主程序中用到了如Acc、PSW等,在中断程序中也用到它们,又要保证回到主程序后与执行中断以前的数据相同,就得自己把它们保护起来。*子程序返回REI与中断返回RETI有何区别?,第6部分单片机内部定时器/计数器,单片机计数器的几点要点单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别都是由两个8位的RAM单元THx、TLx组成的,即每个计数器都是16位的计数器,最大的计数量是65536。单片机计数器采用加法计数,计数器可以作为计数器用。也可以作定时器用。要达到某一定时值,采用预置数,通过预置数达到任意计数及任意定时的目的。*与单片机相关的寄存器TMOD、TCON、THx、TLx初上电时全部为零,*计数器计满溢出后,计数器里面的值变成了0,下一次将要计满65536次后才会溢出(因为容器那么大),为保证每一次计数都一样,计满之后我们必须重新预置数(初值)。,因为每次溢出时必须执行一段程序,在这段程序中把预置数送入计数器中,保证每一次计数都一样。这种的计数器方式称加法计数器。预置的数称初值。加法计数器是计满溢出时才申请中断,所以在给计数器赋初值时,不能直接输入所需的计数值,而应输入的是计数器计数的最大值与计数值的差值,设最大值为M,计数值为N,初值为X,则X的计算方法如下:计数状态:X=MN定时状态:X=M定时时间/T而T=12晶振频率,6.2定时器方式和控制寄存器,一、定时器/计数器的工作方式寄存器TMOD,1、图1中,TMOD被分成两部份,每部份4位。分别用于控制T1和T0,M1和M0为工作方式控制位。,2.C/T定时器方式或计数器方式选择位定时/计数器既可作定时用也可作计数用,到底作什么用,由我们根据需要决定。如果C/T为0就是用作定时器,如果C/T为1就是用作计数器。一个定时/计数器同一时刻要么作定时,要么作计数,不能同时又作定时又用作计数。,3.GATE定时器/计数器运行门控标志位GATE=0时,GATE经非门后为1,进入或门,或门总是输出1,和或门的另一个输入端INT1无关,在这种情况下,开关的打开、合上只取决于TR1,只要TR1是1,开关就合上,脉冲就能过来。而如果TR1等于0则开关打开,计数脉冲无法通过,因此定时/计数是否工作,只取决于TR1。GATE=1时,计数脉冲通路上的开关不仅要由TR1来控制,而且还要受到INT1引脚的控制,只有TR1为1,且INT1引脚也是高电平,开关才合上,计数脉冲才可通过。利用这个特性,可以用来测量一个高电平信号的宽度。,2、启停和中断控制寄存器TCON:,TCON高4位用于定时/计数器。TF0、TF1计数溢出标志,当计数溢出后TF0(TF1)就由0变为1。(申请中断,在中断响应后自动恢复0。TF产生的中断申请是否被接受,还需要由中断是否开放来决定)TR0、TR1为运行控制位,当它为1时启动计数,为0停止计数,可用指令SETB来置位以启动计数器/定时器运行,用指令CLR来关闭定时/计数器的工作。在系统复位时被清0。,定时/计数器的工作方式,1、工作方式0工作方式0为13位定时/计数方式。它由TLx)的低5位和THx)的8位构成13位的计数器,此时TLx的高3位未用。,2、工作方式1工作方式1是16位的定时/计数方式,其它特性与工作方式0相同。,3、工作方式2(8位自动装载)工作方式2是8位自动再装入预置数工作方式。我们知道当定时器溢出时,要运行一段程序重装预置数,所以采用工作方式0或1都要在溢出后做一个重置预置数的工作,需要重置的时间。当需要精确计时,就需要工作方式2。,在工作方式2,只有低8位参与计数,而高8位不参与计数,用作预置数的存放,每当计数溢出,就会打开高、低8位之间的开关,预置数进入低8位。这是由硬件自动完成的,不需要由人工干预。通常这种工作方式用于波特率发生器,用于这种用途时,定时器就是为了提供一个时间基准。计数溢出后重新装入预置数再开始计数。,4、工作方式3(两个8位独立计数器)这种方式定时/计数器0被拆成2个独立的8位定时/计数器来用。其中,TL0可以构成8位的定时器或计数器的工作方式,而TH0则只能作为定时器来用。,定时/计数器需要控制,计满后溢出需要有溢出标记,T0被分成两个来用,那就要两套控制及溢出标记。这时TL0还是用原来的TF0标记,而TH0则借用T1的TF1标记。这种情况只有在T1以工作方式2运行(当波特率发生器用不产生中断)时,才让T0工作于方式3的。,五、定时器/计数器的定时/计数范围工作方式0:13位定时/计数方式,因此,最多可以计到2的13次方,也就是8192。工作方式1:16位定时/计数方式,因此,最多可以计到2的16次方,也就是65536。工作方式2和3:都是8位的定时/计数方式,因此,最多可以计到2的8次方,也说是256。*预置值计算:用最大计数量减去需要的计数次数即是该预置的数。,定时器/计数器应用举例,一、方式0的应用例1:利用定时器输出周期为2ms的方波,设单片机晶振频率为6MHz。选用定时器/计数器T0作定时器,2ms的方波可由间隔1ms的高低电平交替产生,因而只要每隔1ms对I/O口取反一次即可得到这个方波。定时1ms的初值:因为一个机器周期=2s(6MHz)所以1ms内T0需要计数N次:N=1ms2s=500,T0的初值X为:X=MN=8192500=7692=1E0CH因为13位计数器中,低8位TL0只使用了5位,其余码均计入高8位TH0的初值,则T0的初值1E0CH调整为:1E0CH=0001111000001100B=TH0=0F0H,TL0=0CH。TMOD初始化:TMOD=00000000B=00H(GATE=0,C/T=0,M1=0,M0=0)TCON初始化:启动TR0=1IE初始化:IE=82H;开中断,定时器T0中断允许,第7部分单片机串行接口,单片机串行口内部结构,7.2与串行口有关的特殊功能寄存器,1.数据缓冲器SBUFSBUF是可直接寻址的特殊功能寄存器,在物理上,它对应着两个独立的寄存器,一个发送寄存器,一个接收寄存器。发送就是CPU写入SBUF的过程,(如MOVSBUF,A)接收就是读取SBUF的过程(如MOVA,SBUF)。接收寄存器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时响应接收器的中断,没有把上一帧数据读走,而产生两帧数据重叠的问题。,2.串行口控制寄存器SCONSCON用于控制和监视串行口的工作状态,其相应的各位功能介绍如下:SCON-D7D6D5D4D3D2D1D0SM0SM1SM2RENTB8RB8TIRISM0、SM1:用于定义串行口的操作模式,两个选择位对应4种模式,见下页表。SM2:多机通信时的接收允许标志位。在模式2和3中,若SM2=1,且接收到的第9位数据(RB8)是0,则接收中断标志(RI)不会被激活。在模式1中,若SM2=1且没有接收到有效的停止位,则RI不会被激活。在模式0中,SM2必须是0。,表7.2串行口操作模式选择,其中fOSC是振荡器频率,UART为通用异步接收和发送器的英文缩写。,3.电源控制寄存器PCONPCON-D7D6D5D4D3D2D1D0SMOD-特殊功能寄存器PCON中,只有一位(最高位)SMOD与串行口的工作有关,该位是串行口波特率系数的控制位:SMOD=1时,波特率加倍;SMOD=0,波特率不加倍。PCON的地址为87H,不可位寻址,初始化时需要用字节传送。,7.3串行口的4种工作模式,1.模式0(1)模式0输出状态。,外接移位寄存器输出,(2)模式0输入状态。,外接移位寄存器输入,2.模式1模式1为波特率可变的8位异步通信接口。波特率取决于定时器T1的溢出速率及SMOD的状态。数据位由P3.0(RXD)端接收,由P3.1(TXD)端发送。传送一帧信息为10位:一位起始位(0),8位数据位(低位在前)和一位停止位(1)。(1)模式1发送过程:用软件清除TI后,CPU执行任何一条以SBUF为目标寄存器的指令,就启动发送。数据由TXD引脚输出,一帧信号发送完时,将置位发送中断标志TI=1,向CPU申请中断,完成一次发送过程。,(2)模式1接收过程。用软件清除RI后,当允许接收位REN被置位1时,接收器开始检测。当检测到有从“1”到“0”的负跳变时,则启动接收过程,在接收移位脉冲的控制下,接收完一帧信息。当最后一次移位脉冲产生时能满足下列两个条件TI置1RI=0;接收到的停止位为1或SM2=0。,3.模式2和模式3串行口工作于模式2和模式3时,被定义为9位异步通信接口。它们的每帧数据结构是11位:最低位是起始位(0),其后是8位数据位(低位在先),第10位是用户定义位(SCON中的TB8或RB8),最后一位是停止位(1)。模式2和模式3工作原理相似,唯一的差别是模式2的波特率是固定的,即为f/32或f/64,而模式3的波特率是可变的,与定时器T1的溢出率有关。,7.5波特率串行口每秒钟发送或接收的数据位数称为波特率。假设发送一位数据所需时间为T,则波特率为1/T。(1)模式0的波特率等于单片机晶振频率的1/12,即每个机器周期接收或发送一位数据。(固定)(2)模式2的波特率与电源控制器PCON的最高位SMOD的写入值有关(但波特率不可变):即SMOD=0,波特率为(1/64)fOSC;SMOD=1,波特率为(1/32)fOSC。,(3)模式1和模式3的波特率除了与SMOD位有关之外,还与定时器T1的溢出率有关(波特率可变)。定时器T1作为波特率发生器,常选用定时方式2(8位重装载初值方式),并且禁止T1中断。此时TH1从初值计数到产生溢出,它每秒钟溢出的次数称为溢出率。因此,表7.3定时器T1产生的常用波特率,例:设某51单片机系统,串行口工作于模式3,要求传送波特率为1200Hz,作为波特率发生器的定时器T1工作在方式2时,请求出计数初值为多少?(设单片机的振荡频率为6MHz)。因为串行口工作于模式3时的波特率为:,当SMOD=0时,初值TH1=256-6106/(12001232/1)=243=0F3H当SMOD=1时,初值TH1=256-6106/(12001232/2)=230=0E6H,7.6串行口的应用,一、串行口的编程串行口需初始化后,才能完成数据的输入、输出。初始化过程如下:(1)串行口工作模式设定:设定SCON的SM0、SM1两位二进制编码。(2)对于操作模式2或3,应根据需要在TB8中写入待发送的第9位数据。(3)若选定的工作模式不是模式0,还需设定接收/发送的波特率。(4)设定SMOD的状态,以控制波特率是否加倍。*若选定工作模式1或3,则应对定时器T1进行初始化以设定其溢出率(初值)。,注意:,在串行通信的编程中,如果是方式1和方式3,初始化程序中必须对定时计数器T1初始化以选择波特率。发送是先发送数据后再检查TI看是否发送完;而接收则是先检查RI再接收数据;无论是发送前还是接收前都应先清RI和TI;无论是查询方式还是中断方式,发送或接收后CPU都不会自动清RI和TI,必须用程序将RI和TI清0。,第9部分系统编程规范,当一个单片机应用系统的硬件确定以后,接下来就要进行系统软件的设计。设计的主要内容是应用系统的主程序和各应用程序模块。系统编程主要围绕主程序、子程序和各中断服务程序的关系以及一些初始化、内存分配、优先级等问题。,一、主程序、子程序和中断服务子程序的概念。1、主程序主程序是单片机系统控制程序的主框架。它是一个顺序执行的无限循环的程序。运行过程必须构成一个圈,这是一个很重要的概念。如图a所示。,主程序应不停地按顺序查询各种软件标志,并根据其变化调用相关的子程序和执行相应的中断服务子程序,以完成对各种实时事件的处理。上图(b)给出了主程序的结构。从主程序的流程结构可以看到,程序一开始必须有段初始化过程。初始化主要完成中断的设置、寄存器的设置(包括特殊功能寄存器)、定时器的设置及其赋初值、堆栈的设置等一系列程序执行中所用到的或可能用到的寄存器、内存的初始值的设置,是任何程序必不可少的。,1、伪定义与初始化为了便于阅读和修改调试,经常对一些内存变量、I/O口等作重定义,如:SPEAKEQUP0.7;表示SPEAK就是P0.7COUNTEQU30H这样凡是用到30H的地方都用COUNT代替,一是便于阅读,知道30H是存放计数值,二是当你要把30H作为别用,把计数值调到40H时,只要更改COUNTEQU30H,不必要到程序的每个地方把30H改为40H。初始化是对程序中用到的中断、定时器及其初值、堆栈、I/O口及内存进行设置,因为大部分的特殊功能寄存器复位时为0,内存复位时是随机数。伪定义与初始化一般放在主程序前。如下面程序,SPEAKEQUP0.7;表示SPEAK就是P0.7COUNTEQU30HORG0000H;指定程序的起始地址LJMPSTARTORG0030HSTART:MOVIE,#00000011;允许定时器0和外中断0MOVTMOD,#01H;定时/计数器0工作于方式1MOVTH0,#3CHMOVTL0,#0B0H;即数15536;预置初值MOVSP,#60H;堆栈设置60H,MOVR2,#7FHMOVR0,#00HLOOP:MOVR0,#00H;清内存0000-007FHINCR0DJNZR2,LOOP;以上是初始SETBEA;开总中断允许SETBTR0;定时/计数器0开始运行MAIN:,2、子程序及参数传递在一段程序中,往往有许多地方需要执行同样的一种操作,这时可“把它单独编成一个子程序,在主程序需要执行这种操作的地方执行一条调用指令转去执行这子程序,完成操作以后再返回到原来的程序(主程序)继续执行,并可“反复调用,如右图所示。这样处理可以简化程序结构,缩短程序长度,便于模块化和调试。在汇编语言源程序中,主程序调用子程序时要注意两个问题,即主程序和子程序间参数传递以及子程序现场保护的问题。,在子程序中,一般应包含有现场保护和现场恢复两个部分。子程序调用中还有一个特别重要的问题,就是信息变换,也就是参数传递问题。在调用子程序时,主程序应先把有关参数(即入口参数)放到某些约定的位置,子程序在运行时,可以从约定的位置得到有关的参数(如延时子程序MOVR5,#1ACALLDELAY)。同样子程序在运行结束前,也应该把运算结果(出口参数)送到约定位置,在返回主程序后,主程序可以从这些地方得到需要的结果。这就是参数传递。子程序必须以RET结尾。,MOVR5,#1ACALLDELAY1;*DLY20MSSUB_PROGRAM*;DELAY1:PUSHPSWDELAY:MOVR6,#40LOOP:MOVR7,#248Loop1:DJNZR7,Loop1DJNZR6,LOOPDJNZR5,DELAYPOPPSWRET实际上实现参数传递时,可采用多种约定方法,单片机中常用工作寄存器、累加器、地址指针寄存器(R0、R1、DPTR)或堆栈来传递参数。,3用工作寄存器或累加器来传递参数这种方法是把入口参数或出口参数放在工作寄存器Rn或累加器A中。主程序在调用子程序之前要把入口参数放在Rn或A中,子程序运行后的结果,即出口参数也放在Rn或A中。如查表:MOVA,P1CJNEA,#7EH,SCAN2MOVA,#01HAJMPSCAN_TABLE1SCAN2:CJNEA,#BEH,SCAN3MOVA,#02HAJMPSCAN_TABLE1SCAN3:.,SCAN_TABLE1:MOVDPTR,#TABLE2ACALLSCAN_TABLE2MOVP0,R0.SCAN_TABLE2:MOVA,A+DPTRMOVR0,ARETTABLE2:DB77H,41H,3BH,5BH,4DH,5EH,7EH,上面程序实现读按键,以A作为参数带入查显示表,结果在A和R0返回(传递)。从上例中可以看到,子程序也应有一个名字,该名字应作为子程序中第一条指令的标号。如:查表子程序的名字是SCAN_TABLE2。其入口条件是A待查表的数;出口条件是A(或R0)-显示值。,二、主程序调用子程序与主程序被中断而去执行中断服务子程序的过程是不同的。主程序调用子程序是:当主程序运行到1000H,执行“LCALLSECOND”指令时,先自动压人断点1003H,然后执行子程序,如左图所示;而主程序中断是随机的,如右图所示。,第十部分单片机最小系统及外部扩展,一、三总线概念,1地址总线(AB)地址总线为16根,P2口作高8位地址线(A15一A8),P0口分时用做扩展系统的低8位地址线(A7一Ao)和数据线(D7一D0)。P0口输出的低8位地址由地址锁存允许信号ALE的下降沿锁存,经地址锁存器输出低8位地址(A7一A0),此后P0口用做数据线。,2数据总线(DB)数据总线为8根。数据总线由PO口担任,P0口的带负载能力为8个TTL(其他为4个TTL),所以在进行应用系统设计时,要充分利用P0口线的带负载能力。,3控制总线(CB)用于系统扩展的控制总线主要有:/RD(P3.7)、/WR(P3.6):用于片外RAM或片外IO芯片的读写控制,执行指令MOVX时,根,据读写要求使/RD或/WR有效。*比较MOV、MOVC、MOVX的区别/PSEN:用于片外ROM的读选通控制,执行指令时自动生成。ALE:用于P0口低8位地址锁存控制,它是系统硬件生成的固有信号(1/6)。/EA:用于片内片外程序存储器的选择控制,一般根据系统扩展情况由外电路设置。当/EA1,且PC值小于0FFFH时,CPU访问内部ROM,PC值超出0FFFH时,则自动转向外部ROM;当EA0时,无论片内有无ROM,CPU只访问外部ROM。使用803l时,/EA必须接地。使用89C51时,/EA接十5V。,189C51最小应用系统所谓最小应用系统是指能维护单片机远行的最简单配置系统。89C51片内有FLASHROM,构成最小应用系统时,只要将单片机接上时钟电路所需的晶体和电容还有复位电路即可。由于不需要外扩程序存储器,/EA接高电平,P0、Pl、P2、P3口均可作IO口用。*由于8031片内无程序存储器,必须外扩EPROM。,89C51最小应用系统,8031最小应用系统,3、I/O口的扩充最小应用系统体积小,结构简单,功耗低,成本低在简单的应用系统中得以广泛应用。但有时还不能满足要求,这时必须扩展。通常采用TTL电路或CM0S电路芯片来扩展,常用有74LS244作扩展输入。244是一个三态输入缓冲器及总线驱动器,它带负载能力强。74LS273(8D锁存器)作扩展输出,它们直接挂在P0口线上。,P0口为双向数据线,既能从74LS244输入数据,又能将数据传送给74LS273输出。输出控制信号由P2.0和WR合成。二者同时为“0”电平时,“或”门输出0,将P0口数据锁存到74LS273,其输出控制着发光二极管LED。输入控制信号由P2.0和RD合成。当二者同时为“0”电平时,“或”门输出0,选通74LS244,将外部信号输入到总线。输入和输出都是在P2.0为0时有效,但由于分别是由RD和WR信号控制,因此,不会发生冲突。而扩展较多的IO接口时,可用线选法或译码器。,上图中,要使得当按下任意键,对应的LED发光。其程序如下:LOOP:MOVDPTR,#FEFFH;数据指针指向扩展IO口地址MOVXA,DPTR;向244读入数据,检测按钮MOVXDPTR,A;向273输出数据,驱动LEDSJMPLOOP;循环可以看出接口的输入/输出就像从片外RAM读写数据一样方便。但作为输入口时,定要有三态功能,否则将影响总线的正常工作。注意:89C51单片机把外扩I/O口和片外RAM统一编址,每个扩展的接口相当于一个扩展的外部RAM单元,访问外部接口就像访问外部RAM一样,用的都是MOVX指令,并产生/RD(或/WR)信号。用/RD、/WR作为输入/输出控制信号。,1线选法扩展片外芯片线选法是利用单片机高位地址总线作为存储器的片选信号,只有该地址线为低电平时,才选中该芯片。缺点:每占用一根地址线,就占用了一段地址空间,且各地址空间不连续,不能充分有效地利用存储空间。,线选法及地址译码法扩展片外存储器及I/O芯片,例:对6116中0030H单元进行读写:MOVDPTR,#D030H;数据指针指向扩展地址,片选低有效MOVXA,DPTR;向读入30H数据MOVXDPTR,A;向30H输出(写)数据*线选法适用于系统扩展芯片较少的单片机应用系统。,2地址译码法扩展片外芯片当线选法所需地址选择线多于可用地址线时。一般采用地址译码法。译码法就是利用译码器对单片机的高位地址线进行译码,其译码输出作为存储器(或IO口)的片选信号。这种方法存储空间连续能有效地利用存储空间。适用于多存储器、多I/O口的扩展。地址译码法必须采用地址译码器,经常使用的地址译码器有74LS138、139。,使用的地址译码器有74LS138和74LS139。,A、B、C译码输入端;/El、/E2、E3使能端;/Y0/Y7译码输出端。,利用地址译码器件74LS138扩展,对6116中0030H单元进行读写:MOVDPTR,#B030H;数据指针指向扩展地址,译中Y6MOVXA,DPTR;向读入30H数据MOVXDPTR,A;向30H输出(写)数据从本例的硬件连接图可以看出,单片机

温馨提示

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

评论

0/150

提交评论