购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.8 PIC单片机外设相关寄存器

本书大量案例涉及外部中断、定时/计数器、CCP、MSSP(I 2 C、SPI)、ADC、比较器、USART等外设应用程序设计,使用C语言开发程序时将大量使用这些外设的相关控制、状态或数据寄存器。由于本书案例主要使用PIC16F877A单片机、部分案例使用PIC18系列高档单片机,本节将用一定篇幅列出使用相对较多的PIC16F877A单片机相关寄存器技术手册内容。其他各种型号单片机更详细的PDF技术手册内容可从微芯公司官方网站http://www.microchip.com下载。

(1)EEPROM控制寄存器—EECON1(EEPROM Control Register 1),相关位如表1-5所示。

表1-5 EEPROM控制寄存器配置位

EEPGD:程序/数据选择位(Program/Data EEPROM Select bit)。

1=访问程序内存,0=访问数据内存。

WRERR:错误(Error)标志位。

1=写操作过早终止,指正常操作期间出现MCLR或WDT复位;0=写操作已完成。

WREN:写使能(Write Enable)位。

1=允许写入,0=禁止写入EEPROM。

WR:写操作控制位。

1=启动写周期。一旦写入完成,该位将被硬件清零。写操作控制位只能用软件置1。

0=EEPROM的写周期已完成。

RD:读操作控制位。

1=启动EEPROM读操作,0=未启动EEPROM读操作。

与PIC EEPROM相关的寄存器还有:

EEADR:EEPROM地址寄存器EEADR,最多可寻址256字节的数据EEPROM存储器。

附注:各位标有R/W表示可读/写,标有U表示未用,“− n”表示上电复位值,其中x表示未知。

(2)中断控制寄存器—INTCON(Interrupt Control Register),相关配置位如表1-6所示。

表1-6 中断控制寄存器

GIE:全局中断允许位。

1=允许所有未屏蔽中断;0=禁止所有中断。

PEIE:外设中断允许位。

1=允许所有未屏蔽外设中断;0=禁止所有外设中断。

T0IE:TMR0溢出中断允许位。

1=允许TMR0溢出中断;0=禁止TMR0溢出中断。

INTE:INT外部引脚中断允许位。

1=允许INT外部引脚中断;0=禁止INT外部引脚中断。

RBIE:RB端口电平变化中断允许位。

1=允许RB端口电平变化中断;0=禁止RB端口电平变化中断。

T0IF:TMR0溢出中断标志位。

1=TMR0寄存器已经溢出(必须用软件清零);0=TMR0寄存器未发生溢出。

INTF:INT外部引脚中断标志位。

1=发生INT外部中断(必须用软件清零);0=未发生INT外部中断。

RBIF:RB端口电平变化中断标志位。

1=RB7:RB4引脚中至少有一位的状态发生了变化(必须用软件清零);

0=RB7:RB4引脚没有发生状态变化。

(3)外设中断独立使能寄存器1—PIE1(Peripheral Interrupts Enable Register 1),相关配置如表1-7所示。

表1-7 外设中断独立使能寄存器1

PSPIE:并行从动端口的读/写中断允许位。

1=允许PSP的读/写中断;0=禁止PSP的读/写中断。

ADIE:A/D转换中断允许位。

1=允许A/D中断;0=禁止A/D中断。

RCIE:USART接收中断允许位。

1=允许USART接收中断;0=禁止USART接收中断。

TXIE:USART发送中断允许位。

1=允许USART发送中断;0=禁止USART发送中断。

SSPIE:同步串行口中断允许位。

1=允许SSP中断;0=禁止SSP中断。

CCP1IE:CCP1中断允许位。

1=允许CCP1中断;0=禁止CCP1中断。

TMR2IE:TMR2与PR2匹配中断允许位。

1=允许 TMR2与PR2匹配中断;0=禁止TMR2与PR2匹配中断。

TMR1IE:TMR1溢出中断允许位。

1=允许TMR1溢出中断;0=禁止TMR1溢出中断。

