逆變電源程序_第1頁(yè)
逆變電源程序_第2頁(yè)
逆變電源程序_第3頁(yè)
逆變電源程序_第4頁(yè)
逆變電源程序_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

// //main.c,晶振4MHz,20110722,系統(tǒng)測(cè)試// #include<pic.h>〃包含單片機(jī)內(nèi)部資源預(yù)定義#include<math.h>#include"text.h"http://資源定義#include"12864.h"〃顯示#include"Initial.h"http://初始化#include"keyscan.h"http://按鍵掃描#include"pwm.h"http:// voidmain(void){Initial。;//調(diào)用初始化子函數(shù)LCD_lnitial();//LCD初始化子函數(shù)LCD_Prints(0,0,"雙極性單相SPWM");LCD_Prints(1,0,"逆變器模擬裝置");LCD_Prints(2,0,"頻率: Hz");LCD_Prints(3,0,'調(diào)制度: =>>");while(1){while(!T0IF);〃判斷40ms到否{T0IF=0;TMR0=98;asm("clrwdt");//清看門狗keyscan();〃按鍵掃描if(spwmint&fer_Hz<50)〃上電初始后,頻率自動(dòng)加到50Hz,調(diào)制度自動(dòng)加到0.98{if(delay>15){fer_Hz+=1;delay=0;mark=1;if((fer_Hz%2)&m<15){m++;xian_m+=2;}}elsedelay++;}else{spwmint=0;LCD_Prints(3,6,"");}if(k2){m++;mark=1;xian_m+=2;}〃有k2鍵,調(diào)制度加0.02,艮卩m加1if(xian_m==102)xian_m=68;if(m>16){m=0;mark=1;}〃調(diào)制度范圍為0.68~1,共17階,每階加0.02if(k1){fer_Hz=fer_Hz+10;mark=1;}〃有k1鍵,正弦波頻率加10Hz

if(kO){fer_Hz=fer_Hz+1;mark=1;}〃有k0鍵,正弦波頻率加1Hzif(fer_Hz>1OO)fer_Hz=10;〃正弦波頻率范圍為10~100HzR4=fer_Hz/1OO; //顯示頻率和調(diào)制度R5=(fer_Hz%100)/10;R6=fer_Hz%10;LCD_Printc(2,2,0x3A);LCD_Writedata(0x00);LCD_Writedata(0x30+R4);LCD_Writedata(0x30+R5);LCD_Writedata(0x30+R6);R4=xian_m/100;R5=xian_m%100/10;R6=xian_m%10;LCD_Printc(3,3,0x3A);LCD_Writedata(0x30+R4);LCD_Writedata(0x2E);LCD_Writedata(0x30+R5);LCD_Writedata(0x30+R6);if(mark){mark=0;//10~24Hz根據(jù)頻率確定對(duì)應(yīng)的//10~24Hz根據(jù)頻率確定對(duì)應(yīng)的抽樣次數(shù)抽樣次數(shù)PWMPWM周期if(25<=fer_Hz&fer_Hz<39)sta=1; //25~39Hzif(40<=fer_Hz&fer_Hz<59)sta=2; //40~59Hzif(25<=fer_Hz&fer_Hz<39)sta=1; //25~39Hzif(40<=fer_Hz&fer_Hz<59)sta=2; //40~59Hzif(60<=fer_Hz&fer_Hz<100)sta=3;//60~100Hzswitch(sta){case0: //10~24HzN=100;//預(yù)分頻數(shù)為4PR2_time=((250000/fer_Hz)/N)-1;〃某一頻率正弦波對(duì)應(yīng)的一個(gè)}}choose_table=1;PR2=PR2_time;pwm_N=25;T2CKPS0=1;for(n=0;n<25;n++)〃計(jì)算1/4周期正弦波的PWM正脈寬時(shí)間{ 〃結(jié)果存于number1[]數(shù)組中R0=(tiaom[m]*sin100[n])/255;R1=(R0+1)/2;R2=(R1+128);R3=(R2*PR2_time)/255;number1[n]=R3;//將中斷中的查表狀態(tài)值改為1//修改PWM周期值//1/4抽樣數(shù)給中斷查pwm_high個(gè)數(shù)//欲分頻系數(shù)為4

