步进电机控制系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "main.h"
- //步进电机引脚
- sbit s1=P2^3;
- sbit s2=P2^4;
- sbit s3=P2^5;
- sbit s4=P2^6;
- uchar scan_key1,scan_key2; //按键功能选择,00 停止,01 正转, 10 反转
- uchar step1;step2; //加减速选择,10加速,01减速
- static step_index;
- uint count1,count2; //定时
- static speed; //速度参数
- //uint jiaNum=0,jianNum=0;
- //uchar jiaChar[3],jianChar[2];
- //uchar flag=0;
- void main(void)
- {
- step2=0;
- step1=0;
- P1=0xff;//按键端口初始化
- s1=0;s2=0;s3=0;s4=0; //电机端口初始化
- EX1=1;//开启外部中断1
- EA=1;//开启总中断
- speed=2000;//速度初值,speed越小速度越快
- // init_1302();
- LCD_init();
- // jiaChar[2]='\0';
- // jianChar[2]='\0';
- while(1)
- {
- get_1302(time_1302);
- DS1302_change();
-
- LCD_display_char(0,2,times);
- LCD_display_char(0,1,date);
-
- if((scan_key1==1)&&(scan_key2==0))// 正转
- {
- ground(step_index);
- delay_speed(speed);
- step_index++; //大于7,从头再来
- if(step_index>7)
- step_index=0;
- LCD_display_char(11,1," ");
- LCD_display_char(11,1,"zhen");
- }
-
- if((scan_key1==0)&&(scan_key2==1)) //反转
- {
- ground(step_index);
- delay_speed(speed);
- step_index--;
- if(step_index<0) //小于0,从头再来。
- step_index=7;
- LCD_display_char(11,1," ");
- LCD_display_char(11,1,"fan");
- }
-
- if(scan_key1==0&&scan_key2==0) // 停止
- {
- s1=0;s2=0;s3=0;s4=0;
- // LCD_display_char(11,1," ");
- LCD_display_char(11,1,"stop ");
- // LCD_display_char(11,2," ");
- }
-
- if(step1==1&&step2==0) //加速
- {
- speed=speed-100;
- // if(flag==1)
- // jiaNum=jiaNum+1;
- // jiaChar[0]=jiaNum+'0';
- if(speed<1000||speed==1000) //速度最大阈值
- {
- speed=1000;
- }
- LCD_display_char(11,2," ");
- LCD_display_char(11,2,"+su");
- // LCD_display_char(14,2,jiaChar);
- }
- if(step1==0&&step2==0) //加减速归零
- {
- speed=2000;
- // LCD_display_char(11,2," ");
- LCD_display_char(11,2,"normal");
- }
- if(step1==0&&step2==1)//减速
- {
- speed=speed+100;
- if(speed>2500||speed==2500) //速度最小阈值
- {
- speed=2500;
- }
- LCD_display_char(11,2," ");
- LCD_display_char(11,2,"-su");
- }
- }
- }
- //速度延时控制函数
- void delay_speed(uint time)
- {
- for (count1=0;count1<time;count1++)
- for(count2=0;count2<3;count2++);
- }
- //按键处理程序(利用外部中断)
- void key(void) interrupt 2
- {
- uchar i;
- uchar butter;
- for(i=0;i<200;i++);//延时防抖
- if(P3^3==0)
- {
- butter=~P1;//低电平有效先取反
- switch(butter)
- {case 0x01: scan_key1=1;scan_key2=0; break; //正转
- case 0x02: scan_key1=0;scan_key2=0;break; //停止
- case 0x04: scan_key1=0 ;scan_key2=1; break; //反转
- case 0x08: step1=1;step2=0;break; //加速
- case 0x10: step1=0;step2=1;break; //减速
- case 0x20: step1=0;step2=0;break; //速度归零(回归初始值)
- default : ; //其它值返回
- }
- }
- P1=0Xff;//按键复位
- }
- //步进电机转步程序
- void ground(step_index)
- {
- switch(step_index)
- {
- case 0://0
- s1 = 1;
- s2 = 0;
- s3 = 0;
- s4 = 0;
- break;
- case 1://0,1
- s1 = 1;
- s2 = 1;
- s3 = 0;
- s4 = 0;
- break;
- case 2://1
- s1 = 0;
- s2 = 1;
- s3 = 0;
- s4 = 0;
- break;
- case 3://1,2
- s1 = 0;
- s2 = 1;
- s3 = 1;
- s4 = 0;
- break;
- case 4://2
- s1 = 0;
- s2 = 0;
- s3 = 1;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
步进电机控制系用.7z
(87.69 KB, 下载次数: 72)
|