(4)外设中断独立使能寄存器2-PIE2(Peripheral Interrupts Enable Register 2),相关配置位如表1-8所示。

表1-8 外设中断独立使能寄存器2

CMIE:比较器中断允许位。

1=允许比较器中断;0=禁止比较器中断。

EEIE:EEPROM写操作完成中断允许位。

1=允许EEPROM写操作完成中断;0=禁止EEPROM写操作完成中断。

BCLIE:总线冲突中断允许位(Bus Collision Interrupt Enable bit)。

1=使能总线冲突中断;0=禁止总线冲突中断。

CCP2IE:CCP2中断允许位。

1=允许CCP2中断;0=禁止CCP2中断。

(5)外设中断独立标志位寄存器1-PIR1(Peripheral Interrupts Flag Bit Register 1),相关配置如表1-9所示。

表1-9 外设中断独立标志寄存器

PSPIF:并行从动端口读/写中断标志位。

1=发生了读/写操作(必须用软件清零);0=未发生读/写操作。

ADIF:A/D转换器中断标志位。

1=完成A/D转换(必须用软件清零);0=未完成A/D转换。

RCIF:USART接收中断标志位。

1=接收缓冲器RCREG满(当读取RCREG时清零);0=接收缓冲器为空。

TXIF:USART发送中断标志位。

1=发送缓冲器TXREG为空(当写入TXREG 时清零);0=发送缓冲器满。

SSPIF:同步串行口中断标志位。

1=完成发送/接收;0=等待发送/接收完成。

CCP1IF:CCP1中断标志位。

● 输入捕捉模式

1=发生了TMR1寄存器捕捉(必须用软件清零);

0=未发生TMR1寄存器捕捉。

● 输出比较模式

1=发生了TMR1寄存器的比较匹配(必须用软件清零);

0=未发生TRM1寄存器的比较匹配。

● 脉宽调制模式(PWM)下未定义

TMR2IF:TMR2对PR2匹配中断标志位。

1=TMR2与PR2匹配(必须用软件清零);0=TMR2与PR2不匹配。

TMR1IF:TMR1溢出中断标志位。

1=TMR1寄存器发生溢出(必须用软件清零);0=TMR1寄存器未发生溢出。

(6)外设中断独立标志位寄存器2-PIR2(Peripheral Interrupts Flag Bit Register 2),相关寄存器如表1-10所示。

表1-10 外设中断独立标志位寄存器2

CMIF:比较器中断标志位。

1=比较器输入发生变化(必须用软件清零);0=比较器输入未发生变化。

EEIF:EEPROM写操作完成中断标志位。

1=EEPROM写操作已完成(必须用软件清零);0=EEPROM 写操作未完成。

BCLIF:总线冲突中断标志位。

1=配置SSP模块I 2 C主控模式时出现总线冲突;0=未出现总线冲突。

CCP2IF:CCP2中断标志位。

● 输入捕捉模式

1=发生了TMR1寄存器捕捉(必须用软件清零);

0=未发生TMR1寄存器捕捉。

● 输出比较模式

1=发生了TMR1寄存器的比较匹配(必须用软件清零);

0=未发生TRM1寄存器的比较匹配。

● 脉宽调制模式(PWM)下未定义。

(7)并行从动端口状态/控制寄存器-TRISE(Parallel Slave Port Status/Control Bits),相关配置位如表1-11所示。

表1-11 并行从动端口状态/控制寄存器

IBF:输入缓冲器满状态位。

1=接收到一个数据,等待CPU读取;0=未接收到任何数据。

OBF:输出缓冲器满状态位。

1=输出缓冲器仍保存着上一次写入的数据;0=已读取输出缓冲器。

IBOV:输入缓冲器溢出检测位(在微处理器模式)。

1=在尚未读取上一次输入数据前发生了一次写入(必须用软件清零);

0=无溢出发生。

PSPMODE:并行从动端口模式选择位。

1=并行从动端口模式;0=通用I/O口模式。

TRISE2、1、0:分别为RE2、1、0引脚的方向控制位。1=输入;0=输出。

