利用外部中断0和外部中断1,控制步进电机的正反转:
以下是程序:
/*
* GccApplication13.c
*
* Created: 2014-9-4 20:52:42
* Author: Administrator
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,flag_a;
uchar b,flag_b;
uchar tab1[]={0x02,0x06,0x04,0x0C,0x08,0x09,0x01,0x03}; //半步励磁,正转
uchar tab2[]={0x03,0x01,0x09,0x08,0x0C,0x04,0x06,0x02}; //半步励磁,正转
//interrupt[EXT_INT0] void int0_isr(void) //INT0启动、停止控制
ISR(INT0_vect)
{
a++;
if(a==1)
{
flag_a=1;
}
else if(a>=2)
{
a=0;
flag_a=0;
flag_b=0;
}
}
//interrupt[EXT_INT1] void int1_isr(void) //INT1正、反转控制
ISR(INT1_vect)
{
b++;
if(b==1)
{
flag_b=1;
PORTD &=~(1<<0);
PORTD|=(1<<1);
}
else if(b==2)
{
flag_b=2;
PORTD|=(1<<0);
PORTD&=~(1<<1);
b=0;
}
}
void delay(uint k)
{
long i;
for(i=0;i<k;i++);
}
int main(void)
{
uchar i;
DDRC=0xFF; //端口初始化
PORTC=0xFF;
DDRD=0xF3;
PORTD=0xFF;
MCUCR=0x0A; //定义INT0和INT1为下降沿时产生中断
GICR=0xC0; //允许INT0和INT1产生中断
//#asm("sei") //开启总中断
sei();
while(1)
{
if(flag_a==1)
{
if(flag_b==1)
{
for(i=0;i<8;i++)
{
PORTC=tab1[i];
delay(10000);
}
}
else if(flag_b==2)
{
for(i=0;i<8;i++)
{
PORTC=tab2[i];
delay(10000);
}
}
}
else if(a==0)
{
PORTC=0x00;
}
}
}
|