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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

电机速度控制PIC课设报告程序.docx

1、电机速度控制PIC课设报告程序附录:#include_CONFIG(0x00F1);/_CONFIG(0x3F71);#define LCD_E RD6#define LCD_RW RD5#define LCD_RS RD4#define COM 0#define DAT 1#define LINE1 0b10000000#define LINE2 0b11000000#define LED RB5#define DN_POSITION LINE2+15 /第2行显示速度回差的个位位置#define DN_POSITION LINE2+15 /第2行显示速度回差的个位位置bank1 char

2、DD16;const char MENU0217= PIC 16F887 , PICC 9.5 ,;const char LINE2=LINE1,LINE2;const unsigned int ND11=200,500,800,1100,1400,1700,2000,2300,2600,2900,3200;/定义结构体类型STRU的变量KEYstruct STRU unsigned SET:3; unsigned INC:1; unsigned DEC:1; unsigned FLAG:1; unsigned CHANGE:1; unsigned SETINT:1;KEY;union /联合

3、体AD_RESULT存放AD转换结果 unsigned int AD_TEMP; char AD2;AD_RESULT;/EEPROM第一单元占空比D初值,第二单元转速误差运行值DN初值_EEPROM_DATA(200,10,255,255,255,255,255,255); unsigned char D; /占空比10倍unsigned HT; /高电平时间(us)unsigned int N0_MIN=150;unsigned int N0_MAX=2048;unsigned int N0; /期望转速值unsigned int N; /实际测速值unsigned char DN; /转

4、速误差unsigned long n;char WW,QW,BW,SW,GW;unsigned char T0N;unsigned int DN_OLD;unsigned int T=0;unsigned int N1;unsigned int N2;int AD_SUB(void);void CSH(void);void DISP_N0_DN(unsigned int,unsigned char);void DISP_N_D(unsigned int,unsigned char);void CAP_CSH(void);void PWM_CSH(unsigned int);void DUTY_

5、SET(unsigned int);void AD_CSH(void); void LCD_CSH(void);void LCD_WRITE_4(char,char);void LCD_WRITE(char,char);void LCD_BUSY(void);char LCD_READ(void);void DISP_C(char);void DISP_MENU(const char *A);void BCD(unsigned int);void DELAY(unsigned int);void DELAY_I(unsigned int);void DELAY_US(char);void in

6、terrupt INT_ISR(void);void change(void);/unsigned int DN_GET(void);/宏定义:清屏#define CLR_LCD() LCD_WRITE(0b00000001,COM); DELAY(2)/AD转换,期望转速N0取值N0_MINN0_MAX,并放大100倍 void main(void) unsigned int i; CSH(); DISP_MENU(*MENU0); DELAY(100); / DELAY(400); CLR_LCD(); while(1) N0=AD_SUB(); DISP_N0_DN(N0,DN); /显

7、示期望转速和转速误差允许值 DISP_N_D(N,D); change(); /显示实际转速和占空比 while (KEY.FLAG=0) DELAY(1); i+; if (i200) LED=0; if (i400) break; DN_OLD=DN;while(KEY.FLAG=1) if (KEY.SET=1) /进入修改,字符闪 LCD_WRITE(DN_POSITION,COM); /确定字符闪的位置 LCD_WRITE(0b00001111,COM); /字符闪 if (KEY.SETINT=1) if (KEY.SET=1) N1=NDT; DELAY_US(3); KEY.S

8、ETINT=0;T+; if(T10)T=0; KEY.CHANGE=1; if (KEY.INC=1) if (KEY.SET=1)DN+; KEY.INC=0; KEY.CHANGE=1; if (KEY.DEC=1) if (KEY.SET=1)DN-; KEY.DEC=0; KEY.CHANGE=1; if (KEY.CHANGE=1) /如果有修改,刷新显示 DISP_N0_DN(N0,DN); KEY.CHANGE=0; if (KEY.SET=1) /刷新后重新开字符标闪 LCD_WRITE(DN_POSITION,COM); /确定字符闪的位置 LCD_WRITE(0b0000

9、1101,COM); /字符闪 if (DN_OLD!=DN) EEPROM_WRITE(1,DN); /写入速度控制的回差值,在EEPROM的地址1 void change(void) unsigned int j; if(NN0+DN) HT-; if(HT1000)HT=1000; DUTY_SET(HT); DELAY(300); else if(N1000)HT=0; DUTY_SET(HT); DELAY(300); LED=1; j=0;void CSH(void) ANSELH=0;/关闭B口模拟引脚,设为I/O引脚 TRISB=0b00001111; OPTION=0b000

10、10111;/B口上拉,且下降沿中断 INTCON=0b11010000;/GIE=1;PEIE=1;INTE=1;RBIE=1; IOCB=0b00001110;/B口电平变化中断控制寄存器,RB1、RB2电平变化产生中断,在RBIE=1的前提下 KEY.FLAG=0; KEY.SET=0; TMR1H=TMR1L=0; T1CON =0b00110001;/1:8分频 TRISD=0b00000000; TRISC=0b00100000; HT=EEPROM_READ(0); DN=EEPROM_READ(1); LCD_CSH(); CAP_CSH(); PWM_CSH(HT); AD_

11、CSH(); int AD_SUB(void) GODONE=1; while(GODONE=1); ADIF=0; AD_RESULT.AD0=ADRESL; AD_RESULT.AD1=ADRESH; n=AD_RESULT.AD_TEMP; n*=350; N2=n/1023+N1; return N2;void DISP_N0_DN(unsigned int START_N0,unsigned char DELTA_N) LCD_WRITE(0b00001100,COM); /不闪 LCD_WRITE(LINE2,COM); /即第2行的第0个字符 BCD(START_N0); /将要

