///////單片機控制步進電機,上電復位到0,絕對坐標相對坐標切換,移動時坐標變化,2010年11月05周光明、、、
#include <reg52.h> #define uchar unsigned char #define uint unsigned int uchar rem[8]={0,0,0,10,10,10,10,10};/////顯存 uchar remx[3]={0,0,0};/////相對坐標存 uchar remj[3]={0,0,0};/////絕對坐標 uchar code bcd[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x7f};/////LED0~9數碼 uchar code jpsj[16]={0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77};/////鍵盤值 uchar ajkz,ter; uint j,k,haomi,haomij; bit aj_1,RLTT,zy_1; sbit CS1=P2^5;/////位選 sbit CS2=P2^6;/////段選 sbit E=P2^7;/////使能 sbit CP=P1^0;/////脈沖口 sbit DIR=P1^1;/////正反轉 sbit LL=P1^2;/////左限位 sbit RL=P1^3;/////右限位 //////////////////////////////////////////// yanshi(uint kk) {while(kk--);}/////延時 ////////////////////////顯示 xianshi() {uchar i; for(i=0;i<8;i++) { P0=~(0x01<<i); E=0; CS2=0; E=1; CS2=1; if(i==1)P0=~(0x80+~bcd[rem[i]]); else P0=bcd[rem[i]]; E=0; CS1=0; E=1; CS1=1; yanshi(20); P0=0xff; E=0; CS1=0; E=1; CS1=1; } } ////////////////////////////////////////////鍵盤///////////// jianpan() { uchar i,tem; P3=0x0f; tem=P3&0x0f; P3=0xf0; tem=tem+(P3&0xf0); if(tem==0xff)aj_1=1; if(tem!=0xff)if(aj_1) { aj_1=0; for(i=0;i<16;i++) { if(tem==jpsj[i])if(i<10) { if(ter==0) {rem[2]=i;rem[0]=rem[1]=10;} if(ter==1)rem[1]=i; if(ter==2)rem[0]=i; ter++; if(ter>2)ter=0; } else ajkz=i; } } } ///////////////////////裝相對坐標/////////////////////////////// zjd() { rem[0]=remj[0]; rem[1]=remj[1]; rem[2]=remj[2]; } zxd() { rem[0]=remx[0]; rem[1]=remx[1]; rem[2]=remx[2]; } //////////////////////取回////////////////////////////// quhui() { if(rem[7]==10)zjd(); else zxd(); } //////////////////電機跑時坐標值隨動//////////////////////////// zuobiao(uint m) { if(m%34==0) { m=m/34; rem[2]=m/100; rem[1]=m%100/10; rem[0]=m%10; } } //////////////////////電機程序/////////////////////////////////// dianji(uint cdcd, bit FX) { DIR=FX; for(j=0;j<cdcd;j++) { CP=~CP; zuobiao(haomi-j); xianshi(); if(RL)if(RL){RLTT=1;return;} if(LL)if(LL)return; } quhui(); } //////////////////////坐標計算/////////////////////////////// jisuan() { haomi=rem[0]*34+rem[1]*343+rem[2]*3432; haomij=remj[0]*34+remj[1]*343+remj[2]*3432; if(rem[7]==11) { zy_1=0; remx[0]=rem[0]; remx[1]=rem[1]; remx[2]=rem[2]; remj[0]=remj[0]+rem[0]; remj[1]=remj[1]+rem[1]; remj[2]=remj[2]+rem[2]; remj[2]=remj[2]%10+remj[1]/10; remj[1]=remj[1]%10+remj[0]/10; remj[0]=remj[0]%10; } else { remj[0]=rem[0]; remj[1]=rem[1]; remj[2]=rem[2]; if(haomi==haomij)haomi=0; else { if(haomi>haomij) { haomi=haomi-haomij; zy_1=0; } else { haomi=haomij-haomi; zy_1=1; } } } haomij=remj[0]*34+remj[1]*343+remj[2]*3432; } /////////////////////相對坐標絕對坐標切換//////////////////////////////////// xjqh() { if(rem[7]==10) { rem[7]=11; zxd(); } else { rem[7]=10; zjd(); } } /////////////////////////////////////////////////////////////// void main(void) {haomi=9000; dianji(60000,1); while(RLTT)/////初始歸零 { RLTT=0; dianji(366,0); } haomi=0; while(1) { jianpan(); xianshi(); if(ajkz==10) { ajkz=0; aj_1=1; if(haomij>0)/////小于零時不左走 { haomij--; dianji(1,1); xianshi(); } } if(ajkz==11)/////大于15厘米時不右走 { ajkz=0; aj_1=1; if(haomij<5150) { haomij++; dianji(1,0); xianshi(); } } if(ajkz==13)/////切換相對絕對坐標 { ajkz=0; xjqh(); } if(ajkz==14)/////確認 { ajkz=0; if(ter==0) { jisuan(); dianji(haomi,zy_1); } } if(ajkz==15)/////取消 { ajkz=0; quhui(); ter=0; } } }