|
/*
實現功能是開機電機歸位,按下按鍵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左右的)
|
-
-
新建文件夾.zip
2019-11-8 12:13 上傳
點擊文件名下載附件
2.2 KB, 下載次數: 13
完整程序
|