周立功 sc16c55应用实例

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//文件:Uart.c
//功能:SC16C550 功能函数实现文件 //版权:周立功单片机发展有限公司
//******************************************************************************************
#include <REG51.H>
广州周立功单片机发展有限公司 Tel:(020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
SC16C550 应用实例
1.1 概述
SC16C550 是 PHILIPS 推出的一款高性能的 UART 芯片,其具有 16 字节 FIFO 和 IrDA 编/解码模块。本文将结合电路和程序演示如何使用 SC16C550 接收和回送 UART 数据。读 者可以根据图 2 制作 SC16C550 的 DEMO 版;在 KEIL C 开发环境下,可利用 P89V51RD2 的 SOFTICE 功能,方便调试 SC16C550 的各种功能。
//*******************************************************************************************
#include <REG51.H>
#include "uart.h"
#define DLL_DATA 0x0c
//定义 UART 分频系数,在 1.8432M 时,波特率为 9600BPS
RTS DTR CTS DSR DCD
RI
38 35 36 37 40 41 42 43
RX TX
RCLK BAUDOUT
XTAL1 XTAL2
11 Rx 13 Tx
10 17
18
19
1.8432MHz
C4 Y2
C5
100P
47P
图 2 应用电路图
为了方便对 UART 发送数据和观察 UART 回送的数据,读者可以参照图 3 自行焊接串 口电平转换电路,把 SC16C550 的 Rx 和 Tx 通过电平转换电路连接到 PC 的 COM 口,然后 通过串口调试软件进行调试。为了利用 P89V51RD2 的 SOFTICE 功能调试程序,在电路中
//函数名: Uart_Write //功 能: 写 UART 寄存器
//入参数: reg=要写的寄存器地址,val=要写的值
//出参数: 无
//********************************Hale Waihona Puke Baidu****************************************
void Uart_Write(unsigned char Reg, unsigned char Val)
DB9
1 C1 104 3
4 C2 104 5
14
13 7
8
U1 C+
CC2+
C2T1OUT
R1IN T2OUT
R2IN SP3232
Vcc 16
V+ V-
2 6
GND T1IN
15 11
R1OUT T2IN
12 10
R2OUT 9
C3 104 C4 104
TXD RXD
图 3 串口连接图
在电路的连接上可以把 SC16C550 看作是 MCU 的一个外部存储器,数据线连接到 P89V51RD2 的 P0 口上,地址线连接到 P2 口上,此外还需要连接读/写使能、片选和复位信 号(如图 2 所示)。
ch = Uart_Read(RHR); Uart_Write(THR, ch); } } }
//读 LSR //判断是否收到数据
//接收数据 //回送数据
程序清单 2 UART.C
//*******************************************************************************************
{
A0 = Reg & 0x01;
//UART 地址
A1 = Reg & 0x02;
A2 = Reg & 0x04;
UART_CEN = 0;
//UART 片选有效
AUXR = 0x02; *((unsigned char pdata *)MCU_COMMAND) = Val; AUXR = 0x00;
3
广州周立功单片机发展有限公司 Tel:(020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
//文件:Mainloop.c
//功能:使用 sc16c500,从 rx 接收数据,在 tx 中返回相同数据 //版权:周立功单片机发展有限公司
通过设置 DLL 和 DLM 设置通信波特率
通过设置 LCR 设置通信格式
通过设置 FCR 设置 FIFO 功能
1.4.3 波特率计算
在此介绍一下 SC16C550 波特率的计算方法:
波特率
=
16
晶振频率 ×(DLL和DLM中分频系数)
本例中通信波特率为 9600Bps,计算得到分频系数为 0x0C,因而设置 DLL 为 0x0C, DLM 为 0x00。
1.5 范例程序
本 范 例 程 序 在 KEIL C 编 译 通 过 的 , 程 序 清 单 如 下 所 示 。 如 果 有 疑 问 请 联 系 LPC900@ZLGMCU.COM。
程序清单 1 MAINLOOP.C
//*******************************************************************************************
图 1 SC16C550 引脚图
1.2 电路分析
SC16C550 的引脚图如图 1 所示,文中使用的电路如图 2 所示。电路十分简单,仅有 2
片芯片,分别为 P89V51RD2 和 SC16C550。其中 P89V51RD2 是一款可扩展外部存储器的增
强型 51 内核单片机。
J1
6 5 4 3 2 1
#define DLM_DATA 0x00
unsigned char c,ch;
void main(void) {
Uart_Reset();
Uart_Write(LCR,0x80); Uart_Write(DLL,DLL_DATA); Uart_Write(DLM,DLM_DATA);
//主函数
//复位 UART
//设置 UART 波特率 //设置 DLL 低位 //设置 DLL 高位
Uart_Write(LCR,0x03); Uart_Write(FCR,0x07);
//8 位数据,1 位停止位 //允许并复位 FIFO
while(1) {
c = Uart_Read(LSR); if (c & 0x01) {
//包含头文件
#include "uart.h"
sfr AUXR=0x8E;
4
广州周立功单片机发展有限公司 Tel:(020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
//*************************************************************************
2
广州周立功单片机发展有限公司 Tel:(020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
1.4.2 程序流程 在本范例程序中,对 SC16C550 的初始化流程如下:
调用 Uart_Reset() 复位 SC16C550
置 LCR[7]为 1 允许读写 DLL 和 DLM
有一点要注意的,如果要使用软件流控制和硬件流控制等功能,必须要选用 SC16C550 而不能选用 SC16C550B,后者是不支持流控制功能的。
它们的详细分别请参考 《飞利浦 SC16C 器件和飞利浦低功耗 SC16CxxxB 器件之间 的不同》一文。
1.4 软件编写
1.4.1 简介
为了使读者易于理解,程序中通过软件查询的方式从 SC16C550 的 Rx 端接收数据,并 从 Tx 端回送数据。SC16C550 的其它功能,如软件流控制和硬件流控制等,读者理解本范 例后,要实验这些功能都是很容易的。
CON6
VCC GND Rx Tx RxD TxD
RxD TxD
VCC
S1 SW-PB
+ C1 1uF
R1
4K7
16MHz
C2 Y1 30P
U1
1 2 3 4 5 6 7 8
P10 P11 P12 P13 P14 P15 P16 P17
10 11
RXD TXD
30 29
ALE/P PSEN
VCC 31
实际上,对 SC16C550 的操作,就是对其内部寄存器进行操作,在程序中对 SC16C550 的寄存器操作是通过函数 Uart_Read(unsigned char reg)和 Uart_Write(unsigned char reg, unsigned char val)实现的。其中 reg 为要操作的寄存器,val 为要写入的值。
在对 SC16C550 初始化完毕之后,即可开始使用它提供的 UART 功能了。在本例中是通 过查询 LSR(线路状态寄存器)的第 0 位有没被置位,判断有没接收到数据。当查询接收 到数据后,通过读取 RHR 即可获得接收到的数据。通过向 THR 写数据,即可达到向 UART 发送数据的目的。
关于 SC16C550 的寄存器的详细说明请参考芯片的数据手册。
WR RD
INT1 INT0
39 D0 38 D1 37 D2 36 D3 35 D4 34 D5 33 D6 32 D7
21 A0 22 A1 23 A2 24 25 26 27 28 15 14 16 17
13 12
U2
D0 D1 D2 D3 D4 D5 D6 D7
2 3 4 5 6 7 8 9
D0 D1 D2 D3 D4 D5 D6 D7
A0 31 A1 30 A2 29
28
A0 A1 A2 AS
VCC
14 15 16 39 20 24 21 25
CS0 CS1 CS2 MR 1OW IOR IOW IOR
33 INT
SC16C550
DDIS TXRDY RXRDY
26 27 32
OUT1 OUT2
//存取外部存储器 //存取内部存储器
UART_CEN = 1;
//UART 片选无效
}
//*************************************************************************
本范例通过查询方式对 SC16C550 进行操作,SC16C550 的 INT 引脚可以悬空。如果读 者需要利用中断操作方式,可以把 INT 引脚连接到 P89V51RD2 的外部中断引脚 INT0 或 INT1。
SC16C550 需要在 RCLK(16 脚)输入一个串行接收同步时钟,并且在 BAUDOUT(17 脚)输出串行发送同步时钟。由于 SC16C550 的最高波特率可达 3Mbit/s,这两个时钟信号 的引入,使得在高速通信的场合中,可以消除接收/发送的时钟差异,提高了数据传输的可 靠性。在本范例中通信的另一端是 PC 的 COM 口,不需要同步时钟,因此需要把 RCLK 和 BAUDOUT 连接起来。
在电路中的电源电压为 5V。需要说明的是,SC16C550 可工作在 5V、3.3V 和 2.5V,但 电源电压的不同将影响最高通信波特率。5V 时最高波特率为 3Mbit/s,3.3V 时为 2Mbit/s, 2.5V 时为 1Mbit/s。
1.3 SC16C550 与 SC16C550B 的差别
EA/VP
9 RESET
19 18
C3 30P
X1 X2
P89V51RD2
P00/AD0 P01/AD1 P02/AD2 P03/AD3 P04/AD4 P05/AD5 P06/AD6 P07/AD7
P20/A8 P21/A9 P22/A10 P23/A11 P24/A12 P25/A13 P26/A14 P27/A15 P35/T1 P34/T0
1
广州周立功单片机发展有限公司 Tel:(020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
把 P89V51RD2 的 TxD 和 RxD 也通过电平转换电路连接到 PC 的 COM 口。
VCC
J1
1 6 2 7 3 8 4 9 5
PC_RXD PC_TXD
相关文档
最新文档