12、显示的起动占空比值做BCD转换 LCD_WRITE(N,DAT); /在当前位置显示字符N LCD_WRITE(0,DAT); /在当前位置显示字符0 LCD_WRITE(=,DAT); /在当前位置显示字符: LCD_WRITE(QW+0x30,DAT); /显示千位 LCD_WRITE(BW+0x30,DAT); /显示百位 LCD_WRITE(SW+0x30,DAT); /显示十位 LCD_WRITE(GW+0x30,DAT); /显示个位 LCD_WRITE(r,DAT); /在当前位置显示字符r LCD_WRITE(p,DAT); /在当前位置显示字符/ LCD_WRITE(m,DA

13、T); /在当前位置显示字符m LCD_WRITE( ,DAT); /在当前位置显示空格 BCD(DELTA_N); /将要显示的转速n控制回差量做BCD转换 LCD_WRITE(D,DAT); /在当前位置显示字符D LCD_WRITE(n,DAT); /在当前位置显示字符n LCD_WRITE(=,DAT); /在当前位置显示字符: LCD_WRITE(SW+0x30,DAT); /显示十位 LCD_WRITE(GW+0x30,DAT); /显示个位void DISP_N_D(unsigned int R1,unsigned char DUTY) /速度在R1,占空比DUTY LCD_WR

14、ITE(0b00001100,COM); /不闪 BCD(R1); LCD_WRITE(LINE1,COM); /DDRAM地址,第1行的第5个字符 LCD_WRITE( ,DAT); /在当前位置显示空格 LCD_WRITE(N,DAT); LCD_WRITE(=,DAT); LCD_WRITE(QW+0x30,DAT); /显示千位 LCD_WRITE(BW+0x30,DAT); /显示百位 LCD_WRITE(SW+0x30,DAT); /显示十位 LCD_WRITE(GW+0x30,DAT); /显示个位 LCD_WRITE(r,DAT); /在当前位置显示字符r LCD_WRITE(

15、p,DAT); /在当前位置显示字符/ LCD_WRITE(m,DAT); /在当前位置显示字符m LCD_WRITE( ,DAT); /在当前位置显示空格 BCD(DUTY); /将要显示的转速n控制回差量做BCD转换 LCD_WRITE(D,DAT); /在当前位置显示字符D LCD_WRITE(=,DAT); /在当前位置显示字符: LCD_WRITE(SW+0x30,DAT); /显示十位 LCD_WRITE(GW+0x30,DAT); /显示个位 LCD_WRITE(%,DAT); /显示字符%void CAP_CSH(void) TRISC2=1; CCP1CON=0b000001

16、10; TMR1H=TMR1L=0; T1CON=0b00110001; CCP1IF=0; CCP1IE=1; GIE=1; PEIE=1;void interrupt INT_ISR(void) long X; unsigned int TZ; if(CCP1IF=1) TMR1H=TMR1L=0; TZ=(CCPR1H1) KEY.SET=0; KEY.FLAG=0; RBIE=0; / TMR1ON=1; RBIE=1; / PEIE=1; / GIE=1; T0IE=1; TMR0=0; T0IF=0; T0N=0; if (RBIF=1) DELAY_I(30); if (RB3=

17、0 & KEY.FLAG=1 ) KEY.SETINT=1; T0N=0; if (RB2=0 & KEY.FLAG=1) KEY.DEC=1; T0N=0; if (RB1=0 & KEY.FLAG=1) KEY.INC=1; T0N=0; RBIF=0; if(T0IF=1) T0IF=0; TMR0=0; T0N+; if (T0N100) /约6S KEY.FLAG=0; KEY.SET=0; T0IE=0; /设置周期为1000US的PWM输出 void PWM_CSH(unsigned int ht) PR2=249; DUTY_SET(ht); /X=0b0011001000;

18、T2CON=0b00000101; /预分频比为1:4 /设置PWM波的高电平时间void DUTY_SET(unsigned int ht) CCPR2L=(ht2) & 0x0FF; CCP2CON=(ht4) & 0x0F; /先写入高4位 LCD_WRITE_4(R2,FLAG); R2=R1 & 0x0F; /后写入低4位 LCD_WRITE_4(R2,FLAG); DELAY_US(10); /延时100us void LCD_BUSY(void) unsigned char R1; while(1) R1=LCD_READ(); /读寄存器 if(R1&0x80)=0x00) /

19、最高位为忙标志位 break; char LCD_READ(void) unsigned char R1; TRISD |=0xF0; /D口低4位为输入 LCD_RS=0;NOP(); /选择命令 LCD_RW=1; /写命令模式 NOP();NOP(); LCD_E=1; /LCD使能 NOP();NOP(); R1=0; R1=PORTD & 0x0F; R1=(R14) & 0xF0; /读数据的高4位给R1高4位 LCD_E=0;NOP(); /使能端形成下降沿 LCD_E=1;NOP(); R1 |=PORTD & 0x0F; /读数据的低4位给R1低4位 LCD_E=0;NOP(

20、); LCD_RW=0; TRISD &=0x0F; /D口低4位恢复为向LCD输出 return R1;void DISP_C(char line) char i; LCD_BUSY(); LCD_WRITE(line,COM); for(i=0;i16;i+) LCD_WRITE(DDi,DAT);void DISP_MENU(const char *A) char i,j; for(i=0;i2;i+) for(j=0;j16;j+) DDj=*A+; A+; DISP_C(LINEi); /从R1双字节数转换为十进制数万位-个位:WW,QW,BW,SW,GWvoid BCD(unsigned int R1) /延时n msvoid DELAY(unsigned int n)void DELAY_I(unsigned int n)/延时(n*10)usvoid DELAY_US(char n)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1