步进电机的控制程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

mega16的,16和32管脚兼容,只不过flash大小不一样,不过中断向量号也不一样,你看下自己改改。时钟频率:内部RC 1M 芯片:ULN2003 键值:0 小角度快正转。1 小角度快倒。2 大角度快转。3 大角度快倒。4 小角度正慢转。5 小角度倒慢转。6 大角度正慢转。7 大角度倒慢转。********************************************************************/

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar a=0,b=0;

uchar KEY_num=0xe1;

unsigned int m=9000;

const uchar f1[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03}; //正转时序3.75度

const uchar f2[]={0x04,0x06,0x02,0x03,0x01,0x09,0x08,0x0c}; //倒转时序3.75度

const uchar f3[]={0x01,0x02,0x04,0x08}; //正转时序7.5度

const uchar f4[]={0x01,0x08,0x04,0x02}; //倒转时序7.5度

void delay(int k) //延时

{ int i; for(i=0;i

void delay_10ms(uint data)

{ uint m=2; while(data) { data--; m=2; while(m)m--; } }

void zhengzhuan1(void) //正转3.75度

{ unsigned char j; for (j=0;j<8;j++) { PORTC=f1[j]; delay(m); } }

void daozhuan1(void) //倒转3.75度

{ unsigned char j; for (j=0;j<8;j++) { PORTC=f2[j]; delay(m); } }

void zhengzhuan2(void) //正转7.5度

{ unsigned char j; for (j=0;j<4;j++) { PORTC=f3[j]; delay(m); } }

void daozhuan2(void) //倒转7.5度

{ unsigned char j; for (j=0;j<4;j++) { PORTC=f4[j]; delay(m); } }

void port_int() //初始化端口

{ PORTB = 0xf0; DDRB = 0x0F; DDRC=0xff; PORTC=0x01; }

void init_devices(void)

{ CLI(); //禁止所有中断

MCUCR = 0x00; MCUCSR = 0x80;//禁止

JTAG GICR = 0x00; port_int();

SEI();//开全局中断}

//按键键值读取程序//返回按键键值,如果没有按键则返回0.

void KYY_read()

{ //定义按键值存放内存

PORTB=0xf0; //行全部送高电平

PORTB=0xf0;

if((PINB&0xf0)!=0xf0) //有按键

{ delay_10ms(1);//延时消抖

if((PINB&0xf0)!=0xf0) //确定有按键按下

{ PORTB=0xfe; //扫描第一行

PORTB=0xfe;

if((PINB&0xf0)!=0xf0)

{ KEY_num=(PINB&0xf0)+1; a=9; }

PORTB=0xfd; //扫描第二行PORTB=0xfd;

if((PINB&0xf0)!=0xf0)

{ KEY_num=(PINB&0xf0)+2; } PORTB=0xfb; //扫描第三行PORTB=0xfb;

if((PINB&0xf0)!=0xf0)

{ KEY_num=(PINB&0xf0)+4; } PORTB=0xf7; //扫描第四行PORTB=0xf7;

if((PINB&0xf0)!=0xf0)

{ KEY_num=(PINB&0xf0)+8; } } } //没有按键返回0 }

//按键执行程序//送如参数:按键键值

KEY_do(uchar data)

{ uchar KEY_number=data;

switch(KEY_number)

{ case 0xe1:a=0;b=0;daozhuan1();m=5000;break;

case 0xd1:a=0;b=1;daozhuan1();m=6000;break;

case 0xb1:a=0;b=2;daozhuan1();m=7000;break;

case 0x71:a=0;b=3;daozhuan1();m=8000;break;

case 0xe2:a=0;b=4;daozhuan2();m=5000;break;

case 0xd2:a=0;b=5;daozhuan2();m=6000;break;

case 0xb2:a=0;b=6;daozhuan2();m=7000;break;

case 0x72:a=0;b=7;daozhuan2();m=8000;break;

case 0xe4:a=0;b=8;zhengzhuan1();m=5000;break;

case 0xd4:a=0;b=9;zhengzhuan1();m=6000;break;

case 0xb4:a=1;b=0;zhengzhuan1();m=7000;break;

case 0x74:a=1;b=1;zhengzhuan1();m=8000;break;

case 0xe8:a=1;b=2;zhengzhuan2();m=5000;break;

case 0xd8:a=1;b=3;zhengzhuan2();m=6000;break;

case 0xb8:a=1;b=4;zhengzhuan2();m=7000;break;

case 0x78:a=1;b=5;zhengzhuan2();m=8000;break; default:b=0;break;

}

}

void main (void)//主程序

{ init_devices();

while(1)

{ KYY_read(); KEY_do(KEY_num); }

}

相关文档
最新文档