|
/*
实现功能是开机电机归位,按下按键K1可控制电机顺时针转动0-140°(理论值),按键K3控制电机逆时针旋转0-140°,但是不能超过初始位置。
*/
#include<iic.h>
sbit K1 = P3^2; //按键K1
sbit K2 = P3^1; //按键K2
sbit K3 = P3^0; //按键K3
sbit led1 = P2^2; //最大位置指示灯
sbit led2 = P2^3; //初始位置指示灯
bit h1=0,h2=0;
void delay(unsigned int h) //延时函数
{
while(h)
{
h--;
}
}
char zhuan[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //顺时针
char fan[]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //逆时针
int num ,i=0,k;
void igt(void) //步进电机归位程序
{
num = At24c02Read(2); //读取AT24c02里面2的地址(储存的是上次记录的步进电机最终停止位的地址)
delay(1000);
while(num) //如果num不等于0,既步进电机没有归位则运行程序进行玩归位
{
for(i=0;i<8;i++)
{
P1=fan[i];
delay(100);
}
num --;
At24c02Write(2,num);
}
}
void shunzhuan() //按键K1控制电机顺转
{
if(h1 == 1)
{
if(K1 == 0) //判断 K1按键是否按下 由于没有使用中断所以是通过单片机扫描检测
{
delay(10); //消抖
if(K1 == 0) //再次判断K1是否按下
{
for(i=0;i<8;i++) //运行8拍
{
P1=zhuan[i];
delay(100);
}
num ++;
At24c02Write(2,num); //将运行次数记录进AT24c02
}
}
}
if(num > 200)
{
h1 = 0;
led1 = 0;
}
else
{
h1 = 1;
led1 = 1;
}
}
void fanzhuan() //按键K3控制电机反转
{
if(h2 == 0)
{
if(K3 == 0) //判断 K3按键是否按下 由于没有使用中断所以是通过单片机扫描检测
{
delay(10); //消抖
if(K3 == 0) //再次判断K1是否按下
{
for(i=0;i<8;i++) //运行8拍
{
P1=fan[i];
delay(100);
}
num --;
At24c02Write(2,num); //将运行次数记录进AT24c02
}
}
}
if(num <= 0)
{
h2 = 1;
led2 = 0;
}
else
{
led2 = 1;
h2 = 0;
}
}
void init_motor() //手动控制电机归位,按一下就ok
{
if(K2 == 0)
{
delay(10);
if(K2 == 0)
{
igt();
while(!K2);
}
}
}
void main() //主函数
{
igt();
delay(10000);
num = At24c02Read(2);
delay(10000);
led1 = 1;
led2 = 1;
while(1)
{
shunzhuan();
fanzhuan();
init_motor();
}
}
//这里只是main.c而已,完整函数在附件中。我使用的是普中开发板(入门板,大概50rmb左右的)
|
|