?? main.c
字號:
/**********************************
/nRF24LE1控制步進電機
***********************************/
#include "reg24le1.h"
#include "intrins.h"
/**********************************/
#define A1 P00
#define A2 P01
#define B1 P02
#define B2 P03
/**********************************/
#define LEDF P04
#define LEDR P05
#define Disableint do{EA=0;}while(0)
#define Enableint do{EA=1;}while(0)
#define TABLE_LONGTH 120
/**********************************/
#define true 1
#define false 0
/**********************************/
#define Goahead 1
#define Goback 0
#define STOP 0
#define RUN 1
/**********************************/
typedef unsigned int uint;
typedef unsigned char uchar;
typedef struct MOTOR{
uint Steps;
uint Stepc;
uchar MOTORderection;
uint Speed;
uchar State;
}STEPMOTORTYPE;
STEPMOTORTYPE StepMotor;
static uint xdata SpeedTable[TABLE_LONGTH];
/**********************************/
void MCUCLKSET()
{
CLKCTRL = 0x28;/*使用 XCOSC16M */
CLKLFCTRL = 0x01;
}
/**********************************/
void IOCONFIG()
{
P0DIR&=0XC0; /*設置P0.0~P0.5為輸出*/
P0=0X00;
}
/**********************************
/設置定時器0用來控制速度
***********************************/
void Timer0init()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EA=0;
}
/**********************************
/初始化速度表
**********************************/
void SpeedTableinit()
{
uchar i;
SpeedTable[0]=30000;
SpeedTable[1]=25000;
for(i=2;i<TABLE_LONGTH;i++)
{
SpeedTable[i]=SpeedTable[i-2]-SpeedTable[i-1]/4;
}
}
/**********************************
/Delay延時函數
***********************************/
void Delay(uint x)
{
uchar dl;
for(;x>0;x--)
for(dl=200;dl>0;dl--)
{
_nop_();
}
}
/**********************************
/脈沖設置函數
**********************************/
void PulseSet(uchar _A1,uchar _A2,uchar _B1,uchar _B2)
{
A1=_A1;
A2=_A2;
B1=_B1;
B2=_B2;
return;
}
/**********************************
/步進電機驅動函數
***********************************/
void MOTORRUN(uchar Derection)
{
static uchar Num=0;
if(Derection==Goahead) /*設置正轉*/
{
Num=(Num+1)%8;
}
else /*設置反轉*/
{
Num=(Num+7)%8;
}
switch(Num)
{
case 0 :PulseSet(0,1,1,1);break;
case 1 :PulseSet(0,0,1,1);break;
case 2 :PulseSet(1,0,1,1);break;
case 3 :PulseSet(1,0,0,1);break;
case 4 :PulseSet(1,1,0,1);break;
case 5 :PulseSet(1,1,0,0);break;
case 6 :PulseSet(1,1,1,0);break;
case 7 :PulseSet(0,1,1,0);break;
default:break;
}
}
/**********************************
/步進電機控制運行
***********************************/
void MotorCtr()
{
if(StepMotor.Steps>StepMotor.Stepc)
{
StepMotor.State=RUN;
StepMotor.Speed=StepMotor.Steps-StepMotor.Stepc;
if(StepMotor.Speed>119)
{
StepMotor.Speed=119;
}
MOTORRUN(StepMotor.MOTORderection);
StepMotor.Stepc++;
}
else if(StepMotor.Steps<=StepMotor.Stepc)
{
StepMotor.State=STOP;
StepMotor.Speed=0;
StepMotor.Steps=0;
StepMotor.Stepc=0;
}
}
/**********************************
/步進電機啟動參數設置
***********************************/
void MOTORSET(uchar state,bit Derection,uint steps)
{
StepMotor.Stepc=0;
StepMotor.Steps=steps;
StepMotor.MOTORderection=Derection;
StepMotor.Speed=100;
StepMotor.State=state;
if(StepMotor.State!=STOP)
{TR0=1;} /*打開步進電機前進*/
}
/**********************************
/定時中斷服務函數
***********************************/
void TIMER0ISR() interrupt INTERRUPT_TF0
{
TR0=0;
MotorCtr();
// TH0=(65536-SpeedTable[StepMotor.Speed])/256;
// TL0=(65536-SpeedTable[StepMotor.Speed])%256;
TH0=(65536-1500)/256;
TL0=(65536-1500)%256;
if(StepMotor.State!=STOP)
{
TR0=1;/*打開定時器*/
}
}
/*********************************
/主函數部分
**********************************/
void main()
{
/*初始化函數*/
Disableint;
MCUCLKSET();
IOCONFIG();
Timer0init();
SpeedTableinit();
Enableint;
while(1)
{
/*設置步進電機正轉*/
LEDR=0;
LEDF=1;
MOTORSET(RUN,Goahead,10000);
while(StepMotor.State!=STOP);
Delay(20000);
/*設置步進電機反轉*/
LEDF=0;
LEDR=1;
MOTORSET(RUN,Goback,10000);
while(StepMotor.State!=STOP);
Delay(20000);
}
}
/*******************************
/ 程序到此結束 /
********************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -