您的当前位置:首页正文

基于C8051F330单片机系统设计入门-讲义版

2020-07-07 来源:爱go旅游网
基于 C8051F330 单片机

系统设计入门

邬杨波 2008.08.08

目录

1、C8051F330 单片机结构特点

1.1 C8051F330 单片机概况 1.2 CIP-51TM 微控制器核 1.3 片内存储器 1.4 片内调试电路

1.5 可编程数字 I/O 和交叉开关 1.6 串行端口

1.7 可编程计数器阵列 1.8 10 位模/数转换器 1.9 比较器

1.10 10位电流输出 DAC 1.11 引脚和封装定义

2、C8051F330 单片机系统硬件设计要点

2.1 复位源特点及外部复位电路连接 2.2 C2 接口电路 2.3 时钟系统特点及使用

2.4 I/O 端口和交叉开关特点及配置

3、C8051F330 单片机系统软件设计要点

3.1 单片机的初始化设置 3.2 软件延时程序

1 C8051F330 单片机特点

1.1 C8051F330单片机概况

模拟外设

- 10位 ADC (只限于 F330 ) 转换速率可达 200ksps 可多达 16个外部单端或差分输入 VREF可

在内部 VREF 、外部引脚或 VDD 中选择 内部或外部转换启动源 内置温度传感器

- 10位电流输出 DAC (只限于 F330 )

- 比较器 可编程回差电压和响应时间 可配置为中断或复位源 小电流( <0.4 μA)

在片调试

- 片内调试电路提供全速、非侵入式的在系统调试(不需仿真器!) - 支持断点、单步、观察 /修改存储器和寄存器

- 比使用仿真芯片、目标仿真头和仿真插座的仿真系统有更优越的性能

- 廉价而完整的开发套件 供电电压 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 2.7V - 3.6V - 典型工作电流: 6.4mA @ 25MHz 9μA @ 32KHz

- 典型停机电流: 0.1 μA 温度范围 :-40°C - +85 °C 高速 8051微控制器内核 - 流水线指令结构; 70% 的指令的执行时间为一个或两个系统时钟周期 - 速度可达 25MIPS (时钟频率为 25MHz 时) - 扩展的中断系统 存储器

- 768字节内部数据 RAM ( 256+512)

- 8KB FLASH ;可在系统编程,扇区大小为 512字节 数字外设 - 17个端口 I/O ;均耐 5V电压, 大灌电流 - 硬件增强型 UART 、SMBus和增强型 SPI 串口 - 4个通用 16位计数器 /定时器

- 16位可编程计数器 /定时器阵列 ( PCA),有 3个捕捉 /比较模块

- 使用 PCA 或定时器和外部时钟源的实时时钟方式 时钟源

- 两个内部振荡器: 24.5MHz ,± 2%的精度,可支持无晶体 UART 操作 80/40/20/10 kHz低频率、

低功耗振荡器

- 外部振荡器:晶体、 RC 、C 、或外部时钟 - 可在运行中切换时钟源,适用于节电方式

1.2 CIP-51TM 微控制器核

1.2.1 和8051完全兼容 TM C8051F330/1系列器件使用 Silicon Labs的专利 CIP-51 微控制器内

核。 CIP-51和MCS-51 指 令集完全兼容,可以使用标准 803x/805x 的汇编器和编译器进行软件开发。 CIP-51内核具有标准 8052的所有外设部件,包括 4个 16位计数器 /定时器、一个具有增强波特率配置的全双工 UART 、 一个增强型 SPI端口、 768字节内部 RAM 、 128字节特殊功能寄存器( SFR)地址空间及 17个I/O 端口。

1.2.2 速度提高

CIP-51 采用流水线结构,和标准的 8051结构相比指令执行速度有很大的提高。在一个标准 的 8051中,除 MUL 和DIV 以外所有指令都需要 12或 24个系统时钟周期,最大系统时钟频率为 12-24MHz 。而对于 CIP-51内核, 70%的指令的执行时间为 1或2个系统时钟周期, 只有 4条指令的 执行时间大于 4个系统时钟周期。

CIP-51共有 111条指令。下表列出了指令条数和执行时所需的系统时钟周期数的关系。

执行周期数 指令数 1 2 2/3 3 3/4 4 4/5 5 8 26 50 5 16 7 3 1 2 1 1.2.3 增加的功能

C8051F330/1 系列 MCU 在CIP-51内核和外设方面有几项关键性的改进,提高了整体性能,

