?? 111.c
字號:
//--------------------------------------------------------------------------
//步進電機L297-02驅動程序。實現對步進電機的正反轉的控制
//注:為了便于觀察,步進電機初始設定很快,要實現步進角精確控制請更改延時
//-----------------------------------------------------------------------------
#include <c8051F330.h>
#include <intrins.h>
// SFR declarations
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F33x
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
#define SYSCLK 24500000 // SYSCLK frequency in Hz
#define TIMER2_RATE 1000 // Timer 2 overflow rate in Hz
//K
unsigned int i;
//端口配置
sbit reset=P1^4;
sbit half=P1^2;
sbit clock=P0^1;
sbit ccw=P1^1;
sbit enable=P1^3;
//sbit control=P1^7;
//*** 函數定義 ***
void delay100ms(int); // 延時100MS
void short_delay(void); //短延時2US
void SYSCLK_Init (void); //初始化系統時鐘
void PORT_Init (void); //端口初始化
void Timer2_Init (int); //定時器2初始化
void S_Init(void); //復位函數
void Dir_F(void); //正轉函數
void Dir_B(void); //反轉函數
void SYSCLK_Init (void)
{
OSCICN |= 0x03; // Configure internal oscillator to
// 24.5MHz
RSTSRC = 0x04; // Enable missing clock detector
}
void PORT_Init (void)
{
XBR0 = 0x00; // no digital peripherals selected
XBR1 = 0x40; // Enable crossbar and weak pull-ups
P1MDOUT |= 0xff; // enable P1 as a push-pull output
P0MDOUT |= 0xff; // enable P0 as a push-pull output
}
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // STOP Timer2; Clear TF2H and TF2L;
// disable low-byte interrupt; disable // split mode; select internal timebase
CKCON |= 0x10; // Timer2 uses SYSCLK as its timebase
TMR2RL = -counts; // Init reload values
TMR2 = TMR2RL; // Init Timer2 with reload value
ET2 = 0; // disable Timer2 interrupts
TR2 = 1; // start Timer2
}
void delay100ms(int time) //when time=100,the delay is 100ms
{
unsigned int count;
TF2H = 0; // Clear Timer2 overflow flag
TR2 = 1; // Start Timer2
for (count = time; count != 0; count--) {
while (!TF2H); // wait for overflow
TF2H = 0; // clear overflow indicator
}
TR2 = 0; // Stop Timer2
}
void short_delay(void) //delay 2us
{
unsigned int i;
for (i=0;i<49;i++);
}
//-----------------------------------------------------------------------------
void S_Init(void)
{
reset=0;
short_delay();
reset=1;
short_delay();
short_delay();
short_delay();
}
void Dir_F(void)
{
ccw=1;
for(i=0;i<1000;i++)
{
clock=1;
short_delay();
clock=0;
short_delay();
clock=1;
delay100ms(10);
}
}
void Dir_B(void)
{
ccw=0;
for(i=0;i<1000;i++)
{
clock=1;
short_delay();
clock=0;
short_delay();
clock=1;
delay100ms(10);
}
}
//主函數
void main ( ){
unsigned int i;
PCA0MD &= ~0x40;
OSCICN |= 0x03; // Set internal oscillator to highest
// setting (24500000)
PORT_Init (); /*初始化I/O口*/
SYSCLK_Init (); // Initialize system clock to 24.5MHz
Timer2_Init(SYSCLK/TIMER2_RATE); // Init Timer 2
// ccw=1;
half=1;
enable=1;
// control=0;
S_Init( );
while (1)
{
Dir_F( );
delay100ms(1000);
Dir_B( );
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -