你試試這個會不會頓挫感
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;//關燈
}
};
}
|