1.02k likes | 1.22k Views
第 4 章 MCS-51 功能模块的编程与仿真. 4.1 单片机的并行输入 / 输出口. 4.2 中断的系统. 4.3 MCS-51 的定时 / 计数器. 4.4 串行接口. 4.1 单片机的并行输入输出端口. 8051 单片机有 4 个 8 位 并行 I/O 端口,每条 I/O 口线都能独立地用作 输入或输出 。 在无片外扩展存储器的系统中,这四个 I/O 口都可以作为 通用 I/O 口使用 。 在有片外扩展存储器的系统中, P2 口送出高 8 位地址 , P0 口分时送出低 8 位地址和 8 位数据。.
E N D
第4章 MCS-51功能模块的编程与仿真 4.1 单片机的并行输入/输出口 4.2 中断的系统 4.3 MCS-51的定时/计数器 4.4 串行接口
4.1 单片机的并行输入输出端口 • 8051单片机有4个8位并行I/O端口,每条I/O口线都能独立地用作输入或输出。 • 在无片外扩展存储器的系统中,这四个I/O口都可以作为通用I/O口使用。 • 在有片外扩展存储器的系统中,P2口送出高8位地址,P0口分时送出低8位地址和8位数据。
1. 并行I/O的结构和原理(1)P0口 图4.1 P0 的位结构图
P0口用作通用I/O口。 ①P0口用作输出口,此时必须外接上拉电阻。 ②P0口用作输入口,分读引脚和读锁存器两种情况。。 读引脚:CPU在执行“MOV”类输入指令时(如:MOV A , P0),内部产生的操作信号是“读引脚”。P0.X引脚上的数据经过缓冲器2读入到内部总线。注意在读引脚时,必须先向电路中的锁存器写入1。 读锁存器:CPU在执行“读-改-写”类输入指令时(如:ANL P0, A ),内部产生的操作信号是“读锁存器”,锁存器中的数据经过缓冲器1送到内部总线,然后与A的内容进行逻辑“与”,结果送回P0的端口锁存器并出现在引脚。除了MOV类指令外,其他的读端口操作指令都属于这种情况。 • 在扩展系统中,P0口作地址/数据总线。
(2) P1口 P1口仅作通用I/O口使用。由于在内部输出端已接有上拉电阻,所以不需再外接上拉电阻。 图4.2 P1 的位结构图
(3) P2口 • 当控制信号等于零时,MUX拨向下方,P2口作为通用I/O口使用 • 当控制信号等于1 时,MUX拨向上方,P2口作为高8位地址线使用。 图4.3 P2 的位结构图
4、P3口 锁存器Q端接与非门的一个输入端,第二功能输出线接与非门的另一个输入端。 图4.4 P3 的位结构图
2、MC5-51并行I/O的应用举例 1、七段数码管的结构与原理 在单片机应用系统中通常使用的是8段式LED数码管显示器,它有共阴极和共阳极两种,如图所示。
数码管不同的发光段亮,可组成不同字型,这种组合称为字型码或断码。在COM送入低电平或高电平,然后控制个各段引脚电平,即可形成相应段码。数码管不同的发光段亮,可组成不同字型,这种组合称为字型码或断码。在COM送入低电平或高电平,然后控制个各段引脚电平,即可形成相应段码。 • 共阳顺序段码:C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H • 共阴顺序段码:3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH(Dp→a)
例4.1:要求通过开关输入4位二进制数,送到数码管显示出来如图(见书)。例4.1:要求通过开关输入4位二进制数,送到数码管显示出来如图(见书)。 ① 汇编源程序 ORG 0000H LJMP STA ORG 0100h STA: MOV P1, #0FFH ;关数码管 LOP: MOV P0, #0FFH ;读引脚前端口置1 MOV A, P0 ;读开关状态 CPL A ;转成数据信息 ANL A, #0FH ;保留低4位信息 MOV DPTR, #TAB MOVC A, @A+DPTR ;查表取得断码信息 MOV P1, A ;断码送数码管显示 AJMP LOP … … END
② C程序 #include "reg51.h" //包含8051单片机寄存器定义头文件 #define LED P1 #define KEY P0 char code disp[ ]={0xC0,0xF9,0xA4,0xB0, 0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83, 0x0C6,0xA1,0x86,0x8E}; //定义断码表 main() { int i; LED=0xFF; //关数码管 while(1) {KEY=0XFF; //读引脚前端口置1 i=KEY; i=~i; //转成数据信息 i=i& 0x0f; //保留低4位信息 LED= disp[i]; //查表取得断码信息,断码送数码管显? } }
③ 仿真实验 • 在Proteus ISIS 中画出设计电路,并进行电气检测。 • 根据电路设计图,在Keil C中编写源程序。 • 编译程序,并产生HEX文件。 • 将HEX文件加入AT89c51,并仿真电路,通过拨动开关观察发光二极管的显示状况,如图所示。
①汇编语言源程序: ORG 0000h AJMP STAR ORG 0100H STAR: MOV A, #0ffh MOV P1, A CLR A;计数器清0 L081D: JB P3.0, L081D ;P3.0为低吗? MOV R2, #10H LCALL DELY JNB P3.0, $;延时后再判断P3.0为低吗? INC A ;累加器加1 PUSH ACC CPL A ;转成驱动二极管的电平 MOV P1, A;A送P1口 POP ACC AJMP L081D DELY: … … ;延时子程序 RET END
② 仿真实验: • 在Proteus ISIS 中画出设计电路,并进行电气检测。 • 根据电路设计图,在Keil C中编写源程序。 • 编译程序,并产生HEX文件。 • 将HEX文件加入AT89c51,并仿真电路,通过拨动开关观察发光二极管的显示状况,如图所示。
图4.10 中断过程流程图 图4.11 中断嵌套过程图 §4.2 中断系统 4.2.1 中断的概述 1.中断的基本概念 2.中断优先权与嵌套
4.2.2 MCS-51的中断系统 8051共有5个中断源。分为高级和低级两个中断优先级,可实现2级中断服务嵌套。 1. MCS-51的中断源 8051允许5个中断源: ① 外部中断源 由外部原因引起的,可以通过两个固定引脚 INT0 ( P3.2 )和INT1( P3.3 )来引入。这两个中断源的请求方式有两种:低电平触发或下降沿触发。 ② 内部中断源 T0:定时/计数器0中断,由T0回零溢出引起。 T1:定时/计数器1中断,由T1回零溢出引起。 ③ TI/RI:串行I/O中断,完成一帧字符发送/接收引起。 2、中断控制
TCON IE IP 1 高级中断请求 IT0= 1 1 自然优先级 PX0 INT0 IE0 IT0 =0 EX0 0 1 PT0 T 0 TF0 中断 PC ET0 0 1 矢量地址 IT1= 1 1 PX1 INT1 IE1 IT1=0 EX1 0 1 PT1 T1 TF1 低级中断请求 ET1 0 自然优先级 1 PS TX TI 1 ≥ RX ES 0 RI EA SCON 中断 各中断 总 允许 优先级 PC 中断标志 矢量地址 源允许 硬件查询 图4.12 8051中断系统结构
①定时控制寄存器TCON • TF0/TF1:定时器溢出中断申请标志位(由硬件自动置位)。 =0:定时器未溢出; =1:定时器溢出(由全“1”变成全“0”)时由硬件自动置位,申请中断,中断被CPU响应后由硬件自动清零。 • TR0/TR1:定时器运行启停控制位 =0:定时器停止运行; =1:定时器启动运行。
IE0/IE1:外部中断申请标志位(由硬件自动置位 ,中 断响应后转向中断服务程序时,由硬件自动清0 )。 =0:没有外部中断申请; =1:有外部中断申请。 • IT0/IT1:外部中断请求的触发方式控制位(可由用户通过软件设置 )。 =0: 在INT0/INT1端申请中断的信号低电平有效; =1: 在INT0/INT1端申请中断的信号负跳变有效。
②串行口控制寄存器SCON TI/RI:串行口发送/接收中断申请标志位=0:没有串行口发送/接收中断申请;=1:有串行口发送/接收中断申请。这两位不会由硬件自动置位,所以用户必须在中断服务子程序中用软件清0。例如:CLR TI RE TI
③中断允许寄存器IE ES: 串行口中断允许位。ET1 :定时器/计数器T1的溢出中断允许位。EX1 :外部中断1中断允许位。ET0 :定时器/计数器T0的溢出中断允许位。EX0 :外部中断0中断允许位。EA: 总的中断允许控制位(总开关):=0 :禁止全部中断;=1 :允许中断。
④ 中断优先级寄存器IP PX0/PX1:外部中断0 /外部中断1 优先级控制位:=0:属低优先级; =1:属高优先级。PT0/PT1:T0/T1中断优先级控制位:=0:属低优先级; =1:属高优先级。PS1:串行口中断优先级控制位:=0:属低优先级; =1:属高优先级。
当同级的几个中断源同时发中断请求时, MCS-51单片机的中断系统对各中断源的中断优先级有一个统一的规定,称为自然优先级。自然优先级的排列如下:
3. 中断响应及处理过程 ① 中断响应的条件 • 相应的中断是开放的; • 没有同级的中断或更高级别的中断正在处理; • 正在执行的指令必须执行完最后 1个机器周期; • 若当前正在执行的是中断返回指令(RETI),或对IE或IP寄存器操作的指令,则必须执行完当前指令的下一条指令才能响应中断。 ② 中断响应的过程 中断过程包括中断请求、中断响应、中断服务、中断返回四个阶段。 • 中断优先级状态触发器置1。 • 由硬件自动生成一条长调用指令,将断点的地址压入堆栈区进行保护, • CPU将执行中断服务子程序,包含保护现场、执行中断主体、恢复现场。 • 中断返回:中断子程序最后为中断返回RETI指令,该指令使断点出栈,然后开放中断允许,中断过程结束,CPU返回原程序。
③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址,即第一条指令的第一个字节在程序存储器中的位置。单片机的中断入口地址由单片机硬件电路决定,各中断服务子程序的入口地址为: 中断源 入口地址 INT0 0003H T0 000BH INT1 0013H T1 001BH RI/TI 0023H
④ 外部中断触发方式的选择 • 边沿触发 当ITx=1时,外部中断为边沿触发方式。CPU在每个机器周期的S5P2期间采样INT1 (P3.3)引脚。若在连续两个机器周期采样到先高电平后低电平,则认为有中断申请,硬件自动使IE0置1,此标志一直保持到CPU响应中断时,才由硬件自动清0。在边沿触发方式下,为保证CPU在两个机器周期内检测到先高后低的负跳变,输入高低电平的持续时间至少要保持12个时钟周期。
电平触发 当ITx=0时,外部中断为电平触发方式。若CPU检测外部中断请求输入引脚为低电平,硬件自动置位相应的中断标志位IEx;若为高电平,则认为无中断申请,硬件自动清除中断标志位。所以,外部中断请求输入信号,必须保持到CPU响应该请求为止。当CPU响应请求后通过硬件清零IEx,但请求信号并没有被清除,在该中断服务子程序返回之前,这个中断请求信号必须撤掉,否则,将引起再次响应。为此,用以下电路清除外部中断请求信号,并在中断服务程序中执行以下指令: ORL P1,#01H ANL P1,#0FEH
图4-12 用二极管显示中断请求信号 4.2.3 MCS-51中断的应用举 【例4.3】:见书P85。
① 汇编语言源程序: ORG 0000H AJMP MAIN ;转向主程序 ORG 0013H ;外部中断1入口地址 AJMP PINT ORG 0050H MAIN: SETB IT1 ;置边沿触发方式 SETB EX1 SETB EA ;开发外部中断1 LOOP: MOV A, P1 ANL A, #0FFH CJNE A,#0FFH , LOOP ;有外部 中断请求,去LOOP ORL P1,#0FFH ;无中断请求,外部灯全灭 LJMP LOOP SJMP $
;中断子程序 JB P1,0 , L2 CLR P1.4 L2: JB P1.1, L3 CLR P1.5 L3: JB P1.2 L4 CLR P1.6 L4:JB P1.3 L5 CLR P1.7 L5:RETI END
② C语言程序 #include "reg51.h" sbit P11=P1^1; sbit P12=P1^2; sbit P13=P1^3; sbit P14=P1^4; sbit P15=P1^5; sbit P16=P1^6; sbit P17=P1^7; void extern0_IR(void) interrupt 1 {p14=p10; p15=p11; p16=p12; p17=p13; }
void main(void) { unsigned char c; IT1=1; EX0=1; EA=1; While(1) { c=P1; c&=0xff; if(c==0xff) P1|0xff; } }
例4.4平时LED发光二极管处于全亮状态;INT0外中断控制二极管循环左移8次;INT1外中断控制二极管循环右移8次;并进行仿真实验例4.4平时LED发光二极管处于全亮状态;INT0外中断控制二极管循环左移8次;INT1外中断控制二极管循环右移8次;并进行仿真实验
①汇编语言源程序: ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030H START: MOV SP, #30H SETB IT0 ;外部中断1为边沿触发方式 SETB IT1 ; 外部中断1为边沿触发方式 SETB EX0 SETB EX1 SETB EA ;开放外部中断0和1 MOV IP , #04H ;外部中断1为高优先级 LOOP: MOV P1 , #00H ;灯全亮 SJMP LOOP ; 等中断
;INT0中断服务子程序 PINT0: PUSH PSW CLR RS1 SETB RS0 MOV R1 , #8 MOV A , #0FEH ;置灯的初态 LP0: MOV P1 , A LCALL DELAY RL A ;循环左移 DJNZ R1 , LP0 POP PSW RETI
;INT1中断服务子程序 PINT1: PUSH PSW SETB RS1 CLR RS0 MOV R1 , #8 MOV A , #07FH ;置灯的初态 LP1: MOV P1 , A LCALL DELAY RR A ;循环右移 DJNZ R1 , LP1 POP PSW RETI ;延时子程序 略
② C程序 #include “reg51.h" //定 8051接触器的头文件 void pint1(void ); void pint1(void ); void delay(void); void main(void ) { IT0=1; IT1=1; //外部中断0、1为边沿触发方式 EX0=1; EX1=1; EA=1; //开放外部中断0和1 IP =0x04; //外部中断1为高优先级 while(1); { P1=0x00; delay()} //灯全亮 } }
//INT0中断服务子程序 void pint0(void ) interrupt 0 { int,i; P1=0xfe ; //置灯的初态 for(i=0,i<7,i++) {delay (void); P1=P1<<1; //循环左移 } } //INT1中断服务子程序 void pint1(void ) interrupt 2 { int,i; P1=0x7f ; //置灯的初态 for(i=0,i<7,i++) { P1=P1>>1; //循环右移 delay (void); } } //延时子程序 略
③ 仿真实验 图4.16 例题4.4 仿真图
¸ 振荡器 12 可重置初值 加1计数器 中断 TFX 方式 控制 TX端 启动 控制 4.3 定时/计数器的结构和原理 8051内部提供两个十六位的定时器/计数器T0和T1
1.计数功能: 所谓计数功能是指对外部脉冲进行计数。外部脉冲从单片机的T0(P3.4)和T1(P3.5)两个引脚输入,最高计数脉冲频率为晶振频率的1/24。 2.定时功能: 以定时方式工作时,计数输入信号是内部时钟脉冲,每个机器周期使计数器加1,所以,计数频率是振荡频率的1/12,
4.3.2定时/计数器的工作方式选择及控制 1.方式控制寄存器TMOD ①工作方式选择位M1、M0
②门控位:GATE。 GATE=0:软件启动定时器,使TRx置1即可启动定时器。 GATE=1:软件和硬件共同启动定时器,除了要使TRx置1外,外部中断请求信号输入端INTx还必须输入高电平才能启动定时器。 ③功能选择位:C/T。 C/T=0时,以定时器方式工作。 C/T=1时,以计数器方式工作。
2.定时器控制寄存器TCON ①定时器启动控制位:TR0、TR1 TRx=0,停止定时器/计数器1工作。 TRx=1,启动定时器/计数器1工作。 该位由软件置位和复位 ②定时器溢出中断标志位:TF0、 TF1 当定时/计数器溢出时,由硬件自动置1。使用查询方式时,此位做状态位供CPU查询,查询有效后需由软件清零;使用中断方式时,此位做中断申请标志位,进入中断服务后被硬件自动清零
4.3.3 定时器/计数器的工作方式 方式0(以定时器/计数器T0为例) • 定时寄存器由TH0的8位和TL0的低5位(高3位不用)组成一个13位计数器。 • 当GATE=0时,只要TR0为1,13位计数器就开始进行加1计数;当GATE=1以及TR0=1时,是否计数还取决于INT0引脚信号,当INT0引脚为高电平时开始计数,当INT0为低电平时停止计数。 • 当定时器溢出时,初值寄存器TH0、TL0会自动清零,要对它们重新装初值,否则,下次它们将从0开始进行加法计数。 • 方式0为定时工作方式时,定时时间计算公式为: t=(213-计数初值X)×晶振周期×12