分享一些51小程序步进电机
-
-
微爱永恒
- LV2工程师
-
| 2017-07-16 12:31:15
- 浏览量 675
- 回复:8
#include
/************************************宏定义************************************/
#define uchar unsigned char
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
/************************************位定义************************************/
sbit dula = P2^6;
sbit wela = P2^7;
/********************************定义变量和数组********************************/
uchar code table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段码
uchar code table1 = {0x01,0x02,0x04,0x08,0x08,0x04,0x02,0x01};//电机4拍拍数
uchar table2 = {0x00};
uchar Im = {0x00,0x00,0x00,0x00};
uchar f;
uchar IrOK;
unsigned long m,Tc;
uchar maichong = 0,table_begin = 0; //maichong步进电机速度档4为最慢 1为最快
//table_begin是table1数组开始位置
//table_begin=0正转 table_begin=1反转
//table1-为正转拍数
//table1-为反转拍数
uchar Start_Flag = 0; //启动标志 0为停止 1为启动
/******************************************************************************/
/* 函数名称 : delay */
/* 函数描述 : 延时函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void delay(uchar i)
{
uchar j,k;
for(j = i;j > 0;j--)
{
for(k = 125;k > 0;k--);
}
}
/******************************************************************************/
/* 函数名称 : display */
/* 函数描述 : 显示函数函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void display()
{
dula = 0;
if(maichong == 0) //开机maichong=0 显示0
{
P0=table;
dula = 1;
dula = 0;
P0 = 0xfd;
wela = 1;
wela = 0;
delay(5);
}
else //遥控器调整档位后maichong不为0
{
P0 = table; //显示档位maichong=1 对应4档
dula = 1;
dula = 0;
wela = 0;
P0 = 0xfd;
wela = 1;
wela = 0;
delay(10);
P0 = table2; //反转时显示"-"
dula = 1;
dula = 0;
wela = 0;
P0 = 0xfe;
wela = 1;
wela = 0;
delay(10);
}
}
/******************************************************************************/
/* 函数名称 : intersvr1 */
/* 函数描述 : 外部中断解码程序 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void intersvr1(void) interrupt 2 using 1
{
Tc = TH0 * 256 + TL0; //提取中断时间间隔时长
TH0 = 0;
TL0 = 0; //定时中断重新置零
if((Tc > Imin) && (Tc < Imax))
{
m = 0;
f = 1;
return;
} //找到启始码
if(f == 1)
{
if(Tc > Inum1 && Tc < Inum3)
{
Im = Im >> 1 | 0x80;
m++;
}
if(Tc > Inum2 && Tc < Inum1)
{
Im = Im >> 1;
m++; //取码
}
if(m == 32)
{
m = 0;
f = 0;
if(Im ==~ Im)
{
IrOK =1 ;
}
else
{
IrOK = 0; //取码完成后判断读码是否正确
}
}
}
}
/******************************************************************************/
/* 函数名称 : Motor_Driver */
/* 函数描述 : 电机驱动函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Motor_Driver(void)
{
uchar i,j;
for(j= 0 + table_begin;j < 4 + table_begin;j++)
{
P1=table1;
for(i = 0;i < maichong;i++)
{
display();
}
}
}
/******************************************************************************/
/* 函数名称 : Inf_Dispose */
/* 函数描述 : 红外接收处理函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Inf_Dispose(void)
{
if(IrOK == 1)
{
switch(Im)
{
case 0x0c: //遥控器1键按下 调为1档
maichong = 4;
break;
case 0x18: //遥控器2键按下 调为2档
maichong = 3;
break;
case 0x5e: //遥控器3键按下 调为3档
maichong = 2;
break;
case 0x08: //遥控器4键按下 调为4档
maichong = 1;
break;
case 0x44: //遥控器 开始/停止 键按下 启动停止控制
Start_Flag =~ Start_Flag;
break;
case 0x43: //遥控器 |<< 键按下 正转
if( maichong != 0) //不是0档的时候设置正反转
{
table_begin = 0;
table2 = 0; //数码管不显示
}
break;
case 0x40: //遥控器 >>| 键按下 反转
if( maichong != 0) //不是0档的时候设置正反转
{
table_begin = 4;
table2 = 0x40; //"-"码
}
break;
default:
break;
}
IrOK = 0;
}
}
/******************************************************************************/
/* 函数名称 : main */
/* 函数描述 : 主函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void main(void)
{
m = 0;
f = 0;
EA = 1;
IT1 = 1;
EX1 = 1;
TMOD = 0x11;
TH0 = 0;
TL0 = 0;
TR0 = 1;
while(1)
{
Inf_Dispose(); //红外接收处理
if(Start_Flag) //如果允许电机启动
{
Motor_Driver(); //电机驱动
}
else //如果不允许电机启动
{
P1 = 0x00; //不给电机输出脉冲
display(); //显示
}
}
}
#include
/************************************宏定义************************************/
#define uchar unsigned char
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
/************************************位定义************************************/
sbit dula = P2^6;
sbit wela = P2^7;
/********************************定义变量和数组********************************/
uchar code table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段码
uchar code table1 = {0x01,0x02,0x04,0x08,0x08,0x04,0x02,0x01};//电机4拍拍数
uchar table2 = {0x00};
uchar Im = {0x00,0x00,0x00,0x00};
uchar f;
uchar IrOK;
unsigned long m,Tc;
uchar maichong = 0,table_begin = 0; //maichong步进电机速度档4为最慢 1为最快
//table_begin是table1数组开始位置
//table_begin=0正转 table_begin=1反转
//table1-为正转拍数
//table1-为反转拍数
uchar Start_Flag = 0; //启动标志 0为停止 1为启动
/******************************************************************************/
/* 函数名称 : delay */
/* 函数描述 : 延时函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void delay(uchar i)
{
uchar j,k;
for(j = i;j > 0;j--)
{
for(k = 125;k > 0;k--);
}
}
/******************************************************************************/
/* 函数名称 : display */
/* 函数描述 : 显示函数函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void display()
{
dula = 0;
if(maichong == 0) //开机maichong=0 显示0
{
P0=table;
dula = 1;
dula = 0;
P0 = 0xfd;
wela = 1;
wela = 0;
delay(5);
}
else //遥控器调整档位后maichong不为0
{
P0 = table; //显示档位maichong=1 对应4档
dula = 1;
dula = 0;
wela = 0;
P0 = 0xfd;
wela = 1;
wela = 0;
delay(10);
P0 = table2; //反转时显示"-"
dula = 1;
dula = 0;
wela = 0;
P0 = 0xfe;
wela = 1;
wela = 0;
delay(10);
}
}
/******************************************************************************/
/* 函数名称 : intersvr1 */
/* 函数描述 : 外部中断解码程序 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void intersvr1(void) interrupt 2 using 1
{
Tc = TH0 * 256 + TL0; //提取中断时间间隔时长
TH0 = 0;
TL0 = 0; //定时中断重新置零
if((Tc > Imin) && (Tc < Imax))
{
m = 0;
f = 1;
return;
} //找到启始码
if(f == 1)
{
if(Tc > Inum1 && Tc < Inum3)
{
Im = Im >> 1 | 0x80;
m++;
}
if(Tc > Inum2 && Tc < Inum1)
{
Im = Im >> 1;
m++; //取码
}
if(m == 32)
{
m = 0;
f = 0;
if(Im ==~ Im)
{
IrOK =1 ;
}
else
{
IrOK = 0; //取码完成后判断读码是否正确
}
}
}
}
/******************************************************************************/
/* 函数名称 : Motor_Driver */
/* 函数描述 : 电机驱动函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Motor_Driver(void)
{
uchar i,j;
for(j= 0 + table_begin;j < 4 + table_begin;j++)
{
P1=table1;
for(i = 0;i < maichong;i++)
{
display();
}
}
}
/******************************************************************************/
/* 函数名称 : Inf_Dispose */
/* 函数描述 : 红外接收处理函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Inf_Dispose(void)
{
if(IrOK == 1)
{
switch(Im)
{
case 0x0c: //遥控器1键按下 调为1档
maichong = 4;
break;
case 0x18: //遥控器2键按下 调为2档
maichong = 3;
break;
case 0x5e: //遥控器3键按下 调为3档
maichong = 2;
break;
case 0x08: //遥控器4键按下 调为4档
maichong = 1;
break;
case 0x44: //遥控器 开始/停止 键按下 启动停止控制
Start_Flag =~ Start_Flag;
break;
case 0x43: //遥控器 |<< 键按下 正转
if( maichong != 0) //不是0档的时候设置正反转
{
table_begin = 0;
table2 = 0; //数码管不显示
}
break;
case 0x40: //遥控器 >>| 键按下 反转
if( maichong != 0) //不是0档的时候设置正反转
{
table_begin = 4;
table2 = 0x40; //"-"码
}
break;
default:
break;
}
IrOK = 0;
}
}
/******************************************************************************/
/* 函数名称 : main */
/* 函数描述 : 主函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void main(void)
{
m = 0;
f = 0;
EA = 1;
IT1 = 1;
EX1 = 1;
TMOD = 0x11;
TH0 = 0;
TL0 = 0;
TR0 = 1;
while(1)
{
Inf_Dispose(); //红外接收处理
if(Start_Flag) //如果允许电机启动
{
Motor_Driver(); //电机驱动
}
else //如果不允许电机启动
{
P1 = 0x00; //不给电机输出脉冲
display(); //显示
}
}
}