102

Click here to load reader

第 4 章 MCS-51 功能模块的编程与仿真

  • Upload
    terris

  • View
    306

  • Download
    4

Embed Size (px)

DESCRIPTION

第 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 位数据。. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 4 章  MCS-51 功能模块的编程与仿真

第 4 章 MCS-51 功能模块的编程与仿真

41 单片机的并行输入 输出口42 中断的系统43 MCS-51 的定时 计数器44 串行接口

41 单片机的并行输入输出端口

8051 单片机有 4 个 8 位并行 IO 端口每条 IO 口线都能独立地用作输入或输出

在无片外扩展存储器的系统中这四个 IO 口都可以作为通用 IO 口使用

在有片外扩展存储器的系统中 P2 口送出高 8 位地址P0 口分时送出低 8 位地址和 8 位数据

图 41 P0 的位结构图

1 并行 IO 的结构和原理 ( 1 ) P0 口

1

D

CP

Q

Q MUX

amp T1

T2 锁存器

地址数据 控制信号 C VCC

内部总线

写锁存器

读锁存器

读引脚

P0X引脚

1

2

P0 口用作通用 IO 口 ① P0 口用作输出口此时必须外接上拉电阻 ② P0 口用作输入口分读引脚和读锁存器两种情况 读引脚 CPU 在执行ldquo MOVrdquo 类输入指令时 ( 如 MOV A P

0) 内部产生的操作信号是ldquo读引脚rdquo P0X 引脚上的数据经过缓冲器 2 读入到内部总线注意在读引脚时必须先向电路中的锁存器写入 1

读锁存器 CPU 在执行ldquo读 - 改 - 写rdquo类输入指令时 ( 如 ANL P0 A ) 内部产生的操作信号是ldquo读锁存器rdquo锁存器中的数据经过缓冲器 1 送到内部总线然后与 A 的内容进行逻辑ldquo与rdquo结果送回 P0 的端口锁存器并出现在引脚除了 MOV 类指令外其他的读端口操作指令都属于这种情况

在扩展系统中 P0 口作地址 数据总线

( 2 ) P1 口 P1 口仅作通用 IO 口使用由于在内部输出端已接有上

拉电阻所以不需再外接上拉电阻

图 42 P1 的位结构图

(3) P2 口 当控制信号等于零时 MUX 拨向下方 P2 口作为通

用 IO 口使用 当控制信号等于 1 时 MUX 拨向上方 P2 口作为高

8 位地址线使用

图 43 P2 的位结构图

4 P3 口 锁存器 Q 端接与非门的一个输入端第二功能输出线接

与非门的另一个输入端

图 44 P3 的位结构图

引脚 第 二 功 能P30 RXD串行口输入P31 TXD串行口输出P32 INT0外部中断 0请求输入P33 INT1外部中断 1请求输入P34 T0定时器 计数器 0外部计数脉冲输入P35 T1定时器 计数器 1外部计数脉冲输入P36 WR外部数据存储器写控制信号输出P37 RD外部数据存储器读控制信号输出

表 41 P3 口的第二功能表

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 2: 第 4 章  MCS-51 功能模块的编程与仿真

41 单片机的并行输入输出端口

8051 单片机有 4 个 8 位并行 IO 端口每条 IO 口线都能独立地用作输入或输出

在无片外扩展存储器的系统中这四个 IO 口都可以作为通用 IO 口使用

在有片外扩展存储器的系统中 P2 口送出高 8 位地址P0 口分时送出低 8 位地址和 8 位数据

图 41 P0 的位结构图

1 并行 IO 的结构和原理 ( 1 ) P0 口

1

D

CP

Q

Q MUX

amp T1

T2 锁存器

地址数据 控制信号 C VCC

内部总线

写锁存器

读锁存器

读引脚

P0X引脚

1

2

P0 口用作通用 IO 口 ① P0 口用作输出口此时必须外接上拉电阻 ② P0 口用作输入口分读引脚和读锁存器两种情况 读引脚 CPU 在执行ldquo MOVrdquo 类输入指令时 ( 如 MOV A P

0) 内部产生的操作信号是ldquo读引脚rdquo P0X 引脚上的数据经过缓冲器 2 读入到内部总线注意在读引脚时必须先向电路中的锁存器写入 1

读锁存器 CPU 在执行ldquo读 - 改 - 写rdquo类输入指令时 ( 如 ANL P0 A ) 内部产生的操作信号是ldquo读锁存器rdquo锁存器中的数据经过缓冲器 1 送到内部总线然后与 A 的内容进行逻辑ldquo与rdquo结果送回 P0 的端口锁存器并出现在引脚除了 MOV 类指令外其他的读端口操作指令都属于这种情况

在扩展系统中 P0 口作地址 数据总线

( 2 ) P1 口 P1 口仅作通用 IO 口使用由于在内部输出端已接有上

拉电阻所以不需再外接上拉电阻

图 42 P1 的位结构图

(3) P2 口 当控制信号等于零时 MUX 拨向下方 P2 口作为通

用 IO 口使用 当控制信号等于 1 时 MUX 拨向上方 P2 口作为高

8 位地址线使用

图 43 P2 的位结构图

4 P3 口 锁存器 Q 端接与非门的一个输入端第二功能输出线接

与非门的另一个输入端

图 44 P3 的位结构图

引脚 第 二 功 能P30 RXD串行口输入P31 TXD串行口输出P32 INT0外部中断 0请求输入P33 INT1外部中断 1请求输入P34 T0定时器 计数器 0外部计数脉冲输入P35 T1定时器 计数器 1外部计数脉冲输入P36 WR外部数据存储器写控制信号输出P37 RD外部数据存储器读控制信号输出

表 41 P3 口的第二功能表

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 3: 第 4 章  MCS-51 功能模块的编程与仿真

图 41 P0 的位结构图

1 并行 IO 的结构和原理 ( 1 ) P0 口

1

D

CP

Q

Q MUX

amp T1

T2 锁存器

地址数据 控制信号 C VCC

内部总线

写锁存器

读锁存器

读引脚

P0X引脚

1

2

P0 口用作通用 IO 口 ① P0 口用作输出口此时必须外接上拉电阻 ② P0 口用作输入口分读引脚和读锁存器两种情况 读引脚 CPU 在执行ldquo MOVrdquo 类输入指令时 ( 如 MOV A P

0) 内部产生的操作信号是ldquo读引脚rdquo P0X 引脚上的数据经过缓冲器 2 读入到内部总线注意在读引脚时必须先向电路中的锁存器写入 1

读锁存器 CPU 在执行ldquo读 - 改 - 写rdquo类输入指令时 ( 如 ANL P0 A ) 内部产生的操作信号是ldquo读锁存器rdquo锁存器中的数据经过缓冲器 1 送到内部总线然后与 A 的内容进行逻辑ldquo与rdquo结果送回 P0 的端口锁存器并出现在引脚除了 MOV 类指令外其他的读端口操作指令都属于这种情况

