1.单片机串行通信的概述
在通信领域内,有两种数据通信方式:和串行通信。随着计算机网络化和微机分级分布式应用系统的发展,通信的功能越来越重要。通信是指计算机与外界的信息传输,既包括计算机与计算机之间的传输,也包括计算机与外部设备,如终端、打印机和磁盘等设备之间的传输。
串行通信是指使用一条数据线,将数据一位一位地依次传输每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。 使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。在串行通信中,把通信接口只能发送或接收的单向传送办法叫单工传送;而把数据在甲乙两机之间的双向传递,称之为双工传送。在双工传送方式中又分为半双工传送和全双工传送。半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收信息。
8位、10位或11位,并能设置各种波特率,给使用带来很大的灵活性。
51系列单片机有两个物理上独立的接收、发送缓冲器SBUF,它们只占用同一地址99H,可同时发送、接送数据。发送缓冲器只能 写入,不能读出,接收缓冲器只能读出、不能写入。
串行发送接收的速率与波特率发生器产生的移位脉冲同频。51系列单片机用定时器T1或直接用CPU时钟作为通信波特率发生器的输入,在串行接口的不同工作方式中,波特率发生器从两个输入信号中选择一个分频,产生移位脉冲来同步串口的接收和发送,移位脉冲的速率即是波特率。
接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二字节即开始被接收 。但是,若在第二个字节接收完毕后,前一个字节还未被CPU读取的话 ,第二个字就会覆盖第一个字节,造成第一个字节的丢失。接收器是双缓冲结构,串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读或写的。
8051串行口可设置四种工作方式,可有8位,10位和11位帧格式。方式0以8位数据为一帧,不设起始位和停止位,先发送最低位。方式1以10位为一帧传输,设有1个起始位“0”,8个数据位和1一个停止位“1”。方式2和3以11位为1帧传输,设有1个起始“0”,8个数据位,1个附加第九位和1个停止们“1”,附加第九位由软件置1或清0。发送时在TB8中,接收时送入RB8中。
2.串行通信程序设计
2.1程序设计流程图
(a)中断方式发送程序
(b)中断方式接收程序
图2.1串行通信中断方式流程图
2.2自发自收程序
ORG 0000H
MOV TMOD,#20H
MOV TH1,#0CCH
MOV TL1,#0CCH ;设定波特率
SETB TR1
MOV SCON,#50H
ABC : CLR TI
MOV P1,#0FEH ;LED灭
ACALL DAY ;延时
MOV A,#0FFH
MOV SBUF,A ;发送数据FFH
JNB RI, $ ;RI≠1等待
CLR RI
MOV A,SBUF ;接收数据,A=FFH
MOV P1,A ;灯亮
JNB TI, $ ;TI≠1等待
ACALL DAY ;延时
SJMP ABC
DAY: MOV R0,#0
DAL: MOV R1,#0
DJNZ R1, $
DJNZ R0,DAL
RET
END
2.3发送程序及分析
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP SUB1
MAIN:MOV SCON,#50H
MOV TMOD,#20H
MOV TL1,#0FDH
MOV TH1,#0FDH
MOV IE,#90H
SETB TR1
INI: MOV SBUF,#55H
MOV R1,#0FFH
LOOP:NOP
DJNZ R1,LOOP
JNB F0,INI
MOV R0,#21H
MOV SBUF,20H
SUB1:JNB RI,LAB0
MOV A,SBUF
CJNE A,#55H,LAB1
SETB F0
CLR RI
LAB1:RETI
LAB0:MOV SBUF,@R0
INC R0
CJNE R0,#24H,LAB2
CLR ES
LAB2:CLR TI
RETI
END
主程序中指令MOV SCON,#50H的意义是将数据50H送入特殊功能寄存器SCON中,即设置串口工作于方式1,不允许多机通信,允许接收/发送数据第9位和接收数据第9位在方式1中未用,可以为任意值,在这里我们让它为0,串口发送/接收无中断请求。
指令MOV TMOD,#20H的意义为将数据20H送入特殊功能寄存器TMOD中,即定时器1的启动与引脚INT1无关,定时记数器1当定时器用,工作于方式2由于定时器0在这个例子中未用,所以可以任意设置 。
指令MOV TL1,#OFDH的意义是给定时器1的低8位赋初值指令MOV TH1,#OFDDH的意义是给定时器1的高8位赋初值 ,因为定时器1工作方式2,即自动重装方式,所以定时器的高低8位都赋相同的初值,这个初值由串口工作方式1的波特率计算公式确定指令MOV IE,#90H的意义为打开中断允许总开关和串口中断允许指令SETB TR1的意义为启动定时器1,使波特率发生器开始产生移位脉冲和采样脉冲指令MOV SBUF,#55H的意义为将数据55H送入发送缓冲器SBUF中并通知串口发送指令MOV R1,#OFFH的意义是将数据OFFH送入工作寄存器R1中,这条指令的意图是为下面这段循环程序设置循环次数指令NOP什么事都不做,只占用CPU的 时间指令DJNZ R1,LOOP的意义为先将R1中的值减1,再判断R1中的值,如果不为0,则跳转到标号为LOOP的地方,发果为0,则顺序运行下一条指令,显然这四条指令就构成一段延时程序,这段延时程序的延时时间应大于单片机1的串口中断服务程序的处理时间与单片机2的中断服务程序处理时间之和指令JNB F0,INI的意义是如果程序状态字PSW中的F0位为0则表明接收端未准备好,所以程序跳转到标事情为INI的地方去再次发送询问信号,如果F0为1则表明接收端已准备好,所以程序往下运行指令MOV R0,#21H的意义为给R0赋初值21H,R0当间址寄存器用,其内容为下次将要发送数据的地址指令MOV SBUF,20H的意义为将内部数据存储器20H中的数据送入发送缓冲器SBUF并启动串口发送装置指令LJMP 的意义为跳转到本指令,即主程序运行到这里就进入了死循环JNB RI,LABO的意义为如果本次串口
单片机串行通信.doc
下载此电子书资料需要扣除0点,





