第七章 I/O接口电路
7-1 单片机并行接口 PIO
7-2 定时 /计数器电路 CTC
7-3 可编程并行接口芯片
7-5 串行 I/O接口 SIO
7-1 单片机并行接口 PIO
PIO:并行 I/O接口用于微型机与外部设备之间并行传送数据。
7-1-1 MCS-51的并行接口
4个 8位双向并行 IO接口:
P0.0~ P0.7,P1.0~ P1.7,P2.0~ P2.7,P3.0~ P3.7。
均为多功能 I/O接口,CPU按当前操作自动进行功能切换。
片内 接口寄存器在 SFR中的映象地址:
1,I/O数据锁存器,P0,P1,P2,P3,SBUF
2,I/O控制 /状态寄存器:
IE,IP,TCON,TMOD,SCON,PCON
一,PIO接口内部结构输出锁存器、输出驱动器、输入缓冲器及多路功能切换电路。
1)输出操作:输出数据经过内部总线暂存到输出锁存器中,经过输出驱动器送到 I/O引脚上。输出锁存器的内容可读入修改。
2)输入操作,I/O引脚输入数据经过输入缓冲器送到内部总线上。
二,接口 的三种操作
1.输出锁存:输出将使数据写入输出锁存器 。
输出指令,MOV P1,A
MOV P1.0,C
2.输入三态:输入从 I/O引脚上输入信号,读信号打开,引脚信号通过下三态门进入内部总线 。 为保证可靠输入,先写入,1” 。
MOV P1,#0FFH ;使输出驱动器截止
MOV A,P1 ;输入
P0~ P3的复位状态均为 FFH,自动处于输入状态 。
3.读 -修改 -写,修改输出锁存器的内容 。 锁存器中的数据通过上三态门进入内部总线,修改后再写入到锁存器中 。
读 -修改 -写指令,PIO为目的操作数的指令 ANL P1,A
三,PIO的使用
1,P0口:并行双向接口或系统总线 DB0~ 7/AB0~ 7
2.P1口:称为用户 I/O接口。对片内 EPROM编程时,用作
EPROM低 8位地址信号线。
四,接口负载能力
P0驱动 8个 TTL电路,P1,P2,P3可驱动 4个 TTL电路
3,P2口:双向 I/O接口或高 8位地址总线 AB8~ 15
对读写片外存储器后,引脚仍恢复输出锁存器的内容。可用于读写片外数据存储器,MOV P2,#20H
MOV R0,#00
MOVX A,@R0
4,P3口:双向并行接口和第二功能:
串行接口引脚,TXD,RXD
中断输入引脚,INT0,INT1
定时器输入引脚,T0,T1
读写控制线,RD,WR
P1,P2和 P3为准双向口。
五,应用举例例,用 4个发光二极管对应显示 4个开关的开合状态。
如 P1.0合则 P1.4亮。
MCS-51
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
1.无条件传送方式:指示灯立即反映开关状态。
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN,ORL A,#0FH
MOV P1,A
MOV A,P1
SWAP A
MOV P1,A
SJMP MAIN
2.中断传送方式:
先设好开关状态,然后发出中断请求信号,改变指示灯亮灭状态。
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP IOINT
ORG 0100H
MAIN,SETB IT0
SETB EX0
SETB EA
HERE,SJMP HERE
ORG 0500H
IOINT,MOV A,#0FFH
MOV P1,A
MOV A,P1
SWAP A
MOV P1,A
RETI
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
INT0
MCS-51
K
+5V
7-2 定时 /计数器电路 CTC
一.定时 /计数器的应用
1.计数功能:
生产线上产品计数。每个产品通过得到一个脉冲信号,计数器记录脉冲个数,当计数值与设定值相等,启动包装机器。
检测转速。电机转动一圈发出一个脉冲,计数器记录一秒时间内脉冲个数,显示转速。
二,定时 /计数器的工作原理定时 /计数器中的核心部件为可预置初值计数器 。 预置初值后开始计数,直至计数值归 0或产生溢出,可申请中断 。
计数器有加 1 计数或减 1计数两种形式 。
K1 K2
可预置初值计数器 中断请求功能选择启动控制内部时钟脉冲
(定时)
外部输入脉冲
(计数)
溢出信号计数脉冲计数初值例:设 CTC中为 8位加 1计数器 。 按要求选择功能和初值 。
1.要求检测到 100个脉冲,发中断请求,通知 CPU。
选计数功能,计数初值为 156 。
2.要求定时每隔 100?s时间,发一次中断请求 。 设内部时钟周期 1?s
选定时功能,计数初值为 156 。
2.定时功能:用于实时控制,定时采样、定时启动等。当定时时间与设定值相等,执行规定操作。
7-2-1 MCS-51定时 /计数器
2个可独立控制的 16位定时器 /计数器,T0,T1
定时器初始化编程:
1.功能选择(定时 /计数)
2.位数选择( 8/13/16位)
3.启动方式选择(内部启动 /外部启动)
4.启动控制(启动 /停止)
5.恢复初值方式(自动重装 /软件重装)
一,定时器控制、状态寄存器
1.TMOD定时器方式寄存器( 89H)
1)功能选择位 C/T:
=0,定时功能,计数内部机器周期脉冲;
=1,计数功能,计数引脚 T0(T1)输入的负脉冲。
2)方式选择位 M1,M0,4种工作方式,13/16/8位
3)门控方式选择位 GATE,
=0,非门控方式 (内部启动 ):
TRx=1,启动定时器工作;
TRx=0,停止定时器工作。
=1,门控方式 (外部启动 ),TRx=1且引脚 INTx=1才启动。
确定定时器工作方式指令,MOV TMOD,#方式字例,设 T0用方式 2非门控定时,T1用方式 1门控计数。
MOV TMOD,#
G A T E C / T M1 M0 G A T E C / T M1 M0
T1 T0
M1 M0 方式 功能描述
0 0 0 13 位
0 1 1 16 位
1 0 2 8 位自动重装
1 1 3 T0 为两个 8 位
2.TCON定时器控制 /状态寄存器
1)启动控制位 TR0,TR1
=0,停止定时器工作
=1,启动定时器工作例:启动 T0,SETB TR0
2)溢出中断标志位 TF0,TF1
定时器溢出使 TFx=1,引起中断请求,CPU响应 Tx中断后,
自动清 0 TFx。
3.可预置初值的 16位加 1计数器 TH0,TL0,TH1,TL1
预置 T0初值指令,MOV TH0,#XH
MOV TL0,#XL
可用软件检测 TFx,必须软件清 0。
WAIT,JBC TF0,NEXT;检测 T0是否溢出
SJMP WAIT ;未溢出,继续检测
NEXT,… ;溢出,TF0清 0,处理溢出二,定时器工作方式由方式选择位 M1,M0设定
1.方式 0
13位定时 /计数器。 THx 8位和 TLx低 5位组成 13位加 1计数器计数外部脉冲个数,1~ 8192(213)
定时时间 (T=1?s),1?s ~ 8.19ms
2 方式 1
16位定时 计数器 。 THx8位和 TLx8位组成 16位加 1计数器计数外部脉冲个数,~ 65536(216)
定时时间,~ 65536× T= 65.54ms
3,方式 2
自动恢复初值 8位定时 /计数器。 TLx为 8位加 1计数器,
THx为 8位初值暂存器。
用于需要重复定时和计数的场合。
最大计数值,256 (28)
最大定时时间 (T=1?s),256?s
4.方式 3
T0分成 2个 8位定时器,TL0定时 /计数器和 TH0定时器
TL0占用 T0控制位,C/T,TR0,GATE;
TH0占用 T1控制位,TR1。
T1不能使用方式 3工作
5.计算时间常数 X(计算初值 )
计数功能,X= 2n -计数值 n,8/13/16
定时功能,X= 2n - t/T t:定时时间,T:机器周期三,MCS-51定时器的应用定时器初始化编程:使用定时器工作之前,先写入控制寄存器,确定好定时器工作方式初始化编程格式:
MOV TMOD,# 方式字;选择方式
MOV THx,#XH ;装入 Tx时间常数
MOV TLx,#XL
(SETB EA ) ;开 Tx中断
(SETB ETx )
SETB TRx ;启动 Tx定时器
1,按实际需要选择定时 /计数功能
2,按时间或计数长度选择方式
3,计算时间常数
4,溢出处理编程格式:
1)查询方式:先查询定时器溢出标志,再进行溢出处理。
… ;定时器初始化
WAIT,JBC TFx,PT ;检测溢出标志
SJMP WAIT
PT,MOV THx,#XH ;重装时间常数
MOV TLx,#XL
… ;溢出处理
SJMP WAIT
2) 中断方式:初始化后执行其他任务,中断服务程序处理溢出 。
ORG 0000H
LJMP MAIN
ORG 000BH(001BH); Tx中断入口
LJMP PTS
MAIN,… ;初始化后执行其他程序
PTS,… ;溢出中断服务程序
MOV THx,#XH ;重装时间常数
MOV TLx,#XL
RETI
四,应用举例例,由 P1.0输出方波信号,周期为 2ms,
设 fosc=12MHz。 2ms
解:每隔 1ms改变一次 P1.0的输出状态。用 T0非门控方式 1定时。
计算时间常数,X = 216 - t/T = 216 -1000/1 = FC18H
( 1)查询方式:
START,MOV TMOD,#
MOV TL0,#
MOV TH0,#
SETB TR0
LOOP,JBC TF0,PTF0
SJMP LOOP
PTF0,CPL P1.0
MOV TL0,#
MOV TH0,#
SJMP LOOP
( 2)中断方式
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP PT0INT
ORG 0100H
MAIN,MOV SP,#60H
MOV TMOD,#
MOV TL0,#
MOV TH0,#
SETB EA
SETB ET0
SETB TR0
HERE,SJMP HERE
PT0INT,CPL P1.0
MOV TL0,#
MOV TH0,#
RETI
例 P1.7驱动 LED亮 1秒灭 1秒地闪烁,设时钟频率为 6MHz。
长定时方法:增加一个软件计数器或一个硬件计数器。
硬件方式,T0定时,T1计数 T0的定时跳变信号 P1.0的负跳变次数,计满 5个跳变为 1秒。
START,MOV TMOD,#61H
MOV TL1,#0FBH
MOV TH1,#0FBH
CLR P1.0
SETB TR1
LOOP1,CPL P1.7
LOOP2,MOV TL0,#3CH
MOV TH0,#0B0H
SETB TR0
LOOP3,JBC TF0,LOOP4
SJMP LOOP3
LOOP4,CPL P1.0
JBC TF1,LOOP1
SJMP LOOP2
例 定时器外部引脚 T0(T1)用作外部中断信号输入端。
外部负脉冲引起中断请求,选计数方式,时间常数为 FFH。
例,门控方式测量正脉冲宽度解,INT1引脚输入被检测信号,记录在正脉冲的时间内包含机器脉冲个数 。
1) 设脉宽小于 65.5ms
等待查询 INT0,正脉冲过后,读出 TH1TL1。
START,MOV TMOD,#90H
MOV TL1,#0H
MOV TH1,#0H
WAIT1,JB P3.3,WAIT1
SETB TR1
WAIT2,JNB P3.3,WAIT2
WAIT3,JB P3.3,WAIT3
CLR TR1
MOV R2,TL1
MOV R3,TH1

