本帖最后由 suellasun 于 2017-11-29 14:56 編輯
#include<reg51.h>
#define MotorTabNum 5
unsigned char T0_NUM;
unsigned char END_FLAG = 0;
sbit MotorEn = P2^1; // 使能
sbit FX = P2^0; // 方向
sbit CLK = P2^2; // 脈沖
unsigned char g_MotorSt = 0; // 啟停
unsigned char g_MotorDir = 0; // 正反
unsigned int SET_MotorPulse = 0; //相應角度對應的脈沖數量
unsigned int CLK_OUT_NUM = 0; // 脈沖計數
signed int MotorSpedNum = 0; // 速度檔
float CUR_MotorAngle = 0.0; // 當前角度
int MotorAngle;
unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
signed char g_MotorNum = 0;
//--------------
void delayms(xms);
void mDelay(unsigned int DelayTime); //延時函數
void T0_Init();
unsigned char Recive();
void SecondPro();
// 串口接收主程序
void main(void)
{
unsigned char lsData = 0;
T0_Init(); // 定時器0 1 初始化
MotorEn = 0; // 使能關閉
FX = 0; // 方向
while(1)
{
lsData = Recive();
if(lsData == 'A')
{
MotorAngle=90;
SET_MotorPulse=(unsigned int)((MotorAngle/0.9)*8.0);
SecondPro();
}
}
}
void SecondPro()
{
if (END_FLAG) // 角度目標達到
{
END_FLAG = 0; // 清
g_MotorSt = 0; // 電機關閉標志
MotorEn = 0;
}
else
{
TR0 = 1; //開啟定時器
g_MotorSt = 1;//開電機
MotorEn = 1; //電機使能
}
}
/********定時器初始化***********************************************************/
void T0_Init()
{
TMOD = 0x21; //定時器0 1
SCON |= 0x50;
PCON |= 0x00;
TH0 = (65535-100)/256; // 1ms
TL0 = (65535-100)%256;
TH1 = 0xf3; // 12MHZ 2400波特率
TL1 = 0xf3;
EA = 1;
ET0 = 1;
TR1 = 1;
REN = 1;
}
void Timer0_Init() ////////
{
TMOD = 0x20;
SCON = 0x50;
PCON = 0x00;
TH1 = 0xf3; // 12MHZ 2400波特率
TL0 = 0xf3;
TR1 = 1;
REN = 1;
}
unsigned char Recive() // 串口接收程序
{
unsigned char date;
while(RI == 0);
RI = 0;
date = SBUF;
return date;
}
/********定時器中斷*****************/
void T0_time() interrupt 1
{
TH0 = (65535-100)/256;
TL0 = (65535-100)%256;
T0_NUM++;
if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按鍵g_MotorNum++ 減小按鍵g_MotorNum--
{
T0_NUM = 0;
CLK=CLK^0x01; // 輸出脈沖
CLK_OUT_NUM++;
if(CLK_OUT_NUM >= SET_MotorPulse) // 達到角度目標
{
CLK_OUT_NUM = 0; // 脈沖清空
TR0 = 0; // 關閉定時器
END_FLAG = 1; // 目標達到標志
}
}
}
/********延時函數***********************************************************/
void delayms(xms)
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--)
;
}
|