本程序是一個51單片機控制步進電機轉動的程序,通過鍵盤設置轉的圈數,電機能自動轉設置的圈數,并且轉的圈數和已經轉過的圈數都能在液晶上顯示出來。求大神幫忙寫個程序流程圖,先謝謝大佬們。以下是程序:
- #include <reg52.h>
- #include <intrins.h>
- #include "LCD1602.h" //添加液晶頭文件
- #include "key.h" //添加1602頭文件
- #define uchar unsigned char
- #define uint unsigned int
- uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
- uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
- unsigned char speed=2; //檔位
- unsigned char speed_1=30;//速度延遲
- unsigned char key_X=0; //0 運行,1 設置
- unsigned char set=0; //0 運行,1 設置
- /********************************************************/
- /*
- /* 延時t毫秒
- /* 11.0592MHz時鐘,延時約1ms
- /*
- /********************************************************/
- void delay(uint t)
- {
- uint k;
- while(t--)
- {
- for(k=0; k<125; k++)
- { }
- }
- }
- /********************************************************/
- /*
- /*步進電機正轉
- /*
- /********************************************************/
- void motor_ffw(uint n)
- {
- uchar i;
- uint j;
- for (j=0; j<n; j++) //轉1×n圈
- {
- for (i=0; i<8; i++) //一個周期轉30度
- {
- P1 = FFW[i]; //取數據
- delay(30); //調節轉速
- }
- }
- }
- /********************************************************/
- /*
- /*步進電機反轉
- /*
- /********************************************************/
- void motor_rev(uint n)
- {
- uchar i;
- uint j;
- for (j=0; j<n; j++) //轉1×n圈
- {
- for (i=0; i<8; i++) //一個周期轉30度
- {
- P1 = REV[i]; //取數據
- delay(30); //調節轉速
- }
- }
- }
- void disp()
- {
- if(set==0)
- {
- write_1602_c(0x87);
- write_1602_d(key_X/100+0x30);
- write_1602_d(key_X%100/10+0x30);
- write_1602_d('.');
- write_1602_d(key_X%10+0x30);
- write_1602_c(0xc8);
- write_1602_d(speed%10+0x30);
- }
- if(set==1)
- {
- }
- }
- unsigned char k=16; //矩陣鍵盤值
- unsigned char k1=17; //矩陣鍵盤值
- void main(){
- unsigned char x1=0; //光標位置
- unsigned char quan=0; //圈數
- unsigned char xiaoshudian=0;//小數點
- unsigned char x2=0; //整數
- unsigned char x3=0; //小數
- LCD_init();
- write_1602_c(0x80);
- write_1602_d('M');
- write_1602_d('O');
- write_1602_d('T');
- write_1602_d('O');
- write_1602_d('R');
- write_1602_d(' ');
- write_1602_d(' ');
- write_1602_c(0x8C);
- write_1602_d(' ');
- write_1602_d('0');
- write_1602_d('.');
- write_1602_d('0');
- write_1602_c(0xC0);
- write_1602_d('S');
- write_1602_d('P');
- write_1602_d('E');
- write_1602_d('E');
- write_1602_d('D');
- while(1)
- {
- k=scan(); //矩陣鍵盤
- if(k!=k1)
- {
- if(set==1)
- if(k<10) //數字
- {
- if(x1==0)
- x2=k;
- if(x1==2)
- x3=k;
- write_1602_c(0x8D+x1);
- write_1602_d(k+'0');
- x1=x1+2;
- write_1602_c(0x8D+x1);
- write_1602_c(0x0f);//讓光標閃爍
- }
- if(k==14) //開閥
- {
- set=0;
- write_1602_c(0x0C); //讓光標停
- key_X=key_X+(x2*10+x3);
- disp();
- motor_rev(x2*10+x3); //電機轉
- }
- if(k==15) //關閥
- {
- set=0;
- write_1602_c(0x0C); //讓光標停
- if(key_X>=(x2*10+x3))
- {
- key_X=key_X-(x2*10+x3);
- disp();
- motor_ffw(x2*10+x3); //電機轉
- }
- }
- if(k==10) //設置鍵
- {
- if(set==0)
- {
- set=1;
- x1=0;
- write_1602_c(0x8C);
- write_1602_d(' ');
- write_1602_d('0');
- write_1602_d('.');
- write_1602_d('0');
- write_1602_c(0x8D);
- write_1602_c(0x0f);//讓光標閃爍
- }
- else
- {
- write_1602_c(0x0c);//讓光標消失
- set=0;
- }
- }
-
- k1=k;
- if(k==12) //按加速
- {
- if(speed<4)
- {
- speed++;
- }
- if(speed==4)
- speed_1=30;
- if(speed==3)
- speed_1=50;
- if(speed==2)
- speed_1=70;
- if(speed==1)
- speed_1=90;
- }
- if(k==13) //按減速
- {
- if(speed>1)
- {
- speed--;
- }
- if(speed==4)
- speed_1=30;
- if(speed==3)
- speed_1=50;
- if(speed==2)
- speed_1=70;
- if(speed==1)
- speed_1=90;
- }
- }
- disp();
- }
- }
復制代碼
|