在扩展系统中 P0 口作地址 数据总线

( 2 ) P1 口 P1 口仅作通用 IO 口使用由于在内部输出端已接有上

拉电阻所以不需再外接上拉电阻

图 42 P1 的位结构图

(3) P2 口 当控制信号等于零时 MUX 拨向下方 P2 口作为通

用 IO 口使用 当控制信号等于 1 时 MUX 拨向上方 P2 口作为高

8 位地址线使用

图 43 P2 的位结构图

4 P3 口 锁存器 Q 端接与非门的一个输入端第二功能输出线接

与非门的另一个输入端

图 44 P3 的位结构图

引脚 第 二 功 能P30 RXD串行口输入P31 TXD串行口输出P32 INT0外部中断 0请求输入P33 INT1外部中断 1请求输入P34 T0定时器 计数器 0外部计数脉冲输入P35 T1定时器 计数器 1外部计数脉冲输入P36 WR外部数据存储器写控制信号输出P37 RD外部数据存储器读控制信号输出

表 41 P3 口的第二功能表

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 4: 第 4 章  MCS-51 功能模块的编程与仿真

P0 口用作通用 IO 口 ① P0 口用作输出口此时必须外接上拉电阻 ② P0 口用作输入口分读引脚和读锁存器两种情况 读引脚 CPU 在执行ldquo MOVrdquo 类输入指令时 ( 如 MOV A P

0) 内部产生的操作信号是ldquo读引脚rdquo P0X 引脚上的数据经过缓冲器 2 读入到内部总线注意在读引脚时必须先向电路中的锁存器写入 1

读锁存器 CPU 在执行ldquo读 - 改 - 写rdquo类输入指令时 ( 如 ANL P0 A ) 内部产生的操作信号是ldquo读锁存器rdquo锁存器中的数据经过缓冲器 1 送到内部总线然后与 A 的内容进行逻辑ldquo与rdquo结果送回 P0 的端口锁存器并出现在引脚除了 MOV 类指令外其他的读端口操作指令都属于这种情况

在扩展系统中 P0 口作地址 数据总线

( 2 ) P1 口 P1 口仅作通用 IO 口使用由于在内部输出端已接有上

拉电阻所以不需再外接上拉电阻

图 42 P1 的位结构图

(3) P2 口 当控制信号等于零时 MUX 拨向下方 P2 口作为通

用 IO 口使用 当控制信号等于 1 时 MUX 拨向上方 P2 口作为高

8 位地址线使用

图 43 P2 的位结构图

4 P3 口 锁存器 Q 端接与非门的一个输入端第二功能输出线接

与非门的另一个输入端

图 44 P3 的位结构图

引脚 第 二 功 能P30 RXD串行口输入P31 TXD串行口输出P32 INT0外部中断 0请求输入P33 INT1外部中断 1请求输入P34 T0定时器 计数器 0外部计数脉冲输入P35 T1定时器 计数器 1外部计数脉冲输入P36 WR外部数据存储器写控制信号输出P37 RD外部数据存储器读控制信号输出

表 41 P3 口的第二功能表

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 5: 第 4 章  MCS-51 功能模块的编程与仿真

( 2 ) P1 口 P1 口仅作通用 IO 口使用由于在内部输出端已接有上

拉电阻所以不需再外接上拉电阻

图 42 P1 的位结构图

(3) P2 口 当控制信号等于零时 MUX 拨向下方 P2 口作为通

用 IO 口使用 当控制信号等于 1 时 MUX 拨向上方 P2 口作为高

8 位地址线使用

图 43 P2 的位结构图

4 P3 口 锁存器 Q 端接与非门的一个输入端第二功能输出线接

与非门的另一个输入端

图 44 P3 的位结构图

引脚 第 二 功 能P30 RXD串行口输入P31 TXD串行口输出P32 INT0外部中断 0请求输入P33 INT1外部中断 1请求输入P34 T0定时器 计数器 0外部计数脉冲输入P35 T1定时器 计数器 1外部计数脉冲输入P36 WR外部数据存储器写控制信号输出P37 RD外部数据存储器读控制信号输出

表 41 P3 口的第二功能表

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 6: 第 4 章  MCS-51 功能模块的编程与仿真

(3) P2 口 当控制信号等于零时 MUX 拨向下方 P2 口作为通

用 IO 口使用 当控制信号等于 1 时 MUX 拨向上方 P2 口作为高

8 位地址线使用

图 43 P2 的位结构图

4 P3 口 锁存器 Q 端接与非门的一个输入端第二功能输出线接

与非门的另一个输入端

图 44 P3 的位结构图

引脚 第 二 功 能P30 RXD串行口输入P31 TXD串行口输出P32 INT0外部中断 0请求输入P33 INT1外部中断 1请求输入P34 T0定时器 计数器 0外部计数脉冲输入P35 T1定时器 计数器 1外部计数脉冲输入P36 WR外部数据存储器写控制信号输出P37 RD外部数据存储器读控制信号输出

表 41 P3 口的第二功能表

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 7: 第 4 章  MCS-51 功能模块的编程与仿真

4 P3 口 锁存器 Q 端接与非门的一个输入端第二功能输出线接

与非门的另一个输入端

图 44 P3 的位结构图

引脚 第 二 功 能P30 RXD串行口输入P31 TXD串行口输出P32 INT0外部中断 0请求输入P33 INT1外部中断 1请求输入P34 T0定时器 计数器 0外部计数脉冲输入P35 T1定时器 计数器 1外部计数脉冲输入P36 WR外部数据存储器写控制信号输出P37 RD外部数据存储器读控制信号输出

表 41 P3 口的第二功能表

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 8: 第 4 章  MCS-51 功能模块的编程与仿真

引脚 第 二 功 能P30 RXD串行口输入P31 TXD串行口输出P32 INT0外部中断 0请求输入P33 INT1外部中断 1请求输入P34 T0定时器 计数器 0外部计数脉冲输入P35 T1定时器 计数器 1外部计数脉冲输入P36 WR外部数据存储器写控制信号输出P37 RD外部数据存储器读控制信号输出

表 41 P3 口的第二功能表

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 9: 第 4 章  MCS-51 功能模块的编程与仿真

2 MC5-51 并行 IO 的应用举例1 七段数码管的结构与原理 在单片机应用系统中通常使用的是 8 段式 LED 数码管

显示器它有共阴极和共阳极两种如图所示

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 10: 第 4 章  MCS-51 功能模块的编程与仿真

数码管不同的发光段亮可组成不同字型这种组合称为字型码或断码在 COM 送入低电平或高电平然后控制个各段引脚电平即可形成相应段码

共阳顺序段码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H

共阴顺序段码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 6FH ( Dprarra )

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 11: 第 4 章  MCS-51 功能模块的编程与仿真

例 41 要求通过开关输入 4 位二进制数送到数码管显示出来如图 ( 见书 )

