逆变电源程序.docx

上传人:b****1 文档编号:482567 上传时间:2023-04-29 格式:DOCX 页数:26 大小:21.55KB
下载 相关 举报
逆变电源程序.docx_第1页
第1页 / 共26页
逆变电源程序.docx_第2页
第2页 / 共26页
逆变电源程序.docx_第3页
第3页 / 共26页
逆变电源程序.docx_第4页
第4页 / 共26页
逆变电源程序.docx_第5页
第5页 / 共26页
逆变电源程序.docx_第6页
第6页 / 共26页
逆变电源程序.docx_第7页
第7页 / 共26页
逆变电源程序.docx_第8页
第8页 / 共26页
逆变电源程序.docx_第9页
第9页 / 共26页
逆变电源程序.docx_第10页
第10页 / 共26页
逆变电源程序.docx_第11页
第11页 / 共26页
逆变电源程序.docx_第12页
第12页 / 共26页
逆变电源程序.docx_第13页
第13页 / 共26页
逆变电源程序.docx_第14页
第14页 / 共26页
逆变电源程序.docx_第15页
第15页 / 共26页
逆变电源程序.docx_第16页
第16页 / 共26页
逆变电源程序.docx_第17页
第17页 / 共26页
逆变电源程序.docx_第18页
第18页 / 共26页
逆变电源程序.docx_第19页
第19页 / 共26页
逆变电源程序.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

逆变电源程序.docx

《逆变电源程序.docx》由会员分享,可在线阅读,更多相关《逆变电源程序.docx(26页珍藏版)》请在冰点文库上搜索。

逆变电源程序.docx

逆变电源程序

//-----------------

//main.c,晶振4MHz,20110722,系统测试

//--------------

#include//包含单片机内部资源预定义

#include

#include"text.h"//资源定义

#include"12864.h"//显示

#include"Initial.h"//初始化

#include"keyscan.h"//按键扫描

#include"pwm.h"

//--------------------

voidmain(void)