TR1=1 T1启动 TR1=0
T1停止
INT1
2) 设脉宽大于 65.5ms,中断方式记录 TH1TL1溢出中断次数。
SETB TR1
SETB ET1 ;开 T1中断
SETB EA
WAIT2,JNB P3.3,WAIT2;等待正脉冲到来
WAIT3,JB P3.3,WAIT3;等待正脉冲结束
CLR TR1 ;关闭 T1
MOV IE,#00 ;关闭中断
MOV R2,TL1 ;读出 T1
MOV R3,TH1
LCALL PPS ;计算脉宽
HERE,SJMP HERE ;其他任务
PRIC,INC R4 ;记录溢出次数
RETI
PPS,… ;计算脉宽子程序计算脉宽的子程序的计算式如下:
脉宽 t = ( R4 × 216 + R3 R2 ) × T ( T为机器周期)
7-3 可编程并行接口芯片 8255
用于扩展单片机并行 I/O接口。
7-3-1 结构与引脚一,结构
1.数据线
D0~ 7:传送计算机与 8255之间的数据,控制字和状态字 。
PA0~ 7 PB 0~ 7 PC0~ 7:传送 8255与外设之间的数据和联络信息,
PC0~ 7可用作数据线或联络线
1.3个 8位并行 I/O接口 PA,PB和 PC
包含 I/O数据锁存器,控制寄存器和状态寄存器。
2.2组控制 A组,PA和 PC0~ 3,B组,PB和 PC4~ 7
3.3种工作方式:
基本 I/O:输出锁存,输入三态,不用联络信号。
应答式 I/O:输入 /输出均锁存,C口用于传送联络信号,读 C口可了解外设当前状态。
应答双向式,A口为双向 I/O,C口用作 A口双向传送的联络信号线二,引脚
P0
P2.7
8051
A0
A1
CS
8255
373
2.地址线
CS:片选线
A1,A0:口选线,寻址 PA,PB,PC数据口和控制口。
例 求 8255口地址:
解,A口 (7F00H),
B口 (7F01H),
C口 (7F02H),
控制口 (7F03H)
(三 )读写控制线
RD,WR控制计算机与 8255之间的信息传送和流向
(四 )复位线
RESET高电平复位,使内部寄存器全部清零 。
7-3-2 8255编程规定
8255初始化编程:往控制口写入控制字,确定 8255工作方式。
方式选择控制字,D7=1
C口置位 /复位控制字,D7=0
控制字 D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0
方式 1 A 组方式 PA PC 4 ~ 7 方式 PB PC 0 ~ 3
置 / 复位 0 位选择 1 / 0
例,8255PA口方式 0输出单片机片内 RAM数据,PB口方式 1输入 … 。
PIOS,MOV DPTR,#7F03H;控制口地址
MOV A,#86 ;写控制字
MOVX @DPTR,A ;设工作方式
MOV DPTR,#7F00H; PA数据口地址
MOV A,@R0 ;取 RAM的数据
MOVX @DPTR,A ;由 PA口输出

