利用外部中断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;
- }
- }
- }
|