基于C8051F330单片机系统设计入门

更新时间:2023-03-08 07:35:25 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于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 -

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、或外部时钟 ? 可在运行中切换时钟源,适用于节电方式

- 2 -

1.2 CIP-51TM 微控制器核

1.2.1 与8051完全兼容

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端口。

TM

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 - 3 -

1.2.3 增加的功能

C8051F330/1 系列MCU在CIP-51内核和外设方面有几项关键性的改进,提高了整体性能,更易于在最终应用中使用。

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

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

RST

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

C8051F330/1器件的内部振荡器在出厂时已经被校准为24.5MHz ± 2%,该振荡器的周期可以由用户以大约0.5%的增量编程;片内还集成了一个低速振荡器,更适合于低功耗操作。器件内集成了外部振荡器驱动电路,允许使用晶体、陶瓷谐振器、电容、RC或外部CMOS时钟源产生系统时钟。如果需要,时钟源可以在运行时切换到外部振荡器。外部振荡器在低功耗系统中是非常有用的,它允许MCU从一个低频率(节电)外部晶体源运行,当需要时再周期性地切换到高速(可达25MHz)的内部振荡器。

图1.4 片内时钟和复位电路

- 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 片内存储器组织

5

1.4 片内调试电路

C8051F330/1器件具有片内Silicon Labs 2线(C2)接口调试电路,支持使用安装在最终应用系统中的产品器件进行非侵入式、全速的在系统调试。

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

USB

图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和所需数字资源的组合。

6

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

1.6 串行端口

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

2

7

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原理框图

8

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原理框图

9

1.9 比较器

C8051F330/1器件内部有一个电压比较器,可以由用户软件使能/禁止和配置。端口I/O引脚可以通过多路选择器被配置为比较器输入。如果需要,可以将两个比较器输出连到端口引脚:一个锁存输出和/或一个未锁存的输出(异步)。比较器的响应时间是可编程的,允许用户在高速和低功耗方式之间选择。比较器的正向和负向回差电压也是可配置的。 比较器能在上升沿、下降沿产生中断,或在两个边沿都产生中断。当MCU工作在空闲方式时,这些中断可用于唤醒MCU。比较器0还可以被配置为复位源。图1.10给出了比较器0的原理框图。

图1.10 比较器原理框图

10

1.10 10位电流输出DAC

C8051F330内部有一个10位电流方式数/模转换器(IDA0)。IDA0的最大输出电流可以有三种不同的设置:0.5mA、1mA和2mA。IDA0具有灵活的输出更新机制,允许无缝满度变化,支持无抖动波形更新。IDA0有三种更新方式:写IDA0H、定时器溢出或外部引脚边沿。

图1.11 IDA0原理框图

1.11引脚和封装定义

11

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

2.1 复位源特点及外部复位电路连接

复位电路允许很容易地将控制器置于一个预定的缺省状态。在进入复位状态时,将发生以下过程:

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

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

端口I/O锁存器的复位值为0xFF(全部为逻辑?1?),处于漏极开路方式。在复位期间和复位之后弱上拉被使能。对于VDD监视器和上电复位,/RST引脚被驱动为低电平,直到器件退出复位状态。

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

图10.1 复位源框图

12

2.1.1 上电复位

V

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

RST

RST

而减小(VDD上升时间被定义为VDD从0V上升到V的时间)。图10.2给出了上电和VDD

监视器复位的时序。最大的VDD上升时间为1ms;上升时间超过该最大值时可能导致器件在VDD达到V电平之前退出复位状态。当上升时间小于1ms时,上电复位延时(T)

RST

PORDelay

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

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

13

表10.1 复位源电气特性

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

2.1.2 掉电复位和VDD监视器

当发生掉电或因电源波动导致VDD降到V

RST

以下时,电源监视器将/RST引脚驱动为低

RST

电平并使CIP-51保持复位状态(见图10.2)。当VDD又回到高于V的电平时,CIP-51将退

