你试试这个会不会顿挫感
mcu stc90c52RC
晶振 11.0592
电机 28BYJ-48
#include "STC89.h"
//#include "main.h"
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef uchar u8;
typedef uint u16;
typedef long int u32;
#define nop _nop_()
#define FOSC 11059200L //晶振
#define BAUD 9600 //波特率
#define Forward 1
#define Backward 0
#define M1_A P10
#define M1_B P11
#define M1_C P12
#define M1_D P13
#define Delay_2003 nop
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while ( --k );
}
while ( --j );
}
while ( --i );
}
//-----------------------------------------------
//direction 正反转
//run_part 运行步数
u8 M1_run ( u8 direction,u16 run_part ) ////减速比 1/64
{
// static u16 f=2000;
static u8 M1_part=1;
static u16 part=0;
static bit f=0;
static u16 _run_part;
if ( f==0 ) //是一个新数据
{
_run_part=run_part;//新步数载入缓存
part=0;//拍数从零开始
f=1;//
}
if ( part<_run_part )
{
part++;//记录已运行步数
if ( direction==Forward ) //正转
{
if ( M1_part ==8 )
{
M1_part=0;
}
M1_part++;
}
else if ( direction==Backward ) //反转
{
if ( M1_part==1 )
{
M1_part=9;
}
M1_part--;
}
switch ( M1_part )
{
case ( 1 ) :
M1_A =1;
M1_B =0;
M1_C =0;
M1_D =0;
Delay_2003;
break;
case ( 2 ) :
M1_A =1;
M1_B =1;
M1_C =0;
M1_D =0;
Delay_2003;
break;
case ( 3 ) :
M1_A =0;
M1_B =1;
M1_C =0;
M1_D =0;
Delay_2003;
break;
case ( 4 ) :
M1_A =0;
M1_B =1;
M1_C =1;
M1_D =0;
Delay_2003;
break;
case ( 5 ) :
M1_A =0;
M1_B =0;
M1_C =1;
M1_D =0;
Delay_2003;
break;
case ( 6 ) :
M1_A =0;
M1_B =0;
M1_C =1;
M1_D =1;
Delay_2003;
break;
case ( 7 ) :
M1_A =0;
M1_B =0;
M1_C =0;
M1_D =1;
Delay_2003;
break;
case ( 8 ) :
M1_A =1;
M1_B =0;
M1_C =0;
M1_D =1;
Delay_2003;
break;
}
}
else if ( part>=_run_part )
{
M1_A =0;
M1_B =0;
M1_C =0;
M1_D =0;
// part=0;
f=0;
}
return f;
}
//-----------------------------------------------
void TIME0_INIT ( void )
{
// AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //清空定时器模式
TMOD |= 0x01; //设置定时器模式16位
TL0 = ( 65536 - FOSC / 12 / 1000 ); // 1ms 的初装值*/
TH0 = ( 65536 - FOSC / 12 / 1000 ) >> 8;
ET0 = 1; //允许定时器0中断
TF0 = 0; //清除TF0标志
EA = 1; //允许总中断
TR0 = 1; //定时器0开始计时
}
//------------------------------
bit M1_flag;
void time0() interrupt 1 //定时/计数器 中断
{
// static bit a=1;
TF0 = 0; //清除TF0标志
TL0 = ( 65536 - FOSC / 12 / 1000 ); //设置定时初值 65536-fosc/12/1000 /*12T时 定时器 每 1ms 的初装值*/
TH0 = ( 65536 - FOSC / 12 / 1000 ) >> 8; //设置定时初值 TF1 = 0; //清除TF1标志
if ( M1_flag==1 )
{
M1_flag=M1_run ( Backward,4000 );
}
if ( M1_flag==0 )
{
P21=0; //步数完成
}
}
void main()
{
M1_A =0;
M1_B =0;
M1_C =0;
M1_D =0;
TIME0_INIT ( );//定时器初始化
while ( 1 )
{
Delay100ms();
P22=~P22;
if ( P20==0 )//按键启动电机
{
M1_flag=1;
P21=1;//关灯
}
};
}
|