www.pudn.com > stepper_motor_controller.rar > contol.c
/ //*************************************************** // Created by sheriflee // Edited by Jihengzhang // Created time: Jun 24th,2004 // 计算时将数值都乘以10,即假定每一步走9度而非0.9度 //************************************************** #include#include //*** 主程序 ** main() { for (tmr=0;tmr<0x2000;tmr++); //上电延时 send_byte(CMD_RESET); //复位HD7279A //****************************************** // initialize cpu //****************************************** // SCON = 0x52; //SCON 串行口设置 // TMOD = 0x20; //* TMOD 时钟模式设置 IE = 0x81; //允许外部中断int0 TCON = 0x01; //* TCON 定时器控制 int0边沿触发 //****************************************** // initialize L279 //****************************************** l297_en=0; // 禁止电机动作 l297_rst=0; // 复位 l297_ref=1; // 参考电压为5V l297_half=1; // 半步 l297_ctrl=1; // 相位调脉宽 l297_clk=1; // 准备发脉冲 //****************************************** // 测试 //****************************************** send_byte(CMD_TEST); //发送测试指令 delay5p5ms(50); send_byte(CMD_RESET); //清除显示 //********************************************** // 闪烁等待键盘输入 //********************************************** // wait_cnter=0; key_number=0xff; keyin_data[0]=0x0f; keyin_data[1]=0x0f; keyin_data[2]=0x0f; angle =0; write7279(BLINKCTL,0xf8); //第1、2、3 位设置为闪烁显示 write7279(UNDECODE,0X08); //在第1位显示下划线'_' write7279(UNDECODE+1,0x08); //在第2位显示下划线'_' write7279(UNDECODE+2,0x08); //在第3位显示下划线'_' //********************************************** // 电机控制相关的初始化 //********************************************** angle =0; keyin_angle =0; do{ if (flag_run) //允许运转 { if(real_angle >9) //还够转一步 { real_angle =real_angle-9; // 转过一步 angle =angle + 9; if (real_angle < keyin_angle/8) delay =delay -2; if (real_angle >(keyin_angle/8)*7) delay =delay +2; l297_cw =flag_sign; // clockwise/counterclockwise stepping(delay); } else flag_run=0; } led0_show( &angle); led1_show( &real_angle); } while (1); } //*********** The end of main function ************ //********************************************** // interrupt0 service function //********************************************** void int0_serv( void ) interrupt 0 { IE =0; // 禁止中断 flag_run=0; // 停止转动 write7279(BLINKCTL,0xff); //第1、2、3 位设置为闪烁显示 key_number=read7279(CMD_READ); //读出按键 switch(key_number){ case KEY_1: data_shift(keyin_data,3); keyin_data[0]=0x01; break; case KEY_2: data_shift(keyin_data,3); keyin_data[0]=0x02; break; case KEY_3: data_shift(keyin_data,3); keyin_data[0]=0x03; break; case KEY_4: data_shift(keyin_data,3); keyin_data[0]=0x04; break; case KEY_5: data_shift(keyin_data,3); keyin_data[0]=0x05; break; case KEY_6: data_shift(keyin_data,3); keyin_data[0]=0x06; break; case KEY_7: data_shift(keyin_data,3); keyin_data[0]=0x07; break; case KEY_8: data_shift(keyin_data,3); keyin_data[0]=0x08; break; case KEY_9: data_shift(keyin_data,3); keyin_data[0]=0x09; break; case KEY_0: data_shift(keyin_data,3); keyin_data[0]=0x00; //输入零 break; case KEY_C: //输入值正负切换 flag_sign=!flag_sign; break; case KEY_D: //急停 write7279(BLINKCTL,0xff); //闪烁显示 break; case KEY_E: //清除输入值 { keyin_data[0]=0x0f; keyin_data[1]=0x0f; keyin_data[2]=0x0f; } break; case KEY_F: write7279(BLINKCTL,0xf8); //闪烁显示 if (keyin_data[0]>9) keyin_angle=0; else if (keyin_data[1]>9) keyin_angle = keyin_data[0]; else if (keyin_data[2]>9) keyin_angle = keyin_data[1]*10+keyin_data[0]; else keyin_angle = keyin_data[2]*100+keyin_data[1]*10+keyin_data[0]; keyin_angle =keyin_angle*10; // 输入角度值×1便于计算 real_angle =keyin_angle; // 转动过程中数值随着变化 delay =DELAY; // 装入延时的初始值 keyin_data[0]=0x0f; // 保存输入值缓冲区清零 keyin_data[1]=0x0f; keyin_data[2]=0x0f; flag_run=1; // 开始转动 break;} led1_show( &real_angle ); //调用显示函数 IE =0x81; // 开启中断 } void write7279(unsigned char cmd, unsigned char dta){ send_byte (cmd); send_byte (dta); } unsigned char read7279(unsigned char command){ send_byte(command); return(receive_byte()); } //****************************************** // send_byte function //****************************************** void send_byte( unsigned char out_byte){ unsigned char i; cs=0; long_delay(); for (i=0;i<8;i++){ if (out_byte&0x80) dat=1; else dat=0; clk=1; short_delay(); clk=0; short_delay(); out_byte=out_byte*2; } dat=0; } //****************************************** // receiv_byte function //****************************************** unsigned char receive_byte(void){ unsigned char i, in_byte; dat=1; // long_delay(); for (i=0;i<8;i++){ clk=1; short_delay(); in_byte=in_byte*2; if (dat) in_byte=in_byte|0x01; clk=0; short_delay(); } dat=0; return (in_byte); } //****************************************** // led0_show function //****************************************** void led0_show(unsigned int *p ){ unsigned char i,j,k; i= *p /1000; j= (*p - i*100)/100; k=*p - (i*1000)-(j*100); write7279(DECODE0+6,i); write7279(DECODE0+5,j); write7279(DECODE0+4,k); } //****************************************** // led1_show function //****************************************** void led1_show(unsigned int *p){ unsigned char i,j,k; if (flag_sign) write7279(UNDECODE+3,0x01); else write7279(UNDECODE+3,0x00); if (flag_run) { i= *p /1000; j= (*p - i*100)/100; k=*p - (i*1000)-(j*100); write7279(DECODE0+6,i); write7279(DECODE0+5,j); write7279(DECODE0+4,k); } else { for(i=0;i<3;i++) write7279(DECODE0+i,keyin_data[i]); } } //****************************************** // long_delay function //****************************************** void long_delay(void){ unsigned char i; for (i=0;i<0x30;i++); } void short_delay(void){ unsigned char i; for (i=0;i<8;i++); } //****************************************** // delay5p5ms function //****************************************** void delay5p5ms(unsigned char time){ unsigned char i; unsigned int j; for (i=0;i