出复位状态。注意,尽管内部数据存储器的内容可能没有因掉电复位而发生改变,但无法确定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 位6 R VDDSTAT 保留 位5 R 保留 位4 R 保留 位3 保留 位2 R 保留 位1 R 保留 位0 复位值 可变 SFR地址: 0xFF 位7: VDMEN:VDD监视器使能位。 14

该位控制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引脚去耦以防止强噪声引起复位。从外部复位状态退出后,PINRSF标志(RSTSRC.0)被置?1?。

2.1.4 外部复位电路

VDDR110kR21kR31k/RSTC1104C21uF 15

2.2 C2接口电路

C8051F330/1有一个Silicon Labs 2线(C2)调试接口,支持FLASH编程、边界扫描和使用安装在最终应用系统中的器件进行在系统调试。C2接口使用一个时钟信号(C2CK)和一个双向的C2数据信号(C2D)在器件和宿主机之间传送信息。有关C2协议的详细信息见C2接口规范。

16

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 8,10

2.实物示意图

JTAG 接口说明 2.7 至3.6VDC 输入 GND TCK TMS TDO TDI NC C2 接口说明 2.7 至3.6VDC 输入 GND C2D NC NC C2CK NC

17

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振荡器校准寄存器

18

图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的延时可以防止提前将系统时钟切换到外部振荡器。在晶体振荡器稳定之前就切换到外部晶体振荡器可能产生不可预见的后果。建议

19

的步骤如下:

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

3. 查询XTLVLD =>?1?。

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

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

20

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℃(除非特别说明)。 条件 最小值 典型值 最大值 单位 I= -10μA,端口I/O为推挽方式 VDD-0.1 OH VDD-0.7 输出高电压(V) I= -3mA,端口I/O为推挽方式 V OHOH I= -10mA,端口I/O为推挽方式 VDD-0.8 OH I= 10μA 0.1 OL 0.6 输出低电压(V) IOL= 8.5mA V OL 1.0 I= 25mA OL参数 21

输入高电压(V) IH 弱上拉禁止 弱上拉使能,V= 0 V IN2.0 25 V 输入低电压(V) IL0.8 V ±1 50 μA 输入漏电流

图14.1 端口I/O功能框图

2.4.1 优先权交叉开关译码器

优先权交叉开关译码器(图14.3)为每个I/O功能分配优先权,从优先权最高的UART0开始。当一个数字资源被选择时,尚未分配的端口引脚中的最低位被分配给该资源(UART0总是使用引脚4和5)。如果一个端口引脚已经被分配,则交叉开关在为下一个被选择的资源分配引脚时将跳过该引脚。此外,交叉开关还将跳过在PnSKIP寄存器中被置?1?的那些位所对应的引脚。PnSKIP寄存器允许软件跳过那些被用作模拟输入、特定功能或GPIO的引脚。

22

注意:如果一个端口引脚被一个外设使用而不经过交叉开关,则该引脚在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 没有引脚被跳过的交叉开关优先权译码表

23

图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跳过寄存器

24

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

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

25

图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?表示模拟输入。复位后所有引脚的缺省设置都是数字输入。对PnMDIN寄存器的详细说明见图14.8。

26

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

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

I/O引脚的输出驱动器特性由端口输出方式寄存器PnMDOUT中的对应位决定,每个端口输出驱动器都可被配置为漏极开路或推挽方式。不管交叉开关是否将端口引脚分配给某个数字外设,都需要对端口驱动器的输出方式进行设置。唯一的例外是SMBus引脚(SDA,SCL),不管PnMDOUT的设置如何,这两个引脚总是被配置为漏极开路。

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

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

27

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

寄存器XBR0和XBR1必须被装入正确的值以选择所需要的数字I/O功能。置?1?XBR1中的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寄存器

28

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; //配置P0、P1口输入输出方式 P0MDOUT=0x00; P1MDIN=0xff; P1MDOUT=0xB8; }

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};

29

}

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--); } }

30

本文来源:https://www.bwwdw.com/article/ao73.html

Top