for(n=0;n<25;n++)//表1值移入表0中{number0[n]=number1[n];}choose_table=0; //表值移完,中斷查表狀態(tài)值改為0break;case1://25~39HzN=160;//抽樣總數(shù)160PR2_time=(1000000/fer_Hz)/N-1;〃某一頻率正弦波對(duì)應(yīng)的一個(gè)PWM周期for(n=0;n<40;n++)//計(jì)算1/4周期正弦波的PWM正脈寬時(shí)間{ 〃結(jié)果存于number1[]數(shù)組中R0=(tiaom[m]*sin160[n])/255;R1=(R0+1)/2;R2=(R1+128);R3=(R2*PR2_time)/255;number1[n]=R3;}choose_table=1; //將中斷中的查表狀態(tài)值改為1PR2=PR2_time; //修改PWM周期值pwm_N=40; //1/4抽樣數(shù)給中斷查pwm_high個(gè)數(shù)T2CKPS0=0; //欲分頻系數(shù)為1for(n=0;n<40;n++)//表1值移入表0中{number0[n]=number1[n];}choose_table=0; //表值移完,中斷查表狀態(tài)值改為0break;case2: //40~59HzN=100;//抽樣總數(shù)100PR2_time=(1000000/fer_Hz)/N-1;〃某一頻率正弦波對(duì)應(yīng)的一個(gè)PWM周期for(n=0;n<25;n++)〃計(jì)算1/4周期正弦波的PWM正脈寬時(shí)間{ 〃結(jié)果存于number1[]數(shù)組中R0=(tiaom[m]*sin100[n])/255;R1=(R0+1)/2;R2=(R1+128);R3=(R2*PR2_time)/255;number1[n]=R3;}choose_table=1; //將中斷中的查表狀態(tài)值改為1PR2=PR2_time; //修改PWM周期值pwm_N=25; //1/4抽樣數(shù)給中斷查pwm_high個(gè)數(shù)T2CKPS0=0; //欲分頻系數(shù)為1

PWM周期for(n=0;n<25;n++)PWM周期for(n=0;n<25;n++)//表1值移入表0中{number0[n]=number1[n];}choose_table=0; //表值移完,中斷查表狀態(tài)值改為0break;case3://60~100HzN=76; //抽樣總數(shù)76PR2_time=(1000000/fer_Hz)/N-1;〃某一頻率正弦波對(duì)應(yīng)的一個(gè)for(n=0;n<19;n++)〃計(jì)算1/4周期正弦波的PWM正脈寬時(shí)間{ 〃結(jié)果存于number1[]數(shù)組中number1[n]=R3;}number1[n]=R3;}choose_table=1;PR2=PR2_time;pwm_N=19;T2CKPS0=0;//將中斷中的查表狀態(tài)值改為1//修改PWM周期值//1/4抽樣數(shù)給中斷查pwm_high個(gè)數(shù)//欲分頻系數(shù)為1for(n=0;n<19;n++)//表1值移入表0中number0[n]=number1[n];}choose_table=0; //表值移完,中斷查表狀態(tài)值改為0break;default:break;}//switch(sta)}//if(mark)}//while(!T0IF)}//while(1)}//==================================//中斷程序voidinterruptpic(void){TMR2IF=0;pwm();if(A==35){RC0=~RC0;A=0;}A++;/初始化voidInitial(void)//上電復(fù)位{if(nPOR==0){PORTA=0x00;PORTB=0x00;PORTC=0x00;PORTD=0X00;PORTE=0X00;}while(nPOR==0){nPOR=1;}OPTION_REG=Ox06;〃分頻器給TMRO,128分頻TRISA=0x01;TRISB=0xC0;TRISC=OxcO;〃第二個(gè)IO口CCP1TRISD=0x00;TRISE=OxOO;ADCON1=0x06;〃全部為數(shù)字口//OPTION_REG=0X03;〃定時(shí)器0分頻系數(shù)16TMR0=98;〃定時(shí)器初值,定時(shí)40ms256*157// //PWM工作方式設(shè)置INTC0N=0xC0;〃開(kāi)總中斷和外部中斷PIE1=0x02;〃定時(shí)器2允許中斷PIR1=0x00;TRISC=0x00;TMR2=0X00;CCP1C0N=0X0C;//CCP模塊工作在PWM方式T2CON=0X00;〃分頻1:1,TMR2ON=1,未啟動(dòng)定時(shí)器2TMR2ON=1; //啟動(dòng)定時(shí)器2mark=1;spwmint=1;}/* 文件:12864.h*功能:并行LCD顯示*平臺(tái):PIC16F877A4MHz晶振作者:S_gqing*時(shí)間:2011.10IO口定義11為數(shù)據(jù)TOC\o"1-5"\h\z#defineLCD_RS RC5#defineLCD_RW RC6#defineLCD_EN RC7#defineLCD_BUSY_1RD7#defineT_BUSY TRISD7#defineT_DATA TRISD#defineLCD_DATA_IOPORTD *///指令數(shù)據(jù)選擇位。0為指令//讀寫選擇位。0為寫1為讀//并口使能位//讀忙位//忙狀態(tài)方向設(shè)置位//數(shù)據(jù)口方向設(shè)置〃八位數(shù)據(jù)10口/*=====================//讀忙狀態(tài)//說(shuō)明:讀到不忙才跳出程序=====================*/〃RS=0,RW=1,E=H,D0~D7=狀態(tài)字voidLCD_CheckBusy(void){busy=1;RD=0x00; //先置位繁忙標(biāo)志位TRISD=0xFF; 〃RC口設(shè)為輸入口LCD_RS=0; //設(shè)置該字節(jié)數(shù)據(jù)為命令代碼LCD_RW=1; //設(shè)置此次操作為讀while(busy){asm("N0P");asm("N0P");asm("N0P");LCD_EN=1; //使能asm("N0P");asm("N0P");asm("N0P");if(!RD7)busy=0; 〃檢測(cè)LCD是否工作繁忙asm("N0P");asm("N0P");asm("N0P");LCD_EN=0; //禁止}LCD_EN=0; //禁止TRISD=0X00; //恢復(fù)通信為輸出}/*voidLCD_CheckBusy(void){ucharflag=1;LCD_RS=0; //指令LCD_RW=1;//讀