更易于在最终使用中使用。

扩展的中断系统向 CIP-51 提供 14个中断源(标准 8051只有 7个中断源),允许大量的模拟 和数字外设中断微控制器。 一个中断驱动的系统需要较少的 MCU 干预,因而有更高的执行效率。 在设计一个多任务实时系统时,这些增加的中断源是非常有用的。

MCU 有多达 8个复位源 :上电复位电路( POR)、一个片内 VDD 监视器(当电源电压低于 V 时强制复位)、一个看门狗定时器、一个时钟丢失检测器、一个由比较器 0提供的电压检测

RST

器、一个软件强制复位、外部复位输入引脚和 FLASH 读 /写错误保护电路复位。除了 POR、复位 输入引脚及 FLASH 操作错误这三个复位源之外,其他复位源都可以被软件禁止。在一次上电复 位之后的 MCU初始化期间, WDT 可以被永久性使能。

C8051F330/1器件的内部振荡器在出厂时已经被校准为 24.5MHz ±2%,该振荡器的周期可以 由用户以大约 0.5%的增量编程;片内还集成了一个低速振荡器,更适合于低功耗操作。器件内 集成了外部振荡器驱动电路,允许使用晶体、陶瓷谐振器、电容、 RC或外部 CMO时S 钟源产生

统时钟。如果需要,时钟源可以在运行时切换到外部振荡器。外部振荡器在低功耗系统中是非 常有用的,它允许 MCU从一个低频率(节电)外部晶体源运行,当需要时再周期性地切换到高速 (可达 25MHz)的内部振荡器。

图1.4 片内时钟和复位电路

1.3 片内存储器

CIP-51 有标准 8051的程序和数据地址配置。它包括 256字节的数据 RAM ,其中高 128字节为 双映射。用间接寻址访问通用 RAM的高128字节,用直接寻址访问 128字节的 SFR地址空间。数 据RAM的低128字节可用直接或间接寻址方式访问。前 32个字节为 4个通用寄存器区,接下来的 16字节既可以按字节寻址也可以按位寻址。

程序存储器包含 8KB的FLASH 。该存储器以 512字节为一个扇区, 可以在系统编程, 且不需 特别的编程电压。图 1.5给出了 MCU 系统的存储器结构。

图 1.5 片内存储器组织

1.4 片内调试电路

C8051F330/1器件具有片内 Silicon Labs 2线( C2 )接口调试电路 ,支持使用安装在最终使 用

系统中的产品器件进行非侵入式、全速的在系统调试。

Silicon Labs 的调试系统支持观察和修改存储器和寄存器,支持断点和单步执行。不需要额 外的目标 RAM 、程序存储器、 定时器或通信通道。 在调试时所有的模拟和数字外设都正常工作。 当MCU 单步执行或遇到断点而停止运行时,所有的外设( ADC 和 SMBus除外)都停止运行,以

保持和指令执行同步。

图1.6 开发 /在系统调试示意图

1.5 可编程数字 I/O 和交叉开关

C8051F330有17个I/O引脚(两个 8位口和一个 1位口)。 C8051F330/1端口的工作情况和标 准8051相似,但有一些改进。 每个端口引脚都可以被配置为模拟输入或数字 I/O 。被选择作为数 字I/O的引脚还可以被配置为推挽或漏极开路输出。在标准 8051中固定的 “弱上拉 ”可以被总体禁

止,这为低功耗使用提供了进一步节电的能力。

数字交叉开关允许将内部数字系统资源映射到端口 I/O引脚(见图 1.7)。可通过设置交叉 开关控制寄存器将片内的计数器 / 定时器、串行总线、硬件中断、比较器输出以及微控制器内部 的其它数字信号配置为出现在端口 I/O 引脚。 这一特性允许用户根据自己的特定使用选择通用端 口I/O和所需数字资源的组合。

图 1.7 数字交叉开关原理框图

1.6 串行端口

2

C8051F330/1系列MCU 内部有一个 SMBus/I C接口、一个具有增强型波特率配置的全双工 UART 和一个增强型 SPI接口。每种串行总线都完全用硬件实现,都能向 CIP-51 产生中断,因此 需要很少的 CPU 干预。

1.7 可编程计数器阵列

