要阅读先前关于PIC 16F877基础知识的文章,请单击下面的链接。
看一看:外围接口控制器(PIC)
看一看:pic167f877简介
在PIC16F877中注册存储器组织
寄存器是用于读取或写入数据/程序的图片中的一个位置。PIC的存储器分为一系列寄存器。每个寄存器都有自己的地址和内存位置。这些地址通常通过使用十六进制数表示。根据工作和用法的类型,PIC中的寄存器分为两类。
通用寄存器(GPR)
GPR是一种比任何其他存储器都能更快访问的少量存储器。这些寄存器文件可以通过文件选择寄存器(FSR)直接或间接访问。通用寄存器(GPR)存储器映射(PIC16F877A)如下图所示。
特殊功能寄存器(SFR)
特殊功能寄存器也是用于特殊专用功能的存储器寄存器。这些寄存器在PIC芯片内执行各种专用功能。PIC芯片中的每个特殊功能都是通过使用这些寄存器来控制的。CPU和外围模块使用这些寄存器来控制设备的所需操作。这些寄存器通常以静态RAM存储器的形式实现。下表列出了这些寄存器的列表。特殊功能寄存器可分为两组:核心(CPU)和外围设备。本节详细描述了与核心功能相关的寄存器。下图显示了PIC16F877的SFR内存映射。
状态寄存器
状态寄存器是一个8位寄存器,包含算术逻辑单元(ALU)的算术状态、复位状态和数据存储器的银行选择位。下面是状态寄存器的详细说明。
状态寄存器(地址03h,83h,103h和183h)
r / w * -0 | R / w 0 | R / w 0 | R-1 | R-1 | r / w-x ** | r / w-x | r / w-x |
IRP | RP1. | RP0. | 到 | PD. | Z | 直流 | C |
Bit7位0.
(*R/W-可读/可写,**x-未知位)
- 第7位- (IRP):这是一个寄存器银行选择位,通常用于间接寻址模式。
- 位6-5(rp1:rp0):这些位是常用用于直接寻址模式的寄存器组选择位(此模式下的每个银行携带128副)
(11 =银行3(180H-1FFH)
10=气缸组2(100h-17Fh)
01 =银行1(80H-FFH)
00 = Bank 0(00H-7FH))
- 第4位,(TO):这是一个超时位,用于计时、计数、休眠和复位功能。
(1 =开机后,CLRWDT指令或SLEEP指令
0 =发生WDT超时))
- 第3位(PD):下电位
(1 =上电后或通过CLRWDT指令
0 =执行睡眠指令)
- 位2,(z):零位
(1 =算术或逻辑操作的结果为零
0 =算术或逻辑操作的结果不是零。)
- 位1 DC:数字携带/借用位(ADDWF,AddLW,Sublw,Subwf指令)
(对于借用,极性颠倒)
(1 =从结果的第4低阶位进位
0 =没有从结果的第4个低阶位执行。)
- 位0(c):携带/借用位(addwf,addlw,sublw,subwf指令)
(1=从结果的最高有效位执行的进位
0 =没有从结果的最高有效位执行。)
选项寄存器
选项Register是一个可读和可写的寄存器,它包含各种控制位来配置TMR0预分配器/WDT后标量器(单个可分配寄存器也称为预标量器)、外部INT中断、TMR0和PORTB上的弱上拉。期权寄存器的结构如下所示。
R / w1 | R / w1 | R / w1 | R / w1 | R / w1 | R / w1 | R / w1 | R / w1 |
RBPU(反转) | INTEDG | t0cs. | T0SE. | PSA | PS2 | PS1 | PS0 |
7 0
- Bit 7 (RBPU):这是一个PORTB上拉使能位。如果这个位是' 1 ',那么PORTB上拉功能被禁用。如果该位为' 0 ',则通过单个端口闩锁值启用上拉功能。
(1=端口B上拉被禁用。
0 = PORTB上拉由单个端口锁存值启用。)
- 位6(Intedg):这是一个中断边缘选择位。如果中断位于raisin边缘或下降沿,则该位决定。下面给出了该位的功能。
(1 = RB0 / INT引脚上升沿上的中断。
0=RB0/INT引脚下降沿中断。)
- 第5位(T0CS):这是一个定时器-0(TMR0)时钟源选择位,其功能如下所示。
(1=RA4/T0CKI销上的过渡。
0 =内部指令周期时钟(CLKO)。)
- 位4(T0SE):TMR0源边选择位,用于选择定时器0源边。
(1 = RA4 / T0cki引脚上的高到低过渡递增。
0 = RA4 / T0CKI引脚上的低到高转换的增量。)
- 位3(PSA):预分频器分配位。
(1 =预分频器被分配给手表狗定时器(WDT)。
0=将预分频器分配给定时器0模块。)
- 比特2-0(PS2:PS0):预分频器速率选择比特。
INTCON寄存器
Intcon寄存器是一个可读性的可写寄存器,其中包含各种启用和标志位
TMR0寄存器溢出,RB端口更改和外部RB0 / INT引脚中断。下面给出了该寄存器的架构。
R / w 0 | R / w 0 | R / w 0 | R / w 0 | R / w 0 | R / w 0 | R / w 0 | r / w-x |
g | 佩 | tmr0ie. | INTE | rbie. | TMR0IF. | INTF | rbif. |
- 位7gie:全局中断使能位。如果该位为enable(' 1 '),也启用所有未屏蔽中断;如果该位为0(' 0 '),则禁用所有中断。
(1 =启用所有未屏蔽中断。
0 =禁用所有中断。)
- 第6位(PEIE):这是一个外围中断启用位,用于控制外围中断。如果该位为启用(“1”),则还将启用所有未屏蔽的外围中断,如果为禁用(“0”),则还将禁用所有活动的外围中断动作。
(1=启用所有未屏蔽的外围中断
0 =禁用所有外设中断)
- 第5位(TMR0IE):这是定时器0(TMR0)溢出中断使能位,它控制定时器0中的溢出中断。
(1 =开启TMR0中断
0=禁用TMR0中断)
- 位4(INTE):这是一个RB0/INT外部中断启用位,用于启用/禁用外部中断。
(1=启用RB0/INT外部中断
0 =禁用RB0 / int外部中断)
- 位3(RBIE):控制端口B更改中断的RB端口更改中断启用位。
(1 =开启RB端口变更中断。
0=禁用RB端口更改中断。)
- 位2(TMR0IF):TMR0溢出中断标志位控制定时器0的溢出。
(1 = TMR0寄存器溢出[必须在软件中清除]
0 = TMR0寄存器没有溢出)
- 位1(INTF):RB0/INT外部中断标志控制位。
(1=发生RB0/INT外部中断(必须在软件中清除)
0 = RB0/INT外部中断未发生)。
- Bit 0 (RBIF): RB端口改变中断标志位。
(1 = RB7:RB4引脚的至少一个改变状态;不匹配条件将继续设置该位。读数PortB将结束不匹配状态并允许该位清除
[必须在软件中清除])。
Pie1注册
PIE1寄存器包含用于外围中断的各个启用位。该寄存器的结构如下所示。
R / w 0 | R / w 0 | R / w 0 | R / w 0 | R / w 0 | R / w 0 | R / w 0 | R / w 0 |
PSPIE | 爱狄 | RCIE | TXIE | SSPIE. | ccp1ie. | TMR2IE | TMR1IE |
- 位7(PSPIE):该位是并行从端口读/写中断启用位
(1 =启用PSP读/写中断
0 =禁用PSP读写中断)
- 位6(ADIE):A / D转换器中断使能位控制模拟与数字转换器中断。
(1 =允许A/D转换器中断
0 =禁用A/D转换器中断)
- 位5(RCIE):控制USART数据接收中断的USART接收中断启用位。
(1=启用USART接收中断
0 =禁用USART接收中断)
- 位4(TXIE):USART发送中断使能位控制USART数据传输。
(1 =启用USART传输中断
0 =禁用USART发送中断)
- Bit 3 (SSPIE):同步串行端口中断使能位,控制SSP数据中断。
(1 =启用SSP中断
0=禁用SSP中断)
- 位2(CCP1IE):CCP1中断使能位控制捕获比较脉冲宽度调制中断。
(1 =开启CCP1中断
0 =禁用CCP1中断)
- Bit 1 (TMR2IE): TMR2到PR2匹配中断使能位。
(1 =开启TMR2到PR2匹配中断
0=禁用TMR2至PR2匹配中断)
- 位0(TMR1IE):TMR1溢出中断使能位控制定时器1模块的溢出中断。
(1 =启用TMR1溢出中断
0 =禁用TMR1溢出中断)
PIR1注册
PiR1寄存器包含外围中断的单个标志位。PiR1寄存器的结构如下所述。
R / w 0 | R / w 0 | R-0. | R-0. | R / w 0 | R / w 0 | R / w 0 | R / w 0 |
PSPIF | ADIF | RCIF | TXIF | SSPIF. | ccp1if. | TMR2IF | TMR1IF |
- 第7位(PSPIF):并行从端口读写中断标志位。
(1 =已发生读取或写入操作(必须在软件中清除)
0 =没有发生读取或写)
- 位6(ADIF):A / D转换器中断标志标志位,用于控制该模数转换器的中断标志。
(1 = A/D转换完成
0 = A / D转换不完整)
- 位5(RCIF):USART接收中断标志位。
(1=USART接收缓冲区已满
0=USART接收缓冲区为空)
- 第4位(TXIF): USART传输中断标志位。
(1 = USART发送缓冲区为空
0=USART传输缓冲区已满)
- 位3(SSPIF):同步串口(SSP)控制图片中的SSP中断标志的中断标志位。
(1 = SSP中断条件发生,必须在从中断服务程序返回之前在软件中清除。将设置该位的条件是:
•SPI - 传输/接收发生。
•I2C奴隶 - 传输/接收已发生。
•I2C主人
- 传输/接收发生了。
- SSP模块完成发起的开始条件。
–启动的停止条件由SSP模块完成。
- SSP模块完成了启动的重启条件。
- SSP模块完成了启动的确认条件。
—SSP模块空闲(多主系统)时出现启动条件。
—SSP模块空闲(多主系统)时发生停止状态。
0 =没有发生SSP中断条件)
- 第2位(CCP1IF): CCP1中断标志位,控制捕获比较脉冲宽度调制中断标志。它有三种模式。它们如下所示。
1.捕获模式:
1=发生TMR1寄存器捕获(必须在软件中清除)
0 =没有发生TMR1寄存器捕获
2.比较模式:
1 =发生TMR1寄存器比较匹配(必须在软件中清除)
0=未发生TMR1寄存器比较匹配
3.PWM模式:
- 位1(TMR2IF):TMR2至PR2匹配中断标志位
(1=TMR2与PR2发生匹配(必须在软件中清除)
0 =没有TMR2到PR2匹配发生)
- 位0(TMR1IF):TMR1溢出中断标志位。
(1=TMR1寄存器溢出(必须在软件中清除)
0=TMR1寄存器未溢出)
PIE2注册
Pie2寄存器包含CCP2外设中断的单个使能位,SSP总线冲突
中断,EEPROM写操作中断和比较器中断。这个寄存器的结构如下所示。
U-0 | R / w 0 | U-0 | R / w 0 | R / w 0 | U-0 | U-0 | R / w 0 |
- - - | CMIE | - - - | eeie. | BCLIE. | ------ | - - - | CCP2IE |
- Bit 7未实现:阅读为“0”
- 第6位(CMIE):比较器中断使能位
(1 =启用比较器中断
0 =禁用比较器中断)
- 第5位未实现:读作“0”
位4(EEIE):EEPROM写入操作中断启用位
(1 =使能EEPROM写中断
0 =禁用EEPROM写入中断)
- 第3位(BCLIE):总线碰撞中断启用位。
(1 =启用总线冲突中断
0 =禁用总线碰撞中断)
- 第2-1位未实现:读取为' 0 '
- 位0(CCP2IE):CCP2中断使能位。
(1 =启用CCP2中断
0 =禁用CCP2中断)
PIR2注册
PIR2寄存器包含CCP2中断、SSP总线冲突中断、EEPROM写操作中断和比较器中断的标志位。这个寄存器的结构如下所示。
U-0 | R / w 0 | U-0 | R / w 0 | R / w 0 | U-0 | U-0 | R / w 0 |
- - - | CMIF | - - - | EEIF. | BCLIF. | - - - | - - - | CCP2IF |
- Bit 7未实现:阅读为“0”
- 第6位(CMIF):比较器中断标志位
(1=比较器输入已更改(必须在软件中清除)
0 =比较器输入没有改变)
- 第5位未实现:读作“0”
- 位4(EEIF):EEPROM写操作中断标志位。
(1 =完成写操作(必须在软件中清除)
0 =写操作未完成或尚未开始)
- 第3位(BCLIF):总线冲突中断标志位。
(1 =在SSP配置为I2C主模式时,SSP中发生了总线冲突
0 =没有发生总线碰撞)
- 第2-1位未实现:读取为' 0 '
- 位0(CCP2IF):CCP2中断标志位。这也适用于三种模式。它们是
1.捕获模式:
1=发生TMR1寄存器捕获(必须在软件中清除)
0 =没有发生TMR1寄存器捕获
比较模式:
1 =发生TMR1寄存器比较匹配(必须在软件中清除)
0=未发生TMR1寄存器比较匹配
2. PWM模式:
该模式不使用。
PCON注册
电源控制(PCON)寄存器包含标志位,以允许在电源复位之间进行差异
(POR),一个欠压复位(BOR),看门狗复位(WDT)和外部MCLR复位。这个寄存器的结构如下所示。
U-0 | U-0 | U-0 | U-0 | U-0 | U-0 | R / w 0 | R / w1 |
—— | --- | --- | --- | --- | --- | (反相) | BOR(反相) |
- Bit 7-2未实现:阅读为“0”
- 位1(POR):上电复位状态位
(1 =没有上电复位
0 =上电复位(上电复位后必须在软件中设置)
- 位0(BOR):棕色输出复位状态位
(1=未发生褐灭重置
0=发生棕出重置(必须在棕出重置发生后在软件中设置)。
6注释
http://www.pinterest.com/obralsurabaya1//
该程序将帮助您计算脉冲并在LCD显示屏中显示它
# include
#include“delay.h”
#包括“lcd.h”
__config(0x3f71);
#define lcd_rs rc0.
#define lcd_en rc1.
#定义LCD_DATA PORTD
静态无符号整数秒;
静态无符号整数频率;
静态unsigned char stat;
/ /液晶显示子程序
/ *在4位模式下将字节写入LCD * /
/ *初始化LCD - 投入4位模式* /
空白lcd_init(空白)
{
lcd_rs = 0;
lcd_en = 0;
延迟(100);//施用电源后等待15毫秒,
lcd_write(0x01);//
lcd_rs = 0;
lcd_write(0x38);//
lcd_rs = 0;
lcd_write(0x0c);//显示在,光标上,光标关闭
lcd_rs = 0;
lcd_write (0 x06);//设置入口模式
}
/ /端口初始化
空白port_init(空白)
{
TRISE = 0;
端口=0;
}
//主要功能
void main()
{
静态无符号字;
ADCON1=0x06;
trisc = 0x08;
portc = 0;
TRISD = 0;
PORTD=0;
trisb = 0xff;
// portb = 0;
lcd_init();
lcd_goto0 (0);
lcd_rs = 1;
lcd_puts(“脑拍白”);
lcd_goto1 (0);
lcd_puts(“state =”);
port_init();
/ /如果(PORTB ^ 1 = = 1)
stat=0xff;
而(1)
{a = portb;
if((a&0x02)==(stat&0x02))
{stat=~stat;
弗雷克++;
}
延迟(10);
秒+ +;
如果(sec = = 200)
{sec = 0;
频率=频率*100;
if(freq> 50 && freq400 && freq800 && freq1350)
{lcd_goto1 (8);
lcd_puts(“退出”);
freq = 0;
}
freq = 0;
}
}
}
如何创建PIC16F877A中计算脉冲的程序