T_DATA=0xff;〃RD口設(shè)為輸入口T_BUSY=1; //設(shè)為輸入口while(flag){asm("NOP");asm("NOP");LCD_EN=1;//__delay_us(5);asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");if(!LCD_BUSY_1)flag=0;LCD_EN=0;}LCD_EN=0;//T_DATA=0x00;//RD設(shè)為輸出口__delay_us(2);//asm("NOP");asm("NOP");}*//*=====================//寫命令到LCD//輸入:八位命令__cmd=====================*/voidLCD_Writecmd(ucharcom){LCD_CheckBusy();LCD_RS=0;LCD_RW=0;LCD_DATA_IO=com;LCD_EN=1;//__delay_us(3);asm("NOP");asm("NOP");asm("NOP");LCD_EN=0;}/*======================//寫一字節(jié)數(shù)據(jù)到LCD//輸入:八位數(shù)據(jù)__data======================*/voidLCD_Writedata(uchardata){LCD_CheckBusy();LCD_RS=1;LCD_RW=0;LCD_DATA_IO=data;LCD_EN=1;//__delay_us(3);asm("NOP");asm("NOP");asm("NOP");LCD_EN=0;}/*=========================讀一個(gè)數(shù)據(jù)到單片機(jī)返回?cái)?shù)值x=========================*/ucharLCD_Readdata(void){unsignedchardata;LCD_CheckBusy();//檢測(cè)LCD是否工作繁忙TRISD=0xFF;//RD口設(shè)為輸入口LCD_RS=1; //設(shè)置該字節(jié)數(shù)據(jù)是顯示數(shù)據(jù)LCD_RW=1; //設(shè)置該次操作為讀LCD_EN=1;asm("NOP");asm("NOP");asm("NOP");data=PORTD; //PORTD口數(shù)據(jù)送dataLCD_EN=0;//使能TRISD=0x00; //下次循環(huán)為輸出口returndata;//返回?cái)?shù)值data}/*========================//LCD光標(biāo)定位(行和列定位)//輸入:行—row列—line〃說(shuō)明:row為0~3,line為0~7=========================*/voidLCD_SetPos(ucharrow,ucharline){if(row==0)LCD_Writecmd(0x80+line);elseif(row==1)LCD_Writecmd(0x90+line);elseif(row==2)LCD_Writecmd(0x88+line);elseLCD_Writecmd(0x98+line);}/*=========================//寫一字節(jié)數(shù)據(jù)到LCD〃輸入:row__行川ne__列,data__數(shù)據(jù)//說(shuō)明:row為0~3,line為0~15,data為待顯示一字節(jié)數(shù)據(jù)=========================*/voidLCD_Printc(ucharrow,ucharline,uchardata){LCD_SetPos(row,line);LCD_Writedata(data);}/*=========================//寫字符串到LCD//輸入:row__行川ne__列,*string__字符串的首地址指針〃說(shuō)明:row為0~3,line為0~15,字符串用常量const修飾=========================*/voidLCD_Prints(ucharrow,ucharline,constuchar*string){LCD_SetPos(row,line);while(*string){LCD_Writedata(*string);string++;}}/*======================//清GDRAM內(nèi)容======================*/voidLCD_CleanGDRAM(void){ucharx,y;for(y=0;y<64;y++){for(x=0;x<16;x++){LCD_Writecmd(0x34);LCD_Writecmd(0x80+y);〃行地址LCD_Writecmd(0x80+x);〃列地址LCD_Writecmd(0x30);LCD_Writedata(0x00);LCD_Writedata(0x00);}