(8)选项寄存器-OPTION_REG(OPTION Register),如表1-12所示。

表1-12 选项寄存器

OPTION_REG寄存器用来设置TMR0/WDT预分频器、外部INT中断、TMR0和PORTB弱上拉等。

RBPU:弱上拉使能位。

1=禁止弱上拉;0=使能弱上拉。

INTEDG:中断信号边沿选择位。

1=INT引脚上升沿中断;0=INT引脚下降沿中断。

T0CS:TMR0时钟源选择位。

1=T0CKI引脚输入时钟;0=内部指令周期时钟(CLKOUT)。

T0SE:TMR0时钟源边沿选择位。

1=T0CKI引脚电平由高到低转变时递增;0=T0CKI引脚电平由低到高转变时递增。

PSA:预分频器分配位。

1=预分频器分配给WDT;0=预分频器分配给TIMER0。

PS2:PS0(Prescaler Rate Select bits 2:0):预分频比选择位,对应的分频比如表1-13所示。(9)TIMER1控制寄存器-T1CON(TIMER1 Control Register),如表1-14所示。

表1-13 预分频比选择位分频比

表1-14 TIMER1控制寄存器

T1CKPS1:T1CKPS0 TIMER1输入时钟预分频比选择位,对应值如下。

11=1:8预分频比;10=1:4预分频比;01=1:2预分频比;00=1:1预分频比。

T1OSCEN:TIMER1振荡器使能位。

1=振荡器使能;0=振荡器关闭。振荡器的反相器和反馈电阻被关断,以降低功耗。

T1SYNC:TIMER1外部时钟输入同步控制位。

当TMR1CS=1时:1=不同步外部时钟;0=同步外部时钟。

当TMR1CS=0时:此位被忽略,TIMER1使用内部时钟。

TMR1CS:TIMER1时钟源选择位。

1:选择T1OSO/T1CKI引脚的外部时钟(上升沿计数);

0:选择内部时钟(FOSC/4)。

TMR1ON:TIMER1使能位。

1=使能TIMER1;0=关闭TIMER1。

与TIMER1相关的寄存器有:

① TMR1L保存16位TMR1寄存器低字节的寄存器;

② TMR1H保存16位TMR1寄存器高字节的寄存器。

(10)TIMER2控制寄存器-T2CON(TIMER2 Control Register),如表1-15所示。

表1-15 TIMER2控制寄存器

TOUTPS3:TOUTPS0:TIMER2输出后分频比选择位。

0000,0001,…,1111分别设置1:1,1:2,…,1:16后分频比。

TMR2ON:TIMER2允许位。

1=TIMER2允许;0=TIMER2关闭。

T2CKPS1:T2CKPS0:TIMER2时钟预分频比选择位。

00,01,1x分别设置1:1,1:4,1:16预分频比。

与TIMER2相关的寄存器还有:

① TMR2:TIMER2定时器模块8位的寄存器;

② PR2:TIMER2周期寄存器(Period Register),其默认初值恒为0xFF。

(11)CCPx控制寄存器-CCP1CON/CCP2CON(CCP1/CCP2 Control Register),如表1-16所示。

表1-16 CCPx控制寄存器

DCxB1:DCxB0(或称做CCPxX:CCPxY):PWM占空比的最低两位。

这两位在捕捉模式(Capture Mode)与比较模式(Compare Mode)下未用。

在PWM模式下,它们是10位PWM占空比的最低2位,占空比的高8位(DCx9:DCx2)在CCPRxL中。

CCPxM3:CCPxM0CCPx模式选择位,配置如下:

0000=捕捉/比较/PWM关闭(即复位CCPx模块);

0100=捕捉模式,每个下降沿发生;

0101=捕捉模式,每个上升沿发生;

0110=捕捉模式,每4个上升沿发生;

0111=捕捉模式,每16个上升沿发生;

1000=比较模式,比较相符时CCPx引脚为高电平(CCPIF置1);

1001=比较模式,比较相符时CCPx引脚为低电平(CCPIF置1);

1010=比较模式,比较相符时,产生软件中断(CCPIF置1,CCPx引脚不受影响);

1011=比较模式,比较相符时,产生特殊触发事件(CCPIF置1,CCP引脚不受影响);

11xx=PWM模式。

与CCPx相关的寄存器还有:

① CCPRxH,CCPx捕获/比较/PWM(Capture/Compare/PWM)寄存器高字节;

② CCPRxL CCPx捕获/比较/PWM(Capture/Compare/PWM)寄存器低字节;

③ 捕获/比较模式与TMR1相关,PWM模式与TMR2相关。

(12)主控同步串行口状态寄存器-SSPSTAT(MSSP Status Register/SPI Mode),如表1-17所示。

表1-17 主控同步串行口状态寄存器配置位

SMP:SPI输入数据的采样(Sample)相位。

● 在SPI主控模式下

1=在数据输出时间的末端采样输入数据;0=在数据输出时间的中间采样输入数据。

● 在SPI从动模式下:SMP必须清零。

CKE:SPI时钟沿选择位。

CKP=0(SSPCON<4>)

1=在SCK上升沿发送数据;0=在SCK下降沿发送数据。

CKP=1(SSPCON<4>)

1=在SCK下降沿发送数据;0=在SCK上升沿发送数据。

D/A:数据/地址位(仅用于I 2 C模式)。

1=表示最后接收或发送的字节是数据;0=表示最后接收或发送的字节是地址。

P:停止位(仅用于I 2 C模式)。当SSP模块被禁止时该位被清零。

1=表示检测到停止位(复位时该位为0);0=表示未检测到停止位。

S:启动位(仅用于I 2 C模式)。当SSP模块被禁止时该位被清零。

1=表示检测到启动位(复位时该位为0);0=表示未检测到启动位。

R/W:读/写位信息(仅用于I 2 C模式)。该位用来记录在最后一次地址匹配后接收到的读/写信息。从本机地址与接收地址匹配开始,到下一个启动位、停止位或无应答位(ACK)时,该位有效。1=读;0=写。

UA:地址更新(仅用于10位I 2 C模式)。

1=表示需要更新SSPADD寄存器中的地址;0=表示地址不需要更新。

BF:缓冲区满状态位。

接收时(SPI和I 2 C模式)

1=表示接收完成,SSPBUF满;0=表示接收未完成,SSPBUF空。

发送时(I 2 C模式时)

1=表示发送正在进行,SSPBUF满;0=表示发送已经完成,SSPBUF空。

(13)主控同步串行口控制寄存器-SSPCON(MSSP Control Register),如表1-18所示。

表1-18 主控同步串行口控制寄存器

WCOL:写冲突检测位。

1=正在发送前一个字时,又有数据写入SSPBUF寄存器(该位必须用软件清零);

0=表示未发生冲突。

SSPOV:接收溢出指示位。

● 在SPI模式下

1=SSPBUF中仍保持前一个数据时又收到新的字节。在溢出时,SSPSR中的数据丢失,且SSPBUF不能再被更新。溢出只会发生在从动模式下。即使只发送数据,用户也必须读SSPBUF,以避免产生溢出。在主控模式下,溢出位不会被置位,因为每次接收或发送新数据,都要通过写SSPBUF来启动。

0=没有溢出。

● 在I 2 C模式下

1=SSPBUF中仍保持前一个字节时又收到新的数据。在发送方式下SSPOV位无效,在SPI和I 2 C模式下,该位都必须用软件清零。

0=没有溢出。

SSPEN:同步串行口使能位。在SPI和I 2 C两种模式下,当该位为1而使能时,应正确定义相应引脚的输入/输出方向。

● 在SPI模式下

1=使能串行口,并定义SCK、SDO、SDI和SS为串行口引脚;

0=禁止串行口,并定义SCK、SDO、SDI和SS引脚为一般I/O端口引脚。

● 在I 2 C模式下

