设计与开发

pic单片机程序实例 PIC系列单片机配置字详细介绍(长期实践总结的压箱底资料)

小编 2024-11-24 设计与开发 23 0

PIC系列单片机配置字详细介绍(长期实践总结的压箱底资料)

(注:本文档主要根据PIC16F193X数据手册编写,对于其他型号的单片机,其配置字可能略有不同,此外本文部分参考了PIC18F78K22数据手册,因而部分注释了两个系列单片机的区别)

1、FCMEN:故障保护时钟监视器使能位

FCMEN_ON:使能 FCMEN_OFF: 禁止(红色表示本人使用PIC单片机所选择的配置,下同)

详细说明:在使器件能在外部振荡器发生故障时继续运行。 FSCM 可以检测当振荡器起振定时器(OST)延时结束后的任何时刻发生的振荡器故障。

如图所示,故障检测器模块内部有一个锁存器。在外部时钟的每个下降沿上将锁存器置1。 在采样时钟的每个上升沿将锁存器清零。 如果采样时钟的一个完整半周期在外部时钟变为低电平之前结束,则将检测到故障。

FC时钟监控框图

FC时钟监控时序

结论:若外部时钟在采样时钟为高电平时间内(约1ms)没有下降沿,则当采样时钟为低电平时认为时钟故障。

注:外部时钟没有经过PLL倍频

2、IESO:内部/外部时钟切换位

IESO_ON:使能切换 IESO_OFF:禁止切换

详细说明:使能后,当外部晶振出错后,单片机会自动切换到内部RC震荡电路作为其工作时钟。

16F1936资料:当MCU上电复位或从休眠模式唤醒时,由于外部震荡电路可能还没稳定,此时可允许先使用内部时钟,然后再切换到外部时钟。

3、CLKOUTEN:时钟输出使能位

CLKOUTEN_ON: 使能 CLKOUTEN_OFF: 禁止

详细说明:使能RA6/CLKOUT 引脚上的CLKOUT 功能,若MPU连接外部石英晶振或陶瓷谐振器,不能使用该功能

4、BOREN<1:0>:欠压复位使能位

BOREN_ON:使能BOR

BOREN_NSLEEP: BOR 在工作时使能,在休眠时禁止

BOREN_SBODEN: BOR 由PCON 寄存器的SBOREN 位控制

BOREN_OFF: 禁止

详细说明:当Vdd 到达可选的最低电平时, BOR 电路将器件保持在复位状态。 在BOR 和POR 之间的整个电压范围内,可实现执行保护功能。可配合PWRT(复位延迟)使用。

BOR原理

5、CPD:数据代码保护位

CPD_ON:使能 CPD_OFF:禁止

详细说明:使能/禁止数据存储器代码保护,擦除操作期间关闭代码保护时,将擦除整个数据EEPROM 的内容。在数据存储器受代码保护时,只有CPU 可对数据EEPROM进行读写操作。

6、CP:代码保护位

CP_ON:使能 CP_OFF:禁止

详细说明:使能/禁止程序存储器代码保护,当关闭代码保护时,将擦除整个程序存储器的内容。使能后,禁止对程序存取器的外部读写操作,若进行读操作,返回0。

7、MCLRE:MCLR/VPP 引脚功能选择位

MCLRE_ON:使能 MCLRE_OFF:禁止

详细说明:仅当LVP=0时有效,外部复位

MCLRE引脚

8、PWRTE:上电延 时定时器使能位

(如果电源上电慢,防止无法启动,MCU必须具有该功能,且必须使能)

PWRET_ON:使能 PWRET_OFF:禁止

详细说明:上电、欠压复位后提供64ms的延迟。

(注:16F1936,16F1946中仅说有64ms的延迟,18F87K22资料中有如下说明:采用LF-INTOSC时钟(31.25KHz,周期为32us)计数,计数寄存器为11bits,因而延迟时间为2048*32us=65.5ms)

复位原理图

9、WDTE<1:0>:看门狗定时器使能位

WDTE_ON:使能

WDTE_NSLEEP:在运行时使能,休眠时禁止

WDTE_SWDTEN:由WDTCON 寄存器中的SWDTEN 位控制

WDTE_OFF:禁止

详细说明:看门狗定时器是系统定时器,如果固件在超时周期内未发出CLRWDT 指令,看门狗定时器将产生复位。

看门狗原理图

通过配置WDTPS,可是设置复位时间2ms-256s(18F为4ms-4196s)。

(注:任何复位,进入休眠模式,从休眠模式唤醒,振荡器故障都会使WDT清0,且复位后默认超时周期为2秒)

10、FOSC<2:0>:振荡器选择位

