步进电机的控制程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); } }