/******************************************************************
* OK887A V1.1 PIC单片机开发系统演示程序 *
*
* 标 题: OK887A V1.1 PIC学习板演示程序--步进电机单双八拍
* 文 件 名: MotorStep1 *
* 版本: V2.0 (2008/6/20) *
* 作者: 高山流水 (Email: aoke999@sohu.com) *
* 网站: www.aokemcu.cn(奥科电子) *
* *
* *
******************************************************************
* 功能描述: 单双八拍工作方式:A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)
********************************************************************************
*【版权】Copyright(C) 2009-2019 All Rights Reserved
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*******************************************************************************/
//#include <pic1687x.h>
#include <htc.h>
#include <math.h>
#define uint8 unsigned char
#define uint16 unsigned int
__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset
#define F1 RA1
#define F2 RA2
#define F3 RA3
#define F4 RA4
/***************************定义全局变量***************************************/
#define Speed 7 //速度,可以调节
volatile uint8 MotorStep = 0,count =0;
volatile uint8 time_flag = 0;
/***************************函数声明***************************************/
void SetMotor(void);
void InitMotor(void);
/*******************************************************************************
* 函 数 名: InitMotor(void
* 函数功能: 马达初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void InitMotor(void)
{
F1 = 1;
F2 = 1;
F3 = 1;
F4 = 1;
}
/*******************************************************************************
* 函 数 名: SetMotor(void)
* 函数功能: 马达八拍运行
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void SetMotor(void)
{
switch(MotorStep)
{
case 0: // A
if(time_flag)
{
F1 = 0;
F2 = 1;
F3 = 1;
F4 = 1;
MotorStep = 1;
time_flag = 0;
}
break;
case 1: // AB
if(time_flag ==1)
{
F1 = 0;
F2 = 0;
F3 = 1;
F4 = 1;
MotorStep = 2;
time_flag = 0;
}
break;
case 2: //B
if(time_flag ==1)
{
F1 = 1;
F2 = 0;
F3 = 1;
F4 = 1;
MotorStep = 3;
time_flag = 0;
}
break;
case 3: //BC
if(time_flag ==1)
{
F1 = 1;
F2 = 0;
F3 = 0;
F4 = 1;
MotorStep = 4;
time_flag = 0;
}
break;
case 4: //C
if(time_flag ==1)
{
F1 = 1;
F2 = 1;
F3 = 0;
F4 = 1;
MotorStep = 5;
time_flag = 0;
}
break;
case 5: //CD
if(time_flag ==1)
{
F1 = 1;
F2 = 1;
F3 = 0;
F4 = 0;
MotorStep = 6;
time_flag = 0;
}
break;
case 6: //D
if(time_flag ==1)
{
F1 = 1;
F2 = 1;
F3 = 1;
F4 = 0;
MotorStep = 7;
time_flag = 0;
}
break;
case 7: //DA
if(time_flag ==1)
{
F1 = 0;
F2 = 1;
F3 = 1;
F4 = 0;
MotorStep = 0;
time_flag = 0;
}
break;
default:break;
}
}
/******************************************************************************
* 函 数 名: main()
* 函数功能: 单双八拍
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void main()
{
ADCON1 = 0x8E;
TRISA = 0x00;
T1CON = 0x08;
TMR1H = 0xEC; //65535-1000*5 1毫秒延时
TMR1L = 0x77;
TMR1IE = 1;
TMR1IF = 0;
PEIE = 1;
GIE = 1;
TMR1ON = 1;
InitMotor();
while(1)
{
SetMotor();
}
}
/******************************************************************************
* 函 数 名: interrupt Capture(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void interrupt ISR(void)
{
if(TMR1IF == 1)
{
TMR1ON = 0;
TMR1IE = 0;
TMR1IF = 0;
count++;
if(count == Speed)
{
time_flag = 1;
count = 0;
}
TMR1H = (65535-5*1150)/256;
TMR1L = (65535-5*1150)%256;
TMR1IE = 1;
TMR1ON = 1;
}
}
- 1
- 2
前往页