① 汇编源程序 ORG 0000H

LJMP STA ORG 0100hSTA 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 hellip hellip END

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 12: 第 4 章  MCS-51 功能模块的编程与仿真

② C 程序include reg51h 包含 8051 单片机寄存器定义头文件define LED P1define KEY P0char code disp[ ]=0xC00xF90xA40xB0 0x990x920x820xF8 0x800x900x880x83 0x0C60xA10x860x8E 定义断码表main() int i LED=0xFF 关数码管 while(1) KEY=0XFF 读引脚前端口置 1

i=KEY i=~i 转成数据信息

i=iamp 0x0f 保留低 4 位信息 LED= disp[i] 查表取得断码信息 断码送数码管显

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 13: 第 4 章  MCS-51 功能模块的编程与仿真

③ 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过拨动开关

观察发光二极管的显示状况如图所示

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 14: 第 4 章  MCS-51 功能模块的编程与仿真

图 47 例 41 的仿真图

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 15: 第 4 章  MCS-51 功能模块的编程与仿真

例 42 要求对某引脚送入的脉冲进行计数把脉冲的个数送到八个发光二极管以二进制数的形式显示出来并进行仿真实验

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 16: 第 4 章  MCS-51 功能模块的编程与仿真

① 汇编语言源程序 ORG 0000h AJMP STAR ORG 0100H STAR MOV A 0ffh MOV P1 A

CLR A 计数器清 0L081D JB P30 L081D P30 为低吗 MOV R2 10H LCALL DELY JNB P30 $ 延时后再判断 P30 为低吗 INC A 累加器加 1 PUSH ACC CPL A 转成驱动二极管的电平 MOV P1 A A 送 P1 口 POP ACC AJMP L081DDELY hellip hellip 延时子程序

RET END

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 17: 第 4 章  MCS-51 功能模块的编程与仿真

② 仿真实验 在 Proteus ISIS 中画出设计电路并进行电气检

测 根据电路设计图在 Keil C 中编写源程序 编译程序并产生 HEX 文件 将 HEX 文件加入 AT89c51 并仿真电路通过

拨动开关观察发光二极管的显示状况如图所示

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 18: 第 4 章  MCS-51 功能模块的编程与仿真

图 48-9 例 42 的仿真图

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 19: 第 4 章  MCS-51 功能模块的编程与仿真

sect42 中断系统421 中断的概述1 中断的基本概念2 中断优先权与嵌套

图 410 中断过程流程图

图 411 中断嵌套过程图

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 20: 第 4 章  MCS-51 功能模块的编程与仿真

422 MCS-51 的中断系统 8051 共有 5 个中断源分为高级和低级两个中断优先

级可实现 2 级中断服务嵌套

1 MCS-51 的中断源 8051 允许 5 个中断源① 外部中断源 由外部原因引起的可以通过两个固定引脚 INT0 ( P32 )和 INT1 ( P33 )来引入这两个中断源的请求方式有两种低电平触发或下降沿触发② 内部中断源 T0 定时 计数器 0 中断由 T0 回零溢出引起 T1 定时 计数器 1 中断由 T1 回零溢出引起

③ TIRI 串行 IO 中断完成一帧字符发送 接收引起2 中断控制1048708 1048708

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 21: 第 4 章  MCS-51 功能模块的编程与仿真

图 412 8051 中断系统结构

IE0 PX0

EA

EX0

1

中断

矢量地址

1

0

ET0

EX1

ET1

ES

PT0

PX1

PT1

PS

1

0

1

0

1

0

1

0

自然

优先

中断

矢量地址

自然

优先

IT0=1

IT0=0

TF0

IE1

1

IT1=1

IT1=0

TF1

TI

RI

T0

T1

INT1

TX

RX

TCON IE IP

SCON

中断标志 各中断

源允许

总允许 优先级

硬件查询

PC

低级

中断

请求

PC

高级

中断

请求

INT0

ge1

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 22: 第 4 章  MCS-51 功能模块的编程与仿真

① 定时控制寄存器 TCON

TCON(88H)

D7 D6 D5 D4 D3 D2 D1 D0

TF1 TR1 TF0 TR0 IE1 IT1IE0

IT0

TF0TF1 定时器溢出中断申请标志位(由硬件自动置位)

=0 定时器未溢出 =1 定时器溢出(由全ldquo 1rdquo变成全ldquo 0rdquo )时由硬件自

动置位申请中断中断被 CPU响应后由硬件自动清零 TR0TR1 定时器运行启停控制位 =0 定时器停止运行 =1 定时器启动运行

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 23: 第 4 章  MCS-51 功能模块的编程与仿真

IE0IE1 外部中断申请标志位(由硬件自动置位 中 断响应后转向中断服务程序时由硬件自动清 0 )

=0 没有外部中断申请 =1 有外部中断申请 IT0IT1 外部中断请求的触发方式控制位(可由用户通

过软件设置 ) =0 在 INT0INT1 端申请中断的信号低电平有效 =1 在 INT0INT1 端申请中断的信号负跳变有效

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 24: 第 4 章  MCS-51 功能模块的编程与仿真

TIRI 串行口发送 接收中断申请标志位 =0 没有串行口发送 接收中断申请 =1 有串行口发送 接收中断申请 这两位不会由硬件自动置位所以用户必须在中断服务子程序中用软件清 0 例如 CLR TI RE TI

② 串行口控制寄存器 SCON

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8TI RI

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 25: 第 4 章  MCS-51 功能模块的编程与仿真

③ 中断允许寄存器 IE

IE(A8H)

D7 D6 D5 D4 D3 D2 D1 D0

EA mdash ET2 ES ET1 EX1 ET0 EX0

ES 串行口中断允许位 ET1 定时器 计数器 T1 的溢出中断允许位 EX1 外部中断 1 中断允许位 ET0 定时器 计数器 T0 的溢出中断允许位 EX0 外部中断 0 中断允许位 EA 总的中断允许控制位(总开关) =0 禁止全部中断 =1 允许中断

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 26: 第 4 章  MCS-51 功能模块的编程与仿真

④ 中断优先级寄存器 IP

IP(B8H)

D7 D6 D5 D4 D3 D2 D1 D0

mdash mdash PT2 PS PT1 PX1 PT0 PX0

PX0PX1 外部中断 0 外部中断 1 优先级控制位 =0 属低优先级 =1 属高优先级PT0PT1 T0T1 中断优先级控制位 =0 属低优先级 =1 属高优先级PS1 串行口中断优先级控制位 =0 属低优先级 =1 属高优先级

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 27: 第 4 章  MCS-51 功能模块的编程与仿真

当同级的几个中断源同时发中断请求时 MCS-51 单片机的中断系统对各中断源的中断优先级有一个统一的规定称为自然优先级自然优先级的排列如下

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 28: 第 4 章  MCS-51 功能模块的编程与仿真

