2.步进电机控制系统设计 第一个按键,速度等级增加,有多个速度等级,速度等级显示在LCD上 第三个按键,电机停止 第四个按键,电机启动
- #include <REGX51.H>
- #include "def.h"
- #include "lcd1602.h"
-
- void MotorStop(void); //声明函数
- void qx (u16 ii);
- void zt (void);
- sbit k1=P3^2; // 运行与停止
- sbit k2=P2^1; // 方向转换
- sbit k3=P2^2; // 速度调整
- sbit k4=P2^3; // 设定圈数
- u8 code ffw[4] ={0x01,0x02,0x04,0x08}; // 正转
- u8 code rev[4] ={0x08,0x04,0x02,0x01}; // 反转
- u16 snum=156; //预设角度
- u16 rate=101; //预设速率
- u16 ii; //角度显示
- u16 ia=100; //报警值
- void Delay_xms(u8 x)//ms延时函数
- {
- u8 i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- bit on_off=1; // 运行与停止标志
- bit direction=1; //方向标志
- void to(void) //外部中断
- {
- IT0=1;
- EX0=1;
- EA=1;
- }
- void bao (void) //、、、、、、、、、、、、、、、、、、、、、、、、报警 、、、、、、、、、、、、、、、、、、、、、、、、
- {
- if((ii==ia)|(on_off==1))
- {
- ii=snum;
- if(on_off==1)
- {
- zt();
- }
- else
- {
- qx(ia);
- display_lcd(0x19,0x21);
- }
- on_off=1;
- MotorStop();
- }
- }
- void clockwise(u16 rate) //顺时针转动
- {
- u8 i;
- for(i=0;i<4;i++)
- {
- P1=ffw[i];
- Delay_xms(rate);//转速调节
- }
- }
- //停止转动
- void MotorStop(void)
- {
- P1=0xff;
- }
- void anticlockwise (u16 rate) //逆时针转动
- {
- u8 i;
- for(i=0;i<4;i++)
- {
- P1=rev[i];
- Delay_xms(rate);//转速调节
- }
- }
- void key (void) //按键判断
- {
- if (k2 == 0)
- {
- delay(10);
- if (k2 == 0)
- {
- direction=~direction; // 方向标志;
- }
- while (!k2);
- }
- if(on_off==1)
- {
- if (k3 == 0)
- {
- delay(10);
- if (k3 == 0)
- {
- while (!k3)
- {
- if(direction==1)
- {
- Delay_xms(100);
- if(rate<255)
- {
- rate++;
- }
- }
- else
- {
- Delay_xms(100);
- if(rate>10)
- {
- rate--;
- }
- }
- }
- }
- }
- if (k4 == 0)
- {
- delay(10);
- if (k4 == 0)
- {
- while (!k4)
- {
- if(direction==1)
- {
- Delay_xms(100);
- if(snum<255)
- {
- snum++;
- }
- }
- else
- {
- Delay_xms(100);
- if(snum>10)
- {
- snum--;
- }
- }
- }
- }
- }
- }
- }
- void zt (void) //状态显示
- {
- u8 a,b,c,d,e,f;
- if(on_off==0)
- {
- display_lcd(0,'n');
- }
- else
- {
- display_lcd(0,'f');
- }
- if(direction==1)
- {
- display_lcd(1,0x7e);
- }
- else
- {
- display_lcd(1,0x7f);
- }
- a=snum/100;
- b=(snum-100*a)/10;
- c=(snum-100*a-b*10)%10;
- d=rate/100;
- e=(rate-100*d)/10;
- f=(rate-100*d-e*10)%10;
- display_lcd(0x10,a+'0');
- display_lcd(0x11,b+'0');
- display_lcd(0x12,c+'0');
- display_lcd(0x15,d+'0');
- display_lcd(0x16,e+'0');
- display_lcd(0x17,f+'0');
- }
- void qx (u16 ii)
- {
- u8 a,b,c;
- a=ii/100;
- b=(ii-100*a)/10;
- c=(ii-100*a-b*10)%10;
- display_lcd(0x10,a+'0');
- display_lcd(0x11,b+'0');
- display_lcd(0x12,c+'0');
- }
- void quan (void) //圈数
- {
- if(on_off==0)
- {
- if(direction==1)
- {
- for(ii=0;ii<snum;ii++)
- {
- clockwise (rate);
- bao();
- if(on_off==0)
- {
- qx(ii);
- }
- }
- }
- else
- {
- for(ii=0;ii<snum;ii++)
- {
- anticlockwise(rate);
- bao();
- if(on_off==0)
- {
- qx(ii);
- }
- }
- }
- }
- }
- void main (void)
- {
- to();
- lcd_init();
- zt();
- while(1)
- {
- key();
- quan();
- }
- }
- void exint0() interrupt 0
- {
- if (k1 == 0)
- {
- delay(10);
- if (k1 == 0)
- {
- on_off=~on_off; // 运行与停止标志;
- }
- while (!k1);
- }
- }
复制代码
|