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点,