分享一些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(); //显示 } } }
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:2
建模太难了 2017-07-19
#define Imax 14000 //此处为晶振为11.0592时的取值, #define Imin 8000 //如用其它频率的晶振时, #define Inum1 1450 //要改变相应的取值。 #define Inum2 700 #define Inum3 3000 这部分不用可以吗
0   回复
举报
发布
磨砂膏99 回复 2017-07-20
晶振设置的,必须的
0   回复
举报
qq1328512480 2017-07-19
辛苦辛苦,欢迎欢迎
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子