ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:21.55KB ,
资源ID:482567      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-482567.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(逆变电源程序.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

逆变电源程序.docx

1、逆变电源程序/-/main.c,晶振4MHz,20110722,系统测试/-#include /包含单片机内部资源预定义#include #include text.h /资源定义#include 12864.h/显示 #include Initial.h /初始化#include keyscan.h /按键扫描#include pwm.h /-void main(void) Initial();/调用初始化子函数 LCD_lnitial();/LCD初始化子函数 LCD_Prints(0,0,双极性单相SPWM); LCD_Prints(1,0,逆变器模拟装置); LCD_Prints(2,

2、0,频率: Hz); LCD_Prints(3,0,调制度: =); while(1) while(!T0IF);/判断40ms到否 T0IF=0;TMR0=98; asm(clrwdt);/清看门狗 keyscan();/按键扫描 if(spwmint&fer_Hz15) fer_Hz+=1;delay=0;mark=1; if(fer_Hz%2)&m16) m=0;mark=1;/调制度范围为0.681,共17阶,每阶加0.02 if(k1) fer_Hz=fer_Hz+10;mark=1;/有k1键,正弦波频率加10Hz if(k0) fer_Hz=fer_Hz+1;mark=1;/有k

3、0键,正弦波频率加1Hz if(fer_Hz100) fer_Hz=10;/正弦波频率范围为10100Hz 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

4、_Writedata(0x30+R4); LCD_Writedata(0x2E); LCD_Writedata(0x30+R5); LCD_Writedata(0x30+R6); if(mark) mark=0; if(10=fer_Hz&fer_Hz24) sta=0; /1024Hz 根据频率确定对应的抽样次数 if(25=fer_Hz&fer_Hz39) sta=1; /2539Hz if(40=fer_Hz&fer_Hz59) sta=2; /4059Hz if(60=fer_Hz&fer_Hz100) sta=3; /60100Hz switch(sta) case 0: /1024

5、Hz N=100; /预分频数为4 PR2_time=(250000/fer_Hz)/N)-1;/某一频率正弦波对应的一个PWM周期 for(n=0;n25;n+) /计算1/4周期正弦波的PWM正脉宽时间 /结果存于number1数组中 R0=(tiaomm*sin100n)/255;R1=(R0+1)/2;R2=(R1+128); R3=(R2*PR2_time)/255; number1n=R3; choose_table=1; /将中断中的查表状态值改为1 PR2=PR2_time; /修改PWM周期值 pwm_N=25; /1/4抽样数给中断查pwm_high个数 T2CKPS0=1

6、; /欲分频系数为4 for(n=0;n25;n+) /表1值移入表0中 number0n=number1n; choose_table=0; /表值移完,中断查表状态值改为0 break; case 1: /2539Hz N=160; /抽样总数160 PR2_time=(1000000/fer_Hz)/N-1;/某一频率正弦波对应的一个PWM周期 for(n=0;n40;n+) /计算1/4周期正弦波的PWM正脉宽时间 /结果存于number1数组中 R0=(tiaomm*sin160n)/255;R1=(R0+1)/2;R2=(R1+128); R3=(R2*PR2_time)/255;

7、 number1n=R3; choose_table=1; /将中断中的查表状态值改为1 PR2=PR2_time; /修改PWM周期值 pwm_N=40; /1/4抽样数给中断查pwm_high个数 T2CKPS0=0; /欲分频系数为1 for(n=0;n40;n+) /表1值移入表0中 number0n=number1n; choose_table=0; /表值移完,中断查表状态值改为0 break; case 2: /4059Hz N=100; /抽样总数100 PR2_time=(1000000/fer_Hz)/N-1;/某一频率正弦波对应的一个PWM周期 for(n=0;n25;n

8、+) /计算1/4周期正弦波的PWM正脉宽时间 /结果存于number1数组中 R0=(tiaomm*sin100n)/255;R1=(R0+1)/2;R2=(R1+128); R3=(R2*PR2_time)/255; number1n=R3; choose_table=1; /将中断中的查表状态值改为1 PR2=PR2_time; /修改PWM周期值 pwm_N=25; /1/4抽样数给中断查pwm_high个数 T2CKPS0=0; /欲分频系数为1 for(n=0;n25;n+) /表1值移入表0中 number0n=number1n; choose_table=0; /表值移完,中断

9、查表状态值改为0 break; case 3: /60100Hz N=76; /抽样总数76 PR2_time=(1000000/fer_Hz)/N-1;/某一频率正弦波对应的一个PWM周期 for(n=0;n19;n+) /计算1/4周期正弦波的PWM正脉宽时间 /结果存于number1数组中 R0=(tiaomm*sin76n)/255;R1=(R0+1)/2;R2=(R1+128); R3=(R2*PR2_time)/255; number1n=R3; choose_table=1; /将中断中的查表状态值改为1 PR2=PR2_time; /修改PWM周期值 pwm_N=19; /1/

