|
/*
實(shí)現(xiàn)功能是開(kāi)機(jī)電機(jī)歸位,按下按鍵K1可控制電機(jī)順時(shí)針轉(zhuǎn)動(dòng)0-140°(理論值),按鍵K3控制電機(jī)逆時(shí)針旋轉(zhuǎn)0-140°,但是不能超過(guò)初始位置。
*/
#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) //延時(shí)函數(shù)
{
while(h)
{
h--;
}
}
char zhuan[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //順時(shí)針
char fan[]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //逆時(shí)針
int num ,i=0,k;
void igt(void) //步進(jìn)電機(jī)歸位程序
{
num = At24c02Read(2); //讀取AT24c02里面2的地址(儲(chǔ)存的是上次記錄的步進(jìn)電機(jī)最終停止位的地址)
delay(1000);
while(num) //如果num不等于0,既步進(jìn)電機(jī)沒(méi)有歸位則運(yùn)行程序進(jìn)行玩歸位
{
for(i=0;i<8;i++)
{
P1=fan[i];
delay(100);
}
num --;
At24c02Write(2,num);
}
}
void shunzhuan() //按鍵K1控制電機(jī)順轉(zhuǎn)
{
if(h1 == 1)
{
if(K1 == 0) //判斷 K1按鍵是否按下 由于沒(méi)有使用中斷所以是通過(guò)單片機(jī)掃描檢測(cè)
{
delay(10); //消抖
if(K1 == 0) //再次判斷K1是否按下
{
for(i=0;i<8;i++) //運(yùn)行8拍
{
P1=zhuan[i];
delay(100);
}
num ++;
At24c02Write(2,num); //將運(yùn)行次數(shù)記錄進(jìn)AT24c02
}
}
}
if(num > 200)
{
h1 = 0;
led1 = 0;
}
else
{
h1 = 1;
led1 = 1;
}
}
void fanzhuan() //按鍵K3控制電機(jī)反轉(zhuǎn)
{
if(h2 == 0)
{
if(K3 == 0) //判斷 K3按鍵是否按下 由于沒(méi)有使用中斷所以是通過(guò)單片機(jī)掃描檢測(cè)
{
delay(10); //消抖
if(K3 == 0) //再次判斷K1是否按下
{
for(i=0;i<8;i++) //運(yùn)行8拍
{
P1=fan[i];
delay(100);
}
num --;
At24c02Write(2,num); //將運(yùn)行次數(shù)記錄進(jìn)AT24c02
}
}
}
if(num <= 0)
{
h2 = 1;
led2 = 0;
}
else
{
led2 = 1;
h2 = 0;
}
}
void init_motor() //手動(dòng)控制電機(jī)歸位,按一下就ok
{
if(K2 == 0)
{
delay(10);
if(K2 == 0)
{
igt();
while(!K2);
}
}
}
void main() //主函數(shù)
{
igt();
delay(10000);
num = At24c02Read(2);
delay(10000);
led1 = 1;
led2 = 1;
while(1)
{
shunzhuan();
fanzhuan();
init_motor();
}
}
//這里只是main.c而已,完整函數(shù)在附件中。我使用的是普中開(kāi)發(fā)板(入門(mén)板,大概50rmb左右的)
|
-
-
新建文件夾.zip
2019-11-8 12:13 上傳
點(diǎn)擊文件名下載附件
2.2 KB, 下載次數(shù): 13
完整程序
|