111 = ECH:外部时钟,高功耗模式:RA7/OSC1/CLKIN 引脚为CLKIN 功能

110 = ECM:外部时钟,中等功耗模式:RA7/OSC1/CLKIN 引脚为CLKIN 功能

101 = ECL:外部时钟,低功耗模式:RA7/OSC1/CLKIN 引脚为CLKIN 功能

100 = INTOSC振荡器:RA7/OSC1/CLKIN 引脚为I/O 功能

011 = EXTRC 振荡器:RA7/OSC1/CLKIN 引脚为RC 功能

010 = HS振荡器:高速晶振/ 谐振器连接到RA6/OSC2/CLKOUT 和RA7/OSC1/CLKIN 引脚

001 = XT振荡器:晶振/ 谐振器连接到RA6/OSC2/CLKOUT 和RA7/OSC1/CLKIN 引脚

000 = LP振荡器:低功耗晶振连接到RA6/OSC2/CLKOUT 和RA7/OSC1/CLKIN 引脚

详细说明:EC模式将外部产生的逻辑电平作为系统时钟源,其中ECH对应4-32 MHz,ECM对应0.5-4 MHz,ECL对应0-0.5 MHz。INTOSC模式采用内部时钟源作为其工作时钟,通过PLL倍频、分频,可产生31KHz-16MHz时钟。LP、XT 和HS 模式支持在OSC1 和OSC2 引脚之间连

接石英晶振或陶瓷谐振器的应用,EXTRC模式支持使用外部RC 电路。

时钟源整体框图

EC模式

石英晶振(LP、XT 或HS模式)

陶瓷谐振器(XT或HS模式)

RC模式

“pic系列单片机有rc、lp、xt、hs等振荡模式。除rc模式外,振荡模式的选择实际上就是环路增益的选择。低增益对应低振荡频率,高增益对应高振荡频率。一般根据实际需要的工作频率可参考数据手册来选择。

11、LVP:低压编程使能位

LVP_ON = 使能低压编程

LVP_OFF = 必须使用MCLR/VPP 引脚上的高压进行编程

详细说明:允许器件在没有高压的情况下仅使用VDD 进行编程。如果使能了低压编程(LVP = 1),将自动使能MCLR复位功能,且无法禁止。

12、DEBUG:在线调试器模式位

DEBUG_OFF = 禁止在线调试器, RB6/ICSPCLK 和RB7/ICSPDAT 是通用I/O 引脚

DEBUG_ON = 使能在线调试器, RB6/ICSPCLK 和RB7/ICSPDAT 专用于调试器

13、BORV:欠压复位电压选择位

BORV_19 = 欠压复位电压设置为1.9V

BORV_= 欠压复位电压设置为2.5V (注:1936,1946资料为2.5V,代码注释为2.7V)

(注:18F87K22为BORV<1:0>,1.8V,2.0V,2.7V,3.0V)

14、STVREN:堆栈上溢/ 下溢复位使能位

STVREN_ON = 堆栈上溢或下溢将导致复位

0STVREN_OFF = 堆栈上溢或下溢不会导致复位

详细说明:MPC在执行调用函数、中断函数等操作时,进行对当前PC值进行堆栈操作,若不使能该功能,堆栈将作为循环缓冲区使用,溢出的PC值将覆盖最早进入堆栈的PC值。

15、PLLEN:PLL 使能位

PLLEN_ON = 使能4xPLL

PLLEN_OFF = 禁止4xPLL

注:配置字禁止该功能时,可在程序中通过设置SPLLEN,选择是否使能4xPLL功能。 (软件启动时,需一段时间后锁相环倍频才能稳定,可查询PLLR,测试PIC16F1946,采用外部4M晶振,震荡器选择HS模式,软件SPLLEN置1,约600指令周期后PLLR为1)

16、 VCAPEN<1:0>:稳压器电容使能位

00 = 在RA0 引脚上使能VCAP 功能

01 = 在RA5 引脚上使能VCAP 功能

10 = 在RA6 引脚上使能VCAP 功能

11 = VCAP 引脚上无电容

详细说明:Vcap是提供给内部稳压器使用的,如果你5V的系统,必须在三个Vcap脚上选择一个接上Cap,而且要在配置位中指定该引脚。如果系统只需要3.3V,无需选择Vcap.

17、WRT<1:0>:闪存自写保护位

4 kW 闪存(仅PIC16F1933/PIC16LF1933 和PIC16F1934/PIC16LF1934):

11 = 写保护关闭

10 = 000h 至1FFh 受写保护, 200h 至FFFh 可以由EECON 控制寄存器修改

01 = 000h 至7FFh 受写保护, 800h 至FFFh 可以由EECON 控制寄存器修改

