|
0.png (306.76 KB, 下載次數(shù): 32)
下載附件
2019-12-22 23:02 上傳
程序在這里;
- #include<reg51.h>
- #include<stdio.h>
- void delay1(void);
- void delay2(void);
- void display(int);
- int bs=0;
- main()
- { char a,b,c,d,j,*q,
- done1[8]={0x01,0x02,0x04,0x00,0x01,0x04,0x02,0x00},
- done2[8]={0x03,0x06,0x05,0x00,0x03,0x05,0x06,0x00}, done3[14]={0x01,0x03,0x02,0x06,0x04,0x05,0x00,0x01,0x05,0x04,0x06,0x02,0x03,0x00};
- L: a=P1;
- while(!(a&0x08)) //判斷是否啟動,若沒啟動則重新判斷
- { P3=0x08;
- delay1();
- a=P1; }
- //...............................................判斷工作模式
- if(a&0x01) //方式1模型
- q=done1;
- else if(a&0x02) //方式2模型
- q=done2;
- else if(a&0x04) //方式3模型
- q=done3;
- //...............................................判斷電機(jī)轉(zhuǎn)向
- if(a&0x10) //判斷電機(jī)是否要正轉(zhuǎn)
- { P3=0x10; //P1.4口為1,電機(jī)正轉(zhuǎn),紅燈亮
- b=0;}
- else
- { P3=0x20; //P1.4口為0,電機(jī)反轉(zhuǎn),黃燈亮
- if(a&0x04)b=7; //反轉(zhuǎn)時將b置數(shù),使指針指到數(shù)組反相序部分
- else b=4; }
- //....................................................
- d=b;
- while(1)
- { c=*(q+b); //判斷電機(jī)步數(shù)是否走完
- if(c==0)b=d; //步數(shù)走完,電機(jī)重新再走
- else
- { P3=c; //從P3輸出電機(jī)控制信號
- b++;
- bs++; //總步數(shù)加1
- display(bs); //顯示步數(shù)
- j=a;
- a=P1;
- if(a!=j) //判斷P1口狀態(tài)信號是否改變
- { if(!(a&0x08))bs=0; //若為停止信號,總步數(shù)清零
- goto L; } //狀態(tài)信號改變,返回到開始,重新對電機(jī)控制
- }
- }
- }
- void delay1() //延時5ms子程序
- { int i,j;
- for(i=0;i<200;i++)
- for(j=0;j<300;j++);
- }
- void delay2() //延時50us子程序
- { int i,j;
- for(i=0;i<10;i++)
- for(j=0;j<60;j++);
- }
- void display(int n)
- {unsigned char tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
- unsigned char i,k,t,num[4];
- num[0]=n%10; //將總步數(shù)的各位分別存在num數(shù)組中
- num[1]=(n/10)%10;
- num[2]=(n/100)%10;
- num[3]=(n/1000)%10;
- for(t=0;t<50;t++) //掃描50次
- { k=0x08; //位選碼指向最左一位,第四位
- for(i=0;i<4;i++)
- { P2=k; //從P2口輸入位選碼
- P0=~(tab[num[i]]); //取出顯示碼,并從P0口輸出顯示碼
- k=k>>1; //求下一個位選碼
- delay2();
- }
- }
- }
復(fù)制代碼
|
|