1=使能串行口,并定义SDA和SCL为串行口引脚;

0=禁止串行口,并定义SDA和SCL引脚为一般I/O端口引脚。

CKP:时钟极性选择位。

● 在SPI模式下

1=空闲状态时,时钟为高电平;0=空闲状态时,时钟为低电平。

● 在I 2 C模式下

SCK 释放控制。1=使能时钟;0=保持时钟线为低电平(用于保证数据的建立时间)。

SSPM3:SSPM0:同步串行口模式选择位。所有配置如下:

0000=SPI主控模式,时钟=FOSC/4;

0001=SPI主控模式,时钟=FOSC/16;

0010=SPI主控模式,时钟=FOSC/64;

0011=SPI主控模式,时钟=TMR2输出/2;

0100=SPI从动模式,时钟=SCK引脚,使能SS引脚控制;

0101=SPI从动模式,时钟=SCK引脚,禁止SS引脚控制,SS可用作I/O引脚;

0110=I 2 C 7位地址的从动模式;

0111=I 2 C 10位地址的从动模式;

1000=保留;

1001=保留;

1010=保留;

1011=I 2 C固件控制的主控模式(从动模式空闲);

1100=保留;

1101=保留;

1110=I 2 C从动模式,7位地址,允许启动位和停止位中断功能;

1111=I 2 C从动模式,10位地址,允许启动位和停止位中断功能。

与MSSP模块相关的寄存器还有8位的同步串行口接收缓冲器/发送寄存器SSPBUF。

(14)发送状态和控制寄存器——TXSTA(Transmit Status and Control Register),如表1-19所示。

表1-19 发送状态和控制寄存器配置位

CSRC:时钟源选择位(异步模式此位未用)。在同步模式下:

1=主控模式(由内部波特率发生器产生时钟);

0=从动模式(由外部时钟源提供时钟信号)。

TX9:9位发送使能位。

1=选择9位数据发送;0=选择8位数据发送。

TXEN:发送使能位。

1=允许发送;0=禁止发送。在SYNC模式下,SREN/CREN位比TXEN位优先级高。

SYNC:USART模式选择位。

1=同步模式;0=异步模式。

BRGH:高速波特率使能位。异步模式下,1=高速;0=低速。同步模式下此位未用。

TRMT:发送移位寄存器状态位。1=TSR空;0=TSR满。

TX9D:发送数据的第9位,可作为奇偶校验位。

(15)接收状态和控制寄存器-RXSTA(Receive Status and Control Register),如表1-20所示。

表1-20 接收状态和控制寄存器配置位

SPEN:串口使能位。

1=允许串口工作(RX/DT和TX/CK引脚配置为串口引脚);0=禁止串口工作。

RX9:9位接收使能位。

1=选择9位接收;0=选择8位接收。

SREN:单字节接收使能位。

同步主控模式下,1=允许接收单字节;0=禁止接收单字节。在接收完成后该位被清零。同步从动模式及异步模式此位未用。

CREN:连续接收使能位。

异步模式下,1=允许连续接收;0=禁止连续接收。

同步模式下,1=允许连续接收直到CREN位被清零;0=禁止连续接收。

FERR:帧出错标志位。

1=帧出错(读RCREG寄存器可更新该位,并接收下一个有效字节);0=无帧错误。

OERR:溢出错误位。

1=有溢出错误(清零CREN位可将此位清零);0=无溢出错误。

RX9D:接收数据的第9位,可作为奇偶校验位。

与TXSTA、RXSTA相关的寄存器SPBRG用于设置USART的波特率,如表1-21所示。

表1-21 SPBRG设置的USART波特率

注:X为SPBRG寄存器的取值(0~255)

向波特率寄存器SPBRG写入一个新值会使BRG定时器复位(或清零),这可确保波特率发生器BRG不需要等到定时器溢出就可以输出新的波特率值。

下面补充说明波特率的误差计算。

以FOSC=16MHz、目标波特率=9600为例,设BRGH=0,SYNC=0。有:

目标波特率=Fosc/(64(X+1)),即

