以前學習51的時候為了調試機械臂角度編寫的程序,用在開發板上也比較方便,但是由于是普通的舵機,不是總線的,所以需要自己洞洞板焊一個供電帶電路。
單片機源程序如下:
- #include <reg52.h>
- #include <lcd1602.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit duoji0=P2^0; //PWM輸出
- sbit duoji1=P2^1;
- sbit duoji2=P2^2;
- sbit duoji3=P2^3;
- sbit duoji4=P3^1;
- sbit duoji5=P3^0;
- #define GPIO_KEY P1
-
- unsigned int k0;
- unsigned int k1;
- unsigned int k2;
- unsigned int k4;
- unsigned int k3;
- unsigned int k5; //定義下降沿節點
- uint dsip[8]={0};
- uint j=0;
- unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','D',' '};
- void delayms(uint xms)
- {
- uchar j;
- uint i;
- for(i=xms;i>0;i--)
- for(j=112;j>0;j--);
- }
- void time0() interrupt 1
- {
- static uint ii0=0;
- TH0=(65536-100)/256; //以20ms為一個周期,以0.1ms為一個脈沖寬度
- TL0=(65536-100)%256;
- ii0++;
-
- if(ii0<=k0)
- duoji0=1; //0號舵機pwm輸出
- else
- duoji0=0;
-
- if(ii0<=k1) //1號舵機pwm輸出
- duoji1=1;
- else
- duoji1=0;
- if(ii0<=k2) //2號舵機pwm輸出
- duoji2=1;
- else
- duoji2=0;
- if(ii0<=k3) //3號舵機pwm輸出
- duoji3=1;
- else
- duoji3=0;
-
- if(ii0<=k4) //4號舵機pwm輸出
- duoji4=1;
- else
- duoji4=0;
-
- if(ii0<=k5) //5號舵機pwm輸出
- duoji5=1;
- else
- duoji5=0;
-
- if(ii0==200)
- ii0=0;
- }
- void time0init()
- {
- TMOD=0x01;
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- TR0=1;
- ET0=1;
- EA=1;
- }
- char KeyDown()
- {
- uchar KeyValue=20;
- uchar a=0;
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
- {
- delayms(10);//延時10ms進行消抖
- if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
- {
- //測試列
- GPIO_KEY=0X0F;
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=0;break;
- case(0X0b): KeyValue=1;break;
- case(0X0d): KeyValue=2;break;
- case(0X0e): KeyValue=3;break;
- }
- //測試行
- GPIO_KEY=0XF0;
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue;break;
- case(0Xb0): KeyValue=KeyValue+4;break;
- case(0Xd0): KeyValue=KeyValue+8;break;
- case(0Xe0): KeyValue=KeyValue+12;break;
- }
- while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵松手檢測,當按鍵等于0xf時候跳出循環
- {
- delayms(100);
- a++;
- }
- }
- }
- return KeyValue;
- }
- void count()
- {
-
- LcdWriteData(ASCII[0]);
- LcdWriteData(ASCII[11]);
- LcdWriteData(ASCII[k0/10]);
- LcdWriteData(ASCII[k0%10]);
- LcdWriteData(ASCII[12]);
-
- LcdWriteData(ASCII[1]);
- LcdWriteData(ASCII[11]);
- LcdWriteData(ASCII[k1/10]);
- LcdWriteData(ASCII[k1%10]);
- LcdWriteCom(0x80+0x40);
-
- LcdWriteData(ASCII[2]);
- LcdWriteData(ASCII[11]);
- LcdWriteData(ASCII[k2/10]);
- LcdWriteData(ASCII[k2%10]);
- LcdWriteData(ASCII[12]);
-
- LcdWriteData(ASCII[3]);
- LcdWriteData(ASCII[11]);
- LcdWriteData(ASCII[k3/10]);
- LcdWriteData(ASCII[k3%10]);
-
- }
- void main()
- {
- time0init();
- k0=15;
- k1=9;
- k2=16;
- k3=14;
- k4=8;
- k5=8;
- LcdInit();
- count();
-
- while(1)
- {
- uchar KeyValue1=20;
- KeyValue1=KeyDown();
-
-
-
-
-
-
-
- if(KeyValue1==0&&k0<=20&&k0>=8) //0號舵機高電平時間增加
- {
- k0++;
- if(k0==21)
- k0=20;
- KeyValue1=20;LcdWriteCom(0x01); count();
- }
-
- if(KeyValue1==4&&k0<=20&&k0>=8) //0號舵機高電平時間減少
- {
-
- k0--;
- if(k0==7)
- k0=8;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- if(KeyValue1==1&&k1<=20&&k1>=8) //1號舵機高電平時間增加
- {
-
- k1++;
- if(k1==21)
- k1=20;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- if(KeyValue1==5&&k1<=20&&k1>=8)
- {
-
- k1--;
- if(k1==7)
- k1=8;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- if(KeyValue1==2&&k2<=20&&k2>=8) //2號舵機高電平時間增加
- {
-
- k2++;
- if(k2==21)
- k2=20;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- if(KeyValue1==6&&k2<=20&&k2>=8)
- {
-
- k2--;
- if(k2==7)
- k2=8;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- if(KeyValue1==3&&k3<=20&&k3>=8) //3號舵機高電平時間增加
- {
-
- k3++;
- if(k3==21)
- k3=20;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- if(KeyValue1==7&&k3<=20&&k3>=8)
- {
-
- k3--;
- if(k3==7)
- k3=8;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- if(KeyValue1==8&&k4<=20&&k4>=8) //4號舵機高電平時間增加
- {
-
- k4++;
- if(k4==21)
- k4=20;
- KeyValue1=20;LcdWriteCom(0x01); count();
- }
-
- if(KeyValue1==12&&k4<=20&&k4>=8)
- {
-
- k4--;
- if(k4==7)
- k4=8;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- if(KeyValue1==9&&k5<=20&&k5>=8) //5號舵機高電平時間增加
- {
-
- k5++;
- if(k5==21)
- k5=20;
- KeyValue1=20;LcdWriteCom(0x01); count();
- }
-
- if(KeyValue1==13&&k5<=20&&k5>=8)
- {
-
- k5--;
- if(k5==7)
- k5=8;
- KeyValue1=20; LcdWriteCom(0x01);count();
- }
-
- }
- }
-
復制代碼
所有資料51hei提供下載:
51arm1602pwm.rar
(44.41 KB, 下載次數: 94)
2019-5-5 10:51 上傳
點擊文件名下載附件
|