标题:
四步进电机,自动,手动控制,数码管显示速度 单片机四轴机器人程序
[打印本页]
作者:
yangjiang1
时间:
2019-9-10 13:54
标题:
四步进电机,自动,手动控制,数码管显示速度 单片机四轴机器人程序
实物调试
程序
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P0^2;
sbit SDA=P0^3;
//xainshi
unsigned char z; //运行的电机
unsigned char x; //正反
unsigned char c; //数字加
uchar code FFW1[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //四相八拍正转编码 前四
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍正转编码 后四
uchar code REV1[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; ////四相八拍反转编码 前四
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; ////四相八拍反转编码 后死
sbit BEEP = P0^7; //蜂鸣器
sbit K1 = P0^4; //cwshi
sbit K111 = P1^0; //
sbit K112 = P1^1; //
sbit K121 = P1^2; //
sbit K122 = P1^3; //
sbit K131 = P1^4; //
sbit K132 = P1^5; //
sbit K141 = P1^6; //
sbit K142 = P1^7; //
sbit K166 = P0^5; //全套动作
unsigned char keyval; //定义变量储存按键值
unsigned char jianzhi; //定义变量储存按键值
unsigned char M1;
unsigned char i1;
unsigned char t,shi,ge,bai,dadt;
unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
/*************************************************************************
********************
LCD WRITE 模式 连续写入数据
*************************************************************************/
/*********************************************************
*IIC_delay
*******************************************************/
void led_delay(void)
{
unsigned char j;
for(j=0;j<200;j++)
{}
}
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<130; k++)
{ }
}
}
//电机运转延时函数
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
//dengmingqi
void beep()
{
uchar i;
for (i=0;i<100;i++)
{
// delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}
//一号主控电机
//正转
void motor_ffw10()
{
uchar i;
// uint j;
// for (j=0; j<8; j++) //转1*n圈
for (i=0; i<8; i++) //一个周期转45度
{P2=FFW1[i]; //取数据
delay(1); //调节转速
c=i;
// }
}
}
//反转
void motor_rev11()
{
uchar i;
uint j;
x=0;
z=1;
// for (j=0; j<8; j++) //转1×n圈
{
// if(K3==0)
// {break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P2 = REV1[i]; //取数据
delay(1); //调节转速
c=i;
}
}
}
//二号主控电机
//电机正转动
void motor_ffw20()
{
uchar i;
uint j;
x=1;
z=2;
// for (j=0; j<8; j++) //转1*n圈
{
// if(K3==0)
//{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P2 = FFW[i]; //取数据
delay(1); //调节转速
c=i;
}
}
}
//反转
void motor_rev21()
{
uchar i;
uint j;
x=0;
z=2;
// for (j=0; j<8; j++) //转1×n圈
{
//if(K3==0)
// {break;} //退出此循环程序
c=8;
for (i=0; i<8; i++) //一个周期转45度
{
P2 = REV[i]; //取数据
delay(1); //调节转速
c=i;
}
}
}
//三号主控电机
//电机正转动
void motor_ffw30()
{
uchar i;
uint j;
x=1;
z=3;
//for (j=0; j<8; j++) //转1*n圈
for (i=0; i<8; i++) //一个周期转45度
{
P3=FFW1[i]; //取数据
delay(1);
c=i; //调节转速
}
}
//反转
void motor_rev31()
{
uchar i;
uint j;
x=0;
z=3;
// for (j=0; j<8; j++) //转1×n圈
// {
// if(K3==0)
// {break;}
//退出此循环程序
c=j;
for (i=0; i<8; i++) //一个周期转45度
{
P3 = REV1[i]; //取数据
delay(1); //调节转速
//调节转速
}
// }
}
//四号主控电机
//电机正转动
void motor_ffw40()
{
uchar i;
uint j;
x=1;
z=4;
// for (j=0; j<8; j++) //转1*n圈
{
// if(K3==0)
// {break;}
//退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P3 = FFW[i]; //取数据
c=i;
delay(2); //调节转速
}
}
}
//反转
void motor_rev41()
{
uchar i;
uint j;
x=0;
z=4;
// for (j=0; j<8; j++) //转1×n圈
{
c=j;
for (i=0; i<8; i++) //一个周期转45度
{
P3 = REV[i]; //取数据
delay(2); //调节转速
}
}
}
//一号主控电机
//正转
void motor_ffws10()
{
uchar i;
// uint j;
// for (j=0; j<8; j++) //转1*n圈
for (i=0; i<8; i++) //一个周期转45度
{P2=FFW1[i]; //取数据
delay(1); //调节转速
c=i;
// }
}
}
//反转
void motor_revs11()
{
uchar i;
uint j;
x=0;
z=1;
// for (j=0; j<8; j++) //转1×n圈
{
// if(K3==0)
// {break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P2 = REV1[i]; //取数据
delay(1); //调节转速
c=i;
}
}
}
//二号主控电机
//电机正转动
void motor_ffws20()
{
uchar i;
uint j;
x=1;
z=2;
// for (j=0; j<8; j++) //转1*n圈
{
// if(K3==0)
//{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P2 = FFW[i]; //取数据
delay(1); //调节转速
c=i;
}
}
}
//反转
void motor_revs21()
{
uchar i;
uint j;
x=0;
z=2;
// for (j=0; j<8; j++) //转1×n圈
{
//if(K3==0)
// {break;} //退出此循环程序
c=8;
for (i=0; i<8; i++) //一个周期转45度
{
P2 = REV[i]; //取数据
delay(1); //调节转速
c=i;
}
}
}
//三号主控电机
//电机正转动
void motor_ffws30()
{
uchar i;
uint j;
x=1;
z=3;
//for (j=0; j<8; j++) //转1*n圈
for (i=0; i<8; i++) //一个周期转45度
{
P3=FFW1[i]; //取数据
delay(1);
c=i; //调节转速
}
}
//反转
void motor_revs31()
{
uchar i;
uint j;
x=0;
z=3;
// for (j=0; j<8; j++) //转1×n圈
// {
// if(K3==0)
// {break;}
//退出此循环程序
c=j;
for (i=0; i<8; i++) //一个周期转45度
{
P3 = REV1[i]; //取数据
delay(1); //调节转速
//调节转速
}
// }
}
//四号主控电机
//电机正转动
void motor_ffws40()
{
uchar i;
uint j;
x=1;
z=4;
// for (j=0; j<8; j++) //转1*n圈
{
// if(K3==0)
// {break;}
//退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P3 = FFW[i]; //取数据
c=i;
delay(2); //调节转速
}
}
}
//反转
void motor_revs41()
{
uchar i;
uint j;
x=0;
z=4;
// for (j=0; j<8; j++) //转1×n圈
{
c=j;
for (i=0; i<8; i++) //一个周期转45度
{
P3 = REV[i]; //取数据
delay(2); //调节转速
}
}
}
//一号主控电机
//正转
void motor_ffwA10()
{
uchar i;
uint j;
x=1;
z=1;
for (j=0; j<50; j++) //转1*n圈
{
for (i=0; i<8; i++) //一个周期转45度
{
P2 = FFW1[i]; //取数据
delay(50); //调节转速
c=i;
z=1;
}
}
}
//反转
void motor_revA11()
{
uchar i;
uint j;
x=0;
z=1;
for (j=0; j<50; j++) //转1×n圈
{
// if(K3==0)
// {break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P2 = REV1[i]; //取数据
delay(50); //调节转速
z=1;
c=i;
}
}
}
//二号主控电机
//电机正转动
void motor_ffwA20()
{
uchar i;
uint j;
x=1;
z=2;
for (j=0; j<20; j++) //转1*n圈
{
// if(K3==0)
//{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P2 = FFW[i]; //取数据
delay(50); //调节转速
c=i;
z=2;
}
}
}
//反转
void motor_revA21()
{
uchar i;
uint j;
x=0;
z=2;
for (j=0; j<20; j++) //转1×n圈
{
//if(K3==0)
// {break;} //退出此循环程序
c=8;
for (i=0; i<8; i++) //一个周期转45度
{
P2 = REV[i]; //取数据
delay(50); //调节转速
c=i;
z=2;
}
}
}
//三号主控电机
//电机正转动
void motor_ffwA30()
{
uchar i;
uint j;
x=1;
z=3;
for (j=0; j<50; j++) //转1*n圈
{
for (i=0; i<8; i++) //一个周期转45度
{
P3=FFW1[i]; //取数据
delay(1);
c=i; //调节转速
z=3;
}
}
}
//反转
void motor_revA31()
{
uchar i;
uint j;
x=0;
z=3;
for (j=0; j<50; j++) //转1×n圈
{
// if(K3==0)
// {break;}
//退出此循环程序
c=j;
for (i=0; i<8; i++) //一个周期转45度
{
P3 = REV1[i]; //取数据
delay(1); //调节转速
//调节转速
z=3;
}
}
}
//四号主控电机
//电机正转动
void motor_ffwA40()
{
uchar i;
uint j;
x=1;
z=4;
for (j=0; j<30; j++) //转1*n圈
{
// if(K3==0)
// {break;}
//退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P3 = FFW[i]; //取数据
c=i;
delay(1); //调节转速
z=4;
}
}
}
//反转
void motor_revA41()
{
uchar i;
uint j;
x=0;
z=4;
for (j=0; j<30; j++) //转1×n圈
{
c=j;
for (i=0; i<8; i++) //一个周期转45度
{
P3 = REV[i]; //取数据
delay(2);
z=4;
}
}
}
void motor_ffw1A40()
{
uchar i;
uint j;
x=1;
z=4;
for (j=0; j<30; j++) //转1*n圈
{
// if(K3==0)
// {break;}
//退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P3 = FFW[i]; //取数据
c=i;
delay(1); //调节转速
z=4;
}
}
}
//反转
void motor_rev1A41()
{
uchar i;
uint j;
x=0;
z=4;
for (j=0; j<30; j++) //转1×n圈
{
c=j;
for (i=0; i<8; i++) //一个周期转45度
{
P3 = REV[i]; //取数据
delay(2);
z=4;
}
}
}
/*
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
*/
void init()
{
TMOD=0X01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
void IIC_delay(void)
{
unsigned char i;
for(i=0;i<20;i++) _nop_();
}
/*********************************************************
*
启动IIC
*********************************************************/
void start_IIC(void)
{
SCL=1; //给芯片发送开始信号
SDA=1;
IIC_delay();
SDA=0;
IIC_delay();
SCL=0; //开始信号传送完
IIC_delay();
}
/*******************************************************
*
停止IIC
*******************************************************/
void stop_IIC(void)
{
SCL=0;
IIC_delay();
SDA=0;
IIC_delay();
SCL=1;
IIC_delay();
SDA=1;
}
void ack_IIC()
{
SCL=0;
_nop_();_nop_();_nop_();
while(SDA);
SCL=1;
_nop_();_nop_();_nop_();
SCL=0;
}
/*******************************************************
*
写一个字节数据
*******************************************************/
void WriteByte(unsigned char WriteData)
{
unsigned char i;
for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
{
SCL=0;
IIC_delay();
WriteData=WriteData>>1;
SDA=CY;
IIC_delay();
SCL=1;
IIC_delay();
}
//8位数据传送完
ack_IIC(); //判断芯片发过来的ACK应答信号
}
/*******************************************************
/************************************************
写一字节数据到LEDSROM
**************************************************/
void write_LEDSROM(unsigned char addr,unsigned char WData)
{
start_IIC(); //调用开始信号
WriteByte(addr); //写起始地址命令(0C0H),地址00H单元。
WriteByte(WData);//给显示寄存器写显示数据,值可根据实参改变
stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
}
/************************************************
/************************************************
*
分开写数据到LED
**************************************************/
void xsled(void)
{
SDA=1;
SCL=1;
start_IIC(); //调用开始信号
WriteByte(0x44);//写命令40H(数据设置)
stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
write_LEDSROM(0xC0,0x00); //第一个数码管
write_LEDSROM(0xC1,xsbcdbuf[bai]); //第二个数码管
write_LEDSROM(0xC2,xsbcdbuf[shi]); //第三个数码管
write_LEDSROM(0xC3,xsbcdbuf[ge]);//第四个数码管
IIC_delay();
start_IIC(); //调用开始信号
WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
}
void jisuan()
{
bai=z ;
shi=x ;
ge=c;
//bai=dadt/100;
// shi=dadt/10%10;
// ge=dadt%10;
}
main()
{
P0=0xff;
M1=1;//chuzhi
// unsigned char z;
z=1;
//P1=0xff;
init();
while(1)
{
//motor_revA11();
//motor_revA10();
// jisuan();
// xsled();
jisuan();
xsled();
K166=0;
P2=0x00;
P3=0x00;
P1=0x00;
if(t==1000)
{
t=0;
}
//1号电机
if(K111==1)
{
// K1=1; //端口测试
// beep();
motor_ffw10(); //电机正转
}
if(K112==1)
{
motor_rev11(); //电机反转
}
//2号电机
if(K121==1)
{
motor_ffw20(); //电机正转
}
if(K122==1)
{
motor_rev21(); //电机反转
}
//3号电机
if(K131==1)
{
motor_ffw30(); //电机正转
}
if(K132==1)
{
motor_rev31(); //电机反转
}
//4号电机
if(K141==1)
{
motor_ffw40(); //电机正转
}
if(K142==1)
{
motor_rev41(); //电机反转
}
//quantao
if(K166==1)
{
uchar i;
for (i=0; i<1; i++)
{
K1=1;
{
// motor_ffwA20(); //电机正转
motor_revA21();
jisuan();
xsled();
}
jisuan();
xsled();
delay(2000);
jisuan();
xsled();
//#############################################################shang
// if(100>t>1)
{
motor_ffwA10(); //电机正转
jisuan();
xsled();
}
delay(2000);
jisuan();
xsled();
//######################################################################xaunzhuanzhenti
// if(30>t>25)
{
motor_ffwA30(); //电机正转
jisuan();
xsled();
}
jisuan();
xsled();
delay(1000);
jisuan();
xsled();
//if(30>t>25)
{
motor_revA31(); //电机正转
jisuan();
xsled();
}
delay(100);
jisuan();
xsled();
//#####################################################xuanzhaunshouwan
//下降之前展开机
//下降
//if(40>t>30)
{
jisuan();
xsled();
motor_revA41();
// motor_ffwA40(); //电机正转
jisuan();
xsled();
}
delay(3000);
jisuan();
xsled();
// if(250>t>120) #############################################xaijiang
{
motor_ffwA20(); //电机正转
// motor_revA21();
motor_ffwA20();
jisuan();
xsled();
}
jisuan();
xsled();
delay(2000);
jisuan();
xsled();
jisuan();
xsled();
//#####################################################jiajing
// if(40>t>30)
{
// motor_revA41(); //电机正转
motor_ffwA40();
jisuan();
xsled();
M1=0;
}
jisuan();
xsled();
//#############################################################shang
// if(100>t>1)
{
jisuan();
xsled();
motor_revA21();
// motor_ffwA20(); //电机正转
jisuan();
xsled();
}
delay(2000);
jisuan();
xsled();
jisuan();
xsled();
//if(20>t>13)#####################################################huizhuan
{
motor_revA11(); //电机正转
jisuan();
xsled();
}
// delay(2000);
jisuan();
xsled();
//z =0;
// x
// if(30>t>25)
{
/// motor_ffwA30(); //电机正转
}
jisuan();
xsled();
// delay(10000);
jisuan();
xsled();
//if(40>t>30)
{
// motor_ffwA40(); //电机正转
}
// delay(1000);
jisuan();
xsled();
//if(20>t>13)
{
// motor_revA11(); //电机正转
}
// delay(2000);
jisuan();
xsled();
//if(25>t>20)
{
// motor_revA21(); //电机正转
}
// delay(2000);
jisuan();
xsled();
//if(30>t>25)
{
// motor_revA31(); //电机正转
}
// delay(1000);
jisuan();
xsled();
// if(40>t>30)
{
// motor_revA41(); //电机正转
M1=0;
}
jisuan();
xsled();
// delay(2000);
}
}
jisuan();
xsled();
c =0;
}
}
void T0_time() interrupt 1
{
TH0=(65535-80000)/256;
TL0=(65535-60000)%256;
// TH0 = 0x0FC;
// TL0 = 0xEC;
t++;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1