9600=16 000 000/(64(X+1)),可得:X=25.042 ≈ 25

计算波特率=16 000 000/(64(25+1))=9615

误差=(计算波特率−目标波特率)/目标波特率=(9 615−9 600)/9 600=0.16%

(16)比较器参考电压模块控制寄存器——CVRCON(Comparator Voltage Reference Control Register 2),如表1-22所示。

表1-22 比较器参考电压模块控制寄存器

VREN:VREF使能。

1=开启VREF电路;0=关闭VREF电路。

VROE:VREF输出使能。

1=VREF与比较器模块的VREF相连。电压值也输出到VREF引脚;0=VREF与比较器模块不相连。电压值与VREF引脚无关。

VRR:VREF范围选择。

1=0~0.75 VDD,间隔为VDD/24的步长;0=0.25~0.75 VDD,间隔为VDD/32的步长。

VR3:VR0:VREF值选择VR3:VR0取值为0000~1111(0~15)。

若VRR=1:VREF=(VR<3:0>/24)×VDD;

若VRR=0:VREF=1/4×VDD+(VR3:VR0/32)×VDD。

表1-23列出了典型的参考电压(VDD=5.0 V)。

表1-23 VREF典型参考电压

(17)比较器控制寄存器——CMCOM(Comparator Control Register 2),如表1-24所示。

表1-24 比较器控制寄存器

C2OUT:比较器2输出指示位。

当C2INV=0时:1=表示C2 VIN+>C2 VIN-;0=表示C2 VIN+<C2 VIN-。

当C2INV=1时:1=表示C2 VIN+<C2 VIN-;0=表示C2 VIN+>C2 VIN-。

C1OUT:比较器1输出指示位。

当C1INV=0时:1=表示C1 VIN+>C1 VIN-;0=表示C1 VIN+<C1 VIN-。

当C1INV=1时:1=表示C1 VIN+<C1 VIN-;0=表示C1 VIN+>C1 VIN-。

C2INV:比较器2输出反相位。1=C2OUT反相;0=C2OUT非反相。

C1INV:比较器1输出反相位。1=C1OUT反相;0=C1OUT非反相。

CIS:比较器输入选择位。当CM2:CM0=110时,

1=C1 VIN− 连接RA3/AN3,C2 VIN-连接 RA2/AN2

0=C1 VIN− 连接RA0/AN0,C2 VIN-连接 RA1/AN1

CM2:CM0所有8种配置组合(000~111)列举在第3章相关案例中。

(18)A/D转换器控制寄存器0——ADCON0(ADC Control Register 0),如表1-25所示。

表1-25 A/D转换器控制寄存器

ADCS1:ADCS0:A/D转换时钟选择位,与ADCON1中的ADCS2共3位配置8种不同的A/D转换时钟。所有的8种配置如表1-26所示。

表1-26 A/D转换时钟

CHS2:CHS0:模拟通道选择位。取值000~111分别选择通道AN0~AN7通道。

GO/DONE(或称ADGO):A/D转换状态位。当ADON=1时,1=A/D转换正在进行(该位置1启动A/D转换,A/D转换结束后该位由硬件自动清零);0=未进行A/D转换。

ADON:A/D模块开启位。

1=A/D转换器模块工作;0=A/D转换器关闭,不消耗工作电流。

(19)A/D转换器控制寄存器1-ADCON1(ADC Control Register 1),如表1-27所示。

表1-27 A/D转换器控制寄存器

ADFM:A/D结果格式选择位。

1=右对齐,ADRESH高6位读为0;0=左对齐,ADRESL低6位读为0。

ADCS2与ADCON0的ADCS1、ADCS0配合使用。

PCFG3~PCFG0为A/D端口配置控制位,0000~1111的所有配置组合见第3章相关案例。 LNCaKWYLo7sLOfqC8fRT3HA3IOg+2OtTGO787CpdsNj3wgduCRCw4Z0WpTOko6fi

点击中间区域
呼出菜单
上一章
目录
下一章
×