00 = 000h 至FFFh 受写保护,无可由EECON 控制寄存器修改的地址址

8 kW 闪存(仅PIC16F1936/PIC16LF1936 和PIC16F1937/PIC16LF1937):

11 = 写保护关闭

10 = 000h 至1FFh 受写保护, 200h 至1FFFh 可以由EECON 控制寄存器修改

01 = 000h 至FFFh 受写保护, 1000h 至1FFFh 可以由EECON 控制寄存器修改

00 = 000h 至1FFFh 受写保护,无可由EECON 控制寄存器修改的地址

16 kW 闪存(仅PIC16F1938/PIC16LF1938 和PIC16F1939/PIC16LF1939):

11 = 写保护关闭

10 = 000h 至1FFh 受写保护, 200h 至3FFFh 可以由EECON 控制寄存器修改

01 = 000h 至1FFFh 受写保护, 2000h 至3FFFh 可以由EECON 控制寄存器修改

00 = 000h 至3FFFh 受写保护,无可由EECON 控制寄存器修改的地址

详细说明:写保护用于保护器件不受意外的自写访问。在允许修改程序存储器其他区域的同时可以保护应用程序,例如引导加载程序软件。

推荐配置:__CONFIG(FOSC_HS & WDTE_ON(1) & PWRTE_ON & MCLRE_ON&CP_ON & CPD_OFF & BOREN_ON &CLKOUTEN_OFF & IESO_OFF & FCMEN_ON);

__CONFIG(WRT_OFF & VCAPEN_OFF(2)& PLLEN_ON(3)& STVREN_ON & BORV_19 (4)& DEBUG_OFF & LVP_OFF);

注:

1、关于看门狗配置字WDTE,若某些单片机超时时间较短,而程序初始化时间较长,可选择软件启动,WDTE_SWDTEN,注意对相关寄存器定时设置,或者在初始化程序中 多次清狗

2、如果MCU采用+3.3V供电,则可以不使能VCAP,如果采用+5.0V供电必须使用VCAP。

3、若采用4M外部晶振,采用FOSC_HS 或FOSC_XT可能还需测试确认。

4、复位电压根据MCU工作电压、电源电压范围以及RAM保持电压确认。+3.3V工作推荐为1.9V,+5.0V工作推荐为+5.0V。

pic单片机之中断程序(附实例)

什么是中断程序呢?

形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。在程序方面来说 当CPU在执行一个程序的时候,突然产生了中断事件CPU就去执行中断程序了,当执行完成后CPU又回来执行原先的程序。

中断事件

什么是中断事件,就是引起中断的事件。对于单片机来说这些事件是多种多样的。比如 说一个按键按下,一定的时间到了,一串数据发送完毕,或接收完一个数据。

讲到中断不得不讲讲和中断相对的 查询。其实不管是按键按下 还是 时间到,还是数据发送完毕,这些事实上都可以用查询的方式办到。比如 你是经理 如果你想知道属下任务完成了没有 一种方式就是去询问属下,任务完成没有。早上没完成,下午在问。下午没完成第二天再问。。。。一直到完成为止 这种方式就相当于查询的方式,另一种就是然属下完成任务好直接汇报,在下属执行任务的期间你无需去打挠下属,当下属任务完成后就第一时间向你汇报,这种方式就好像中断。

查询方式:缺点就是可能会大量浪费CPU的时间,不断去查询。如果事情不多还好,可是一旦事情多了会明显感到运行速度变慢。

中断方式:可以用在对时间和响应速度有要求的场合。

具体有哪些事件会引起中断 可以看

1,中断控制寄存器INTCON

2,外设中断允许寄存器 PIEX 注 : X可以是1 2 3 4.。。。不同型号的单片机数目不同

3,外设中断标志寄存器 PIRX 注: X可以是1 2 3 4.。。。不同型号的单片机数目不同

INTCON 中断控制寄存器讲解:

1开启或关闭 全体的中断功能(GIE)

2开启或关闭全体外设的中断功能(PEIE)外设就是在外设中断允许/标志寄存器里面所写的设备。

3开启一些中断事件。

PIEX 与 PIRX 是相互对应的如:当把PIE1的TMR1IE设置为1 定时器timr1将开启中断。等到TMR1定时器溢出后,则会在PIR1的TMRIF将为1,并且执行中断程序。

实例讲解:

我们把上一讲的《PIC单片机之定时器》中的实例修改成中断方式 实现 每隔 50MS亮起LED,每隔50MS灭掉LED。

/*开发环境MPLAB X IDE 芯片型号PIC16LF1823*/

#include