除了4个16位的通用计数器 /定时器之外, MCU 中还有一个片内 可编程计数器 /定时器阵列 (PCA )。 PCA包括一个专用的 16位计数器 /定时器时间基准和 3个可编程的捕捉 /比较模块。时 间基准的时钟可以是下面的六个时钟源之一:系统时钟 /12、系统时钟 /4、定时器 0溢出、外部时 钟输入( ECI )、系统时钟和外部振荡源频率 /8。外部时钟源对于实时时钟功能是非常有用的, 可以在使用内部振荡器驱动系统时钟的同时由外部振荡器给 PCA 提供时钟。

每个捕捉 /比较模块都有六种工作方式:边沿触发捕捉、软件定时器、高速输出、 8位或 16 位脉冲宽度调制器、频率输出。此外,捕捉 /比较模块 2还提供看门狗定时器( WDT )功能。在 系统复位后, 捕捉 /比较模块 2被配置并被使能为 WDT方式。PCA捕捉/比较模块的 I/O和外部时钟 输入可以通过数字交叉开关连到端口 I/O 。

图1.8 PCA原理框图

1.8 10位模 /数转换器

C8051F330/1内部有一个 10位SAR ADC 和一个 16通道差分输入多路选择器。该 ADC 工作在 200ksps的最大采样速率时可提供真正 10位的线性度, INL和DNL为± 1LSB 。ADC系统包含一个 可编程的模拟多路选择器,用于选择 ADC的正输入和负输入。端口 0~1作为 ADC的输入;另外, 片内温度传感器的输出和电源电压( VDD )也可以作为 ADC 的输入。用户固件可以将 ADC 置于 关断

状态以节省功耗。

A/D 转换可以有 6种启动方式:软件命令、定时器 0溢出、定时器 1溢出、定时器 2溢出、定 时器 3溢出或外部转换启动信号。 这种灵活性允许用软件事件、 外部硬件信号或周期性的定时器

溢出信号触发转换。一次转换完成可以产生中断(如果被允许),或者用软件查询一个状态位 来判断转换结束。转换结束后 10位结果数据字被锁存到 ADC 数据寄存器中。

窗口比较寄存器可被配置为当 ADC 数据位于一个规定的范围之内或之外时向控制器申请中 断。ADC 可以用后台方式监视一个关键电压, 当转换数据位于规定的范围之内 /外时才向控制器 申请中断。

图1.9 10位ADC 原理框图

1.9 比较器

C8051F330/1 器件内部有一个电压比较器,可以由用户软件使能

/禁止和配置。端口 I/O

引脚可以通过多路选择器被配置为比较器输入。 如果需要, 可以将两个比较器输出连到端口 引脚:一个锁存输出和 /或一个未锁存的输出(异步)。比较器的响应时间是可编程的,允 许用户在高速和低功耗方式之间选择。比较器的正向和负向回差电压也是可配置的。

比较器能在上升沿、下降沿产生中断,或在两个边沿都产生中断。当 MCU 工作在空闲 方式时, 这些中断可用于唤醒 MCU 。比较器 0还可以被配置为复位源。 图 1.10给出了比较器 0 的原理框图。

图 1.10 比较器原理框图

1.10 10位电流输出 DAC

C8051F330内部有一个 10位电流方式数 /模转换器( IDA0 )。 IDA0 的最大输出电流可以 有

三种不同的设置: 0.5mA 、1mA和2mA 。IDA0 具有灵活的输出更新机制, 允许无缝满度变 化,支持无抖动波形更新。 IDA0 有三种更新方式:写 IDA0H 、定时器溢出或外部引脚边沿。

图1.11 IDA0 原理框图

1.11引脚和封装定义

2、C8051F330 单片机系统硬件设计要点

2.1 复位源特点及外部复位电路连接 复位电路允许很容易地将控制器置于一个预定的缺省

状态。 在进入复位状态时, 将发生 以下过程:

CIP-51停止程序执行

特殊功能寄存器( SFR)被初始化为所定义的复位值 外部端口引脚被置于一个已知状态 中断和定时器被禁止。

所有的 SFR都被初始化为预定值, SFR中各位的复位值在 SFR的详细说明中定义。在复 位期间内部数据存储器的内容不发生改变,复位前存储的数据保持不变。但由于堆栈指针 SFR被复位,堆栈实际上已丢失,尽管堆栈中的数据未发生变化。