/*======================//延時(shí)程序======================*/voidDelay_LCD(void){uchark;for(k=50;k>0;k++);}/*=========================//LCD初始化=========================*/voidLCD_lnitial(void){//Delay_LCD();__delay_ms(500);//延時(shí)50mSLCD_Writecmd(0x30);//選擇8位數(shù)據(jù),基本指令集LCD_Writecmd(0x30);//選擇8位數(shù)據(jù),基本指令集//LCD_Writecmd(0x01);//LCD_Writecmd(0x06);LCD_Writecmd(0x0c);//開(kāi)顯示(無(wú)游標(biāo),觀標(biāo)不閃)LCD_Writecmd(0x01);//清顯示,設(shè)定地址指針為00HLCD_Writecmd(0x06);//指定在資料的讀取和寫入時(shí),設(shè)定游標(biāo)的移動(dòng)方向?yàn)橛壹爸付@示的移位LCD_CleanGDRAM();#defineucharunsignedchar#defineuintunsignedint#defineRAPORTA#defineRBPORTB#defineRCPORTC#defineRDPORTD#defineREPORTE//指令數(shù)據(jù)選擇位。//指令數(shù)據(jù)選擇位。0為指令1為數(shù)據(jù)//讀寫選擇位。0為寫1為讀//并口使能位//讀忙位//忙狀態(tài)方向設(shè)置位//數(shù)據(jù)口方向設(shè)置TOC\o"1-5"\h\z#defineLCD_RS RC5#defineLCD_RW RC6#defineLCD_EN RC7#defineLCD_BUSY_1RD7#defineT_BUSY TRISD7#defineT_DATA TRISD

#defineLCD_DATA_IO// staticvolatilebitxs7staticvolatilebitxs6staticvolatilebitxs5staticvolatilebitxs4staticvolatilebitxs3staticvolatilebitxs2staticvolatilebitxs1staticvolatilebitxs0PORTD〃八位數(shù)據(jù)#defineLCD_DATA_IO// staticvolatilebitxs7staticvolatilebitxs6staticvolatilebitxs5staticvolatilebitxs4staticvolatilebitxs3staticvolatilebitxs2staticvolatilebitxs1staticvolatilebitxs0@(unsigned)&PORTE*8+2;@(unsigned)&P0RTE*8+1;@(unsigned)&P0RTE*8+0;@(unsigned)&P0RTB*8+5;@(unsigned)&P0RTB*8+4;@(unsigned)&P0RTB*8+3;@(unsigned)&P0RTB*8+2;@(unsigned)&P0RTB*8+1;//定義十二個(gè)按鍵//定義十二個(gè)按鍵staticvolatilebitk0staticvolatilebitk1staticvolatilebitk2staticvolatilebitk3staticvolatilebitk4staticvolatilebitk5staticvolatilebitk6staticvolatilebitk7@(unsigned)&key1*8+0;@(unsigned)&key1*8+1;@(unsigned)&key1*8+2;@(unsigned)&key1*8+3;//定義十二個(gè)按鍵//定義十二個(gè)按鍵staticvolatilebitk0staticvolatilebitk1staticvolatilebitk2staticvolatilebitk3staticvolatilebitk4staticvolatilebitk5staticvolatilebitk6staticvolatilebitk7@(unsigned)&key1*8+0;@(unsigned)&key1*8+1;@(unsigned)&key1*8+2;@(unsigned)&key1*8+3;@(unsigned)&key1*8+4;@(unsigned)&key1*8+5;@(unsigned)&key1*8+6;@(unsigned)&key1*8+7;staticvolatilebitstaticvolatilebitstaticvolatilebitstaticvolatilebitk8@(unsigned)&key2*8+0;k9@(unsigned)&key2*8+1;k10@(unsigned)&key2*8+2;k11@(unsigned)&key2*8+3;staticvolatilebitstaticvolatilebitstaticvolatilebitstaticvolatilebitstaticvolatilebitlk0@(unsigned)&lkey1*8+0;staticvolatilebitlk1@(unsigned)&lkey1*8+1;staticvolatilebitlk2@(unsigned)&lkey1*8+2;staticvolatilebitlk3@(unsigned)&lkey1*8+3;staticvolatilebitlk4@(unsigned)&lkey1*8+4;staticvolatilebitlk5@(unsigned)&lkey1*8+5;staticvolatilebitlk6@(unsigned)&lkey1*8+6;staticvolatilebitlk7@(unsigned)&lkey1*8+7;staticvolatilebitlk8@(unsigned)&lkey2*8+0;staticvolatilebitlk9@(unsigned)&lkey2*8+1;staticvolatilebitlk10@(unsigned)&lkey2*8+2;staticvolatilebitlk11@(unsigned)&lkey2*8+3;

// //定義變量ucharR0,R1,R2,R3,R4,R5,R6,R7;ucharkeycnt;//uchardsbit;//uchardsbuf[8];//uinttimecnt,adcnt,timepwm;//unsignedlongintadbuf;//uchardsfl;//==========================constuchartiaom[17]={173,179,184,189,194,199,204,209,214,219,224,230,235,240,245,250,255};const ucharsin76[19]={3,24,45,66,86,105,124,142,159,175,190,203,215,226,235,242,248,252,254};const ucharsin100[25]={3,19,34,50,66,81,96,111,125,139,152,164,176,188,198,208,217,225,232,238,243,248,251,253,255};constucharsin160[40]={2,12,22,32,41,51,61,71,80,90,99,108,117,126,135,143,151,159,167,174,181,188,195,201,207,213,218,223,228,232,236,240,243,246,248,250,252,253,254,255};ucharPR2_time,choose_way,fer_Hz=10;ucharnumber0[40];ucharnumber1[40];ucharsta,delay;ucharpwm_N,sam_times=O;〃抽樣總數(shù),某一次抽樣序號(hào)中斷中讀數(shù)據(jù)狀態(tài)值ucharn,N,m=0,choose_table=0;bitmark,busy;bitspwmint;ucharxian_m=68;ucharA;// //聲明本模塊中所調(diào)用的函數(shù)類型// voidInitial(void); //上電復(fù)位//定時(shí)、走時(shí)//定時(shí)、走時(shí)//按鍵掃描voidLCD_lnitial(void);voidkeyscan(void);//voidAD(ucharm,ucharn);//voidMCP41O1O(ucharm);//voidDA12(unsignedintm);//uintAD1O(ucharm,ucharn);#ifndef_XTAL_FREQ//聲明4MHz//聲明4MHz晶振#endifvoidkeyscan(void) //按鍵掃描{keycnt++;xs0=xs1=xs2=xs3=xs4=xs5=xs6=xs7=RD7=0;//關(guān)顯示TRISB=0XF0; //低四位為輸入//RD6=1;RD5=0;RD4=1; //(k4~k7)asm("nop");asm("nop");RO=(RBSXfO)&OxfO;R0=R0>>4;// RD4=O;RD5=1;RD6=1; //(kO~k3)//asm("nop");asm("nop");// RO+=((RDAOXOF)&OXOF);// RD6=O;RD5=1;RD4=1; //(k8~k11//asm("nop");asm("nop");//R1=(RDAOXOf)&OxOf;if(RO|R1) //有鍵?{if(keycnt>=12){keycnt=O;key1=RO;key2=R1;}else{key1=lkey1;key2=lkey2;}}else{key1=key2=O;keycnt=O;}R2=key1;R3=key2;key1=key1&(Ikey"key1);lkey1=R2;key2=key2&(Ikey2Akey2);Ikey2=R3;}// 〃單片機(jī)內(nèi)部1O位AD,入口參數(shù)為(adconO,adcon1)//返回為采樣到的AD值// uintAD10(ucharm,ucharn){uchari;uintvan;union //定義共用體以存每次AD結(jié)果{uinty1;uchary2[2];}ad_temp;van=0;PIE1=0x00;//禁止AD中斷ADCON1=n;//設(shè)置通道類型參考電壓及對(duì)其格式PEIE=0;//禁止外設(shè)中斷PIR1=0x00;//AD中斷標(biāo)志位清零ADCON0=m;//設(shè)置AD通道及開(kāi)ADONi=4;while(i--){;} //采樣時(shí)間12周期i=8;while(i--)//連續(xù)采樣8次,求平均值{ADIF=0;//

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論