1、51系列单片机应用与电子设计竞赛,2009年,第一部份 51单片机及其资源,1、什么是单片机: 单片机全称单片微型计算机。它是在同一块芯片上集成了一台微型计算机所需的CPU、存储器(ROM、RAM)、输入/输出部件和时钟等控制部件.不求规模大,力争小而全。 2、单片机的特点 单片机:把微处理器和少量RAM(128/256字节)、ROM(4-8K)以及I/O等有关电路集成在一片半导体芯片。,3、如何学习单片机,硬件: 掌握单片机的硬件资源及外部扩展电路的方法,合理分配资源。 软件:掌握单片机的指令功能、程序设计和调式方法,仿真软件的使用。 具体方法: 1、从最基本的典型电路-进行编程控制。 2、
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、。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位地址
4、。 8、P3口(10-17):第一功能与P1同。 P3口还有第二功能。,P3口第二功能: P3.0 RXD 串口输入 P3.1 TXD 串口输出 P3.2 /INT0 外中断0输入 P3.3 /INT1 外中断1输入 P3.4 T0 定时/计数器0外部输入 P3.5 T1 定时/计数器1外部输入 P3.6 /WR 外部数据存储器写选通 P3.7 /RD 外部数据存储器读选通,I/O口应注意问题,1、上电复位时所有I/O口全部位“1”,设计时应注意,必要时可用硬件反向或软件调整。 2、I/O口的吸收电流与输出电流不同,注意其驱动能力,选用合理的驱动方式。,1、状态字PSW:CY AC FO RS
5、1 RS0 OV P可单独位操作。CY:进位标志。最高位D7进位或借位时置 1。AC:辅助进位标志。半进位D3FO:用户标志位。自定义。RS1 RSO:选择工作寄存组 OV:溢出标志位。P:奇偶校验。运算结果A的内容偶数个1时,P=0;奇数个1时,P=1,部分专用寄存器,2、堆栈及堆栈指针SP 堆栈特殊的存储单元,主要用于保护数据。操作为压入、弹出,后进先出。堆栈的栈顶由SP决定。堆栈的地址随操作自动增加或减少。上电时SP值为07,在程序的初始化中注意设置SP。 3、数据指针DPTR: 16位数据指针,可分为DPH、DPL,作为地址寄存器,可寻址64K,常用于查表,有专门的指令。 4、程序计数
6、器PC: 16位程序计数指针。每当从存储器中取出一条指令并加以执行时,PC的值自动加一,总是指向将要取出的下一条指令的地址。,通用数据寄存器:007FH,1、通用工作寄存器区:001FH 4组(每组都称RO R7,由用户在程序中选择RS1 RS0)00 0007 0组 080F 1组 10 1017 2组 181F 3组*当应用程序有多个中断时特别有用,2、位寻址区20H2FH :可以8位一起操作,也可 以按位操作。一般用作状态、标志。如:20H.0,20H.1,20H.2 20H.73、30H7FH:一般数据RAM,通常SP设在这区域(如30H),用户可任意使用。4、80HFFH: (805
7、2、89C52才有)扩展RAM,不能 直接寻址,须间接寻址。如:MOV R0,#90H MOV R0, A 5、程序存储器 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、外部数据存储器: 最
8、大64K ( P0低位地址, P2高位地址)*综上所述,尽可使用更多资源的 89C52 CPU。,第二部份单片机应用系统的仿真调试,一、单片机仿真及平台介绍1、仿真与仿真机: 仿真的主要目的是人工运行程序来排除错误。一个单片机应用系统包括单片机部份及为达到使用目的而设计的应用电路,仿真就是利用仿真机来代替电路板上 ( 称目标机) 的单片机,对应用电路部份进行测试、调试。仿真有软件仿真和硬件仿真两种,软件仿真用于用于排除软件错误;硬件仿真借助仿真机进行,用于排除一些硬件错误。,硬件仿真时仿真机代替目标机的CPU,由仿真机向目标机的应用电路部份提供各种信号、数据,进行调试。这种仿真可以通过单步、断
9、点、连续运行等多种方法来运行程序,并能观察到单片机内部的变化,便于改正各种的错误。51单片机仿真软件有很多,最常用的有WAVE、KEIL、PROTEUS。根据多年使用和我校设备现状,建议使用WAVE仿真软件。,第三部分单片机的指令系统和软件编程,一、C语言和汇编语言在开发单片机时各有哪些优缺点? 汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。,
10、二、单片机开发采用哪种语言比较好?对于有复杂运算的用C语言较好;对于采集等时间要求严格的用汇编好。由于内部ROM、RAM等资源有限,使用C语言编写,一条指令编译后,生成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而汇编语言一条指令就对应一个机器码,每一步执行什么动作都很清楚,调试起来也比较方便。初学者还可以对单片机的执行有更深的了解,所以我们还是建议采用汇编语言比较好。*竞赛建议采用汇编语言和WAVE仿真平台(除非你十分熟悉C语言及其调试环境)。,单片机的指令系统和软件编程1、机器语言(机器码): 二进制码(BIN)或16进制(HEX) 二进制代码( 1110 0101B,0011
11、 0000B)16进制表示(E5H,30H) 2、汇编语言: 助记符(需要汇编成机器码) 如: MOV A , 30H 二进制代码 E5 30 A-30HE5 操作码 30操作数30H 源地址 A目标地址,要使左图灯亮,程序应SETB P2.3 ; 置某位为“1” ,相当于接高电平 (位操作,对某位或I/O口操作),要使右图灯亮,程序应 CLR P2.2 ; 清某位为“0”,相当于接低电平 (位操作,对某位或I/O口操作)上两条指令是对I/O口位操作。 51的所有I/O口都可以位操作,也可以整个I/O口8位同时操作。,P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.
12、0MOV P2, #00001000B或 MOV P2, #08H*两个灯都亮时,注意观察两个LED的亮度,由此可知I/O口的输出电流和吸收电流不一样,产生频率1K Hz的声音-晶振12M,LOOP: SETB P2.1 ;喇叭控制脚高延时500US CLR P2.1 ;喇叭控制脚低延时500US转到LOOP循环,在单片机指令中,循环左(右)移很容易搞错循环右移RR A ; 原来 A=01011010B, 右移后 A=00101101B 循环左移RL A ; 原来 A=01011010B, 左移后A=10110100B,较难掌握并容易错的指令,带进位循环右移 RRC A ;原来 A=01011
13、010B, 进位位C=1 , 右移后 A=10101101B , C=0 ; 再移一次后, A=01010110B, C=1带进位循环左移 RLC A ;原来 A=01001101B, 进位位 C=1, 左移后A=10011011B, C=0; 再移一次后, A=00110110B, C=1 *注意RR A、 RL A 与 RRC A、 RLC A的区别,带进位循环左(右)移:,比较容易错的MOV指令,在MOV指令中,有一条指令也很容易出错:MOV A , Rn Rn为间接指令,只有两个 R0 、R1,本指令意思是 以Rn中的数据作为地址,将该地址中的数送给A* MOV A , Rn不支持 R
14、2 、R3,,第三部分 显示器及其显示方式,数码管显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称为共阳极;另一种是8个发光二极管的阴极都连在一起的,称为共阴极。,规则排列时数字的显示,MOV P2,#11110000B ; 送位控制I/O线MOV P0,#01H ; 显示测一段MOV P0,#02H ; 显示测一段MOV P0,#04H ; 显示测一段MOV P0,#08H ; 显示测一段MOV P0,#10H ; 显示测一段MOV P0,#20H ; 显示测一段MOV P0,#40H ; 显示测一段MOV P0,#80H ; 显示测一段,不规则排列时,可以通过送数,使每次
15、亮一段(位)测得各段的值,然后进行编码。,画一个8字形, 把测得的值标到对应的位置,便可得到字符编码,如:要得到 1的字符码,1为B、C亮,则 B+C=08H+40H=48H。 同理可得其他各码。,数码管屏幕显示方式 静态显示,1 、 静态显示在单片机应用系统中,显示器显示常用两种方法:静态显示和动态扫描显示。所谓静态显示,就是每个显示器都要单独一个具有锁存功能的器件,用于锁存笔划段字形代码。单片机只要把显示的字形代码送到接口电路(锁存器) 就不用管它了,直到要显示新的数据时,再发送新的字形码,使用这种方法单片机软件简单,但成本高。(竞赛时可以选这种)* 锁存的器件很多,如串并转换电路74LS
16、16。,动态显示,2、动态扫描显示(产品开发采用这种方式)动态显示是单片机中应用最为广泛的一种显示方式之一。其接法是把所有显示器的8个笔划段A-H同名端连在一起,而每一个显示器的公共端各自独立地接一个I/O线控制(三极管)。CPU将字段输出口送字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于公共端,而这一端是由I/O控制的,所以我们就可以自行决定何时显示哪一位了。* 而所谓动态扫描就是指采用分时的方法,轮流控制各个显示器的公共端,使各个显示器轮流点亮。动态显示每次只显示一个字。,显示1234方法如下:送显示 1 的代码到P0,送控制公共端的I/O线P2.x,延时几毫秒;送
17、显示 2 的代码到P0, 12341 2 3 4在轮流显示过程中,每位显示器的显示时间是极为短暂的,但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要速度足够快,给人的印象就是一组稳定的显示数据1234,不会有闪烁感。,不论动态或静态显示,显示代码是编程时编好的。显示时根据数值取出来显示,常用查表指令。MOV DPTR , # DISPLAY_TABLEMOVC A , A+DPTR (查表指令) 把数据指针(表指针)所指地址的内容送给累加器 AA A+DPTR 其中DPTR为表头指针,是一个16位的地址,由DPH和DPL组成(DPTR=DPH+DPL)。A
18、为偏移量,这是因为有时数不是在表头而是在表中间,离表头有一定的偏移。 *注意:MOVC 与 MOV 指令的区别,第四部分 标准输入设备 -键盘,一、键盘接口与编程,键盘是由若干按键组成的开关矩阵,它是计算机最常用的输入设备。键盘有硬件译码和软件译码。硬件译码是采用译码电路进行译码,电路复杂,成本高,一般很少采用。软件译码直接采用软件来识别,不增加成本,一般单片机系统都采用软件来译码,它具有结构简单,使用灵活等特点。,按键开关的抖动问题由于按键是机械触点,当机械触点断开、闭合时,会有抖动,P1.0输入端的波形如图所示。 这种抖动对于人感觉不到,但对计算机来说,则完全可以检测到,因为计算机处理的速
19、度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。你只按了一次按键,可是计算机却已执行了多次。,为使CPU能正确地读出P1口的状态,对每一次按键只作一次响应,就必须考虑如何去除这些抖动,常用去抖动的方法:硬件方法和软件方法。硬件去抖动是加一些能延时的元器件,如电容,而单片机中常用软件法。软件去抖动就是在单片机获得P1.0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1.0口,如果仍为低,说明S1的确按下了,这实际上是避开了按键按下时(前沿)的抖动时间。而在检测到按键释放后 (P1.0为高)再延时5到10毫秒,消除后沿的抖
20、动,然后再对键值处理。,(1)矩阵式键盘的结构与工作原理: 当需要的键数比较多时,为减少占用I/O口,通常将按键排列成矩阵。矩阵方式一个端口(如P1口)就可以构成4*4=16个按键,比直接将端口线用于键盘多出了一倍,线数越多,区别越明显,如:再多加一条线就可以构成20键的键盘,多出四个键;而直接用端口线则只能多出一个键。上图中,行所接的I/O口为输出, 列所接的I/O口为输入,输入上拉电阻 。,(2)矩阵式键盘按键识别法按键识别常用逐行查询法,可分两步进行: 第一步判断键盘中有无键按下:将全部行线P1.0-P1.3置低电平,然后检测列线的状态。只要有一列为低电平,则键盘中有键被按下,若所有列线
21、均为高电平,则键盘中无键按下。第二步判断闭合键所在的位置: 确认有键按下后,依次将每根行线置为低电平, 其它行线为高电平;逐行检测各列线的电平状态。若某列为低,则该列线与低电平的行线交叉处的按键就是闭合的按键。,行线: 输出I/O 低4位值 P1.0 1 1 1 0 P1.1 1 1 0 1 P1.2 1 0 1 1 P1.3 0 1 1 1 列线: 输入I/O 高4位值 P1.4 1 1 1 0 P1.5 1 1 0 1 P1.6 1 0 1 1 P1.7 0 1 1 1 输出0FEH,0FDH,0FBH,0F7H1= 7E 4= 7=2= 5= 8=3= 6= 9=,第五部份中 断,一、什
22、么是中断:,当CPU正在处理某项事件时,外部或内部发生了紧急事件,要求CPU暂停正在处理的的工作转去处理紧急事件,待处理完以后回到原来被中断的地方,继续执行被中断的程序,这过程称中断。,计算机中断嵌套当CPU正在执行中断服务程序时, 又有中断优先级更高的中断申请产生,这时CPU就会暂停当前的中断服务转而处理高级中断申请, 待高级中断处理程序完毕,再返回原中断程序断点处继续执行,这一过程称为中断嵌套。,二、中断的优先级处理:单片机中断有优先级。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况。两个中断同时发生,CPU先响应优先级高的中断再响应优先级低
23、的中断。当一个中断已产生,又有一个中断再产生时,如果再产生的中断优先级高于前一个中断,再产生的中断被响应,产生中断嵌套,否则再产生的中断被忽略。 单片机的五个中断源的自然优先级 外中断0定时器0外中断1定时器1串口,三、中断的响应过程和中断入口中断响应:中断响应可以分为几个步骤: 1、保护断点,即保存下一个将要执行的指令地址,把这个地址送入堆栈。 2、寻找中断入口,根据不同的中断源所产生的中断,查找不同的入口地址。 以上两点是由计算机自动完成的,与编程者无关。 3、执行中断处理程序(中断服务程序)。 4、中断返回:执行完中断指令后,就从中断处返回到主程序继续执行。,中断入口:单片机五个中断源,
24、有五个相应的地址。 每个中断产生后CPU都到相应的地方(中断服务入口地址)去找处理这个中断的程序(中断服务入口地址)。 当然在去之前要保存下一条将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。,中断请求源入口地址: 外中断0IE0 入口地址:0003H 定时器0TF0 入口地址:000BH 外中断1IE1 入口地址:0013H 定时器1TF1 入口地址:001BH 串行口RI(TI) 入口地址:0023H (编写程序时应把中断程序放在那儿,否则中断程序就不能被执行)每个地址只有8个单元,当中断程序大于8个单元时,就得放到其他地方,并在入口地址处放一条转移指令转到放程序的地方
25、。,一个完整的主程序看起来应该是这样的:ORG 0000H LJMP STARTORG 0003HLJMP EX0_INT ;转外中断0ORG 000BHLJMP T0_INT ;转定时器0ORG 0030H START: 。这样写的目的是为了留出其他中断源的入口地址,如果没有这样,将把中断程序当主程序执行。当然,在程序中没用中断时,主程序可以直接从0000H开始。,四、MCS-51中断系统的结构:,中断有关的寄存器有4个:IE、IP、TCON和SCON,分别用来控制中断的开关、各种中断源的优先级和中断类型。上电复位后4个寄存器全部为零。,1、中断允许寄存器IE中断的允许或禁止是由可位寻址的中
26、断允许寄存器IE来控制的,如果某位为“1”,对应的中断将被允许。IE D7 D6 D5 D4 D3 D2 D1 D0EA ES ET1 EX1 ET0 EX0 EA是总开关,如果它等于0,所有中断都不允许。 ES 串行口中断允许 ET1定时器1中断允许 EX1外中断1中断允许。 ET0定时器0中断允许 EX0外中断0中断允许。,2、五个中断优先级有一定的排序(由低位到高位依次降低)外中断0定时器0外中断1定时器1 串口 *这是自然优先级,上电时就这样排好,可以通过IP改变它。 3、中断优先级控制寄存器IP中断优先级控制是由可位寻址的中断优先级寄存器IP来控制的,用来改变中断优先级。 IP:D7
27、 D6 D5 D4 D3 D2 D1 D0- - - PS PT1 PX1 PT0 PX0 串口 定时器1 外中断1 定时器0 外中断0如果某位为1,则优先级最高,称高优先级。,TCON是定时/计数器控制寄存器,其中四位与中断有关TCON-D7 D6 D5 D4 D3 D2 D1 D0 TF1 - TF0 - IE1 IT1 IE0 IT0 IE0:外中断0请求标志位。当有外部中断请求时,由硬件自动置位IE0 CPU响应中断后,硬件自 动将IE0清0。 IE1: 外中断1中断请求标志位。(置1、清0 同IE0) TF0:定时器T0的溢出中断标记。当T0计数产生溢出时,由硬件置位TF0。CPU响
28、应中断后,硬 件自动将TF0清0。 TF1:定时器T1的溢出中断标记。(置1、清0 同IF0),(2)SCON是串行口控制寄存器其中低2位锁存串行口的接收中断和发送中断标志TI、RI(串行口发送、接收中断)。执行中断服务程序后, 硬件不会自动将TI、RI清0,程序员必须把它清0,重复产生中断。SCON-D7 D6 D5 D4 D3 D2 D1 D0- - - - - - TI RI5个中断请求源分为内部中断和外部中断外部中断请求源(2个):即外中断0和1,由外部引脚引入的,在单片机上有两个引脚,名称为INT0、INT1,也就是P3.2、P3.3这两个引脚。,内部中断请求源(3个):由内部定时器
29、0、定时器1溢出、串行口发送、接收中断产生。五、外中断触发方式:两个外中断的触发方式由TCON寄存器中的IT0和IT1决定: IT0:INT0 触发方式控制位。可由软件进行置位 和复位,IT0=0,INT0为低电平触发方 式,IT0=1,INT0为负跳变(下降沿)触发方式。 IT1:INT1触发方式控制位。(置位、复位和触发方式与IT0同),五、多个外中断源的设计:当需要多个外中断时,可以用与的方式进行扩充,几个外中断接到一个外中断触发端,同时每个中断接到一个I/O口,当中断时查询I/O口得知哪个中断源触发。,六、中断优先级的归纳:优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即
30、可以由程序员设定哪些中断是高优先级、哪些中断是低优先级。由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定。开机时,每个中断都处于同一级别的优先级,但我们可以用指令对优先级进行设置。中断优先级由中断优先级寄存器IP来改变,IP中某位设为1,相应的中断就是高优先级,否则就是低优先级。,七、中断响应过程: 1、下列三种情况之一CPU不会立即响应中断: CPU正在处理一个同级或更高级别的中断请求。(自然优先级的局限) 现行的机器周期不是当前正执行指令的最后一个周期。由于单片机有单周期、双周期、三周期指令,当前执行指令是单字节没问题,如果是双字节或三字节的,就要等整条指令都执行
31、完了,才能响应中断。 当前正执行的指令是返回指令RETI或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才应中断。,2、中断响应过程CPU响应中断时,首先把当前指令的下一条指令(就是中断返回后将要执行的指令)的地址送入堆栈,然后根据中断标记,到相应的中断入口地址去取指令,程序就转到中断入口处执行。*这些工作都是由硬件来完成的,不必我们去考虑。 3、中断请求的撤除CPU响应中断请求后,在中断返回(执行RETI指令)前,必须撤除请求,否则会错误地再一次引起中断过程。,中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,这样程序就会从被中
32、断打断的地方继续往下执行了。注意:CPU所做的保护工作是很有限的,只保护了一个地址,而其它的所有东西都不保护,如果你在主程序中用到了如Acc、PSW等,在中断程序中也用到它们,又要保证回到主程序后与执行中断以前的数据相同,就得自己把它们保护起来。*子程序返回REI与中断返回RETI有何区别?,第6部分 单片机内部定时器/计数器,单片机计数器的几点要点单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别都是由两个8位的RAM单元THx、TLx组成的,即每个计数器都是16位的计数器,最大的计数量是65536。单片机计数器采用加法计数,计数器可以作为计数器用。也可以作定时器用。要达到某一定时
33、值,采用预置数,通过预置数达到任意计数及任意定时的目的。*与单片机相关的寄存器TMOD 、TCON、THx、TLx初上电时全部为零,* 计数器计满溢出后,计数器里面的值变成了0,下一次将要计满65536次后才会溢出(因为容器那么大),为保证每一次计数都一样,计满之后我们必须重新预置数(初值)。,因为每次溢出时必须执行一段程序,在这段程序中把预置数送入计数器中,保证每一次计数都一样。这种的计数器方式称加法计数器。预置的数称初值。加法计数器是计满溢出时才申请中断, 所以在给计数器赋初值时, 不能直接输入所需的计数值, 而应输入的是计数器计数的最大值与计数值的差值, 设最大值为 M, 计数值为 N,
34、 初值为 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=
35、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
36、)就由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位自动再装入预置数工作方式。我们
37、知道当定时器溢出时,要运行一段程序重装预置数,所以采用工作方式0或1都要在溢出后做一个重置预置数的工作,需要重置的时间。当需要精确计时,就需要工作方式2。,在工作方式2,只有低8位参与计数,而高8位不参与计数,用作预置数的存放,每当计数溢出,就会打开高、低8位之间的开关,预置数进入低8位。这是由硬件自动完成的,不需要由人工干预。通常这种工作方式用于波特率发生器,用于这种用途时,定时器就是为了提供一个时间基准。计数溢出后重新装入预置数再开始计数。,4、工作方式3 (两个8位独立计数器) 这种方式定时/计数器0被拆成2个独立的8位定时/计数器来用。其中,TL0可以构成8位的定时器或计数器的工作方式
38、,而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。*预置值计算:用最大
39、计数量减去需要的计数次数即是该预置的数。,定时器/计数器应用举例,一、方式0的应用例1:利用定时器输出周期为2ms的方波, 设单片机晶振频率为 6MHz。 选用定时器/计数器T0作定时器, 2ms的方波可由间隔1ms的高低电平交替产生, 因而只要每隔1ms对 I/O口 取反一次即可得到这个方波。 定时1 ms的初值: 因为一个机器周期=2s (6MHz) 所以1ms内T0 需要计数N次: N= 1 ms2 s = 500,T0的初值X为:X=MN=8192500=7692=1E0CH因为13位计数器中,低8位TL0只使用了5位, 其余码均计入高8位TH0的初值, 则T0的初值1E0CH调整为:
40、 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的过程,(如MOV SBUF,A) 接收就是读取SBUF的过程(如MO
41、V A,SBUF)。接收寄存器是双缓冲的, 以避免在接收下一帧数据之前, CPU未能及时响应接收器的中断, 没有把上一帧数据读走, 而产生两帧数据重叠的问题。,2. 串行口控制寄存器SCONSCON用于控制和监视串行口的工作状态, 其相应的各位功能介绍如下: SCON-D7 D6 D5 D4 D3 D2 D1 D0 SM0 SM1 SM2 REN TB8 RB8 TI RISM0、SM1: 用于定义串行口的操作模式, 两个选择位对应 4 种模式,见下页表。SM2: 多机通信时的接收允许标志位。 在模式 2和 3中, 若SM2 =1, 且接收到的第 9 位数据(RB8)是 0, 则接收中断标志(
42、RI)不会被激活。在模式1中, 若SM2=1 且没有接收到有效的停止位, 则 RI不会被激活。在模式 0 中, SM2 必须是 0。,表7.2 串行口操作模式选择,其中fOSC是振荡器频率, UART为通用异步接收和发送器的英文缩写。,3. 电源控制寄存器PCONPCON-D7 D6 D5 D4 D3 D2 D1 D0SMOD - - - - - - -特殊功能寄存器PCON中, 只有一位(最高位)SMOD与串行口的工作有关, 该位是串行口波特率系数的控制位: SMOD=1 时, 波特率加倍; SMOD=0 , 波特率不加倍。PCON的地址为 87H, 不可位寻址, 初始化时需要用字节传送。,
43、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申请中断,
44、 完成一次发送过程。,(2) 模式1 接收过程。 用软件清除 RI后, 当允许接收位REN被置位1时, 接收器开始检测。当检测到有从“1”到“0”的负跳变时, 则启动接收过程, 在接收移位脉冲的控制下, 接收完一帧信息。当最后一次移位脉冲产生时能满足下列两个条件TI置1 RI=0; 接收到的停止位为1 或 SM2=0。,3. 模式 2 和模式3串行口工作于模式2和模式3 时,被定义为 9 位异步通信接口。它们的每帧数据结构是 11 位: 最低位是起始位(0), 其后是 8 位数据位(低位在先), 第 10 位是用户定义位(SCON中的 TB8或 RB8), 最后一位是停止位(1)。模式 2 和
45、模式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 和模
46、式 3 的波特率除了与SMOD位有关之外, 还与定时器 T1 的溢出率有关 (波特率可变) 。定时器 T1 作为波特率发生器, 常选用定时方式 2( 8 位重装载初值方式), 并且禁止 T1 中断。此时 TH1 从初值计数到产生溢出, 它每秒钟溢出的次数称为溢出率。 因此,表 7.3 定时器T1产生的常用波特率,例:设某51单片机系统,串行口工作于模式3,要求传送波特率为1200Hz,作为波特率发生器的定时器T1工作在方式2时, 请求出计数初值为多少?(设单片机的振荡频率为6 MHz)。因为串行口工作于模式 3时的波特率为 :,当SMOD=0 时,初值TH1=256-6106/(1200123
47、2/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进行初始化 以设定其溢出率(初值)。,注意:,
48、在串行通信的编程中,如果是方式1和方式3,初始化程序中必须对定时计数器T1初始化以选择波特率。发送是先发送数据后再检查TI看是否发送完;而接收则是先检查RI再接收数据;无论是发送前还是接收前都应先清RI和TI;无论是查询方式还是中断方式,发送或接收后CPU都不会自动清RI和TI,必须用程序将RI和TI清0。,第9部分系统编程规范,当一个单片机应用系统的硬件确定以后,接下来就要进行系统软件的设计。设计的主要内容是应用系统的主程序和各应用程序模块。系统编程主要围绕主程序、子程序和各中断服务程序的关系以及一些初始化、内存分配、优先级等问题。,一、主程序、子程序和中断服务子程序的概念。 1、主程序主程序是单片机系统控制程序的主框架。它是一个顺序执行的无限循环的程序。运行过程必须构成一个圈,这是一个很重要的概念。如图a所示。,