PIC16F877A的特殊功能配置
- 格式:pdf
- 大小:94.00 KB
- 文档页数:2
一、系统主要功能1)基本要求1.硬件设计要求:(1)CPU使用PIC16F877A。
(2)用4x4矩阵键盘作为操作信息输入。
(3)用LCD1602或六位数码管作为信息输出。
(建议使用LCD1602)(4)用蜂鸣器及发光二极管作为错误报警及状态显示。
2.系统功能要求:(1)输入密码功能。
输入密码时用“*”号或“-”显示。
在输入密码时,具有清除前一位密码功能(用CLR键)。
密码输入完毕,按(ENTER键)确认并生效。
(2)上锁功能。
在锁开状态下,通过(LOCK键)上锁。
(3)在锁合的状态下,通过密码开锁功能。
开锁时,直接在键盘上输入六位密码,按(ENTER键)确认,如果密码正确,转入锁开状态。
(4)在锁开状态下,修改密码功能。
在键盘上输入六位新的密码,按(ENTER键)确认,代替旧密码,并保存在RAM中。
(4)在开锁时,如果输入密码三次错误,产生声、光报警功能。
(5)0~9为密码键数字键,E为ENTER键,C为清除键CLR键,D作为上锁键LOCK键,如果用到其他键时,可自行定义。
2)进阶要求密码保存在PIC16F877A内部的EEPROM中,以防断电密码丢失。
(不使用外挂的EEPROM,如:AT24C02等)二、系统设计要求1)根据系统的功能和目标,画出系统功能框图。
2)根据系统功能框图用Proteus画出仿真电路图。
3)根据系统的功能要求,画出程序流程图。
4)根据程序流程图,用PIC C语言编写系统源程序。
5)进行编译、调试建立目标代码。
6)在Proteus环境下进行仿真。
三、设计报告报告内容包括系统设计思路、方案选择、器件选择及电路元器件明细表、系统功能框图、程序流程图、源程序清单、系统工作原理和设计心得等。
四、评分标准:1、完成《基本要求》者,得分80~89分;2、完成《基本要求》及《进阶要求》者,得分90~100分;五、设计时间安排十九周的星期一至星期五(2011年6月27日至7月1日)1)周一:布置任务,进行方案选择、器件选择。
pic16f877a编程实例pic16f877a是一款常用的单片机,被广泛应用于嵌入式系统中。
它具有多种功能和强大的性能,可以实现各种应用需求。
本文将以pic16f877a编程实例为主题,介绍其基本特性和常见应用。
pic16f877a是一款8位单片机,采用哈佛架构,具有高性能和低功耗的特点。
它内置了8KB的程序存储器,368字节的数据存储器,以及35个I/O引脚,可以满足大多数嵌入式系统的需求。
我们来看一个简单的实例,通过pic16f877a控制LED灯的开关。
```c#include <pic16f877a.h>void main() {TRISB0 = 0; // 设置RB0为输出引脚while(1) {RB0 = 1; // 将RB0引脚电平设置为高,LED灯亮__delay_ms(1000); // 延时1秒RB0 = 0; // 将RB0引脚电平设置为低,LED灯灭__delay_ms(1000); // 延时1秒}}```在上面的程序中,我们首先将RB0引脚设置为输出引脚,然后进入一个无限循环。
在循环中,我们将RB0引脚电平设置为高,LED灯亮起,然后延时1秒;然后将RB0引脚电平设置为低,LED灯熄灭,再次延时1秒。
通过不断重复这个过程,我们可以实现LED灯的闪烁效果。
除了控制LED灯,pic16f877a还可以用来控制其他外设,如蜂鸣器、液晶显示屏等。
下面是一个使用pic16f877a控制蜂鸣器的实例。
```c#include <pic16f877a.h>void main() {TRISB0 = 0; // 设置RB0为输出引脚while(1) {RB0 = 1; // 将RB0引脚电平设置为高,蜂鸣器鸣叫__delay_ms(1000); // 延时1秒RB0 = 0; // 将RB0引脚电平设置为低,蜂鸣器停止鸣叫__delay_ms(1000); // 延时1秒}}```在上面的程序中,我们同样将RB0引脚设置为输出引脚,并进入一个无限循环。
#ifndef _HTC_H_#warning Header file pic168xa.h included directly. Use #include <htc.h> instead. #endif/** Microchip单片机的头文件* PIC 16F873A chip* PIC 16F874A chip* PIC 16F876A chip* PIC 16F877A chip* 中档单片机*/#if defined(_16F874A) || defined(_16F877A)#define __PINS_40#endifvolatile unsigned char INDF @ 0x00;//间接寻址寄存器volatile unsigned char TMR0 @ 0x01;//定时器0volatile unsigned char PCL @ 0x02;//低8位程序计数器volatile unsigned char STATUS @ 0x03;//程序状态寄存器volatile unsigned char FSR @ 0x04;//特殊功能寄存器volatile unsigned char PORTA @ 0x05;//端口A寄存器volatile unsigned char PORTB @ 0x06;//端口B寄存器volatile unsigned char PORTC @ 0x07;//端口C寄存器#ifdef __PINS_40volatile unsigned char PORTD @ 0x08;//端口D寄存器volatile unsigned char PORTE @ 0x09;//端口E寄存器#endifvolatile unsigned char PCLATH @ 0x0A;//高5位程序计数器volatile unsigned char INTCON @ 0x0B;//中断控制寄存器volatile unsigned char PIR1 @ 0x0C;//中断标志寄存器PIR1volatile unsigned char PIR2 @ 0x0D;//中断标志寄存器PIR2volatile unsigned char TMR1L @ 0x0E;//T1低字节计数寄存器volatile unsigned char TMR1H @ 0x0F;//T1高字节计数寄存器volatile unsigned char T1CON @ 0x10;//TMR1控制寄存器volatile unsigned char TMR2 @ 0x11;//定时/计数器TMR2volatile unsigned char T2CON @ 0x12;//TMR2控制寄存器volatile unsigned char SSPBUF @ 0x13;//收/发数据缓冲器volatile unsigned char SSPCON @ 0x14;/*同步串口控制寄存器,对MSSP模块的功能和指标进行设置和定义*/volatile unsigned char CCPR1L @ 0x15;//捕获/比较/PWM寄存器低字节volatile unsigned char CCPR1H @ 0x16;//捕获/比较/PWM寄存器低字节volatile unsigned char CCP1CON @ 0x17;//CCP1CON寄存器volatile unsigned char RCSTA @ 0x18;//USART接收控制兼状态寄存器volatile unsigned char TXREG @ 0x19;//USART发生缓冲器volatile unsigned char RCREG @ 0x1A;//USART接收缓冲器volatile unsigned char CCPR2L @ 0x1B;//捕获/比较/PWM寄存器低字节volatile unsigned char CCPR2H @ 0x1C;//捕获/比较/PWM寄存器低字节volatile unsigned char CCP2CON @ 0x1D;//CCP2CON寄存器volatile unsigned char ADRESH @ 0x1E;//ADC转换结果寄存器高字节volatile unsigned char ADCON0 @ 0x1F;//A/D转换器开关位/* bank 1 registers */volatile unsigned char OPTION @ 0x81;/*/选择寄存器,用于配置TMR0/WDT预分频系数、外部INT中断、TMR0和端口B的弱上拉。
PIC16F877A之定时TMR0编写下面的实验程序实现的功能是让RC 口所带的8 个LED 一个接一个的全亮起来,最后达到全亮后再一个一个的灭下去,这样反复循环,使用定时器查询方式控制延时,而不使用定时器的中断。
中断程序会在以后陆续写到上面来tmr0 equ 01hpcl equ 02hstatus equ 03hoption_reg equ 81hintcon equ 0bhportc equ 07htrisc equ 87htmr0data equ 15hcount equ 20hrp0 equ 5horg 0000hnopgoto mainorg 0005hmain nopbsf status,rp0movlw 00hmovwf triscmovlw 07hmovwf option_regbcf status,rp0clrf countloop1movf count,0call readmovwf portcincf count,1movlw 0fhandwf count,1call delaycall delaycall delaycall delaycall delaycall delaycall delaygoto loop1delaybcf intcon,2movlw tmr0datamovwf tmr0delay1btfss intcon,2goto delay1returnread addwf pcl,1retlw b’10000000’retlw b’11000000’retlw b’11100000’retlw b’11110000’retlw b’11111000’retlw b’11111100’retlw b’11111110’retlw b’11111111’retlw b’11111110’retlw b’11111100’retlw b’11111000’retlw b’11110000’retlw b’11100000’retlw b’11000000’retlw b’10000000’retlw b’00000000’end本程序利用的16F877A 的TMR0,具体如何设置请查找16F877C 中的INTCON、OPTION_REG 、TMR0 等相关特殊工作寄存器的功能说明。
目录第1章前言 (1)1.1 选题的背景和意义 (1)1.2 国内外电子秤发展及成果 (2)1.3 研究现状 (3)1.3.1 影响因素 (3)1.3.2 产品质量 (3)1.3.3 发展方向 (4)1.3.4 电子秤的智能化 (4)1.4 电子秤设计的任务及要求 (4)第2章系统方案设计与论证 (6)2.1 系统方案的设计思路 (6)2.2 系统方案设计 (6)2.3 系统方案比较与论证 (6)2.3.1 单片机的选型 (6)2.3.2 称重传感器选型 (10)2.3.3 放大部分选型 (14)2.3.4 A/D转换器选型 (14)2.3.5 显示模块选型 (16)2.3.6 键盘输入选型 (18)2.3.7 语音芯片选型 (19)第3章系统硬件设计 (20)3.1 基于PIC16F877A的主控电路 (20)3.1.1 PIC16F877A简介 (20)3.1.2 PIC16F877A引脚介绍 (20)3.1.3 主控电路设计 (21)3.2 称重部分 (22)3.2.1 GF-7桥型称重器简介 (22)3.2.2 工作原理 (23)3.2.3 硬件电路 (23)3.3 测身高部分 (24)3.3.1 超声波测距原理 (24)3.3.2 测身高硬件电路设计 (24)3.4 显示部分 (26)3.5 语音播报部分 (27)3.6 键盘部分 (28)3.7 报警电路 (28)3.8 电源电路 (29)3.9 硬件低功耗设计 (29)3.9.1 低功耗元器件选择 (29)3.9.2 低功耗电路设计 (30)第4章软件设计 (31)4.1 称重部分软件设计 (31)4.2 测身高部分软件设计 (32)第5章结论 (36)致谢 (37)参考文献 (38)第1章前言目前,随着社会的发展、生活水平不断提高,人们越来越关注自己的身体健康。
许多人由于工作的压力和不良的饮食习惯,使得身体健康每况愈下,疾病也随之而来,而在这些人群中,患有肥胖和营养不良的病人居多。
输出电压可设置的升降压DC-DC变换器如下图,设计一个DC-DC变换电路:要求:1)当输入电压Ui 在14V~16V变化时,输出电压Uo恒压输出,Uo稳态相对误差不超过2%,Uo可通过键盘设置为10~20V间的任意电压,电压步进长度0.1V;2)要求用液晶屏显示输出电压和输出电流,电压显示精度到0.1V,电流显示精度到50mA;要求带4*43)输出负载电流I2范围0~1A;4)试计算电源效率。
<一>电路部分:设计原理:主电路boost-buck电路,驱动电路,控制电路(pic单片机控制)。
原理概述:boost-buck电路利用开关管的开关,输出电压的平均值Uo=ton/(T-ton)×Ui=D/(1-D)*ui。
D为占空比。
用单片机输出PWM方波(经过驱动电路放大后)控制MOS 管的开关,来调节输出电压。
将输出电压送回PIC单片机模数转换模块,通过反馈调节PWM 占空比调节电压,使输出稳定。
利用差分运放电路,检测出输出电压与输出电流的关系。
键盘输入设置电压。
外接液晶屏显示输出电压和输出电流和输出电流。
主电路:驱动电路:控制电路:液晶外围电路:键盘电路模块:用multisim仿真如下结果:设计小结:输出电流与输出电压的关系U=RI。
在程序设计中,通过电压的输出在液晶屏上显示电流的输出。
〈二〉程序部分:输出pwm:#include<pic.h>unsigned int DRE;__CONFIG(0x2001);void PWM(){PR2=39; //频率25KHzTRISC|=0x04; //RC2置为输入CCP1CON=0X0c; //PWM输出CCPR1L=0X01; //占空比25%T2CON=0X04; //开定时器TMR2,预分频1:1TMR2IF=0; //清除TMR2中断标志位}void main(){while(1){PWM();DRE=40; //高电平寄存器的值CCPR1L=DRE/4; //装入高8位CCP1CON<5>=(DRE/2)%2; //装入次低位CCP1CON<4>=DRE%2; //装入最低位while(TMR2IF==0);TRISC=0x00;}}AD转换:#include<pic.h>__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void AD(){TRISA0=1; //RA1设置为模拟输入ADCON1=0x00; //参考电压电源电压VDD AD转换周期Fosc/4 ADCON0=0x40; //}void delayms(int xms){int i,j ;for(i=0;i<xms;i++)for(j=0;j<150;j++) ;}void main(){unsigned int x,y,z,A,B,C;unsigned int Result,Result1,ADRES;while(1);{ delayms(5); //采样采样电压充电延时GO=1;}while(GO==1);{}Result=ADRES;x=(Result*5)/256; //取个位十分位百分位y=((Result*50)/256)%10;z=((Result*500)/256)%10;Result1=Result/1.2-1.5;A=(Result*5)/256; //取个位十分位百分位B=((Result*50)/256)%10;C= ((Result*500)/256)%10;}液晶屏与键盘:#include<pic.h>#define LCD_EN RC7#define LCD_RW RC6#define LCD_RS RC5unsigned int x,y,z,A,B,C;unsigned char dis0[]="voltage:";unsigned char dis1[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis2[]="current:";unsigned char dis3[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis4[3], dis5[3];__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void delay (int xms){int i,j;for(i=0;i<xms;i++){for(j=0;j<150;j++);}}void write_com(){unsigned char com ; //声明写指令LCD_RS=0;LCD_RW=0;LCD_EN=0;PORTD=com;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void write_date(){unsigned char date;LCD_RS=1;LCD_RW=0;LCD_EN=0;PORTD=date;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void init(){ TRISD=0x00;TRISC&=0x1f;write_com(0x38);delay(5);write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x01);delay(5);}void display(){unsigned char j; dis4[0]=dis1[x];dis4[1]=dis1[10]; dis4[2]=dis1[y];dis4[3]=dis1[z]; write_com(0xc8); for(j=0;j<=3;j++) {write_date(dis5[j]);delay(1);}unsigned char k; dis5[0]=dis3[A];dis5[1]=dis3[10]; dis5[2]=dis3[B];dis5[3]=dis3[C]; write_com(0xc8); for(k=0;k<=3;k++) {write_date(dis4[k]);delay(1);}}void main(){unsigned char i;init();write_com(0x80); //显示第1行for(i=0;i<=8;i++){write_date(dis0[i]);delay(1);}write_com(0x80+0x40);//显示第2行for(i=0;i<=8;i++){write_date(dis2[i]);delay(1);}}#include<pic.h>#include<pic.h>#define LCD_EN RC7#define LCD_RW RC6#define LCD_RS RC5unsigned int x,y,z,A,B,C;unsigned char dis0[]="voltage:";unsigned char dis1[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis2[]="current:";unsigned char dis3[]={'0','1','2','3','4','5','6','7','8','9','.'}; unsigned char dis4[3], dis5[3];__CONFIG(FOSC_XT&WDTE_OFF&LVP_OFF);void delay (int xms){int i,j;for(i=0;i<xms;i++){for(j=0;j<150;j++);}}void write_com(){unsigned char com ; //声明写指令LCD_RS=0;LCD_RW=0;LCD_EN=0;PORTD=com;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void write_date(){unsigned char date;LCD_RS=1;LCD_RW=0;LCD_EN=0;PORTD=date;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}void init(){ TRISD=0x00;TRISC&=0x1f;write_com(0x38);delay(5);write_com(0x0c);delay(5);write_com(0x06);delay(5);write_com(0x01);delay(5);}void display(){unsigned char j;dis4[0]=dis1[x];dis4[1]=dis1[10];dis4[2]=dis1[y];dis4[3]=dis1[z]; write_com(0xc8);for(j=0;j<=3;j++) {write_date(dis5[j]);delay(1);}unsigned char k;dis5[0]=dis3[A];dis5[1]=dis3[10];dis5[2]=dis3[B];dis5[3]=dis3[C];write_com(0xc8);for(k=0;k<=3;k++){write_date(dis4[k]);delay(1);}}void main(){unsigned char i;init();write_com(0x80); //显示第1行for(i=0;i<=8;i++){write_date(dis0[i]);delay(1);}write_com(0x80+0x40);//显示第2行for(i=0;i<=8;i++){write_date(dis2[i]);delay(1);}} #define KEYBOARD_PORT_DIR TRISB //键盘扫描方向端口#define KEYBOARD_PORT PORTB //键盘扫描端口#define NO_KEY 0xFF //无按键__CONFIG(0x3FFF);unsigned char L,O;char scankeypad(); //获取4×4键盘值char getkeyvalue(); //获取某按键的值void delay(int xms){int i,j;for(i=0;i<xms;i++)for(j=0;j<150;j++);}const char ccode[16][2]={{0xEE,1},{0xED,2},{0xEB,3},{0xE7,'L'},{0xDE,4},{0xDD,5},{0xDB,6}, {0xD7,'+'},{0xBE,7},{0xBD,8}, {0xBB,9}, {0xB7,'-'},{0x7E,'.'},{0x7D,0},{0x7B,'*'}, {0x77,'O'}};char scankeypad() //获取4*4键盘扫描码{char key4H=0,key4L=0,scancode=0;TRISD=0xF0; //低四位输出,高四位输入PORTD=0x00; //低四位输出0asm("nop");asm("nop"); //待输出信号稳定key4H=PORTD; //读取高四位key4H=key4H&0xF0; //将低四位屏蔽if(key4H!=0xF0) //有按键按下{delay(20);key4H=PORTD; //重读if(key4H!=0xF0){TRISD=0x0F;PORTD=0x00;asm("nop");asm("nop");key4L=PORTD; //读取高四位key4L=key4H&0x0F; //将高四位屏蔽if(key4L!=0x0F) //有按键按下{scancode=key4H|key4L;//高四位与低四位组成键盘扫描码while(PORTD!=0x0F); //按键未松开等待return(scancode);}}}return NO_KEY;}char Getkeyvalue() //获取扫描码{ char keyvalue=0,c=0;keyvalue=scankeypad();if(keyvalue!=NO_KEY){while(keyvalue!=ccode[c][0]){ //比较描码与当前数组元素是否相等c++;}return(ccode[c][1]);//返回序号对应值}return(NO_KEY);}void main(){int i=0,Num[2]={0,0},Numindex=0;while(1){i=Getkeyvalue(); //获得键值if(i!=NO_KEY) //有按键{if(i>=0&&i<=9){Num[2]=Numindex*10+i; //新数值}else{switch(i){case'L':Num[0]=0;Num[1]=0;Numindex=0;break;case'.':break;case'O': Num[2]=Numindex*10+i;break;default:break; };}}}}电源输出效率:。
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单片机是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 自动太阳跟踪器的设计伍春生1,2,刘四洋1,2,彭燕昌1,许洪华1(1.中国科学院电工研究所 北京 100080;2.中国科学院研究生院 北京 100039)摘 要:太阳能电池板的效率偏低导致光伏发电系统成本过高,是困扰其长足发展的主要原因。
阐述了光伏发电自动跟踪系统的基本原理和研制的关键技术并以PIC16F877A 为核心控制单元,设计了一种自动太阳跟踪器,能自动跟踪太阳的高度角与方位角,使太阳光线始终垂直入射在光伏阵列的表面以获取最大发电效率。
详细介绍了系统软硬件设计方案并研制出相应可靠稳定运行的样机。
关键词:PIC16F877A ;自动太阳跟踪器;光伏阵列;发电效率中图分类号:TP273 文献标识码:B 文章编号:10042373X (2007)202147203Design of Automatic Sun T rackers B ased on PIC16F877AWU Chunsheng 1,2,L IU Siyang 1,2,PEN G Yanchang 1,XU Honghua 1(1.Institute of Electrical Engineering ,Chinese Academy of Sciences ,Beijing ,100080,China ;2.Graduate School ,Chinese Academy of Sciences ,Beijing ,100039,China )Abstract :The main idea of restricting development is that solar panels lead to low efficiency photovoltaic power generation system too costly.The basic principle and key technology based on PIC16F877A of it is proposed.An automatic sun trackers following with the azimuth angle and the solar altitude of the sun based on PIC16F877A is designed in this paper ,which makes vertical incidence sun ′s ray on the surface of photovoltaic (PV )arrays and maximizes generating efficiency.The hardware and software schemes of system are introduced in detail ,and finally automatic sun trackers running reliably are developed.K eywords :PIC16F877A ;automatic sun trackers ;PV arrays ;generating efficiency收稿日期:2007205207 光伏发电能为人类提供可持续能源,并保护赖以生存的环境,但其发电效率低,发电成本相对较高仍然是制约其大规模应用的重要因素。
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的特殊功能配置CPU的特殊功能
BIT13CP:闪存程序存储器代码保护位
0:所有程序存储器代码保护
1:关闭代码保护
BIT12Unimplemented:读时为结果为1
BIT11DEBUG:在电路调试模式位
0:在电路调试功能有效,RB6和RB7专用于调试器
1:在电路调试功能失效,RB6和RB7用于本身的IO或其它功能BIT10-9WRT1-0:闪存程序存储器写使能位
WRT1WRT0说明
11写保护关闭,所有程序存储器由EECON控制写
100000h到00ffh写保护;0100h到1fffh由EECON控制写010000h到07ffh写保护;0800h到1fffh由EECON控制写000000h到0fffh写保护;1000h到1fffh由EECON控制写BIT8CPD:数据EEPROM存储器代码保护位
0:数据EEPROM存储器代码保护开启
1:数据EEPROM存储器代码保护关闭
BIT7LVP:低电压(单电源)的在线串行编程使能位
0:RB3/PGM是普通IO口功能,编程时MCLR管脚必须是高电压1:RB3/PGM是PGM功能,低电压编程使能
BIT6BOREN:欠压复位使能位
0:欠压复位失效
1:欠压复位使能
BIT5-4Unimplemented:读时结果为1
BIT3PWRTEN:上电延时定时器使能位
0:上电延时定时器使能
1:上电延时定时器失效
BIT2WDTEN:看门狗定时器使能位
0:看门狗失效
1:看门狗使能
BIT1-0:Fosc1:Fosc0:时钟源选择位
Fosc1Fosc0时钟源11RC振荡器
10外部石英高频晶振HS【频率范围见下表】01外部石英晶振XT【频率范围见下表】
00外部低频石英晶振LP【频率范围见下表】。