直流电机测速并显示_第1页
直流电机测速并显示_第2页
直流电机测速并显示_第3页
直流电机测速并显示_第4页
直流电机测速并显示_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.可实现功能:1 可控制左右旋转2 可控制停止转动3 有测速功能,即时显示在液晶上4 有速度档位选择,分五个档次,但不能精确控速5 档位显示在液晶上用到的知识:1 用外部中断检测电机送来的下降沿,在一定时间里统计 脉冲个数,进行算出转速。2 通过改变占空比可改变电机速度,占空比的改变可以通 过改变定时器的重装初值来实现。3 要想精确控制速度,还需要用自动控制理论里的PID算 法,但参数难以选定,故在此设计中没有涉及!#include#define uchar unsigned char #define uint unsigned intsbit PW1=P10 ;sbit PW2=P11; /

2、控制电机的两个输入sbit accelerate=P02 ; /调速按键sbit stop=P03 ; /停止按键sbit left=P04 ; /左转按键sbit right=P05 ; /右转按键sbit detect=P32;/检测脉冲sbit lcdrs=P00;sbit lcden=P01;#define Da P2uint temp; /保存检测到的电平数据以便比较 uint count; /用于计数 uint aa,bb; /用于计数uint speed; /用来计算转速uint a=25000;uint t0=25000,t1=25000; /初始时占空比为50%uchar f

3、lag=1; /此标志用于选择不同的装载初值uchar dflag; /左右转标志uchar sflag=1; /用来标志速度档位#define right_turn PW1=0;PW2=1/顺时针转动#define left_turn PW1=1;PW2=0/逆向转动#define end_turn PW1=1;PW2=1/停转void keyscan(); /键盘扫描void delay(uchar z);void time_init(); /定时器的初始化void write_com(uchar com); /液晶写指令void write_data(uchar date); /液晶写数

4、据void lcd_init(); /液晶初始化void display(uint rate); /显赫速度void int0_init(); /定时器0初始化void keyscan();/键盘扫描程序void judge_derection();void main() time_init(); /定时器的初始化 lcd_init(); /液晶初始化 int0_init(); /定时器0初始化 while(1) void time_init() TMOD=0x11; /两个定时器都设定为工作方式1 十六位定时计数器 EA=1;/开启总中断 TH0=(65536-50000)/256; TL0

5、=(65536-50000)%256; ET0=1; TR0=1; TH1=(65536-a)/256; TL1=(65536-a)%256; ET1=1; TR1=0; void int0_init() EX0=1;/外部中断源可以申请中断 IT0=1;/外部中断源下降沿触发void timer0() interrupt 1 using 0 TH0=(65536-50000)/256; TL0=(65536-50000)%256;/装载初值 keyscan();/键盘扫描程序 aa+; if(aa=5) aa=0; temp=count*0.5*60*2*2*100/24;/计算转速,每分转

6、多少圈 count=0; /重新开始计数脉冲数 display(temp); /把计算得的结果显示出来 void timer1() interrupt 3 using 0 if(flag) flag=0; end_turn; a=t0;/t0的大小决定着低电平延续时间 TH1=(65536-a)/256; TL1=(65536-a)%256;/重装载初值 else flag=1; /这个标志起到交替输出高低电平的作用if(dflag=0) right_turn; /右转 else left_turn; /左转a=t1; /t1的大小决定着高电平延续时间TH1=(65536-a)/256; TL

7、1=(65536-a)%256;/重装载初值 /*外部中断*/void service_int0() interrupt 0 count+; /来一个下降沿沿就计一个脉冲数 /*显示函数*/void display(uint rate) uchar wan,qian, bai,shi,ge; wan=rate/10000; qian=rate/1000%10; bai=rate/100%10; shi=rate/10%10; ge=rate%10; write_com(0x80); write_data(0+wan); write_data(0+qian); write_data(0+bai)

8、; write_data(.); write_data(0+shi); write_data(0+ge); /*延时函数*/ void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-) ; /*写指令*/ void write_com(uchar com) lcdrs=0;Da=com;delay(1);lcden=1;delay(1);lcden=0; /*写数据*/ void write_data(uchar date) lcdrs=1; Da=date;delay(1);lcden=1;delay(1);lcden=0; /*

9、液晶初始化*/ void lcd_init() lcden=0;write_com(0x38) ; /初始化write_com(0x0c) ;/打开光标 0x0c不显示光标 0x0e光标不闪,0x0f光标闪write_com(0x01) ; /清显示write_com(0x80+0x40);write_data(0);write_data( );write_data(G);write_data(e);write_data(a);write_data(r); /*键盘扫描程序*/ void keyscan() if(stop=0) TR1=0; /关闭定时器0 即可停止转动end_turn; /

10、 停止供电write_com(0x80+0x40);write_data(0); if(left=0) TR1=1; dflag=1;/转向标志置位则左转 write_com(0x80+0x40); write_data(0+sflag); if(right=0) TR1=1; dflag=0;/转向标志复位则右转write_com(0x80+0x40);write_data(0+sflag); if(accelerate=0) delay(10) ;/延时消抖if(accelerate=0) while(accelerate=0); /等待松手 sflag+;if(sflag=2) t0=20000; t1=30000;/占空比为百分之60 write_com(0x80+0x40); write_data(2); if(sflag=3) t0=15000; t1=35000;/占空比为百分之70 write_com(0x80+0x40); write_data(3); if(sflag=4) t0=10000; t1=40000;/占空比为百分之80 write_com(0x80+0x40); writ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论