{

Initial();//调用初始化子函数

LCD_lnitial();//LCD初始化子函数

LCD_Prints(0,0,"双极性单相SPWM");

LCD_Prints(1,0,"逆变器模拟装置");

LCD_Prints(2,0,"频率:

Hz");

LCD_Prints(3,0,"调制度:

=>>");

while

(1)

{

while(!

T0IF);//判断40ms到否

{

T0IF=0;TMR0=98;

asm("clrwdt");//清看门狗

keyscan();//按键扫描

if(spwmint&fer_Hz<50)//上电初始后,频率自动加到50Hz,调制度自动加到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键,调制度加0.02,即m加1

if(xian_m==102)xian_m=68;

if(m>16){m=0;mark=1;}//调制度范围为0.68~1,共17阶,每阶加0.02

if(k1){fer_Hz=fer_Hz+10;mark=1;}//有k1键,正弦波频率加10Hz

if(k0){fer_Hz=fer_Hz+1;mark=1;}//有k0键,正弦波频率加1Hz

if(fer_Hz>100)fer_Hz=10;//正弦波频率范围为10~100Hz

R4=fer_Hz/100;//显示频率和调制度

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;

if(10<=fer_Hz&fer_Hz<24)sta=0;//10~24Hz根据频率确定对应的抽样次数

if(25<=fer_Hz&fer_Hz<39)sta=1;//25~39Hz

if(40<=fer_Hz&fer_Hz<59)sta=2;//40~59Hz

if(60<=fer_Hz&fer_Hz<100)sta=3;//60~100Hz

switch(sta)

{

case0:

//10~24Hz

N=100;//预分频数为4

PR2_time=((250000/fer_Hz)/N)-1;//某一频率正弦波对应的一个PWM周期

for(n=0;n<25;n++)//计算1/4周期正弦波的PWM正脉宽时间

{//结果存于number1[]数组中

R0=(tiaom[m]*sin100[n])/255;R1=(R0+1)/2;R2=(R1+128);

R3=(R2*PR2_time)/255;

number1[n]=R3;

}

choose_table=1;//将中断中的查表状态值改为1

PR2=PR2_time;//修改PWM周期值

pwm_N=25;//1/4抽样数给中断查pwm_high个数

T2CKPS0=1;//欲分频系数为4

for(n=0;n<25;n++)//表1值移入表0中

{

number0[n]=number1[n];

}

choose_table=0;//表值移完,中断查表状态值改为0

break;

case1:

//25~39Hz

N=160;//抽样总数160

PR2_time=(1000000/fer_Hz)/N-1;//某一频率正弦波对应的一个PWM周期

for(n=0;n<40;n++)//计算1/4周期正弦波的PWM正脉宽时间

{//结果存于number1[]数组中

R0=(tiaom[m]*sin160[n])/255;R1=(R0+1)/2;R2=(R1+128);

R3=(R2*PR2_time)/255;

number1[n]=R3;

}

choose_table=1;//将中断中的查表状态值改为1

PR2=PR2_time;//修改PWM周期值

pwm_N=40;//1/4抽样数给中断查pwm_high个数

T2CKPS0=0;//欲分频系数为1

for(n=0;n<40;n++)//表1值移入表0中

{

number0[n]=number1[n];

}

choose_table=0;//表值移完,中断查表状态值改为0

break;

case2:

//40~59Hz

N=100;//抽样总数100

PR2_time=(1000000/fer_Hz)/N-1;//某一频率正弦波对应的一个PWM周期

for(n=0;n<25;n++)//计算1/4周期正弦波的PWM正脉宽时间

{//结果存于number1[]数组中

R0=(tiaom[m]*sin100[n])/255;R1=(R0+1)/2;R2=(R1+128);

R3=(R2*PR2_time)/255;

number1[n]=R3;

}

choose_table=1;//将中断中的查表状态值改为1

PR2=PR2_time;//修改PWM周期值

pwm_N=25;//1/4抽样数给中断查pwm_high个数

T2CKPS0=0;//欲分频系数为1

for(n=0;n<25;n++)//表1值移入表0中

{

number0[n]=number1[n];

}

choose_table=0;//表值移完,中断查表状态值改为0

break;

case3:

//60~100Hz

N=76;//抽样总数76

PR2_time=(1000000/fer_Hz)/N-1;//某一频率正弦波对应的一个PWM周期

for(n=0;n<19;n++)//计算1/4周期正弦波的PWM正脉宽时间

{//结果存于number1[]数组中

R0=(tiaom[m]*sin76[n])/255;R1=(R0+1)/2;R2=(R1+128);

R3=(R2*PR2_time)/255;

number1[n]=R3;

}

choose_table=1;//将中断中的查表状态值改为1

PR2=PR2_time;//修改PWM周期值

pwm_N=19;//1/4抽样数给中断查pwm_high个数

T2CKPS0=0;//欲分频系数为1

for(n=0;n<19;n++)//表1值移入表0中

{

number0[n]=number1[n];

}

choose_table=0;//表值移完,中断查表状态值改为0

break;

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)//上电复位

{

if(nPOR==0)

{

PORTA=0x00;

PORTB=0x00;

PORTC=0x00;

PORTD=0X00;

PORTE=0X00;

}

while(nPOR==0){nPOR=1;}

OPTION_REG=0x06;//分频器给TMR0,128分频

TRISA=0x01;

TRISB=0xC0;

TRISC=0xc0;//第二个IO口CCP1

TRISD=0x00;

TRISE=0x00;

ADCON1=0x06;//全部为数字口

//OPTION_REG=0X03;//定时器0分频系数16

TMR0=98;//定时器初值,定时40ms256*157

//----------------------

//PWM工作方式设置

INTCON=0xC0;//开总中断和外部中断

PIE1=0x02;//定时器2允许中断

PIR1=0x00;

TRISC=0x00;

TMR2=0X00;

CCP1CON=0X0C;//CCP模块工作在PWM方式

T2CON=0X00;//分频1:

1,TMR2ON=1,未启动定时器2

TMR2ON=1;//启动定时器2

mark=1;

spwmint=1;

}

/*-------------------

*文件:

12864.h

*功能:

并行LCD显示

*平台:

PIC16F877A4MHz晶振

*作者:

S_gqing

*时间:

2011.10

IO口定义

#defineLCD_RSRC5//指令数据选择位。

0为指令1为数据

#defineLCD_RWRC6//读写选择位。

0为写1为读

#defineLCD_ENRC7//并口使能位

#defineLCD_BUSY_1RD7//读忙位

#defineT_BUSYTRISD7//忙状态方向设置位

#defineT_DATATRISD//数据口方向设置

#defineLCD_DATA_IOPORTD//八位数据IO口

-------------------*/

/*=====================

//读忙状态

//说明:

读到不忙才跳出程序

=====================*/

//RS=0,RW=1,E=H,DO~D7=状态字

voidLCD_CheckBusy(void)

{

busy=1;RD=0x00;//先置位繁忙标志位

TRISD=0xFF;//RC口设为输入口

LCD_RS=0;//设置该字节数据为命令代码

LCD_RW=1;//设置此次操作为读

while(busy)

{

asm("NOP");

asm("NOP");

asm("NOP");

LCD_EN=1;//使能

asm("NOP");

asm("NOP");

asm("NOP");

if(!

RD7)busy=0;//检测LCD是否工作繁忙

asm("NOP");

asm("NOP");

asm("NOP");

LCD_EN=0;//禁止

}

LCD_EN=0;//禁止

TRISD=0X00;//恢复通信为输出

}

/*

voidLCD_CheckBusy(void)

{

ucharflag=1;

LCD_RS=0;//指令

LCD_RW=1;//读

T_DATA=0xff;//RD口设为输入口

T_BUSY=1;//设为输入口

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设为输出口

//__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;

}

/*======================

//写一字节数据到LCD

//输入:

八位数据__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;

}

/*=========================

读一个数据到单片机

返回数值x

=========================*/

ucharLCD_Readdata(void)

{

unsignedchardata;

LCD_CheckBusy();//检测LCD是否工作繁忙

TRISD=0xFF;//RD口设为输入口

LCD_RS=1;//设置该字节数据是显示数据

LCD_RW=1;//设置该次操作为读

LCD_EN=1;

asm("NOP");

asm("NOP");

asm("NOP");

data=PORTD;//PORTD口数据送data

LCD_EN=0;//使能

TRISD=0x00;//下次循环为输出口

returndata;//返回数值data

}

/*========================

//LCD光标定位(行和列定位)

//输入:

行__row,列__line

//说明:

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);

}

/*=========================

//写一字节数据到LCD

//输入:

row__行,line__列,data__数据

//说明:

row为0~3,line为0~15,data为待显示一字节数据

=========================*/

voidLCD_Printc(ucharrow,ucharline,uchardata)

{

LCD_SetPos(row,line);

LCD_Writedata(data);

}

/*=========================

//写字符串到LCD

//输入:

row__行,line__列,*string__字符串的首地址指针

//说明:

row为0~3,line为0~15,字符串用常量const修饰

=========================*/

voidLCD_Prints(ucharrow,ucharline,constuchar*string)

{

LCD_SetPos(row,line);

while(*string)

{

LCD_Writedata(*string);

string++;

}

}

/*======================

//清GDRAM内容

======================*/

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);

}

}

}

/*======================

//延时程序

======================*/

voidDelay_LCD(void)

{

uchark;

for(k=50;k>0;k++);

}

/*=========================

//LCD初始化

=========================*/

voidLCD_lnitial(void)

{

//Delay_LCD();

__delay_ms(500);//延时50mS

LCD_Writecmd(0x30);//选择8位数据,基本指令集

LCD_Writecmd(0x30);//选择8位数据,基本指令集

//LCD_Writecmd(0x01);

//LCD_Writecmd(0x06);

LCD_Writecmd(0x0c);//开显示(无游标,观标不闪)

LCD_Writecmd(0x01);//清显示,设定地址指针为00H

LCD_Writecmd(0x06);//指定在资料的读取和写入时,设定游标的移动方向为右及指定显示的移位

LCD_CleanGDRAM();

}

#defineucharunsignedchar

#defineuintunsignedint

#defineRAPORTA

#defineRBPORTB

#defineRCPORTC

#defineRDPORTD

#defineREPORTE

//---------------------

#defineLCD_RSRC5//指令数据选择位。

0为指令1为数据

#defineLCD_RWRC6//读写选择位。

0为写1为读

#defineLCD_ENRC7//并口使能位

#defineLCD_BUSY_1RD7//读忙位

#defineT_BUSYTRISD7//忙状态方向设置位

#defineT_DATATRISD//数据口方向设置

#defineLCD_DATA_IOPORTD//八位数据IO口

//------------------------

staticvolatilebitxs7@(unsigned)&PORTE*8+2;

staticvolatilebitxs6@(unsigned)&PORTE*8+1;

staticvolatilebitxs5@(unsigned)&PORTE*8+0;

staticvolatilebitxs4@(unsigned)&PORTB*8+5;

staticvolatilebitxs3@(unsigned)&PORTB*8+4;

staticvolatilebitxs2@(unsigned)&PORTB*8+3;

staticvolatilebitxs1@(unsigned)&PORTB*8+2;

staticvolatilebitxs0@(unsigned)&PORTB*8+1;

//----------------------------------------------

staticvolatilebank3ucharkey1@0x6b;//定义十二个按键

stat

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2