3 中断响应及处理过程① 中断响应的条件 相应的中断是开放的 没有同级的中断或更高级别的中断正在处理 正在执行的指令必须执行完最后 1 个机器周期 若当前正在执行的是中断返回指令( RETI )或对 IE 或 IP寄存器操作的

指令则必须执行完当前指令的下一条指令才能响应中断② 中断响应的过程 中断过程包括中断请求中断响应中断服务中断返回四个阶段 中断优先级状态触发器置 1 由硬件自动生成一条长调用指令 将断点的地址压入堆栈区进行保护 CPU 将执行中断服务子程序包含保护现场执行中断主体恢复现场 中断返回中断子程序最后为中断返回 RETI 指令该指令使断点出栈然

后开放中断允许中断过程结束 CPU返回原程序

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 29: 第 4 章  MCS-51 功能模块的编程与仿真

③ 中断服务程序入口地址(中断矢量) 中断入口地址就是中断服务子程序的起始地址即第

一条指令的第一个字节在程序存储器中的位置单片机的中断入口地址由单片机硬件电路决定各中断服务子程序的入口地址为

中断源 入口地址 INT0 0003 H T0 000BH INT1 0013H T1 001BH RITI 0023H

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 30: 第 4 章  MCS-51 功能模块的编程与仿真

④ 外部中断触发方式的选择 边沿触发 当 ITx=1 时外部中断为边沿触发方式 CPU 在每个机器周期的 S5P2期间采样 INT1 (P33) 引脚若在连续两个机器周期采样到先高电平后低电平则认为有中断申请硬件自动使 IE0 置 1 此标志一直保持到 CPU响应中断时才由硬件自动清 0 在边沿触发方式下为保证 CPU 在两个机器周期内检测到先高后低的负跳变输入高低电平的持续时间至少要保持 12 个时钟周期

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 31: 第 4 章  MCS-51 功能模块的编程与仿真

电平触发当 ITx=0 时外部中断为电平触发方式若 CPU 检测外部

中断请求输入引脚为低电平硬件自动置位相应的中断标志位 IEx若为高电平则认为无中断申请硬件自动清除中断标志位所以外部中断请求输入信号必须保持到 CPU响应该请求为止当 CPU响应请求后通过硬件清零 IEx 但请求信号并没有被清除在该中断服务子程序返回之前这个中断请求信号必须撤掉否则将引起再次响应为此用以下电路清除外部中断请求信号并在中断服务程序中执行以下指令

ORL P101HANL P10FEH

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 32: 第 4 章  MCS-51 功能模块的编程与仿真

423 MCS-51 中断的应用举 【例 43】见书 P85

图 4-12 用二极管显示中断请求信号

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 33: 第 4 章  MCS-51 功能模块的编程与仿真

① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0013H 外部中断 1 入口地址 AJMP PINT ORG 0050HMAIN SETB IT1 置边沿触发方式 SETB EX1 SETB EA 开发外部中断 1LOOP MOV A P1 ANL A 0FFH CJNE A0FFH LOOP 有外部 中断请求去 LOOP ORL P10FFH 无中断请求外部灯全灭 LJMP LOOP SJMP $

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 34: 第 4 章  MCS-51 功能模块的编程与仿真

中断子程序 JB P10 L2 CLR P14L2 JB P11 L3 CLR P15L3 JB P12 L4 CLR P16L4 JB P13 L5 CLR P17L5 RETI END

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 35: 第 4 章  MCS-51 功能模块的编程与仿真

② C 语言程序 include reg51h 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=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 36: 第 4 章  MCS-51 功能模块的编程与仿真

void main(void) unsigned char c IT1=1 EX0=1 EA=1While(1) c=P1 camp=0xff if(c==0xff) P1|0xff

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 37: 第 4 章  MCS-51 功能模块的编程与仿真

例 44 平时 LED 发光二极管处于全亮状态 INT0 外中断控制二极管循环左移 8次 INT1 外中断控制二极管循环右移 8次并进行仿真实验

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 38: 第 4 章  MCS-51 功能模块的编程与仿真

① 汇编语言源程序 ORG 0000H LJMP START ORG 0003H LJMP PINT0 ORG 0013H LJMP PINT1 ORG 0030HSTART MOV SP 30HSETB 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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 39: 第 4 章  MCS-51 功能模块的编程与仿真

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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 40: 第 4 章  MCS-51 功能模块的编程与仿真

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 ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 41: 第 4 章  MCS-51 功能模块的编程与仿真

② C 程序 include ldquoreg51h 定 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 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 42: 第 4 章  MCS-51 功能模块的编程与仿真

INT0 中断服务子程序 void pint0(void ) interrupt 0 inti P1=0xfe 置灯的初态 for(i=0ilt7i++) delay (void) P1=P1ltlt1 循环左移

INT1 中断服务子程序 void pint1(void ) interrupt 2 inti P1=0x7f 置灯的初态 for(i=0ilt7i++) P1=P1gtgt1 循环右移delay (void)

延时子程序 略

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 43: 第 4 章  MCS-51 功能模块的编程与仿真

③ 仿真实验

图 416 例题 44 仿真图

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 44: 第 4 章  MCS-51 功能模块的编程与仿真

43 定时 计数器的结构和原理

8051 内部提供两个十六位的定时器 计数器 T0 和 T1

启动控制

振荡器

TX

TFX中断

12

方式控制

可重置初值加 1 计数器

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 45: 第 4 章  MCS-51 功能模块的编程与仿真

1计数功能 所谓计数功能是指对外部脉冲进行计数外部脉

冲从单片机的 T0(P34) 和 T1(P35) 两个引脚输入最高计数脉冲频率为晶振频率的 124

2定时功能 以定时方式工作时计数输入信号是内部时钟脉

冲每个机器周期使计数器加 1 所以计数频率是振荡频率的 112

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 46: 第 4 章  MCS-51 功能模块的编程与仿真

432 定时 计数器的工作方式选择及控制1 方式控制寄存器 TMOD

TMOD

( 89H)

B7 B6 B5 B4 B3 B2 B1 B0

GATE

CT

M1 M0 GATE

CT

M1 M0

①工作方式选择位 M1 M0

M1 M0 工作方式 功能描述0 0 方式 0 初值寄存器 TL 的低 5 位与 TH的 8位构成 13

位计数器0 1 方式 1 16位计数器1 0 方式 2 自动重新装入初值的 8位计数器1 2 方式 3 仅用于 T0分为两个 8位计数器 T1停止工

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 47: 第 4 章  MCS-51 功能模块的编程与仿真

② 门控位 GATE GATE=0 软件启动定时器使 TRx 置 1 即可启动

定时器GATE=1 软件和硬件共同启动定时器除了要使

TRx 置 1 外外部中断请求信号输入端 INTx还必须输入高电平才能启动定时器

③ 功能选择位 CT CT=0 时以定时器方式工作CT=1 时以计数器方式工作

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 48: 第 4 章  MCS-51 功能模块的编程与仿真

2 定时器控制寄存器 TCON

TCON(88H)

8FH8EH

8DH

8CH

8BH

8AH

89H

88H

TF1TR1

TF0

TR0

IE1 IT1 IE0 IT0 ① 定时器启动控制位 TR0 TR1 TRx=0 停止定时器 计数器 1工作 TRx=1 启动定时器 计数器 1工作 该位由软件置位和复位 ② 定时器溢出中断标志位 TF0 TF1 当定时 计数器溢出时由硬件自动置 1 使用查询方式

时此位做状态位供 CPU 查询查询有效后需由软件清零使用中断方式时此位做中断申请标志位进入中断服务后被硬件自动清零

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 49: 第 4 章  MCS-51 功能模块的编程与仿真

433 定时器 计数器的工作方式方式 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 ) times晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 50: 第 4 章  MCS-51 功能模块的编程与仿真

振荡器 12分频

TH0 (8位)

TL0 (5位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 418 计数器 0 的方式 0 结构图

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 51: 第 4 章  MCS-51 功能模块的编程与仿真

方式 1 方式1是 16 位的定时器 计数器其余与方式 0 相同 方式 1 的定时时间计算公式为 (216 -计数初值 )times 晶振周期 times12

振荡器 12分频

TH0 (8位)

TL0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 419 计数器 0 的方式 1 结构图

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 52: 第 4 章  MCS-51 功能模块的编程与仿真

3 方式 2 它是一个能自动重装初值的 8 位定时器 计数器 方式 2 是由 TL0 组成 8 位计数器 TH0 作为常数缓冲器 当 TL0 产生溢出时一方面使溢出标志位 TF0 置1同时硬件电路又把

TH0 中的数据重新装入 T0L 中重装初值后 TH0 的内容保持不变 其定时时间为 t= ( 28-T0初值) times晶振周期 times12

重新装入

振荡器 12分频

TL0 (8位)

TH0 (8位)

TF0

1

amp

C T =0

C T =1 T0(P34)

TR0

GATE

INT0(P32)

中断

ge1

图 420 计数器 0 的方式 2 结构图

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 53: 第 4 章  MCS-51 功能模块的编程与仿真

4 方 式 3

只有 T0 能够工作于这种方式此时 TL0 和 TH0 成为两个相互独立的 8 位计数器 TL0占用了全部 T0 的控制位和信号引脚即 GATE C T TR0 TF0 等而 TH0只用作定时器使用而且由于定时器 计数器 0 的控制位已被 TL0 独占因此 TH0只好借用定时器 计数器 1 的控制位 TR1 和 TF1 进行工作

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 54: 第 4 章  MCS-51 功能模块的编程与仿真

图 421 计数器 0 的方式 3 结构图

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 55: 第 4 章  MCS-51 功能模块的编程与仿真

434 定时 计数器的初始化 定时 计数器作为一种可编程部件在使用前

对其进行初始化以确定其工作方式和功能定时 计数器的初始化步骤①确定定时 计数器的工作方式并写入 TMOD ② 计算计数初值并写入 THx TLx ③ 如果使用中断方式则开放定时 计数器的中断

根据需要给 IE 中的相关位赋值④ 启动定时 计数器给 TRx 置 1

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 56: 第 4 章  MCS-51 功能模块的编程与仿真

435 定时 计数器的应用举例例 45 设单片机晶振频率为 12MHz 试用 T0 在 P10 端线输出周期为 1ms 的方波脉冲如图所示如用方式 0 分别以查询方式和中断方式实现并在仿真实验中用示波器观察输出波形

05ms

P10

8051

1ms

图 422 例 45波形图

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 57: 第 4 章  MCS-51 功能模块的编程与仿真

① 计数初值计算 由题意可得只要从 P10 口每隔 500s交替输出

高低电平即可得到周期为 1ms 的方波所以 T0 的定时时间为 500s 得

s500s1212

1x213

there4 记数初值 X= 213- 500= 7692= 1111000001100B

即 TH0= F0H TL0= 0CH依题意得 (TMOD)= 00H

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 58: 第 4 章  MCS-51 功能模块的编程与仿真

( 2 )查询方式① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 0040H MAIN MOV SP 30H 堆栈设置 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H MOV TL0 0CH 设置计数初值 MOV IE 00H 禁止中断 SETB TR0 启动 T0 LOP JBC TF0 LOOP1 查询等待 AJMP LOP 继续查询LOOP1 MOV TH0 0F0H 重新设置计数初值 MOV TL0 0CH CPL P10 输出状态翻转 AJMP LOP 返回 LOOP END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 59: 第 4 章  MCS-51 功能模块的编程与仿真

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转 TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 EA=0 禁止中断 TR0=1 启动 T0 while ( TF0==0 )

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 60: 第 4 章  MCS-51 功能模块的编程与仿真

( 3 )用中断方式编写程序① 汇编语言源程序 ORG 0000H AJMP MAIN 转向主程序 ORG 000BH T0 中断服务程序固定入口地址 AJMP ZD 转向 T0 中断服务程序 ORG 0040H MAIN MOV SP 30H 设置堆栈指针 MOV TMOD 00H TMOD初始化 MOV TH0 0F0H 设置计数初值 MOV TL0 0CH SETB ET0 开放 T0 中断 SETB EA 开放总中断 SETB TR0 启动 T0 HERE AJMP HERE 等待中断 ZD CPL P10 输出取反 MOV TH0 0F8H 重新设置计数初值 MOV TL0 06H RETI 返回 END

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 61: 第 4 章  MCS-51 功能模块的编程与仿真

②C 语言程序 include reg51h 定义 8051寄存器的头文件 sbit P10=P1^0 void time0(void ) interrupt 1 p10=~p10 输出状态翻转TH0=0xF0 重新设置计数初值 TL0=0x0C void main(void ) TMOD=0x00 TMOD初始化 TH0=0xF0 TL0=0x0C 设置计数初值 ET0=1 EA=1 禁止中断 TR0=1 启动 T0 while ( 1 )

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 62: 第 4 章  MCS-51 功能模块的编程与仿真

( 4 )仿真实验

p10

XTAL218

XTAL119

ALE30

EA31

PSEN29

RST9

P00AD039

P01AD138

P02AD237

P03AD336

P04AD435

P05AD534

P06AD633

P07AD732

P101

P112

P123

P134

P145

P156

P167

P178

P30RXD10

P31TXD11

P32INT012

P33INT113

P34T014

P37RD17

P36WR16

P35T115

P27A1528

P20A821

P21A922

P22A1023

P23A1124

P24A1225

P25A1326

P26A1427

U1

AT89C51

X1CRYSTAL

C1

30p

R1

10k

C4

10uf

C2

30p

A

B

C

D

p10V=499502

图 423 例 45 仿真图

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 63: 第 4 章  MCS-51 功能模块的编程与仿真

图 424 仿真中用示波器观察到的波形图

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 64: 第 4 章  MCS-51 功能模块的编程与仿真

sect44 串行接口441 串行通信基本知识1 串行通信的传送方式① 单工方式 单工方式是指甲乙双方通信时只能单向传送数据

发送方和接收方固定

图 425 单工方式

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 65: 第 4 章  MCS-51 功能模块的编程与仿真

②半双工方式 半双工方式是指通信双方都有自己的发送器和

接收器既可发送也可接收但不能同时接收和发送

图 4-22 半双工方式

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 66: 第 4 章  MCS-51 功能模块的编程与仿真

③全双工制式 全双工制式是指通信双方均有发送器和接收器

并且信道划分为发送信道和接收信道因此全双工制式可实现甲乙双方同时发送和接收数据发送时能接收接收时也能发送

图 427 双工方式

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 67: 第 4 章  MCS-51 功能模块的编程与仿真

(2) 同步和异步通信(1) 同步通信

在数据块传送开始时先发送 1mdash2 个同步字符并由同时传送的时钟信号来实现发送端和接收端同步即接受方检测到规定的同步字符后接着就连续按顺序传送数据

图 428 同步通信数据帧格式

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 68: 第 4 章  MCS-51 功能模块的编程与仿真

(2)异步通信 异步通信中数据按字符组成字符帧字符发送端一帧一帧地发送接收端一帧一帧地接收

异步通信以字符为传送单位用起始位和停止位标识每个字符的开始和结束

发送端和接收端可以由各自的时钟来控制数据的发送和接收这两个时钟源彼此独立并不要求同步

图 429 异步通信数据帧格式

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 69: 第 4 章  MCS-51 功能模块的编程与仿真

异步通信字符帧的格式①起始位发送器通过发送起始位开始一帧字符的传送② 数据位起始位之后传送数据位数据位中低位在前高

位在后数据位可以是 5 6 7 8 位③奇偶校验位实际上是传送的附加位若该位用于用于奇偶校验可校检串行传送的正确性

④停止位标志一个字符传送的结束停止位可以是 1 15 或 2 位

( 3 )波特率( band rate ) 波特率是异步通信中数据传送速率的单位其意义是每秒传送多少位二进制数

例如数据传送的速率为 120 个字符每秒每个字符由 1 个起始位 8 个数据位和 1 个停止位组成则其传送波特率为

10btimes120 s= 1200b s= 1200波特

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 70: 第 4 章  MCS-51 功能模块的编程与仿真

442MCS-51 串行口及控制 51 单片机具有一个可编程的全双工串行接口它

可用作通用异步接收和发送器( UART )也可用作同步移位寄存器

1 单片机串行口的结构 8051 单片机通过串行数据接收端 RXD (P30 引

脚 ) 和串行数据发送端 TXD(P31 引脚 ) 与外界进行通信其中有两个物理上独立的接收发送缓冲器 SBUF 它们占用同一地址 99H 通过读写方式区分

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 71: 第 4 章  MCS-51 功能模块的编程与仿真

图 430 8051 单片机串口硬件图

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 72: 第 4 章  MCS-51 功能模块的编程与仿真

2 串行数据接收 数据通过 RXD 引脚输入一位一位地存入移位寄存器中

然后再整体 8 位存入接收 SBUF 中同时接收中断标志位RI 自动置 1 向 CPU 申请中断 CPU 响应中断软件清 RI 读取 SBUF 数据接着又开始接收下一个数据直至全部数据接收完毕

3 串行数据发送 将数据写入 SBUF 寄存器中 UART 自动添加起始位和

停止位数据从 TXD 引脚串行发送当一个数据发送完TI 自动置 1 向 CPU 发中断请求 CPU 响应中断后用软件清 TI 位同时将下一个数据写入 SBUF 中继续发送直到所有数据发送完毕

例如 MOV SBUF A 启动一次数据发送 可向 SBUF 再发送下一个数

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 73: 第 4 章  MCS-51 功能模块的编程与仿真

4 串行口控制

SCON(98H)

D7 D6 D5 D4 D3 D2 D1 D0

SM0 SM1 SM2 REN TB8 RB8 TI RI

(1) 串行口控制寄存器 SCON

①SM0 SM1mdashmdash 串行口工作方式选择位 SM0 SM1 工作方式 说 明 波 特 率0 0 方式 0 同步移位寄存器 fOSC12

0 1 方式 1 10位异步收发 由定时器控制1 0 方式 2 11位异步收发 fOSC32或 fOSC6

4

1 1 方式 3 11位异步收发 由定时器控制

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 74: 第 4 章  MCS-51 功能模块的编程与仿真

② SM2------多机通信控制位在方式 2 和方式 3 中若 SM2=1 且 RB8=1 时将接收到的前 8 位数据送入 SBUF 并置位 RI 产生中断请求否则将接收到的 8 位数据丢弃而当 SM2=0 时则不论第 9 位数据为 0还是为 1 都将前8 位数据装入 SBUF 中并产生中断请求在方式 0 时 SM2 必须为 0 ③ REN------允许接收控制位 REN=0 禁止接收 REN=1 允许接收该位由软件置位或复位 ④ TB8------ 方式 2 和方式 3 中要发送的第 9 位数据在方式 2和方式 3 时 TB8 是发送的第 9 位数据在多机通信中以 TB8 位的状态表示主机发送的是地址还是数据 TB8=0表示数据 TB8=1 表示地址该位由软件置位或复位 TB8还可用于奇偶校验位

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 75: 第 4 章  MCS-51 功能模块的编程与仿真

⑤RB8------ 方式 2 和方式 3 中要接收的第 9 位数据在方式 2 或方式 3 时 RB8 存放接收到的第 9 位数据⑥TI------ 发送中断标志当方式 0 时发送完第 8

位数据后该位由硬件置位在其他方式下遇发送停止位时该位由硬件置位因此 TI=1 表示帧发送结束可软件查询 TI 位标志也可以请求中断 TI 位必须由软件清 0 ⑦RI------ 接收中断标志当方式 0 时接收完第 8

位数据后该位由硬件置位在其他方式下当接收到停止位时该位由硬件置位因此 RI=1 表示帧接收结束可软件查询 RI 位标志也可以请求中断 RI 位也必须由软件清 0

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 76: 第 4 章  MCS-51 功能模块的编程与仿真

(2) 电源控制寄存器 PCON

PCON(87H)

D7 D6 D5 D4 D3 D2 D1 D0

SMOD mdash mdash mdash GF1 GF0 PD IDL

PCON 中只有 SMOD 与串口有关 SMOD =1 时波特率加倍 SMOD =0 时波特率不加倍

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 77: 第 4 章  MCS-51 功能模块的编程与仿真

5 MCS-51 串行口的工作方式(1) 方式 0 同步移位寄存器方式其波特率是 fosc

的 112 ① 方式 0 输出

3 4 5 6 10 11 12 13

+5V

8051

P30

74LS164D2

D1

CPP31

P10

CLR

2

78

9

14

TXD

RXD 1

图 431 串行口方式 0 的输出

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 78: 第 4 章  MCS-51 功能模块的编程与仿真

② 方式 0 接收 在 REN=1RI=0 时串行口作为并行输入口使用时要外

接并行输入串行输出的移位寄存器如图当接收器接收完 8位数据后置中断标志 RI=1 请求中断响应中断后必须用软件将 RI 清零

+5V

8051

P3074LS166

Q

CPP31

P10

9

2 7

15

14

TXD

RXD

1

P11

图 432 串行口方式 0 的输入

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 79: 第 4 章  MCS-51 功能模块的编程与仿真

例 46 串行口工作在方式 0 将开关送来的 8 位数据利用74LS165 转成串行数据从 RxD 引脚输入并通过 P1 口所连接的 8 个 LED 显示出来如图 4-29 要求用 Proteus 进行仿真实验

89C51

RXD

TXD

74LS1659

vcc

2

D0D1D2D3D4D5D6D7

vcc

1

P10P11P12P13P14P15P16P17

图 433 例 46 方式 0 输入应用

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 80: 第 4 章  MCS-51 功能模块的编程与仿真

① 汇编源程序 ORG 000h AJMP START ORG 0100HSTART MOV SCON 11H 串口设置为方式 0 接收 LOP CLR P32 SETB P32 发送移位脉冲 CLR RI 清楚 RIWAIT JNB RIWAIT MOV ASBUF 读取数据 MOV P1A 送 LED 显示 SJMP LOP END

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 81: 第 4 章  MCS-51 功能模块的编程与仿真

②C 程序 sbit p32=p3^2 void main(void) SCON=0x11 串口设置为方式 0 接收 while(1) p32=0 p32=1 发送移位脉冲 RI=0 清除 RI while(RI==0) LED=SBUF 读取数据送 LED 显示

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 82: 第 4 章  MCS-51 功能模块的编程与仿真

③ 仿真实验

图 434 例 46 仿真图

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 83: 第 4 章  MCS-51 功能模块的编程与仿真

(2) 方式 1 方式 1 用于 8 位异步通信接口 TXD 与 RXD 分别用于

发送与接收数据此方式的传送波特率可调

图 435 10 位的帧格式

① 数据发送发送时只要将数据写入 SBUF 就启动了发送器开始发

送由硬件自动加入起始位和停止位一帧数据发送完毕将 SCON 中的 TI 置 1

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 84: 第 4 章  MCS-51 功能模块的编程与仿真

② 数据接收 接 收时在 REN=1 前提下当采样到 RXD从 1 向 0跳变状态时就认

定为已接收到起始位启动接收器一帧数据接收完毕必须同时满足以下两个条件即 RI=0 和停止位为 1 或 SM2=0 这次接收才真正有效接收数据进入 SBUF 停止位进入 RB8 并置中断请求标志RI 为 1 该标志也必须由用户在中断服务程子程序中由软件清零

③ 方式 2 和方式 3  串行口工作方式 2 和方式 3均为每帧 11 位异步通信格式即 1 位起始位 8 位数据位 ( 低位在前 ) 1 位可编程的第9 数据位和 1 位停止位

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 85: 第 4 章  MCS-51 功能模块的编程与仿真

方式 2 和方式 3 的发送 发送前先根据通信协议由软件设置 TB8 可作为可作为奇偶校验位或多机通信中地址数据信息的标志位 然后将要发送的数据写入 SBUF 即可启动发送过程 串行口能自动把 TB8取出 并装入到第 9 位数据位的位置 再逐一发送出去发送完毕使 TI=1

方式 2 和方式 3 的接收 接收时 使 REN=1 允许接收当检测到 RXD 端有 1 到 0 的负跳变并判断起始位有效后开始接收 9 位数据送入移位寄存器当满足 RI=0且 SM2=0 或接收到的第 9 位数据为 1 时 前 8 位数据送入 SBUF 第 9 位数据送入 RB8 置 RI 为 1否则这次接收无效 也不置位 RI 重新搜索 RXD 端的负跳变

图 436 11 位的帧格式

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 86: 第 4 章  MCS-51 功能模块的编程与仿真

6 MCS-51 串行口的波特率① 方式 0 的波特率 方式 0 的波特率是固定的其值为 fosc12(fosc 为主机频率 )

② 方式 2 的波特率 通信波特率为 fosc32 或 fosc64 根据特殊功能寄存器 P

CON 中 SMOD 位的状态来决定串行口在那个波特率下工作选择公式为

③ 方式 1 和方式 3 的波特率在这两种方式下串行口波特率是由定时器的溢出率决定的

因而波特率是可变的波特率的公式为 溢出率即 T1溢出一次所需时间的倒数计算公式为

OSC

SMOD

64

2f波特率

溢出率定时器波特率 T132

2SMOD

)2

