PIC16F877A.H头文件详细注释
第1章 PIC16F877单片机实验板介绍

第1章PIC16F877单片机实验板介绍美国微芯公司推出的CMOS 8位PIC系列单片机,采用精简指令集(RISC)、哈佛总线结构、2级流水线取指令方式,具有实用、低价、指令集小、简单易学、低功耗、高速度、体积小、功能强等特点,体现了单片机发展的一种新趋势,深受广大用户的欢迎,已逐渐成为单片机发展的新潮流。
PIC16F87X是微芯公司的中档产品。
它采用14位的类RISC指令系统,在保持低价格的前提下,增加了A/D转换器、内部E2PROM存储器、比较输出、捕捉输入、PWM 输出(加上简单的滤波电路后还可以作为D/A输出)、I2C总线和SPI总线接口电路、异步串行通信(USART)接口电路、模拟电压比较器、LCD驱动、FLASH程序存储器等许多功能,可以方便地在线多次编程和调试,特别适用于初学者学习和在产品的开发阶段使用;它也可以作为产品开发的终极产品。
微芯公司还将FLASH芯片做成与OTP芯片价格相近,以致可用FLASH芯片代替OTP芯片。
微芯公司的单片机是品种最丰富的单片机系列之一,被广泛地应用于各种仪器和设备中。
这种单片机具有如下显著的特点:开发容易,周期短:由于PIC采用类RISC指令集,指令数目少(PIC16F87X 仅35条指令),且全部为单字长指令,易学易用;相对于采用CISC(复杂指令集)结构的单片机可节省30 %以上的开发时间、2倍以上的程序空间。
高速:PIC采用哈佛总线和类精简指令集,逐步建立了一种新的工业标准,指令的执行速度比一般的单片机要快4~5倍。
低功耗:PIC采用CMOS电路设计,结合了诸多的节电特性,使其功耗很低;100 %的静态设计可进入休眠(Sleep)省电状态,而不会影响激活后的正常运行。
微芯公司的单片机是各类单片机中低功耗设计最好的产品之一。
低价实用:PIC配备有OTP(One Time Programmable)型、EPROM型及FLASH型等多种形式的芯片,其OTP型芯片的价格很低。
PIC16F877A功能及其编程

4.1.1 端口A
因此,在使用RA口时,除了要设置TRISA外,有 时相关寄存器也要设置。
注意:在上电复位时,与AN有关的端口的默认 设置是作为模拟端口,即ADCON1(见4.6)中默认 值为0b00xx0000,这个值的设置结果是除RA4外的所 有的RA引脚都作为模拟输入。
信的时钟线; RC7/RX/DT:IO引脚、异步串行通信的接收、同步串行通
信的数据线。
4.1.4 端口D
端口D有8个引脚,它除了作为普通IO口外, 还能作为并行从动口使用。
4.1.5 端口E 端口E只有3个引脚,它们都可以作为AD转换
的模拟电压输入口,功能如下:
RE0/RD/AN5:IO引脚、并行从动口的读控制、 模拟电压输入通道AN5;
➢ 中断的特点:可返回性。中断处理结束后必须能 回到原先的程序,并且能继续运行原先的程序,
这就需要在中断时能进行现场保护与恢复。
中断的执行过程
➢ 中断发生:程序执行到某行,突然事件(能够产 生中断的事件)发生,产生中断。
➢ 断点保护:CPU自动将中断时刻即将要执行的下 一条指令的地址压入堆栈。
➢ 中断响应:CPU自动将PC强制设为0X0004,且GIE =0。执行中断服务程序(自动完成现场保护与恢 复,手动清中断标志位)。
将被调试系统占用,因此在调试时此二个引脚暂 不能使用。
3、8个引脚具有内部弱上拉使能控制 由OPTION_REG寄存器的第7位RBPU控制,如果弱 上拉使能,作为输入的RB口在端口悬空时将被上拉 到高电平。以RB0为例,如下图所示:
4、RB0/INT具有外部中断功能。
5、RB的的高4位还具有电平变化中断功能
ADIE
PIC16F877A定时器的学习

PIC16F877A定时器的学习由于实时数据的仿真需要用到定时器产生数据,今天晚上完成PIC16F877A 产生正弦波形,并将波形数据发送到上位机!这是一个三角波的仿真程序,并通过串口发送到上位机#include #include #include#include “main.h”#include“t232.h”#include“lcd.h”#include“timer.h”//define global variablebank1 uchar flag =0 ;//利用flag 判断中断时间是否到了!bank1 char dat[6] ;bank2 char str[]=“shan dong qing gong ye xue yuan”;bank2 char str1[]=“Starting........”;bank2 char str2[]=“Capturing.......”;bank2 char str3[]=“Stop..........” ;//bank2 float test = 0;//bank2 float t1 ;bank2 uchar t1 =0 ;bank2 uchar t2=0 ;bank1 uchar state = READY ;//当前状态bank1 uchar frame[3] ;//帧缓冲bank1 uchar temp ;//ms 级延时程序void DelayMS(uint ms){ uint i; while(ms--){ for(i=0;i//10us 级延时程序void Delay10US(uint us){ uchar i; for(i=0;iwhile(1) {while((t1>=-20)&&(state==CAPTURE)){t1++ ;sprintf(dat,”(%d)”,t1) ;send_str(dat);if(t1==20)break ;}while((t1}tips:感谢大家的阅读,本文由我司收集整编。
PIC16f877中文资料1

PIC16F877原理简介1.1 PIC16F877特性:PIC16F877是由Microchip公司所生产开发的新产品,属于PICmicro系列单片微机,具有Flash program程序内存功能,可以重复烧录程序,适合教学、开发新产品等用途;而其内建ICD(In Circuit Debug)功能,可以让使用者直接在单片机电路或产品上,进行如暂停微处理器执行、观看缓存器内容等,让使用者能快速地进行程序除错与开发。
如图1为PIC16F877的40根接脚图,PDIP是指一般最常见的DIP(Dual In Line Package)包装,而PIC单片机也有PLCC(Plastic Leaded Chip Carrier)与QFP(Quad Flat Package)两种形式的包装,依照不同的需求,寻找不同的包装形式。
如图所示,每根接脚都有其特定功能,例如Pin11与Pin32(VDD)为正电源接脚,Pin12与Pin31(VSS)为地线接脚;而有些接脚有两种甚至三种以上功能,例如Pin2(RA0/AN0)代表PORTA的第一支接脚,在系统重置(Reset)后,可自动成为模拟输入接脚,接收模拟讯号,也可经由程序规划为数字输出输入接脚。
图1. PDIP40引脚PIC16F877接脚说明图2. PDIP28和SOIC28引脚PIC16F877接脚图说明图3. PLCC44引脚PIC16F877脚位图说明图4. QFP44引脚PIC16F877引脚图说明PIC16F877属于闪控式(Flash)单片机,可以重复烧录,其ROM的容量总共是8K words,以2K为一个page,区分为4个pages;内部RAM总共有512个字节(00f~1FFh),以128个字节为一个Bank,共区分为4个Bank,如图5所示,每个Bank的前半段都有其特殊用途,分别连接到其特殊功能模块,例如I/O、CCP、Timer、USART、MSSP等。
第四章PIC16F877A功能及其编程

WDT倍率 1:01
采用1:40M2 Hz晶 最振大,1:延用04时TM多R少0?
1:08 1:16 1:32 1:64 1:128
TMR0的预分频系数范围为2-256,如何获得1:1的倍率?
例:假设晶振振荡频率fosc=4MHz,求TMR0最大延 时时间是多少?
信的时钟线; RC7/RX/DT:IO引脚、异步串行通信的接收、同步串行通
信的数据线。
4.1.4 端口D
端口D有8个引脚,它除了作为普通IO口外, 还能作为并行从动口使用。
4.1.5 端口E 端口E只有3个引脚,它们都可以作为AD转换
的模拟电压输入口,功能如下:
RE0/RD/AN5:IO引脚、并行从动口的读控制、 模拟电压输入通道AN5;
与中断直接相关的位为INTEDG,它涉及到外 部中断(RB0/INT)的中断边沿选择,0为下降沿。
OPTION_REG=0b10111111; //等效 INTEDG=0
注意: ➢ 进入中断后硬件自动屏蔽全局中断,即中断后GIE=0,
中断返回后自动恢复全局中断允许,GIE=1。
➢ 因此,PIC16单片机不允许中断嵌套!也就是说,在 中断服务程序未退出时,即使有新的中断发生,也不 能进入中断。等当前的中断处理完成退出中断后才能 重新进入中断。
工作原理:递加计数。即由计数初值开始,每来若 干个计数脉冲(和预分频比有关),计数值+1,直 到255。若再加1,溢出,同时使计数当前值等于0
TMR0有溢出中断功能,T0IF将自动置1
若要对外部脉冲计数,必须 ①编程OPTION_REG ,(<T0CS>)置1 ②编程TRISA , RA4/T0CKI引脚设置为输入 ③硬件电路:符合一定要求的外部脉冲送RA4/T0CKI
PIC16f877中文资料

