专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
小白白,求大神教导步进电机
2019-03-24 18:20
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
10245
8
1245
我有一个ULN2003A控制的四相步进电机,现在我打算用驱动器控制一个24V的两相步进电机,程序应该怎么改 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
fafafafather
2019-03-25 10:52
#include <AT89X51.h>
#include <stdio.h>
#include <math.h>
#define uc unsigned char
#define ui unsigned int
void chkbusy(void);
void wcode(uc cd) ;
void wdata(uc dat);
void disrow(uc page,uc col,uc *temp);
void display( uc page,uc col,uc *temp);
void ground(step); //转步
void run1(); //正转
void run2();
void stop();
void delay(ui time);
uc scan_key1,scan_key2; //按键功能选择,00 停止,01 正转 10 反转
uc step1;step2;
static step_index;
ui count1,count2; //定时
uc butter; //按键
static speed; //速度参数
void main(void)
{
P2=0xff;
step2=0;
step1=0;
P1=0xff;
P0=0;
EX1=1;
EA=1; //开中断
speed=1500;
while(1)
{
if((scan_key1==1)&(scan_key2==0)) // 正转
{
ground(step_index);
delay(speed);
step_index++; //大于7,从头再来
if(step_index>7)
step_index=0;
}
if((scan_key1==0)&(scan_key2==1)) //反转
{
ground(step_index);
delay(speed);
step_index--;
if(step_index<0) //小于0,从头再来。
step_index=7;
}
if(scan_key1==0&scan_key2==0)
{
P0=0xff;
}
if(step1==1&step2==0)
{
speed=speed-100;
if(speed<1000|speed==1000)
{ speed=1000;
}
}
if(step1==0&step2==1)
{
speed=speed+100;
if(speed>2500|speed==2500)
{ speed=2500;
}
}
}
}
//***************************************************
//************************* 延时子程序**************
//**************************************************
void delay(ui time) ///延时程序
{ for (count1=0;count1<time;count1++ ) //此处可以用中断进行准确定时。我只是瞎定了几个参数
for(count2=0;count2<3;count2++);
}
//*********************************************************
//******************按键处理程序****************************
//************************************************************
void key(void) interrupt 2
{
uc i;
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; // 加速
default : ; //其它值返回
}
}
P1=0XFF;
}
//**************************************************
//**********************转步************************
//**************************************************
void ground(step_index) //转步
{
switch(step_index)
{
case 0://0 //
P0_0 = 1; //
P0_1 = 0; //
P0_2 = 0;
P0_3 = 0;
break;
case 1://0,1
P0_0 = 1;
P0_1 = 1;
P0_2 = 0;
P0_3 = 0;
break;
case 2://1
P0_0 = 0;
P0_1 = 1;
P0_2 = 0;
P0_3 = 0;
break;
case 3://1,2
P0_0 = 0;
P0_1 = 1;
P0_2 = 1;
P0_3 = 0;
break;
case 4://2
P0_0 = 0;
P0_1 = 0;
P0_2 = 1;
P0_3 = 0;
break;
case 5://2,3
P0_0 = 0;
P0_1 = 0;
P0_2 = 1;
P0_3 = 1;
break;
case 6://3
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 1;
break;
case 7://3,0
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 1;
}
}
源程序
加载中...
查看其它8个回答
一周热门
更多
>
相关问题
相关文章
基于51单片机的计算器设计
0个评论
51单片机300个proteus仿真实例下载
0个评论
51单片机 蜂鸣器
0个评论
51单片机驱动RC522模块
0个评论
基于51单片机的指纹密码锁
0个评论
AT89C51单片机制作简易密码锁
0个评论
51单片机汇编语言计数器
0个评论
51单片机精确延时设计
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <stdio.h>
#include <math.h>
#define uc unsigned char
#define ui unsigned int
void chkbusy(void);
void wcode(uc cd) ;
void wdata(uc dat);
void disrow(uc page,uc col,uc *temp);
void display( uc page,uc col,uc *temp);
void ground(step); //转步
void run1(); //正转
void run2();
void stop();
void delay(ui time);
uc scan_key1,scan_key2; //按键功能选择,00 停止,01 正转 10 反转
uc step1;step2;
static step_index;
ui count1,count2; //定时
uc butter; //按键
static speed; //速度参数
void main(void)
{
P2=0xff;
step2=0;
step1=0;
P1=0xff;
P0=0;
EX1=1;
EA=1; //开中断
speed=1500;
while(1)
{
if((scan_key1==1)&(scan_key2==0)) // 正转
{
ground(step_index);
delay(speed);
step_index++; //大于7,从头再来
if(step_index>7)
step_index=0;
}
if((scan_key1==0)&(scan_key2==1)) //反转
{
ground(step_index);
delay(speed);
step_index--;
if(step_index<0) //小于0,从头再来。
step_index=7;
}
if(scan_key1==0&scan_key2==0)
{
P0=0xff;
}
if(step1==1&step2==0)
{
speed=speed-100;
if(speed<1000|speed==1000)
{ speed=1000;
}
}
if(step1==0&step2==1)
{
speed=speed+100;
if(speed>2500|speed==2500)
{ speed=2500;
}
}
}
}
//***************************************************
//************************* 延时子程序**************
//**************************************************
void delay(ui time) ///延时程序
{ for (count1=0;count1<time;count1++ ) //此处可以用中断进行准确定时。我只是瞎定了几个参数
for(count2=0;count2<3;count2++);
}
//*********************************************************
//******************按键处理程序****************************
//************************************************************
void key(void) interrupt 2
{
uc i;
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; // 加速
default : ; //其它值返回
}
}
P1=0XFF;
}
//**************************************************
//**********************转步************************
//**************************************************
void ground(step_index) //转步
{
switch(step_index)
{
case 0://0 //
P0_0 = 1; //
P0_1 = 0; //
P0_2 = 0;
P0_3 = 0;
break;
case 1://0,1
P0_0 = 1;
P0_1 = 1;
P0_2 = 0;
P0_3 = 0;
break;
case 2://1
P0_0 = 0;
P0_1 = 1;
P0_2 = 0;
P0_3 = 0;
break;
case 3://1,2
P0_0 = 0;
P0_1 = 1;
P0_2 = 1;
P0_3 = 0;
break;
case 4://2
P0_0 = 0;
P0_1 = 0;
P0_2 = 1;
P0_3 = 0;
break;
case 5://2,3
P0_0 = 0;
P0_1 = 0;
P0_2 = 1;
P0_3 = 1;
break;
case 6://3
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 1;
break;
case 7://3,0
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 1;
}
}
源程序
一周热门 更多>