1(

12T1 K

OSC

-初值溢出率定时器

f

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 87: 第 4 章  MCS-51 功能模块的编程与仿真

7 单片机多机通信原理 单片机多机通信是指一台主机和多台从机之间的通信

串行口以方式 2 或方式 3 接收时若 SM2= 1 则仅当接收到的第九位数据为 1 时才将数据送入接收缓冲器 SBUF 并置位 RI 发出中断请求信号否则将丢失信息而当 SM2= 0 时则无论第九位是 0还是 1 都能将数据装入 SBUF 并产生中断请求信号

8051主机

TXD

RXD

8051TXD RXD

0从机

8051TXD RXD

1从机

8051TXD RXD

2从机

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 88: 第 4 章  MCS-51 功能模块的编程与仿真

以主机向从机发送数据为例在编程前可先定义各从机通信地址设三个从机地址分别为 00H 01H 和 02H 主机和从机在初始化程序中将串行口工作方式设定为 11 位异步通信方式(方式 2 或方式 3 )且置位 SM2 允许接收和开放串行口中断

在主机和某一从机通信之前先向所有从机发出所选从机的地址接着发送数据或命令主机在发送地址时地址数据标识位 TB8 设置 1 以表示是地址信息各从机接收到主机发来的地址信息后则置位中断标志 RI 请求 CPU处理从机在中断服务子程序中判断主机送来的地址是否与本从机相符若为本地址则将 SM2 位清 0 准备与主机进行数据通信 而地址不符合的从机则保持 SM2 为 1 状态接着主机发送数据帧数据帧的第 9 位 TB8 为 0 各串行口同时收到了数据帧而只有已选中的从机( SM2=0 )才能产生中断并接收该数据其余从机因收到第九位数据 RB8 为 0且本机 SM2= 1 所以将数据丢掉这就实现了主机和从机的一对一通信

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 89: 第 4 章  MCS-51 功能模块的编程与仿真

例 47 设甲乙机以串行方式 1 进行数据传送 fosc=110592MHz 波特率为 1200bs 使用定时计数器 T1 作为数据传输率数据发生器 T1选工作方式 2 设 SMOD=0甲机发送片外 RAM 1000H- 101FH 单元的16 个数据 乙机接收后存在片外 RAM 1000H~101FH单元中

解串行方式 1波特率取决于 T1溢出率 ( 设 SMOD=0)

计算 T1 定时初值

HESMOD

80384

1f-256X osc

波特率

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 90: 第 4 章  MCS-51 功能模块的编程与仿真

① 汇编语言源程序甲机发送程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV TMOD 20H 置 T1 定时器工作方式 2 MOV SCON 40H 置串行方式 1 禁止接收 MOV PCON 00H 置 SMOD=0(SMOD 不能位操

作 ) MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1启动

MOV IE 90H 开放串行口中断 MOV R2 16 置发送数据长度 MOV DPTR 1000H 置发送数据区首地址

MOV A DPTR 读一个数据 MOV SBUF A 发送

LOP SJMP LOP 等待中断

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 91: 第 4 章  MCS-51 功能模块的编程与仿真

甲机中断子程序UART1 CLR EA 关中断 CLR TI 清除中断标志位 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 关串口中断 LJMP TEND 转向中断返回 NEXT INC DPTR MOV SBUF A 发送下一个数据TEND SETB EA 开中断 RETI END

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 92: 第 4 章  MCS-51 功能模块的编程与仿真

乙机接收程序 ORG 0000H LJMP START ORG 0023H LJMP UART1 ORG 0030HSTART MOV SCON 50H 置串行方式 1 允许接收 MOV PCON 00H 置 SMOD=0 MOV TMOD 20H 置 T1 定时器工作方式 2 MOV TL1 0E8H 置 T1 计数初值 MOV TH1 0E8H 置 T1 计数重装值 SETB TR1 T1 启动 MOV IE 90H 开放串行口中断 MOV R2 16 置接收数据长度 MOV DPTR 0100H 置接收数据区首地址LOP SJMP LOP 等待中断

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 93: 第 4 章  MCS-51 功能模块的编程与仿真

乙机中断子程序UART 1 CLR EA 关中断 CLR RI 清除中断标志位 MOV A SBUF 取接收到的数 MOV A DPTR 接收的数据存入缓冲区 DJNZ R2 NEXT 判断是否发送完毕 CLR ES 接收完毕关串口中

断 LJMP REND 转向中断返回NEXT INC DPTRREND SETB EA 开中断 RETI END

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 94: 第 4 章  MCS-51 功能模块的编程与仿真

②C 语言程序甲机发送程序include ldquoreg51hrdquo 包含 8051 单片机寄存器定义头文

件unsigned char xdata ADDR[16] 定义外部 RAM16 个单元unsigned char i=0 定义计数变量unsigned char p 定义指针变量甲机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否发送完毕ES=0 发送完毕 关串口中断 else 发送下一个数据 p++ SBUF=p EA=1 开中断

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 95: 第 4 章  MCS-51 功能模块的编程与仿真

主程序 void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x40 置串行方式 1 禁止接收PCON=0x00 置 SMOD=0(SMOD 不能位操作 )

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1 启动

IE=0x90 开放串行口中断p= ADDR 置发送数据区首地址

SBUF=p 发送一个数据 while(1) 等待中断

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 96: 第 4 章  MCS-51 功能模块的编程与仿真

乙机接收程序include ldquoreg51hrdquo unsigned char xdata ADDR[16] unsigned char i=0 unsigned char p

乙机中断子程序void uart1(void) interrupt 4 4 号位串行中断 EA=0 关中断 RI=0 清除中断标志位 if(++i==16) 判断是否接收完毕ES=0 接收完毕 关串口中断 else 接收一个数据 p = SBUF p++ EA=1 开中断

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 97: 第 4 章  MCS-51 功能模块的编程与仿真

主程序void main(void ) TMOD=0x20 置 T1 定时器工作方式 2SCON=0x50 置串行方式 1 允许接收PCON=0x00 置 SMOD=0

TL1=0xE8 置 T1 计数初值 TH1=0xE8 置 T1 计数重装值 TR1=1 T1启动

IE=0x90 开放串行口中断i=0 p= ADDR 置接收数据区首地址

while(1) 等待中断

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 98: 第 4 章  MCS-51 功能模块的编程与仿真

8 RS-232C标准接口总线 是美国电气工业协会推广的一种串行接口标准该标准的目的是定义数据终端设备 (DTE) 和数据终端设备( DTE )之间接口的电气特性

RS-232C 使用 25针ldquo Drdquo 型口连接器在微机通信中常常使用 9 根信号引脚所以常用 9针ldquo Drdquo 型口代替 25针连接器

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 99: 第 4 章  MCS-51 功能模块的编程与仿真

9 89C51 单片机的低功耗工作方式CMOS 51 系列单片机的节电工作方式(停机)有空闲方

式(等待待机)和掉电方式 这两种方式的内部控制电流如图所示

80C51

振荡器

时钟发生器

中断定时等

CPU

I DL

PD

XTAL1

XTAL2

图 438 空闲和掉电方式控制电路

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 100: 第 4 章  MCS-51 功能模块的编程与仿真

电源控制寄存器 PCON

PCON87H

D7 D6 D5 D4 D3 D2 D1 D0

SMOD - - - GF1 GF0 PD IDL

SMOD 串行口波特率加倍控制位 SMOD=1 波特率加倍GF1 和 GF0 通用标志位由用户置位或复位PD 掉电方式控制位置 1 后时钟冻结器件进入掉电方式IDL 空闲方式控制位置 1 后启动空闲方式 CPU因无时钟信号而停止运作

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 101: 第 4 章  MCS-51 功能模块的编程与仿真

(1)空闲方式 IDL=0 89C51 将进入空闲运作方式 ALE 和 PSEN 保持逻辑高电平 振荡器仍保持运行时钟脉冲仍可输入到中断串行口

定时器等部件使他们继续正常工作 CPU 因得不到时钟信号而停止工作 而 CPU 的现场保持不变进入空闲方式后有两种方法可以使系统退出该方式

① 中断源发出中断请求请求被响应由硬件将 PCON0 清0 于是空闲方式被中止GF1 和 GF0 可以用来指明中断是在正常状态还是在空闲状态下发生的

②硬件复位通过对复位引脚 RST 加复位信号而使 PCON0(IDL) 清 0 从而退出空闲状态

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变

Page 102: 第 4 章  MCS-51 功能模块的编程与仿真

(2)掉电方式 CPU 执行一条置位 PCON1 ( PD )的指令后

系统进入掉电方式 在这种方式下振荡器冻结 CPU 和所有的功能部

件都因没有振荡时钟而停止工作 内部 RAM区和特殊功能寄存器的内容保持不变 退出掉电方式的只有硬件复位的方法 复位后所有特殊功能寄存器的内容都被初始化但片内 RAM 单元中的数据却并不改变