1.功能
mcs-5l单片机中的异步通信串行口能方便地与其他计算机或串行传送信息的外围设备(如串行打印机、crt终端等)实现双机、多机通信。
串行口有四种工作方式,如表所示:
sm0
sm1
工作方式
功能
波特率
0
0
方式0
移位寄存器方式,用于并行i/o扩展
fosc/12
0
1
方式1
8 位通用异步接收器/发送器
可变
1
0
方式2
9 位通用异步接收器/发送器
fosc/1 或 fosc/24
1
1
方式3
9 位通用异步接收器/发送器
可变
2.结构
由发送数据缓冲器、发送控制器、输出控制门、接收数据缓冲器、接收控制器、输入移位寄存器等组成。发送数据缓冲器只能写入,不能读出,接收数据缓冲器只能读出,不能写入,二者共用一个符号 — 特殊功能寄存器 sbuf,共用一个地址 — 99h。串行口中还有两个特殊功能寄存器scon、pcon,分别用来控制串行口的工作方式和波特率。波特率发生器由定时器/计数器1构成。
3.串行口控制寄存器scon
串行口控制寄存器scon的格式如下:
(l)工作方式选择位smo、sm1:smo、sm1由软件置 “1” 或清 “0” ,用于选择串行口的 4种工作方式。
(2)多机通信控制位sm2:sm2=“1” 时,接收到一帧信息,如果接收到的第 9位数据为1,硬件将ri置“1” ,申请中断;如果第九位数据为“0” ,则 ri不置“1” ,且所接收的数据无效。
sm2=“0” 时,只要接收到一帧信息,不管第九位数据是0还是1,硬件都置ri =“1”,并申请中断。ri由软件清“0”,sm2由软件置“1”或清“0”。
多机通信时,各从机先将sm2置“l”。接收并识别主机发来的地址,当地址与本机相同时,将 sm2清“0”,与主机进行数据传递。各机所发送的数据第 9位必须为“0”。
(3)允许接收控制位ren:ren=“1” 时允许并启动接收,ren =“0”时禁止接收。ren由软件置“1”或清“0”。
(4)发送数据d8位tb8:tb8是方式2、方式3中要发送的第九位数据,事先用软件写入1或0。方式0、方式1不用。
(5)接收数据d8位rb8:方式2、方式3中,由硬件将接收到的第九位数据存入rb8。方式1中,停止位存入rb8。
(6)发送中断标志位ti:发送完一帧信息,由硬件使ti置“1”, ti必须由软件清“0”。
(7)接收中断标志位ri:接收完一帧有效信息,由硬件使ri置“1”, ri必须由软件清“0” 。
4.串行口数据寄存器 sbuf
串行口数据寄存器sbuf由串行输出移位寄存器和两级缓冲的串行输入寄存器组成。当数据写入sbuf时启动串行数据发送,连同此前置入的tb8,按设定波特率串行输出。串行数据移入串行输入寄存器完成后,自动将数据并行送入接收sbuf,并置“1”通知 cpu读取数据,cpu应该在下一个串行数据接收完成之前读出。
5.串行口的工作方式
(1)方式0:同步移位寄存器方式
波特率固定为fosc/12
rxd —— 接收发送数据
txd —— 产生同步移位脉冲
接收/发送完,置位ri/ti ,(要求sm2 = 0)
(2)方式1:8位uart
波特率为(2 smod×t1的溢出率)/32 ,可变。
一帧信息10位。
接收到有效数据完毕,置位ri的条件:
ren = 1,ri = 0 且sm2 = 0或接收到第9位数据为1,此时,数据装载sbuf,ri置1,第9位数据(tb8) rb8。
6.多机通信
多机通信系统有1个主机与多个从机,从机数最多256个,地址编为00h至0ffh。距离近,可直接以ttl电平通信,距离远可转换rs485标准进行通信。为了区分是数据信息还是地址信息,主机用第9位数据tb8作为地址/数据的识别位,地址帧的tb8 =“1” ,数据帧的 tb8 =“0”。各从机的 sm2必须置“1”。在主机与某一从机通信前,先将该从机的地址发送给各从机。由于各从机sm2=“1”,接收到的地址帧 rb8=“1”,所以各从机的接收信息都有效,送入各自的接收缓冲器,并置ri=“1” 。各从机 cpu响应中断后,通过软件判断主机送来的是不是本从机地址,如是本从机地址,就使sm2=“0”,否则保持 sm2 =“l”。
7.波特率
串行口每秒钟发送或接收的数据位数称为波特率。 假设发送一位数据所需时间为t, 则波特率为 1/t。
(1) 模式0 的波特率等于单片机晶振频率的 1/12, 即每个机器周期接收或发送一位数据。
(2) 模式2的波特率与电源控制器pcon的最高位smod的写入值有关:即smod=0, 波特率为(1/64) f osc ; smod=1, 波特率为(1/32)f osc 。
(3) 模式 1 和模式 3 的波特率除了与smod位有关之外, 还与定时器 t1 的溢出率有关。 定时器 t1 作为波特率发生器, 常选用定时方式 2(8位重装载初值方式), 并且禁止 t1 中断。此时 th1 从初值计数到产生溢出, 它每秒钟溢出的次数称为溢出率。 于是