新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機串口通信控制步進電機

單片機串口通信控制步進電機

作者: 時間:2016-12-02 來源:網(wǎng)絡 收藏

/**
* @brief步進電機配置(根據(jù)輸出軸轉(zhuǎn)的圈數(shù)來確定轉(zhuǎn)子的拍數(shù)beats)
* @param 無
* @retval 無
*/
void motor_Config(ulong angle)
{
//在計算之前先關閉中斷
EA = 0;
beats = (angle*64*8*8)/360;
EA = 1;
}

/**
* @brief 定時器T0定時配置
* @param uint xms
* @retval 無
*/
void timer0_Config()
{
TMOD &= 0xF0;//清零T0控制位
TMOD |= 0x01;//T1方式1
TH0 = 0xF8;
TL0 = 0xCC;//2ms
TR0 = 1;
ET0 = 1;
EA = 1;
}

/**
* @brief 串口通信配置
* @param 無
* @retval 無
*/
void Uart_Config(uint baud)
{
SCON |= 0x50;//SM0-SM2 REN TB8 RB8 TI RI
TMOD &= 0x0F;//清零T1控制位
TMOD |= 0x20;//設定定時器T1八位自動重裝模式,計數(shù)設定串口波特率
TH1 = 256-(11059200/12/32/baud);//波特率 = 2^SMOD/32 * T1(溢出率) T1(溢出率) = 1/[(256-X)*(12/11059200)]
TL1 = TH1;
TR1 = 1;
ET1 = 0;//關閉T1的定時中斷
ES = 1;//打開串口中斷
EA = 1;//開總中斷
}

/**
* @brief T0中斷服務子程序
* @param 無
* @retval 無
*/
void timer0_Int() interrupt 1 using 3
{
static uchar step = 0;
uchar buf = 0;//存放相值
TH0 = 0xF8;
TL0 = 0xCC;
if (beats)
{
if (!dir)
{
buf = (P1 & 0xF0);//buf暫存P1的高字節(jié),清零低字節(jié)
buf |= table[step++];//將相值存入buf
step &= 0x07;//與方式實現(xiàn)到8歸零
P1 = buf;
beats--;
}
else
{
buf = (P1 & 0xF0);
buf |= table[step--];
if (step <= 0)
{
step = 7;
}
P1 = buf;
beats--;
}
}
else
{
P1 |= 0x0F;//關閉所有的相,即步進電機停止轉(zhuǎn)動
}
}

/**
* @brief 串口中斷服務子程序
* @param 無
* @retval 無
*/
void Uart_Int() interrupt 4 using 0
{
if (RI)
{
RI = 0;
if (SBUF > 1)
{
angle = SBUF;
}
else
{
dir = SBUF;
}
}
}


上一頁 1 2 下一頁

評論


技術專區(qū)

關閉