?? xiugai.c
字號:
/*****************************************************************************************************************
2009年3月5日14:58:54
下面的程序已經(jīng)實(shí)現(xiàn)了步進(jìn)電機(jī)的基本控制很好。現(xiàn)在要實(shí)現(xiàn)附加的功能
*****************************************************************************************************************/
#include <AT89X51.h>
#define uint unsigned int;
#define uchar unsigned char
//以下定義LED片選信號
sbit LED_1 = P3^0;
//定義輸入按鍵的序號
sbit K_1 = P1^0;
sbit K_2 = P1^1;
sbit K_3 = P1^2;
sbit K_4 = P1^3;
sbit K_5 = P1^4;
sbit K_6 = P1^5;
//以下定義共陰極LED的顯示代碼,0~9
uchar code tab[10] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//以下定義M1驅(qū)動(dòng)信號
sbit M1_1 = P2^0;
sbit M1_2 = P2^1;
sbit M1_3 = P2^2;
sbit M1_4 = P2^3;
static unsigned int count; //計(jì)數(shù)
static int step_index; //步進(jìn)索引數(shù),值為0-7 即是到該轉(zhuǎn)哪一步了
static bit turn; //步進(jìn)電機(jī)轉(zhuǎn)動(dòng)方向 turn=1 反向 turn=0 正向
static bit stop_flag; //步進(jìn)電機(jī)停止標(biāo)志
static int speedlevel; //步進(jìn)電機(jī)轉(zhuǎn)速參數(shù),數(shù)值越大速度越慢,最小值為1,速度最快
static int spcount; //步進(jìn)電機(jī)轉(zhuǎn)速參數(shù)計(jì)數(shù)
void delay(unsigned int endcount); //延時(shí)函數(shù),延時(shí)為endcount*0.5毫秒
void gorun(); //步進(jìn)電機(jī)控制步進(jìn)函數(shù)
//主函數(shù)開始
void main(void)
{
LED_1 = 0;//顯示第一個(gè)LED,既M1的狀態(tài)
count = 0;
step_index = 0;
speedlevel =2;
spcount = 0;
stop_flag = 1;//這里一開始設(shè)定為 stop_flag = 0 表示開機(jī)即進(jìn)行運(yùn)轉(zhuǎn),stop_flag = 1則表示停止
P2_0 = 0;
P2_1 = 0;
P2_2 = 0;
P2_3 = 0;
EA = 1; //允許CPU中斷
TMOD = 0x11; //設(shè)定時(shí)器0和1為16位模式1
ET0 = 1; //定時(shí)器0中斷允許
TH0 = 0x50; //BEFORE FE0C
TL0 = 0x00; //設(shè)定時(shí)每隔65.53ms中斷一次
TR0 = 1; //開始計(jì)數(shù)
delay(10000);
}
//定時(shí)器0中斷處理 在這個(gè)中斷中完成步進(jìn)電機(jī)的步進(jìn)功能的
void timeint(void) interrupt 1
{
TH0=0x50;
TL0=0x00;//設(shè)定時(shí)每隔65.536ms中斷一次
TR0 = 1;
count++;
spcount--;
if(spcount<=0) //速度調(diào)整,SPEEDLEVEL越大,延時(shí)越長(延時(shí)約為1MS*SPEEDLEVEL),// 頻率越小,速度越慢
{
spcount = speedlevel;
gorun();
}
K_1 = 1;//讀數(shù)前先置1
if (K_1 == 0) stop_flag = 1;
K_2 = 1;//讀數(shù)前先置1
if (K_2 == 0) stop_flag = 0 ;
K_3 = 1;//讀數(shù)前先置1
if (K_3 == 0) turn = 1 ;
K_4 = 1;//讀數(shù)前先置1
if (K_4 == 0) turn= 0 ;
K_5 = 1;//讀數(shù)前先置1
if (K_5 == 0)
{
speedlevel+=1;
}
K_6 = 1;//讀數(shù)前先置1
if (K_6 == 0)
{
speedlevel-=1;
}
}
void delay(unsigned int endcount)
{
count=0;
do{}while(count<endcount);
}
void gorun()
{
if (stop_flag==1)
{
P2_0 = 0;
P2_1 = 0;
P2_2 = 0;
P2_3 = 0;
P0 = tab[0];
return;
}
else if (stop_flag==0)
{
if (turn==0)
P0 = tab[1];
else
P0 = tab[2];
}
switch(step_index)
{
case 0: //0
P2_0 = 0;
P2_1 = 0;
P2_2 = 0;
P2_3 = 1;
break;
case 1: //0、1
P2_0 = 0;
P2_1 = 0;
P2_2 = 1;
P2_3 = 1;
break;
case 2: //1
P2_0 = 0;
P2_1 = 0;
P2_2 = 1;
P2_3 = 0;
break;
case 3: //1、2
P2_0 = 0;
P2_1 = 1;
P2_2 = 1;
P2_3 = 0;
break;
case 4: //2
P2_0 = 0;
P2_1 = 1;
P2_2 = 0;
P2_3 = 0;
break;
case 5: //2、3
P2_0 = 1;
P2_1 = 1;
P2_2 = 0;
P2_3 = 0;
break;
case 6: //3
P2_0 = 1;
P2_1 = 0;
P2_2 = 0;
P2_3 = 0;
break;
case 7: //3、0
P2_0 = 1;
P2_1 = 0;
P2_2 = 0;
P2_3 = 1;
}
if (turn==0)
{
step_index++;
if (step_index>7)
step_index=0;
}
else
{
step_index--;
if (step_index<0)
step_index=7;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -