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 #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; // 转过一步 if (flag_sign) angle=angle - 9; else angle=angle + 9; if (real_angle <= keyin_angle/8) { if (delay < NNN) delay= delay +3; } else if (real_angle >=(keyin_angle/8)*7) { if (delay >3) delay= delay -3; } l297_cw =flag_sign; // clockwise/counterclockwise stepping(delay); } else flag_run=0; led1_show(real_angle); } led0_show(angle); } while (1); } //*********** The end of main function ************ //********************************************** // interrupt0 service function //********************************************** void int0_serv( void ) interrupt 0 using 1 { IE =0; // 禁止中断 write7279(BLINKCTL,0xff); //第1、2、3 位设置为闪烁显示 key_number=read7279(CMD_READ); //读出按键 switch(key_number){ case KEY_1: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x01; break; case KEY_2: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x02; break; case KEY_3: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x03; break; case KEY_4: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x04; break; case KEY_5: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x05; break; case KEY_6: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x06; break; case KEY_7: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x07; break; case KEY_8: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x08; break; case KEY_9: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x09; break; case KEY_0: flag_run=0; // 停止转动 data_shift(keyin_data,3); keyin_data[0]=0x00; //输入零 break; case KEY_A: //正向微调 flag_run=0; angle=angle-9; l297_cw =0; // clockwise/counterclockwise stepping(NNN); break; case KEY_B: //正向微调 flag_run=0; angle=angle+9; l297_cw =1; // clockwise/counterclockwise stepping(NNN); break; case KEY_C: //输入值正负切换 flag_run=0; // 停止转动 flag_sign=!flag_sign; break; case KEY_D: //急停 flag_run =!flag_run; if(flag_run) write7279(BLINKCTL,0xf8); //闪烁显示 else write7279(BLINKCTL,0xff); //闪烁显示 break; case KEY_E: //清除输入值 flag_run=0; // 停止转动 { keyin_data[0]=0x0f; keyin_data[1]=0x0f; keyin_data[2]=0x0f; angle =0; } 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 = 10*keyin_data[1]+keyin_data[0]; else keyin_angle = 100*keyin_data[2]+10*keyin_data[1]+keyin_data[0]; keyin_angle =keyin_angle*10; // 输入角度值×10便于计算 real_angle =keyin_angle; // 转动过程中数值随着变化 delay =NNN; // 装入延时的初始值 keyin_data[0]=0x0f; // 保存输入值缓冲区清零 keyin_data[1]=0x0f; keyin_data[2]=0x0f; flag_run=1; // 开始转动 break;} led1_show( real_angle ); //调用显示函数 led0_show(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(int dis){ unsigned char i,j,k,l; i= abs(dis) /1000; j= (abs(dis) - i*1000)/100; k=(abs(dis) - (i*1000)-(j*100))/10; l=abs(dis) - (i*1000)-(j*100)-(k*10); k=k|0x80; //加小数点位 write7279(DECODE0+7,i); write7279(DECODE0+6,j); write7279(DECODE0+5,k); write7279(DECODE0+4,l); } //****************************************** // led1_show function //****************************************** void led1_show(unsigned int dis){ //下边的LED, unsigned char i,j,k; if (flag_sign) write7279(UNDECODE+3,0x01); else write7279(UNDECODE+3,0x00); if (flag_run) { i= dis /1000; j= (dis - i*1000)/100; k=(dis - (i*1000)-(j*100))/10; write7279(DECODE0+2,i); write7279(DECODE0+1,j); write7279(DECODE0,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