求一個步進電機的紅外遙控控制系統
硬件:stc89c51+28BYJ48步進電機+紅外遙控+LCD1602液晶顯示
要求:使用紅外遙控實現步進電機的點動、連續運動、反轉、停止。
共使用六個按鈕,實現四種功能
點動無要求
連續運動的時候可以調節速度,可以設置3—5個擋位,并在1602顯示器上面顯示出來處于哪個擋位
反轉采用一個按鈕進行控制
下面的程序已經實現了遙控啟動停止加速減速反轉,沒有加顯示屏顯示,并且加減速程序不太舒服,希望大佬可以改一下,求求大佬幫幫忙
單片機源程序如下:
- #include<reg51.h>
- void delay0();
- void delay();//可能是漏了函數原型. 如果在main{ ...} 以后定義了函數,main以前要加函數原型聲明.
- unsigned char bdata ab[4];
- sbit P3_2=P3^2;
- char h=0;
- bit f0=0;
- int i=0;
- main()
- {
- char code zz[8]={0x07,0x03,0x0B,0x09,0x0D,0x0c,0x0E,0x06};
- char code fz[8]={0x06,0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07};
- char djh[5]={0x15,0x63,0x78,0xB1,0xEC};
- char djl[5]={0xA0,0xC0,0xD0,0xE0,0x78};
- P0=0xff;
- EA=1;
- EX0=1;
- //必須先初始化才能賦值;
- IT0=1;
- do
- {
- if(ab[2]==0x0c)
- //單步 //開始ab[2]未賦值的時候??
- { P0=0xf9;
- P2=f0==0?zz[i]:fz[i];
- //中斷通過改變ab[2]的值來控制步進電機//f0決定正轉反轉
- i++;
- if(i>7)i=0;
- ab[2]=0;
-
-
- }
- else if(ab[2]==0x18) //連續
- { P0=0xa4;
- for(;;)
- { P2=f0==0?zz[i]:fz[i];
- TH0=djh[h];
- TL0=djl[h];
- delay();
- i++;
- if(i>7)i=0;
- if(ab[2]==0x0c ){ab[2]=0;break;}
- // 停止鍵和單步鍵能退出連續運行
- else if(ab[2]==0x5a ){break;}
- }
-
- }
- } while(1);
-
- }
- void delay0(unsigned char x) //x*0.14MS
- {
- unsigned char i;
- while(x--)
- {
- for (i = 0; i<7; i++) {}
- }
- }
- //簡單的紅外遙控解碼程序(HT6221)
- void hongwai() interrupt 0 //入口點和出口點
- {
- unsigned char j,k,N=0;
- EX0 = 0;
- delay0(15);
- if (P3_2==1)
- { EX0 =1;
- return;
- }
- //確認IR信號出現
- while (!P3_2) //等IR變為高電平,跳過9ms的前導低電平信號。
- {delay0(1);}
- for (j=0;j<4;j++) //收集四組數據
- {
- for (k=0;k<8;k++) //每組數據有8位
- {
- while (P3_2) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
- {delay0(1);}
- while (!P3_2) //等 IR 變為高電平
- {delay0(1);}
- while (P3_2) //計算IR高電平時長
- {
- delay0(1);
- N++;
- if (N>=30)
- { EX0=1;
- return;} //0.14ms計數過長自動離開。
- } //高電平計數完畢
- ab[j]=ab[j] >> 1; //數據最高位補"0"
- if (N>=8) {ab[j] = ab[j] | 0x80;} //數據最高位補"1"
- N=0;
- }//end for k
- }//end for j
- if (ab[2]!=~ab[3])
- { EX0=1;
- return; }
- if(ab[2]==0x0c) //數據顯示及用于步進電機控制
- {P0=0xf9;
- }
- else if(ab[2]==0x18)
- {P0=0xa4;
- }
- else if(ab[2]==0x5e)
- { P0=0xb0;
- f0=~f0;
- }
- else if(ab[2]==0x08)
- { P0=0x99;
- h++;
- if(h>4)h=4;
- }
- else if(ab[2]==0x1c)
- { P0=0x92;
- h--;
- if(h<0)h=0;
- }
- else if(ab[2]==0x5a)
- { P0=0x82;}
- EX0=1; ////開外部中斷0
- }
- void delay()
- {
- TMOD=0x01;
- TR0=1;
- while(!TF0);
- TF0=0;
- TR0=0;
- }
復制代碼 |