方式0是外接串行移位寄存器方式。工作时,数据从rxd串行地输入/输出,txd输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,txd每机器周期输出一个同位脉冲时,rxd接收或发送一位数据)。每当发送或接收完一个字节,硬件置ti=1或ri=1,申请中断,但必须用软件清除中断标志。
实际应用在串行i/o口与并行i/o口之间的转换。
方式1
方式1是点对点的通信方式。8位异步串行通信口,txd为发送端,rxd为接收端。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由t1或t2的溢出率确定。
在发送或接收到一帧数据后,硬件置ti=1或ri=1,向cpu申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。
(1)发送:cpu执行一条写sbuf指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/send和data无效,发送停止位,一帧结束,置ti=1。
(2)接收:ren=1后,允许接收。接收器以所选波特率的16倍速率采样rxd端电平,当检测到一个负跳变时,启动接收器,同时把1ffh写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样rxd,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。此后:
a、若ri=0、sm2=0,则8位数据装入sbuf,停止位入rb8,置ri=1。
b、 若ri=0、sm2=1,则只有停止位为1时,才有上述结果。
c、若ri=0、sm2=1,且停止位为0,则所接数据丢失。
d、若ri=1,则所接收数据丢失。
无论出现那种情况,检测器都重新检测rxd的负跳变,以便接收下一帧。
方式2、方式3
方式2和方式3是9位异步串行通信,一般用在多机通信系统中或奇偶校验的通信过程。在通讯中,tb8和rb8位作为数据的第9位,位sm2也起作用。方式2与方式3的区别只是波特率的设置方式不同。
(1)发送
向sbuf写入一个数据就启动串口发送,同时将tb8写入输出移位寄存器第9位。开始时,send和data都是低电平,把起始位输出到txd。data为高,第一次移位时,将‘1’移入输出移位寄存器的第9位,以后每次移位,左边移入‘0’,当tb8移到输出位时,其左边是一个‘1’和全‘0’。检测到此条件,再进行最后一次移位,/send=1,data=0,输出停止位,置ti=1。
(2)接收
置ren=1,与方式1类似,接收器以波特率的16倍速率采样rxd端。
起始位0移到输入寄存器的最左边时,进行最后一次移位。在ri=0,sm2=0或接收到的第9位=1时,收到的一字节数据装入sbuf,第9位进入rb8,置ri=1;然后又开始检测rxd端负跳变。
多机通信
在这里,多机系统是指‘一主多从’。51系列单片机中,利用第9位tb8/rb8来区分地址与数据信息,用位sm2确定接收方是否对地址或数据帧敏感。其原则是:
1)发送方用第9位tb8=1标志地址帧,tb8=0标志数据帧。
2)接收方若设置sm2=1,则只能接收到地址信息,若设sm2=0,则不管是地址还是数据帧,都能接收到。
利用方式2、3的特点,在点对点的通讯中,在发送方可以用第9位tb8作为奇偶校验位。在接收方,sm2位必须清0。
波特率
1)方式0的波特率=fosc/12
2)方式2的波特率=2^smod*fosc/64
3)方式1、3的波特率由t1或t2的溢出率和smod位确定:
(1)用t1:波特率=2^smod*t1定时器的溢出率/32,t1为方式2t1定时器溢出率=1/((12/fosc)*(256-x))例:已知fosc=6mhz,smod=0,设置波特率为2400,求t1的计数初值x。
波特率=1/((12/fosc)*(256-x))/32=fosc/12*32(256-x)(256-x)=fosc/2400/384=6m/2400/384;256-x~=6.5104x~=250=fah 只能近似计算。
若fosc=11.0592mhz, 则256-x=11.0592m/2400/384=4068/384=12 x=f4h;可精确算出,对其它常用的标准波特率也是能正确算出。所以这个晶振频率是最常用的。
如果smod=1,则同样的x初值得出的波特率加倍。
(3)用t2:
在52型单片机中,串口方式1、3的波特率发生器选择由tclk、rclk位确定是t1还是t2。若tclk=1,则发送器波特率来自t2,否则来自t1。若rclk=1,则接收器波特率来自t2,否则来自t1。
由t2产生的波特率与smod无关。t2定时的最小单元=2/fosc。t2的溢出脉冲16分频后作为串口的发送或接收脉冲。
波特率=(1/((2/fosc)(65536-x)))/16=fosc/(32(65536-x))例:已知fosc=11.0592mhz,求波特率=2400时的x2400=11059200/(32(65536-x)) 65536-x=144 x=65392=ff70h计数器初值寄存器:rcap2h=0ffh,rcap2l=70h。