7-4 可编程多功能接口芯片 8155
256字节 RAM,3个并行口 PA0~ 7,PB0~ 7,PC0~ 5,1个 14位定时器。
7-4-1 结构和引脚一,引脚功能
1.数据线
AD0~ 7:传送 8155与计算机之间的数据,控制字,状态字。
PA0~ 7,PB0~ 7,PC0~ 5,传送 8155与外设之间的信息。
2.地址线
CE:
IO/M,选择口 /RAM单元
AD0~ 7,6个 I/O口和 256字节 RAM地址。
3.控制线
ALE:地址锁存
RD,WR:读写控制
4.定时器输入 /输出线,TIMERIN,TIMEROUT
5.复位线 RESET
P0.0~ 0.7
P2.6
P2.7
ALE
8051
AD0~ 7
IO/M
CS
ALE
8155
7-5 串行 I/O接口 SIO
一,串行通讯的基本方式
(一 ).异步通讯以字符为传送单位用起始位和停止位标识每个字符的开始和结束字符间隔不固定,只需字符传送时同步。
异步通讯常用格式:一个字符帧异步通讯的双方需要两项约定:
1.字符格式一帧字符位数的规定:数据位,校验位,起始位和停止位。
2.波特率 (位 /秒 )对传送速率的规定例:要求每秒传送 120个字符,每帧为 10位。
解,B=120× 10=1200波特 每位 0.83ms
数据位传输率 =120× 8=960位 /秒
(二 ).同步通讯以一串字符为一个传送单位,字符间不加标识位,在一串字符开始用同步字符标识,硬件要求高,通讯双方须严格同步。
D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位二,串行接口功能
1.发送器:并?串数据格式转换,添加标识位和校验位,一帧发送结束,设置结束标志,申请中断。
2.接收器:串?并数据格式转换,检查错误,去掉标识位,保存有效数据,设置接收结束标志,申请中断。
3.控制器:接收编程命令和控制参数,设置工作方式:
同步 /异步、字符格式、波特率、校验方式、数据位与同步时钟比例等。
三,串行数据传送方向单工通讯:数据单向传送 。
半双工通讯:数据可分时双向传送。
全双工通讯:可同时进行发送和接收。
发送器 接收器发送器接收器
7-5-1 MCS-51串行接口
1个全双工串行接口,可同时进行发送和接收。
串行接口输入 /输出引脚,TXD(P3.1),RXD(P3.0)
数据格式 (P.237图 ):按不同方式,一帧位数
8/10/11发送 /接收时,数据皆低位在前。
一帧字符发送 /接收结束,置位标志位 (TI/RI)并申请 SIO中断。
中断控制:中断允许位 ES
中断入口,0023H
D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位
D0 D1 D2 D3 D4 D5 D6 D7
D0 D1 D2 D3 D4 D5 D6 D8 停止位起始位 D7
一,串行接口控制
1.数据缓冲器 SBUF
发送 SBUF和接收 SBUF共用一个地址 99H。
1)发送 SBUF存放待发送的 8位数据,写入 SBUF将同时启动发送。
发送指令,MOV SBUF,A
2)接收 SBUF存放已接收成功的 8位数据,供 CPU读取。
读取串行口接收数据指令:
MOV A,SBUF
S M 0 S M 1 S M 2 R E N TB8 R B 8 TI RI
2.串行口控制 /状态寄存器 SCON(98H)
SM0,SM1:选择串行口 4种工作方式。
SM2:多机控制位,用于多机通讯。
REN:允许接收控制位,REN=1,允许接收; REN=0,禁止接收。
TB8发送的第 9位数据位,可用作校验位和地址 /数据标识位
RB8:接收的第 9位数据位或停止位
TI:发送中断标志,发送一帧结束,TI=1,必须软件清零
RI:接收中断标志,接收一帧结束,RI=1,必须软件清零
3.节电控制寄存器 PCON
SMOD(PCON.7):波特率加倍控制位 。
SMOD=1,波特率加倍,SMOD=0,则不加倍 。
二,串行接口的工作方式
SM0,SM1选择四种工作方式 。
(1) 方式 0:同步移位寄存器方式。用于扩展并行 I/O接口。
1.一帧 8位,无起始位和停止位。
2.RXD:数据输入 /输出端。
TXD:同步脉冲输出端,每个脉冲对应一个数据位。
3.波特率 B = fosc/12
如,fosc=12MHz,B=1MHz,每位数据占 1?s。
4.发送过程:写入 SBUF,启动发送,一帧发送结束,TI=1。
接收过程,REN=1且 RI=0,启动接收,一帧接收完毕,RI=1。
发送时序写入
SBUF
RXD输出
TXD
TI
D0 D1 D2 D3 D4 D5 D6 D7
写 REN=1
RI=0
RXD输入
RI
接收时序
(a)
(b)
(2) 方式 1
8位数据异步通讯方式。
1.一帧 10位,8位数据位,1个起始位 (0),1个停止位 (1)。
2.RXD:接收数据端。 TXD:发送数据端。
3.波特率,用 T1作为波特率发生器,B=(2SMOD/32)× T1溢出率。
4.发送:写入 SBUF,同时启动发送,一帧发送结束,TI=1。
接收,REN=1,允许接收。接收完一帧,若 RI=0且停止位为 1
(或 SM2=0),将接收数据装入 SBUF,停止位装入 RB8,并使 RI=1;否则丢弃接收数据,不置位 RI。
当 REN=1,CPU开始采样 RXD引脚负跳变信号,若出现负跳变,才进入数据接收状态,先检测起始位,若第一位为 0,继续接收其余位;否则,停止接收,重新采样负跳变。
数据采样速率为波特率 16倍频,在数据位中间,用第 7,8,9个脉冲采样 3次数据位,并 3中取 2保留采样值。
写入
SBUF
采样
( a) 发送时序图
TXD
数据输出
TI
D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位
RXD
输入数据
( b) 接收时序图
D0 D1 D2 D3 D4 D5 D6 D7 停止位起始位
RI
检测负跳变
(3) 方式 2和方式 3
9位数据异步通讯方式。
1.一帧为 11位,9位数据位,1个起始位 (0),1个停止位 (1)。
第 9位数据位在 TB8/RB8中,常用作校验位和多机通讯标识位。
2.RXD:接收数据端,TXD:发送数据端。
3.波特率,方式 2,B=(2SMOD/64)× fosc 。
方式 3,B=(2SMOD/32)× T1溢出率 。
4.发送:先装入 TB8,写入 SBUF并启动发送,发送结束,TI=1。
接收,REN=1,允许接收。接收完一帧,若 RI=0且第 9位为 1
(或 SM2=0),将接收数据装入接收 SBUF,第 9位装入 RB8,使 RI=1;
否则丢弃接收数据,不置位 RI。
发送时序写入
SBUF
TXD输出
TI
RXD输入接收时序RI
D0 D1 D2 D3 D4 D5 D6 TB8 停止位起始位 D7
D0 D1 D2 D3 D4 D5 D6 RB8 停止位起始位 D7
检测负跳变
( 4) 计算波特率方式 0为固定波特率,B=fosc/12
方式 2可选两种波特率,B=(2SMOD /64)× fosc
方式 1,3为可变波特率,用 T1作波特率发生器。
B=(2SMOD/32)× T1溢出率
T1为方式 2的时间常数,X = 28 - t/T
溢出时间,t= (28 -X)T = (28 -X)× 12/ fosc
T1溢出率 =1/t= fosc /[12× (2n -X)]
波特率 B=(2SMOD /32)× fosc/[12× (28-X)]
串行口方式 1,3,根据波特率选择 T1工作方式,计算时间常数。
T1选方式 2,TH1=X= 28-fosc/12× 2SMOD/(32× B)
T1选方式 1用于低波特率,需考虑 T1重装时间常数时间。
7-5-2 串行口的应用串行口初始化编程格式:
SIO,MOV SCON,#控制状态字;写方式字且 TI=RI=0
(MOV PCON,#80H) ;波特率加倍
( MOV TMOD,#20H ) ; T1作波特率发生器
( MOV TH1,#X ) ;选定波特率
( MOV TL1,#X )
( SETB TR1)
( SETB EA) ;开串行口中断
( SETB ES)
发送程序:先发送一个字符,等待 TI=1后再发送下一个字符。
1.查询方式,
TRAM,MOV A,@R0 ;取数据
MOV SBUF,A ;发送一个字符
WAIT,JBC TI,NEXT ;等待发送结束
SJMP WAIT
NEXT,INC R0 ;准备下一次发送
SJMP TRAM
2.中断方式,
ORG 0023H ;串行口中断入口
AJMP SINT
MAIN,… ;初始化编程
TRAM,MOV A,@R0 ;取数据
MOV SBUF,A ;发送第一个字符
H,SJMP H ;其它工作
SINT,CLR TI ;中断服务程序
INC R0
MOV A,@R0 ;取数据
MOV SBUF,A ;发送下一个字符
RETI
接收程序,REN=1,RI=0等待接收,当 RI=1,从 SBUF读取数据。
1.查询方式,
WAIT,JBC RI,NEXT ;查询等待
SJMP WAIT
NEXT,MOV A,SBUF ;读取接收数据
MOV @R0,A ;保存数据
INC R0 ;准备下一次接收
SJMP WAIT
2.中断方式,
ORG 0023H
AJMP RINT
MAIN,… ;初始化编程
H,SJMP H ;其它任务
RINT,CLR RI ;清中断标志
MOV A,SBUF ;读取接收数据
MOV @R0,A ;保存数据
INC R0
RETI
(一) 串行口 方式 0 用于扩展单片机的并行 I/O接口。
串行口实现:并行 → 串行的数据转换
74LS165/74LS164实现:串行 → 并行的数据转换。
(二 )异步通讯程序举例
1.发送程序,将片内 RAM 50H起始单元的 16个数由串行口发送 。 要求发送波特率为系统时钟的 32分频,并进行奇偶校验 。
MAINT,MOV SCON,#80H;串行口初始化
MOV PCON,#80H;波特率
SETB EA
SETB ES ;开串行口中断
MOV R0,#50H ;设数据指针
MOV R7,#10H ;数据长度
LOOP,MOV A,@R0 ;取一个字符
MOV C,P ;加奇偶校验
MOV TB8,C
MOV SBUF,A ;启动一次发送
HERE,SJMP HERE ; CPU执行其它任务
S M 0 S M 1 S M 2 R E N TB8 R B 8 TI RI
ORG 0023H ;串行口中断入口
AJMP TRANI
TRANI,PUSH A ;保护现场
PUSH PSW
CLR TI ;清发送结束标志
DJNZ R7,NEXT ;是否发送完?
CLR ES ;发送完,关闭串行口中断
SJMP TEND
NEXT,INC R0 ;未发送完,修改指针
MOV A,@R0 ;取下一个字符
MOV C,P ;加奇偶校验
MOV TB8,C
MOV SBUF,A ;发送一个字符
POP PSW ;恢复现场
POP A
TEND,RETI ;中断返回
2,接收程序,串行输入 16个字符,存入片内 RAM的 50H起始单元,
串行口波特率为 2400(设晶振为 11.0592MHz),。
RECS,MOV SCON,#50H ;串行口方式 1允许接收
MOV TMOD,#20H ; T1方式 2定时
MOV TL1,#0F4H ;写入 T1时间常数
MOV TH1,#0F4H
SETB TR1 ;启动 T1
MOV R0,#50H ;设数据指针
MOV R7,#10H ;接收数据长度
WAIT,JBC RI,NEXT ;等待串行口接收
SJMP WAIT
NEXT,MOV A,SBUF ;读取接收字符
MOV @R0,A ;保存一个字符
INC R0 ;修改指针
DJNZ R7,WAIT ;全部字符接收完?
RET
S M 0 S M 1 S M 2 R E N TB8 R B 8 TI RI
3,接收程序,串行输入 16个字符,进行奇偶校验。
RECS,MOV SCON,#0D0H ;串行口方式 3允许接收
MOV TMOD,#20H ; T1方式 2定时
MOV TL1,#0F4H ;写入 T1时间常数
MOV TH1,#0F4H
SETB TR1 ;启动 T1
MOV R0,#50H ;设数据指针
MOV R7,#10H ;接收数据长度
WAIT,JBC RI,NEXT ;等待串行口接收
SJMP WAIT
NEXT,MOV A,SBUF ;取一个接收字符
JNB P,COMP ;奇偶校验
JNB RB8,ERR ; P≠RB8,数据出错
SJMP RIGHT ; P=RB8,数据正确
COMP,JB RB8,ERR
RIGHT,MOV @R0,A ;保存一个字符
INC R0 ;修改指针
DJNZ R7,WAIT ;全部字符接收完?
CLR F0 ; F0 =0,接收数据全部正确 RETERR,SETB F0 ; F0 =1,接收数据出错
RET