3、初始化程序的设计
在51汇编集成开发环境下,初始化程序的设计可以借助于其中的辅助工具很方便地完成。从[辅助工具]-[初始化设置]-[波特率设置]我们可以打开这个辅助工具(见图3)。
你只要设置好晶振频率;选择工作方式1或工作方式夏设定好所需的波特率,就自动地选择好了定时器l的工作方式,计算出了初值,并给出了参考的初始化程序。你只要将这个参考程序复制到你的应用程序中就可以了。
我们假定单片机系统的晶振频率为6MHz,选择串行口的工作方式为方式1(8位UART,由定时器1作为波特率发生器),数据传输的波特率为600,此时我们得到定时器l应工作在方式2,TH1年HL1的初值均为1AH,参考程序为:
UART初始化:MOV SCON,#50H;选择串行口的工作方式为方式1
MOV PCON,#0OH; 选择SMOD=0MOV
TMOD,#20H;定时器1设置为方式2,软件启动
MOV TH1,#E6H;设置TH1-的初值为E6H
MOV TL1,#E6H;设置TL1的初值为E6H
CLR ET1;关闭定时器1中断,作为波特率发生器用;
CLR ES;若采用查询方式通讯,需关闭串行口中断;
SET.B ES;若采用中断方式通讯,需打开串行口中断
SETB TR1;启动定时器1
由于51汇编集成开发环境可以识别中文,将标号用中文来表示,使程序的可读性更强。
4、查询方式下串行通信程序的设计
若采用查询方式进行串行通讯,在初始化程序中需关闭串行口中断。
(1)发送数据的程序设计
采用查询方式发送数据之前,必须查询标志位TI的状态,当TI=0时,表明串行口未准备好,不可以发送数据;当TI=1时,表明串行口已准备好,可以发送数据。在发送数据前,必须将TI复位。基本流程见图4。
下例程序是采用查询方式发送一个数据块的子程序,其入口条件是:待发送数据的起始地址在DPTR中,发送数据的字节数在R6R7中,数据采用偶校验。
发送入口:CLR C
发送:MOVX A,@DPTR;读取待发送的数据
MOV C,P
MOV.TB8,C;偶校验位传入 TB8SD2:
JBC TI,SD3;查询TI,等待串行口准备好
AJMP SD2
MOV SBUF,A;发送数据
SD3:CJNE R6,#0,修改发送指针
CJNE R7,#O,修改发送指针
RET;数据块发送完,退出发送子程序修改发送指针:
CLR CMOV A.R7SUBB A,#1
MOV R7.AMOV A,R6
SUBB A,#O
MOV R6,A
SD4:INC DPTR
AJMP 发送
(2)接收数据的程序设计
串行口在可靠接收一个字节的数据后,会自动将SCON中的RI置“1”,查询程序就是查询RI中的内容,在RI=1时,将接收到的数据(SBUF中的内容)保存到指定的地址。在接收一个数据块时,其数据块的字节数一般有两种方式确定,一种是事先约定好的固定字节数,另一种是在数据块的开始处用两个字节来指明字节数。
下例程序是采用查询方式接收一个数据块的子程序,其入口条件是接收数据存放的起始地址在DPTR中,接收数据的字节数事先约定好存放在R6R7中,数据采用偶校验。
接收入口:CLR C
查询:JBC RI,接收;查询RI,等待接收的数据到达AJMP
查询接收:MOV A,SBUF偶校验:
MOV C,RB8ANL C.PSW.O
JC保存
MOV C,RB8ORL C,PSW.O
JNC 保存
LJMP ERR2;转出错处理
保存:MOVX @DPTR,AINC DPTRDJNZ R7,查询
DJNZ R6,查询
RE7
ERR2:……;出错处理
5、中断方式下串行通信程序的设计
采用中断方式进行串行通信,应在初始化程序中打开串行口中断。若串行口已准备好,可以发送数据时,TI=1,就引发中断,若串行口可靠接收了一个字节的数据后,RI=1,也引发中断。数据的接收与发送是在中断的服务过程中完成的。
由于RI与TI共用一个中断入口,所以在进入中断服务时必须查询RI或TI,以确定发送数据还是接收数据,此外,由于RI与TI不能自动清除,所以在中断服务程序中还必须清除RI或TI标志。
下例是发送与接收数据的中断服务程序。设待发送数据在R0所指向的单元中,接收的数据存放在R1所指向的单元中,发送与接收的数据均采用偶校验。
串行中断入口:JBC RI,接收;若为RI中断,转接收数据,同时清除RI
发送:CLR TI;TI中断,清除TI,准备发送数据
MOV A,@R0;读取待发送的数据
MOV C,P
MOV TB8,C
偶校验位传入TB8
MOV SBUF,A;
RETI
接收:MOV A,SBUF
偶校验:MOV C,RB8
ANL C,PSW.0
JC保存
MOV C,RB8
ORL C,PSW.0
JNC 保存