__CONFIG(FOSC_INTOSCWDTE_OFFPWRTE_ONMCLRE_OFFCP_ONCPD_OFFBOREN_ON

CLKOUTEN_OFFIESO_ONFCMEN_ON);//这个要放到上一行去

__CONFIG(PLLEN_OFFLVP_OFF) ;

#define LED LATA5

void init_fosc(void)

{

OSCCON= 0x68;

}

void init_gpio(void)

{

PORTA = 0;

LATA = 0;

ANSELA = 0;

TRISAbits.TRISA5=0;

}

void init_timer0(void)

{

OPTION_REG=0x87;

}

void interrupt isr(void)//中断程序,interrupt是个关键字说明该函数,是中断函数。

{

LED = ~LED;//改变LED的状态

INTCONbits.TMR0IF=0;//清零中断标志位 如果在离开中断程序前没有清零,程序将不停的中断。

TMR0=61;//给TMR0付初始值61 ,开始下一个50ms计时做准备。

//中断函数结束 返回主函数。哪里来回 回那里去,也就是回到主函数的while(1);处

}

int main(int argc, char** argv)

{

init_fosc();

init_gpio();

init_timer0();

INTCONbits.GIE=1; //开启总中断

INTCONbits.TMR0IF=0;//清零TMR0溢出中断标志位

INTCONbits.TMR0IE=1;//开启TMR0溢出中断

TMR0=61;

while(1);//主函数 在此什么都没做一直在死循环。但等到50ms时间到了TMR0将会溢出,程序就会跳到void interrupt isr(void)处执行。

}

我帮大家理清下中断初始设置大致的步骤

1 ,开启总中断,开启外设中断。INTCONbits.GIE=1; INTCONbits.PEIE=1;其实即使没用到外设开启也无妨。

2 ,清楚相应中断的标志位。如INTCONbits.TMR0IF=0;

3 ,开启相应中断。如INTCONbits.TMR0IE=1;

中断函数/程序 中要注意的就是 清零相应的中断标志位 如INTCONbits.TMR0IF=0; 否则单片机会认为中断未被执行 则一直中断。

相关问答

带以太网功能的 pic单片机 ,可以推荐一款不?

个人建议,做以太网的话,不要使用PIC系列的。因为貌似现在只有PIC32系列的才带以太网模块,而PIC32是microchip推出和ARM架构竞争的(但基本拼不过ARM)。所以...

pic单片机 EEPROM肿么编写 程序 啊??-ZOL问答

然后在程序中使用voideeprom_write(unsignedcharaddr,unsignedcharvalu...X:\ProgramFiles\HI-TECHSoftwa...

烧到 PIC单片机 程序 没反应是为什么-ZOL问答

单片机没工作,晶振不起振或者程序的问题你要开发PIC单片机,得一定有调试器,Microchip公司的调试器都能同时作为烧录器用。如ICD2,ICD3,PICKIT2,PICKIT3等。...

PIC单片机 能不能把IO口定义成一个变量?

完全可以!#defineXRA0//先把RA0定义为变量X接下来就可以在其它的函数中直接修改变量X的值了,因为RA0为PORTC中的其中一个I/O引脚,所以变量X为bit类型,...

单片机PIC 16F877A对0V-220V的交流电进行AD转换该如何做呢?要用到哪些元器件或IC芯片呢?

电压互感器隔离降压,有效值转换电路,AD转换电路,877A内部AD精度较低不宜使用电压互感器隔离降压,有效值转换电路,AD转换电路,877A内部AD精度较低不宜使用

PIC单片机 用plc编程还是c语言?

PIC单片机可以用PLC,也可以用C语言编程。应该说用C语言来开发更多。在实际应用中,用C编程有极大的优点。能否用C语言来开发,就看有否相应有C编译器,Microchip...

pic单片机 是什么内核?

PIC单片机采用的是RISC(ReducedInstructionSetComputer)指令集架构,其内核主要基于哈佛结构,具有高性能、低功耗、易于编程等特点。PIC单片机内置了多种功...

怎么用 pic 做小卡?

使用PIC单片机可以制作小卡,首先需要选择合适的PIC型号,根据实际需求设计电路图和PCB板,然后进行程序编写和烧录,最后进行测试和调试,完成小卡的制作。在编...

plc pic ,和 单片机 有什么联系和区别啊?

PLC是可编程逻辑控制器(ProgrammableLogicController)的简写,而PIC则是一款单片机的牌子,PLC类似于简单的计算机系统,通过使用专用的梯形图软件编写控制流程...

vscode可以写 单片机 吗?

vscode可以写单片机。windows下首选VS,版本至少vs2005以上,或者用最新的VSCode,不过需要自己配插件,好处是免费,如果做单片机c开发首选eclipse,linux下如...

猜你喜欢