10、4抽样数给中断查pwm_high个数 T2CKPS0=0; /欲分频系数为1 for(n=0;n19;n+) /表1值移入表0中 number0n=number1n; choose_table=0; /表值移完,中断查表状态值改为0 break; default: break; /switch(sta) /if(mark) /while(!T0IF) /while(1)/=/中断程序void interrupt pic (void) TMR2IF=0; pwm(); if(A=35) RC0=RC0;A=0; A+;/初始化void Initial(void) /上电复位 if(nPOR=0)

11、 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;/定时器初值,定时40ms 256*157/-/PWM工作方式设置 INTCON=0xC0;/开总中断和外部中断

12、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显示*平台:PIC16F877A 4MHz晶振*作者:S_gqing*时间:2011.10IO口定义#define LCD_RS RC5 /指令数据选择位。0为指令 1为数据#define LCD_RW RC6 /读写选择位。0为写 1为读#de

13、fine LCD_EN RC7 /并口使能位#define LCD_BUSY_1 RD7 /读忙位#define T_BUSY TRISD7 /忙状态方向设置位#define T_DATA TRISD /数据口方向设置#define LCD_DATA_IO PORTD /八位数据IO口-*/*=/读忙状态/说明:读到不忙才跳出程序=*/RS=0,RW=1,E=H,DOD7=状态字void LCD_CheckBusy(void) busy=1;RD=0x00; /先置位繁忙标志位 TRISD=0xFF; /RC口设为输入口 LCD_RS = 0; /设置该字节数据为命令代码 LCD_RW = 1

14、; /设置此次操作为读 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; /恢复通信为输出/*void LCD_CheckBusy(void) uchar flag=1; LCD_RS=0; /指令 LCD_RW=1; /读 T_DATA=0xff;/RD

15、口设为输入口 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=*/void LCD_Writecmd(uchar com) LCD_CheckBus

16、y(); 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=*/void LCD_Writedata(uchar data) 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;/*=读一个数据到单片机返回

17、数值x=*/uchar LCD_Readdata(void) unsigned char data; 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; /下次循环为输出口 return data; /返回数值data/*=/LCD光标定位(行和列定位)/输入:行_row,

18、列_line/说明:row为03,line为07=*/void LCD_SetPos(uchar row,uchar line) if(row=0) LCD_Writecmd(0x80+line); else if(row=1) LCD_Writecmd(0x90+line); else if(row=2) LCD_Writecmd(0x88+line); else LCD_Writecmd(0x98+line);/*=/写一字节数据到LCD/输入:row_行,line_列,data_数据/说明:row为03,line为015,data为待显示一字节数据=*/void LCD_Printc(u

19、char row,uchar line,uchar data) LCD_SetPos(row,line); LCD_Writedata(data);/*=/写字符串到LCD/输入:row_行,line_列,*string_字符串的首地址指针/说明:row为03,line为015,字符串用常量const修饰=*/void LCD_Prints(uchar row,uchar line,const uchar *string) LCD_SetPos(row,line); while(*string) LCD_Writedata(*string); string+; /*=/清GDRAM内容=*/v

20、oid LCD_CleanGDRAM(void) uchar x,y; for(y=0;y64;y+) for(x=0;x0;k+);/*=/LCD初始化=*/void LCD_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(

21、0x01); /清显示,设定地址指针为00H LCD_Writecmd(0x06); /指定在资料的读取和写入时,设定游标的移动方向为右及指定显示的移位 LCD_CleanGDRAM();#define uchar unsigned char #define uint unsigned int#define RA PORTA#define RB PORTB#define RC PORTC#define RD PORTD#define RE PORTE/-#define LCD_RS RC5 /指令数据选择位。0为指令 1为数据#define LCD_RW RC6 /读写选择位。0为写 1为读#

22、define LCD_EN RC7 /并口使能位#define LCD_BUSY_1 RD7 /读忙位#define T_BUSY TRISD7 /忙状态方向设置位#define T_DATA TRISD /数据口方向设置#define LCD_DATA_IO PORTD /八位数据IO口/-static volatile bit xs7 (unsigned)&PORTE*8+2;static volatile bit xs6 (unsigned)&PORTE*8+1;static volatile bit xs5 (unsigned)&PORTE*8+0;static volatile bit xs4 (unsigned)&PORTB*8+5;static volatile bit xs3 (unsigned)&PORTB*8+4;static volatile bit xs2 (unsigned)&PORTB*8+3;static volatile bit xs1 (unsigned)&PORTB*8+2;static volatile bit xs0 (unsigned)&PORTB*8+1;/-static volatile bank3 uchar key1 0x6b; /定义十二个按键stat

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

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