端口 I/O锁存器的复位值为 0xFF(全部为逻辑 ‘1'),处于漏极开路方式。在复位期间和

复位之后弱上拉被使能。对于 VDD 监视器和上电复位, /RST 引脚被驱动为低电平,直到器 件退出复位状态。

在退出复位状态时,程序计数器( PC)被复位, MCU 使用内部振荡器作为默认的系统 时钟。 看门狗定时器被使能, 使用系统时钟的 12分频作为其时钟源。 程序从地址 0x0000开始 执行。

图 10.1 复位源框图

2.1.1 上电复位

在上电期间,器件保持在复位状态, /RST引脚被驱动到低电平,直到 VDD 上升到超过 V 电平。从复位开始到退出复位状态要经过一个延时;该延时随着 VDD 上升时间的增大

RST

而减小( VDD 上升时间被定义为 VDD 从0V 上升到 V 的时间)。图 10.2给出了上电和 VDD RST 监视器复位的时序。 最大的 VDD 上升时间为 1ms;上升时间超过该最大值时可能导致器件在 VDD 达到 V 电平之前退出复位状态。当上升时间小于 1ms时,上电复位延时( T )

RST PORDelay 通常小于 0.3ms。 在退出复位状态时, PORSF 标志( RSTSRC.1 )被硬件置为逻辑 ‘1'。当 PORSF 标志被 置位时, RSTSRC 寄存器中的所有其它复位标志都是不确定的。 PORSF被 任何其它复位源清 0。由于所有的复位都导致程序从同一个地址( 0x0000 )开始执行, 软件 可以通过读 PORSF 标志来确定是否为上电产生的复位。在一次上电复位后,内部数据存 储器中的内容应被认为是不确定的。在上电复位后, VDD 监视器被禁止。

图 10.2 上电和 VDD 监视器复位时序

表 10.1 复位源电气特性

VDD = 2.7V ~ 3.6V ;-40℃到 +85℃(除非特别说明)

2.1.2 掉电复位和 VDD 监视器

当发生掉电或因电源波动导致 VDD 降到V 以下时,电源监视器将 /RST引脚驱动为低

RST

电平并使 CIP-51保持复位状态(见图 10.2)。当 VDD 又回到高于 V 的电平时, CIP-51 将退 RST 出复位状态。 注意, 尽管内部数据存储器的内容可能没有因掉电复位而发生改变, 但无法确 定VDD 是否降到了数据保持所要求的最低电平以下。如果 PORSF标志的读出值为 1,则内部

RAM 的数据可能不再有效。在上电复位后 VDD 监视器被使能,但它的状态(使能 /禁止)不 受任何其它复位源的影响。例如,在 VDD 监视器被使能后执行一次软件复位,复位后 VDD 监视器仍然为使能状态。

注意:在选择 VDD监视器作为复位源之前,必须使能 VDD 监视器。在 VDD 监视器被使 能或稳定之前选其为复位源可能导致系统复位。将 VDD 监视器配置为复位源的步骤如下:

1. 使能VDD监视器( VDM0CN 中的VDMEN 位 = 1);

2. 等待VDD 监视器稳定(见表 10.1的VDD 监视器启动时间); 3. 选择VDD 监视器作为复位源( RSTSRC中的PORSF位 = 1)。

图 10.2给出了 VDD 监视器的时序。注意,在 VDD 监视器复位后没有复位延时。表 10.1 给出了 VDD 监视器的电气特性。

图10.3 VDM0CN :VDD 监视器控制寄存器

R/W VDMEN 位7

R

VDDSTAT

位6

R R R R

复位值 可变

SFR地址

保留 位5

保留 位4

保留 位3

保留

位2

保留 位1

保留 位0

0xFF

位7: VDMEN : VDD 监视器使能位。 该位控制 VDD 监视器电源的通断。 VDD 监视器在被选择为复位源之前不可能产 生系统复位。在被选择为复位源之前, VDD 监视器必须稳定。在 VDD 监视器稳 定之前选其为复位源可能导致系统复位。 VDD 监视器的最小启动时间见表 10.1。 0:禁止 VDD 监视器。 1:使能 VDD 监视器。 位6: VDDSTAT : VDD 状态。 该位指示当前电源状态( VDD 监视器输出)。 0:VDD 等于或低于 VDD 监视器阈值。 1:VDD 高于 VDD 监视器阈值 位5-0: 保留。读 = 00000b ,写= 忽略。 2.1.3 外部复位 外部/RST引脚提供了使用外部电路强制 MCU 进入复位状态的手段。在 /RST引脚上加一 个低电平有

效信号将导致 MCU 进入复位状态。尽管在内部有弱上拉,但最好能提供一个外 部上拉和 /或对 /RST引脚去耦以防止强噪声引起复位。从外部复位状态退出后, (RSTSRC.0 )被置 ‘1'。

PINRSF 标志

2.1.4 外部复位电路

VDD

2.2 C2 接口电路

C8051F330/1有一个 Silicon Labs 2 线( C2 )调试接口,支持 FLASH 编程、边界扫描和使 用安

装在最终使用系统中的器件进行在系统调试。 C2接口使用一个时钟信号( C2CK )和一 个双向的 C2数据信号( C2D )在器件和宿主机之间传送信息。有关 C2协议的详细信息见 C2 接口规范。

2.2.1 C2引脚共享

C2协议允许 C2引脚和用户功能共享,可以进行在系统调试、 FLASH 编程和边界扫描。

这种共享之所以可能,是因为 C2 通信通常发生在器件的停止运行

状态。在这种状态下片内 外设和用户软件停止工作, C2接口可以安全地 “借用”C2CK (正常方式为 /RST )和C2D(正 常方式为 P2.0)引脚。在大多数情况下, 需要使用外部电阻对 C2接口和用户使用进行隔离 。 典型的隔离电路如图 20.6所示 。

图20.6 典型 C2引脚共享电路

2.2.2 C2 接口配置 1.接口定义

引线 1 2,3,9 4 5 6 7

JTAG 接口说明 2.7 至3.6VDC 输入 GND TCK TMS TDO TDI NC C2 接口说明 2.7 至 3.6VDC 输入 GND C2D NC NC C2CK NC 8,10 2.实物示意图

2.3 时钟系统特点及使用

C8051F330/1 MCU 有一个 可编程内部高频振荡器 、一个 可编程内部低频振荡器 和一个 外部

振荡器驱动电路 。可以通过对 OSCICL 和 OSCICN 寄存器编程来使能 /禁止内部高频振

荡器和调节其输出频率(如图 13.1 所示);可以通过对 OSCLCN 寄存器编程来使能 /禁止 内部低频 振荡器和调节其输出频率(如图 13.4 所示)。系统时钟可以由外部振荡器电路或 任何一个内部振荡器提供。表 13.1 给出了内部振荡器的电气特性。

图 13.1 振荡器框图

2.3.1 可编程内部高频( H-F )振荡器

C8051F330/1 器件包含一个可编程内部高频振荡器, 该 振荡器在系统复位后被默认为系 统

时钟 。内部振荡器的周期可以通过 OSCICL 寄存器编程。 对于 C8051F330/1 器件,OSCICL 已经过工厂校准,基频 fBASE 为 24.5MHz 。系统时钟可以从内部振荡器分频得到,分频数由 寄存器 OSCICN 中的 IFCN 位设定,可为 1、2、4 或 8。复位后的缺省分频数为 8。

图13.2 OSCICL :内部 H-F振荡器校准寄存器

图13.3 OSCICN :内部 H-F 振荡器控制寄存器

2.3.2 外部振荡器驱动电路

外部振荡器电路可以驱动外部 晶体、陶瓷谐振器、电容或 RC 网络。也可以使用一个 外部

CMOS 时钟提供系统时钟。对于晶体和陶瓷谐振器配置,晶体

/陶瓷谐振器必须并接到

XTAL1 和 XTAL2 引脚(见图 13.1,选项 1),还必须在 XTAL1 和 XTAL2 引脚之间 并接一个 10MΩ

的电阻。对于 RC、电容或 CMOS 时钟配置,时钟源应接到 XTAL2 引 脚(见图 13.1,选项 2、 3、

4)。必须在 OSCXCN 寄存器中选择外部振荡器类型,还必 须正确选择频率控制位 XFCN (见图 13.5)。

注意:当使用外部振荡器电路时,必须对所用端口引脚进行配置。

当外部振荡器电路被配置为晶体 /谐振器方式时,端口引脚 P0.2 和 P0.3 分别被用作 XTAL1 和

XTAL2 。

当外部振荡器电路被配置为 RC、电容或 CMOS 时钟方式时,端口引脚 P0.3 被用作 XTAL2 。端口 I/O 交叉开关应被配置为跳过被振荡器占用的引脚 。

当在晶体 /陶瓷谐振器、电容或 RC 方式使用外部振荡器电路时,应将所用的 端口引脚 配置为模拟输入。在 CMOS 时钟方式,应将所用的 端口引脚配置为数字输入 。有关端口输 入方式选择的详细信息见 “14.2 端口 I/O 初始化”。

2.3.3 外部晶体示例

如果使用晶体或陶瓷谐振器作为 MCU 的外部振荡源,则电路为图 13.1中的选项 1。应 从图

13.5(OSCXCN 寄存器)中的晶体列选择外部振荡器频率控制值(

XFCN )。例如,一

个 11.0592MHz 的晶体要求 XFCN 设置值为 111b。

在晶体振荡器被使能时, 振荡器幅度检测电路需要一个建立时间来达到合适的偏置。 在 使能晶体振荡器和检查 XTLVLD 位之间引入 1ms的延时可以防止提前将系统时钟切换到外 部振荡器。在晶体振荡器稳定之前就切换到外部晶体振荡器可能产生不可预见的后果。 建议 的步骤如下:

1.使能外部振荡器。 2.等待至少 1ms。

3. 查询XTLVLD => ‘1。'

4. 将系统时钟切换到外部振荡器。

图 13.5 OSCXCN :外部振荡器控制寄存器

2.3.4 系统时钟选择

寄存器 CLKSEL 中的 SEL1-0位选择用作系统时钟的振荡器。 当选择内部振荡器作为系统

时钟时,外部振荡器仍然可以给外设(定时器、 PCA)提供时钟。系统时钟可以在内部振荡 器和外部振荡器之间自由切换, 只要所选择的振荡器被使能并稳定运行。 内部振荡器的起动 时间很短,因此可以在同一个 OSCICN 写操作中使能和选择内部振荡器。外部晶体和陶瓷谐 振器通常需要较长的起动时间, 应待其稳定后方可用作系统时钟。 当外部振荡器稳定后, 晶 体有效标志(寄存器 OSCXCN中的 XTLVLD )被硬件置 ‘1'。在晶体方式,为了防止读到假 XTLVLD 标志,软件在使能外部振荡器和检查 XTLVLD 之间至少应延时 1ms。RC和 C方式通 常不需要起动时间。

图13.6 CLKSEL :时钟选择寄存器

2.4 I/O 端口和交叉开关特点及配置

数字和模拟资源可以通过 17个I/O引脚使用。 端口引脚被组织为两个 8位口和一个 1位口。 每个端口引脚都可以被定义为通用 I/O(GPIO )或模拟输入。 P0.0 ~ P1.7 可以被分配给内部 数字资源,如图 14.3所示。设计者完全控制数字功能的引脚分配,只受 I/O 引脚数的限制。 这种资源分配的灵活性是通过使用优先权交叉开关译码器实现的。 注意,不论交叉开关的设 置如何,端口 I/O 引脚的状态总是可以被读到相应的端口锁存器。 交叉开关根据优先权译码 表(图 14.3和图14.4)为所选择的内部数字资源分配 I/O引脚。寄存器 XBR0 和XBR1 (见图 14.5 – 14.6)用于选择内部数字功能。所有端口 I/O都耐 5V电压(端口 I/O单元示于图 14.2)。 端口 I/O单元可以被配置为漏极开路或推挽方式 (在端口输出方式寄存器 PnMDOUT 中设置, n = 0,1 )。表 14.1给出了端口 I/O的电气特性。

表14.1 端口 I/O 直流电气特性

VDD = 2.7V – 3.6V, -40 ℃到 +85℃(除非特别说明)。 参数 输出高电压( V ) OH OH 条件 IOH = -10μA,端口 I/O为推挽方式 IOH = -3mA ,端口 I/O为推挽方式 OH 典型值 最大单位 值 VDD-0.1 最小值 VDD-0.7 VDD-0.8 1.0 0.1 0.6 V IOH = -10mA ,端口 I/O为推挽方式 输出低电压( V ) OL IOL= 10μA I = 8.5mA I = 25mA OL OL V 输入高电压( V ) IH 2.0 V 0.8 V 输入低电压( V ) IL

输入漏电流 弱上拉禁止 弱上拉使能, V = 0 V 25 ±1 50 μA

图 14.1 端口 I/O 功能框图

2.4.1 优先权交叉开关译码器

优先权交叉开关译码器 (图 14.3)为每个 I/O 功能分配优先权, 从优先权最高的 UART0 开始。当

一个数字资源被选择时, 尚未分配的端口引脚中的最低位被分配给该资源

( UART0

总是使用引脚 4 和 5)。如果一个端口引脚已经被分配,则交叉开关在为下一个被选择的资 源分配引脚时将跳过该引脚。 此外, 交叉开关还将跳过在 PnSKIP 寄存器中被置 ‘1'的那些位 所对应的引脚。 PnSKIP 寄存器允许软件跳过那些被用作模拟输入、特定功能或 GPIO 的引 脚。

注意: 如果一个端口引脚被一个外设使用而不经过交叉开关,则该引脚在 PnSKIP 寄 存器中

的对应位应被置 ‘1'。这种情况适用于 :

P0.0(如果使用 VREF );

P0.3和/或 P0.2(如果外部振荡器电路被使能) ;

P0.6(如果 ADC 或 IDAC 被配置为使用外部转换启动信号 CNVSTR );

任何被选择的 ADC 或比较器输入。

交叉开关跳过那些已经被分配的引脚,移向下一个未被分配的引脚。图 14.3 示出没有 引脚被跳过( P0SKIP, P1SKIP = 0x00 )的优先权交叉开关译码表; 图 14.4给出了 XTAL1(P0.2) 脚和

XTAL2(P0.3) 脚被跳过情况下( P0SKIP = 0x0C )的交叉开关优先权译码表。

图14.3 没有引脚被跳过的交叉开关优先权译码

图14.4 晶体引脚被跳过的交叉开关优先权译码表

寄存器 XBR0 和XBR1 用于为数字 I/O资源分配物理 I/O 引脚。注意,当 SMBus被选择时, 交叉开关将为其分配两个引脚( SDA和SCL)。当 UART 被选择时,交叉开关也为其分配两 个引脚( TX和RX )。UART0 的引脚分配是固定的 (这是出于引导装入的目的) :UART TX0 总是被分配到 P0.4;UART RX0 总是被分配到 P0.5。在优先功能被分配之后,标准端口 I/O是 连续的。

注意:SPI 可以工作在三线或四线方式, 由 SPI0CN 寄存器中的 NSSMD1-NSSMD0 位 指 定。根据 SPI 方式, NSS 信号可以连到端口引脚,也可以不连到端口引脚。

图14.10 P0SKIP :端口 0跳过寄存器

图14.14 P1SKIP :端口 1跳过寄存器

图14.5 XBR0 :端口 I/O交叉开关寄存器 0

图14.6 XBR1 :端口 I/O交叉开关寄存器 1

2.4.2 端口 I/O 初始化

端口 I/O 初始化包括以下步骤:

1. 用端口输入方式寄存器( PnMDIN )选择所有端口引脚的输入方式(模拟或数字) 。 2. 用端口输出方式寄存器( PnMDOUT )选择所有端口引脚的输出方式(漏极开路或 推挽)。 3. 用端口跳过寄存器( PnSKIP )选择应被交叉开关跳过的那些引脚。 4. 将引脚分配给要使用的外设。 5. 使能交叉开关( XBARE = ‘1')。

所有端口引脚都必须被配置为模拟或数字输入。被用作比较器或 ADC 输入的任何引脚

都应被配置为模拟输入。 当一个引脚被配置为模拟输入时, 它的弱上拉、 数字驱动器和数字 接收器都被禁止, 这可以节省功耗并减小模拟输入的噪声。 被配置为数字输入的引脚可以被 模拟外设使用,但不建议这样做。

此外, 应将交叉开关配置为跳过所有被用作模拟输入的引脚 (通过将 PnSKIP 寄存器中 的对应位置 ‘1'来实现) 。端口输入方式在 PnMDIN 寄存器中设置, 其中‘1'表示数字输入, ‘0' 表示模拟输入。 复位后所有引脚的缺省设置都是数字输入 图14.8。

图14.8 P0MDIN :端口 0输入方式寄存器

。对 PnMDIN 寄存器的详细说明见

图14.12 P1MDIN :端口 1输入方式寄存器

I/O 引脚的输出驱动器特性由端口 输出方式寄存器 PnMDOUT 中的对应位决定,每个端 口输

出驱动器都可被配置为 漏极开路 或 推挽方式 。不管交叉开关是否将端口引脚分配给某 个数字外设,都需要对端口驱动器的输出方式进行设置。 唯一的例外是 SMBus引脚( SDA , SCL),不管

PnMDOUT 的设置如何,这两个引脚总是被配置为漏极开路。

图14.9 P0MDOUT :端口 0输出方式寄存器

当XBR1 寄存器中的 WEAKPUD 位为‘0'时,输出方式为漏极开路的那些引脚的弱上拉被 使能。WEAKPUD 不影响被配置为推挽方式的端口 I/O 。当漏极开路输出被驱动为逻辑 ‘0'时, 弱上拉被自动关断(禁止)以避免不必要的功率消耗。

寄存器 XBR0和XBR1 必须被装入正确的值以选择所需要的数字

I/O功能。置 ‘1'XBR1中

图 14.13 P1MDOUT :端口 1输出方式寄存器

的XBARE 位将使能交叉开关。 不管XBRn 寄存器的设置如何, 在交叉开关被使能之前, 外部 引脚保持标准端口 I/O方式(输入) 。对于给定的 XBRn 设置, 可以使用优先权译码表确定 I/O 引脚分配;另一种方法是使用 Silicon Labs IDE 软件的配置向导功能来确定基于 XBRn 寄存器 设置的端口 I/O 引脚分配。

注意:为使端口引脚工作在标准端口 I/O 输出方式,交叉开关必须被使能。当交叉开关 被禁止时,端口输出驱动器被禁止。

2.4.3 通用端口 I/O

未被交叉开关分配的端口引脚和未被模拟外设使用的端口引脚都可以作为通用

I/O 。 通

过对应的端口数据寄存器访问端口 P2-0,这些寄存器既可以按位寻址也可以按字节寻址。

向端口写入时,数据被锁存到端口数据寄存器中,以保持引脚上的输出数据值不变。 读端口数据寄存器(或端口位)将总是返回引脚本身的逻辑状态,而和 XBRn 的设置值 无关, 即使在引脚被交叉开关分配给其它信号时, 端口寄存器总是读其对应的端口 I/O引脚。 但在对端口 SFR执行下面的读 -修改 -写指令( ANL 、 ORL 、 XRL 、JBC、CPL、INC、DEC、

DJNZ )和对端口 SFR中的某一位执行 MOV 、CLR、SETB期间例外。这些指令读端口寄存器 (而

不是引脚)的值,修改后再写回端口 SFR。

图14.7 P0:端口 0寄存器

3 C8051F330 单片机系统软件设计要点

3.1 单片机的初始化设置

C8051F 单片机的软件设计基本上和标准的 8051 单片机是一样的, 但是略有差异。 这些 差

异主要是由 C8051F 单片机所引入的一些新特性所引起的,如时钟系统、看门狗、交叉开 关等。因此,在软件设计时 首先要对单片机进行初始化 ,包括以下几点:

看门狗初始化-开启还是禁止、如果开启则喂狗周期为多少; 时钟系统的初始化-确定系统的工作时钟源及频率;

I/O 引脚输入输出方式初始化-输入:模拟还是数字、输出:推挽还是开漏; 数字外

设的配置和交叉开关设置; 以下为一段例程。

void SysClkInit(void)

{

//配置系统时钟

OSCICN|=0x03; OSCICL=OSCICL+22;

}

// 设置片内振荡器为 22.1184MHZ //系统配置

//禁止看门狗定时器

void SystemInit(void)

{

PCA0MD&=~0x40;

}

EA=1;

void PortInit(void)

{

//端口配置

P0SKIP=0x02; XBR0=0x05; XBR1=0x43; P0MDIN=0xff; P0MDOUT=0x00; P1MDIN=0xff; P1MDOUT=0xB8;

}

//设置交叉开关

//配置 P0、P1 口输入输出方式

void main(void)

{

unsigned char KeyBuff,TimeNum,KeyValue; code

unsigned char LEDA[]={0x08,0x10,0x20,0};

code unsigned char LEDB[]={0x10,0x28,0,0}; code unsigned char LEDC[]={0x38,0,0x38,0}; SystemInit(); //系统配置 SysClkInit(); //配置系统时钟 PortInit();

}

//端口配置

3.2 软件延时程序

由于 C8051F 单片机的系统工作时钟是可编程的, 因此在编写软件延时程序时要注意系 统

时钟变化对软件延时的影响。以下为一个延时子程序的例子。

void DelayMs(unsigned int n)

{

//延时 (n)MS ,系统时钟为 22.1184MHz

unsigned int i; for(;n>0;n--)

{

for(i=2211;i>0;i--);

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容