【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度 |
您所在的位置:网站首页 › lcd1602供电 › 【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度 |
一、设计目标 设计程序实现按键控制步进电机启动、停机、正反转、加减速、转速及转向显示。 二、主要功能 功能1:步进电机的启动、重启、停机; 功能2:步进电机正反装; 功能3:静态数码管显示速度等级; 功能4:步进电机的加减速; 三、硬件部分 51单片机,导线,5161BS静态数码管,独立按键,四线双极性步进电机。 图1 图2 图3 图4 图5 图6 图1为单片机接线图; 图2为静态数码管的内部电路图; 图3为控制步进电机的部分的内部电路图; 图4为独立按键设置; 图5为四线双极性步进电机内部原理图; 图6为步进电机转动的原理图: ①A加正极,A-加负极,B加负极,B-加负极(电机状态,N极朝上)。 ②A加负极,A-加负极,B加正极,B-加负极(电机状态,N极朝右,旋转90度)。 ③A加负极,A-加正极,B加负极,B-加负极(电机状态,N极朝下)。 ④A加负极,A-加负极,B加负极,B-加正极(电机状态,N极朝左)。 只要依次给相应引脚相应的电平就可以使得电机转动,转动的最小角度为90度。为了实现更加小角度的供电,本次设计中的供电顺序:A、AB、B、BA-、A-、A-B-、B-、B-A,转动的最小角度为45°。 四、程序框图 五、代码说明 代码由延时函数、按键扫描函数、模式判断函数、中断初始化函数、调速函数、主函数组成。 延时函数用于调节给电机供电的时间,从而实现调速。 按键扫描函数用来判断哪个键被按下,从而实现对应功能。 模式判断函数根据按键扫描的返回值执行相应功能。 中断初始化函数定义了两个中断。 调速函数通过两个中断函数实现电机转动的加减速。 主函数调用并执行子函数。 1.主函数 主函数声明两个中断函数,并进入子程序的循环,即先按键扫描,返回值再进入模式判断函数。 /****************************主函数**********************************/ void main(void) { Int0Init();//声明加速的中断 Int1Init();//声明减速的中断 while(1) { mode(key());//先按键扫描,后选择模式 } }声明部分。定义顺时针和逆时针转动时供电的顺序,分别放到两个数组里;定义数码管显示的供电;定义全局变量V用来调节转速、全局变量D用来调节显示的速度档。 #include unsigned char SSZ[] = {0x08,0x0a,0x02,0x06,0x04,0x05,0x01,0x09};//顺时针数组 unsigned char NSZ[] = {0x09,0x01,0x05,0x04,0x06,0x02,0x0a,0x08};//逆时针数组 smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//用于显示档速 int V=500,D=1;//V在延时函数中,用于调速;D用来控制数码管显示的数字 int i=4;//先使电机处于停机状态 int n=0;//用于循环给电机通电2.子函数1 延时函数用于调节给电机供电的时间,从而实现调速。 /***************************延时函数*******************************/ void delay(unsigned int t)//调节给电机供电的时间,从而调速 { while(t--); }3.子函数2 按键扫描函数用来判断哪个键被按下,从而实现对应功能。 /***************************按键扫描***************************************/ int key() { if(P0_0==0) i=1;//顺时针 if(P0_1==0) i=2;//逆时针 if(P0_2==0) i=3;//启动/回到初速度 if(P0_3==0) i=4;//停机 return i; }4.子函数3 模式判断函数根据按键扫描的返回值执行相应功能。停机即不给电机供电并使数码管显示0。启动会首先给全局变量V赋值500保证一定的延时,达到一定的转速,并且速度档先为1。正转使用顺时针数组内规则供电,反转使用逆时针数组内规则供电,并根据全局变量D的值显示速度档。 /****************************模式判断**************************************/ void mode(int i)//由按键扫描返回值判断 { switch(i) { /****************停机****************/ case 4: P2=0X00;//不给电机供电 P1=~smg[0];//数码管显示0 break; /****************启动/重启****************/ case 3: V=500;//启动的速度/初速度 D=1;//速度1档,自动进入模式1 /****************模式1 正转****************/ case 1: while(1) { for(n=0;n |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |