📄 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 + -