PIC16f877中文资料PIC16F877原理简介1.1 PIC16F877特性:PIC16F877是由Microchip公司所生产开发的新产品,属于PICmicro系列单片微机,具有Flash program程序内存功能,可以重复烧录程序,适合教学、开发新产品等用途;而其内建ICD(In Circuit Debug)功能,可以让使用者直接在单片机电路或产品上,进行如暂停微处理器执行、观看缓存器内容等,让使用者能快速地进行程序除错与开发。
如图1为PIC16F877的40根接脚图,PDIP是指一般最常见的DIP(Dual In Line Package)包装,而PIC单片机也有PLCC(Plastic Leaded Chip Carrier)与QFP(Quad Flat Package)两种形式的包装,依照不同的需求,寻找不同的包装形式。
如图所示,每根接脚都有其特定功能,例如Pin11与Pin32(VDD)为正电源接脚,Pin12与Pin31(VSS)为地线接脚;而有些接脚有两种甚至三种以上功能,例如Pin2(RA0/AN0)代表PORTA的第一支接脚,在系统重置(Reset)后,可自动成为模拟输入接脚,接收模拟讯号,也可经由程序规划为数字输出输入接脚。
图1. PDIP40引脚PIC16F877接脚说明图2. PDIP28和SOIC28引脚PIC16F877接脚图说明图3. PLCC44引脚PIC16F877脚位图说明图4. QFP44引脚PIC16F877引脚图说明PIC16F877属于闪控式(Flash)单片机,可以重复烧录,其ROM 的容量总共是8K words,以2K为一个page,区分为4个pages;内部RAM总共有512个字节(00f~1FFh),以128个字节为一个Bank,共区分为4个Bank,如图5所示,每个Bank的前半段都有其特殊用途,分别连接到其特殊功能模块,例如I/O、CCP、Timer、USART、MSSP等。
pic16f877a程序笔记
void main()
{
uchar i;
TRISD=0x00;
while(1)
{
PORTD=0x01;
for(i=8;i>0;i--)
{
delay(200);
PORTD=PORTD<<1;
}
}
}
矩阵+蜂鸣器+数码管程序设计
#include<pic.h>
#define uchar unsigned char
{
PORTD=table[num1];//显示第一个数码管
PORTA=0x20;//0010 0000
delay(2);
PORTD=table[num2];//显示第二个数码管
PORTA=0x10;//0001 0000
delay(2);
PORTD=table[num3];//显示第三个数码管
PORTA=0x08;//0000 1000
void delay(uint x);
void init();
void scan();
void didi(uchar num);
void disp(uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6);
void main()
PORTA=0x01;//0000 0001
delay(2);
}
{
init();
while(1)
{
scan();
disp(key_num,2,3,4,5,6);
}
}
void delay(uint x)
{
uint a,b;
PIC16F877A开发学习板用户手册
KEY_LED 实验步骤: 短接跳线 J23 将 hex 文件下载到单片机中 实验现象:按下 GPIO 键,松开后,led 点亮;按下 INT 健,松开后,led 灭 KEY_ZTJ 10、 矩阵键盘实验 KEY_JZH 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚 将 hex 文件下载到单片机中 实验现象:按下按键,数码管显示键值 11、 定时器/计数器 T0 实验 T0_DSQ 实验步骤: 短接跳线 J23 将 hex 文件下载到单片机中 实验现象:下载代码,运行程序,LED 闪烁 T0_JS_1 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚
断电后数据保持,上电后,从断电时的值开始加(写入 24C02 的数据为 1 递加到 99,LCD1602 从 24C02 中读数据之后显示)
AT24C02 实验步骤: 短接跳线 J18 上面两个引脚和 J22 上面两个引脚 将 hex 文件下载到单片机中 将 1602 液晶屏插入 1602 接口 如果此时没有显示则按复位键便可正常显示 实验现象:1602 第一行显示数值,数值从 1 加到 99, 断电后数据保持,上电后,从断电时的值开始加 17、 模数转换 AD 实验 AD_1
将 hex 文件下载到单片机中 实验现象:LED 灯依次点亮 2、 数码管实验 SMG 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚 将 hex 文件下载到单片机中 实验现象:8 个数码管依次显示 0~7 SMG_JT 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚 将 hex 文件下载到单片机中 实验现象:数码管静态显示一个数字 74HC595_SMG 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚 将 hex 文件下载到单片机中 实验现象:8 位数码管显示 0-7 3、 蜂鸣器实验 BUZZER 实验步骤: 短接跳线 J6
第二讲,PIC16F877的硬件系统,20090714
一、PIC16F877核心区域的 核心区域的 部件及其功能
程序存储器:8K*14 flash程序区 PC指针:程序计数器。 硬件堆栈:共有8层,在调用子程序时自动保存 主程序断点处的地址。至于其它的寄存器的内 容则需要用软件编程来保存。 指令寄存器: 暂存从程序存储器中取出的指令,并将指令 分解为操作码和操作数<或者操作数的地址>, 分别送到不同的目的地。
PIC16F877(A)具有8*13的独立堆栈空间, 不占用程序存储器和数据存储器的区域,也 不需要进栈出栈的指令,在调用和返回时自 动实现入口地址的进出栈操作,遵循“后进 先出”的规则。
六、数据存储器
数据存储器的特点
PIC单片机内的数据寄存器分为两种: 一是工作寄存器,只有W寄存器; 一是数据寄存器RAM,又叫文件寄存器,它包 括所有的特殊功能寄存器、通用寄存器以及所有的 输入输出端口。PIC中的RAM除了具备普通RAM可读 可写的功能外,还能实现移位、置位、清位、位测 试等一系列其它单片机中“工作寄存器”的功能。 掉电后,RAM中的内容消失。
RAM数据存储器结构 数据存储器结构
PIC16F877结构 —— 时钟电路
PIC16F877的时钟按提供时钟的速度快慢分成四种模式,模式 的时钟按提供时钟的速度快慢分成四种模式, 的时钟按提供时钟的速度快慢分成四种模式 的选用是由单片机中配置字中FOSC0位和 位和FOSC1位来设定: 位来设定: 的选用是由单片机中配置字中 位和 位来设定 LP模式 模式——低功耗振荡器(Low Power Crystal) 低功耗振荡器( 模式 低功耗振荡器 ) XT模式 模式——标准的振荡器 谐振器(Crystal/Resonator) 标准的振荡器/谐振器 模式 标准的振荡器 谐振器( ) HS模式 模式——高速振荡器 谐振器(High speed 高速振荡器/谐振器 模式 高速振荡器 谐振器( Crystal/Resonator ) RC模式 模式——低成本的电阻器 电容器(Resistor/Capacitor) 低成本的电阻器/电容器 模式 低成本的电阻器 电容器( )
PIC16F877A单片机中文文献
PIC16F877A单片机是microchip公司的产品,它采用14位的RISC指令系统,内部集成了A/D转换器、EEPROM、模拟比较器、带比较和捕捉功能的定时器/计数器、PWM输出、异步串行通信电路等。
1.程序存储器程序存储器和堆栈PIC16F877A单片机内部具有8K×14位的Flash程序存储器,程序存储器具有13位宽度的程序计数器地址范围:0000H-1FFFH。
由程序计数器提供13条地址线进行单元选择,每个单元宽14位,即PIC16F877A的指令字节宽度为14位,能够存放一条PIC单片机系统指令。
在系统上电或其他复位情况下,程序计数器均从0000H地址单元开始工作。
如果遇到调用子程序或系统发生事件中断时,将把当前程序断点处的地址送入8级×14位的堆栈区域进行保护。
堆栈是一个独立的存储区域,在调用的子程序或中断服务程序执行完后,再恢复断点地址。
通过14位程序总线,取出对应程序之灵的机器码,送入指令存储器,将组成的操作码和操作数进行有效分离。
如果操作数为地址,则进入地址复用器;如果操作数为数据,则进入数据复用器。
而操作码将在指令译码和控制单元中转化为相应的功能操作。
PIC的多数指令均是顺序执行,即使条件跳转也是隔行间接跳转。
具有大范围转移功能的指令只有两条:无条件GOTO语句和调用子程序CALL语句。
但它们受到2KB范围的约束。
所以必须将整个程序存储器以2KB为单位进行分页。
PIC16F877A单片机的上电复位地址是0000H,中端口地址是0004H,中断产生时PC指针会自动指向该地址。
在进行中断应用时,特别是涉及多个中断同时打开时,必须要逐个对中断标志进行判断。
编程时,在0000H-0003H单元内要放置一条GOTO跳转指令,跳转到主程序,以避开0004H存储器单元。
2.数据存储器数据存储器PIC单片机的数据存储器与传统的MCS-51单片机一样,在配置结构上可分为通用寄存器和特殊功能寄存器两大类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//PIC16F877A.H头文件详细注释/* Header file for the Microchip* PIC 16F873A chip* PIC 16F874A chip* PIC 16F876A chip* PIC 16F877A chip* Midrange Microcontroller*/#if defined(_16F874A) || defined(_16F877A)#define __PINS_40#endifstatic volatile unsigned char INDF @ 0x00; //间接寻址寄存器static volatile unsigned char TMR0 @ 0x01; //定时器0static volatile unsigned char PCL @ 0x02; //低8位程序计数器static volatile unsigned char STA TUS @ 0x03; //程序状态寄存器static unsigned char FSR @ 0x04; //特殊功能寄存器static volatile unsigned char PORTA @ 0x05; //端口A寄存器static volatile unsigned char PORTB @ 0x06; //端口B寄存器static volatile unsigned char PORTC @ 0x07; //端口C寄存器#ifdef __PINS_40static volatile unsigned char PORTD @ 0x08; //端口D寄存器static volatile unsigned char PORTE @ 0x09; //端口E寄存器#endifstatic unsigned char PCLA TH @ 0x0A; //高5位程序计数器static volatile unsigned char INTCON @ 0x0B; //中断控制寄存器static volatile unsigned char PIR1 @ 0x0C; //中断标志寄存器PIR1static volatile unsigned char PIR2 @ 0x0D; //中断标志寄存器PIR2static volatile unsigned char TMR1L @ 0x0E; //低字节计数寄存器static volatile unsigned char TMR1H @ 0x0F; //高字节计数寄存器static volatile unsigned char T1CON @ 0x10; //TMR1控制寄存器static volatile unsigned char TMR2 @ 0x11; //定时/计数器TMR2static volatile unsigned char T2CON @ 0x12; //TMR2控制寄存器static volatile unsigned char SSPBUF @ 0x13; //收/发数据缓冲器static volatile unsigned char SSPCON @ 0x14; //同步串口控制寄存器,对MSSP模块的功能和指标进行设置和定义。
static volatile unsigned char CCPR1L @ 0x15; //捕获/比较/PWM寄存器低字节static volatile unsigned char CCPR1H @ 0x16; //捕获/比较/PWM寄存器低字节static volatile unsigned char CCP1CON @ 0x17; //CCP1CON寄存器static volatile unsigned char RCSTA @ 0x18; //USART接收控制兼状态寄存器static volatile unsigned char TXREG @ 0x19; //USART发生缓冲器static volatile unsigned char RCREG @ 0x1A; //USART接收缓冲器static volatile unsigned char CCPR2L @ 0x1B; //捕获/比较/PWM寄存器低字节static volatile unsigned char CCPR2H @ 0x1C; //捕获/比较/PWM寄存器低字节static volatile unsigned char CCP2CON @ 0x1D; //CCP2CON寄存器static volatile unsigned char ADRESH @ 0x1E; //ADC转换结果寄存器高字节static volatile unsigned char ADCON0 @ 0x1F; //A/D转换器开关位。
/* bank 1 registers */static unsigned char bank1 OPTION @ 0x81; //选择寄存器,用于配置TMR0/WDT预分频系数、外部INT中断、TMR0和端口B的弱上拉。
static volatile unsigned char bank1 TRISA @ 0x85; //A口方向寄存器static volatile unsigned char bank1 TRISB @ 0x86; //B口方向寄存器static volatile unsigned char bank1 TRISC @ 0x87; //C口方向寄存器#ifdef __PINS_40static volatile unsigned char bank1 TRISD @ 0x88; //D口方向寄存器static volatile unsigned char bank1 TRISE @ 0x89; //E口方向寄存器#endifstatic volatile unsigned char bank1 PIE1 @ 0x8C; //中断允许寄存器PIE1static volatile unsigned char bank1 PIE2 @ 0x8D; //中断允许寄存器PIE2static volatile unsigned char bank1 PCON @ 0x8E; //电源控制状态寄存器static volatile unsigned char bank1 SSPCON2 @ 0x91; //MSSP控制寄存器2static volatile unsigned char bank1 PR2 @ 0x92; //TMR2周期寄存器static volatile unsigned char bank1 SSPADD @ 0x93; //同步串口地址寄存器static volatile unsigned char bank1 SSPSTA T @ 0x94; //同步串口状态寄存器static volatile unsigned char bank1 TXSTA @ 0x98; //USART发生控制兼状态寄存器static volatile unsigned char bank1 SPBRG @ 0x99; //USART波特率发生器初值寄存器static volatile unsigned char bank1 CMCON @ 0x9C; //比较控制寄存器static volatile unsigned char bank1 CVRCON @ 0x9D; //比较电压参考控制寄存器static volatile unsigned char bank1 ADRESL @ 0x9E; //ADC转换结果寄存器低字节static volatile unsigned char bank1 ADCON1 @ 0x9F; //ADC控制寄存器ADCON1/* bank 2 registers */static volatile unsigned char bank2 EEDA TA @ 0x10C; //EEPROM数据寄存器低字节static volatile unsigned char bank2 EEADR @ 0x10D; //EEPROM地址寄存器低字节static volatile unsigned char bank2 EEDA TH @ 0x10E; //EEPROM数据寄存器高字节static volatile unsigned char bank2 EEADRH @ 0x10F; //EEPROM地址寄存器高字节/* bank 3 registers */static volatile unsigned char bank3 EECON1 @ 0x18C; //EEPROM控制寄存器1static volatile unsigned char bank3 EECON2 @ 0x18D; //EEPROM控制寄存器2//* STA TUS bits状态寄存器*/static volatile bit IRP @ (unsigned)&STA TUS*8+7; //寄存器bank选择位(用于间接寻址)。
0:bank0,1;1:bank2,3static volatile bit RP1 @ (unsigned)&STA TUS*8+6; //寄存器bank选择位(用于直接寻址)。
PR1:PR0:00:BANK0;01:BANK1;10:BANK2;11BANK3.static volatile bit RP0 @ (unsigned)&STA TUS*8+5; //static volatile bit TO @ (unsigned)&STA TUS*8+4; //超时位。
0:WDT超时发生;1:上电后,执行了CLRWDT或者SLEEP指令static volatile bit PD @ (unsigned)&STA TUS*8+3; //掉电标志位。
0:执行完SLEEP指令;1:上电后或者执行CLRWDT指令static volatile bit ZERO @ (unsigned)&STA TUS*8+2; //零标志位。
0:算术或逻辑操作结果不为0;1:反之。
static volatile bit DC @ (unsigned)&STA TUS*8+1; //数字进位/退位标志位。
0:结果的低4位没有发生进位;1:反之。
static volatile bit CARRY@ (unsigned)&STA TUS*8+0; //进位/退位标志位。