PIC16F877A.H头文件详细注释
- 格式:doc
- 大小:97.50 KB
- 文档页数:10
第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定时器的学习由于实时数据的仿真需要用到定时器产生数据,今天晚上完成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.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等。
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单片机是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单片机一样,在配置结构上可分为通用寄存器和特殊功能寄存器两大类。
//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; //进位/退位标志位。