久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機控制18路舵機的C程序

作者:劉聞山   來源:本站原創   點擊數:  更新時間:2013年12月09日   【字體:

關于本程序:
問:定時器1控制著9路pwm    以前聽高手幫我講解  一般8路之內是合適的 因為好像是把舵機的一個周期分成8分來分別控制  超出8路的話 好像周期就有可能改變

答:是的,每路PWM有大約2.5ms是要獨立侵占timer時間的,8*2.5剛好20ms,每路舵機范圍我只用到0.7~2.0左右,所以9路之間沒有干擾。但是個timer之間有干擾。

問:看到個小bug pwm0到pwm8再到pwm0可能不是20ms的一個周期

答:嘿嘿,我把每路的低電平時間合在一起了,然后看它的匯編代碼,修正中斷中語句用去的時間,上位機算好,用keil的仿真出來是很準的。 在兩個timer沒有同時中斷的情況下精度為0.5us,一旦同時中斷,有一路PWM的誤差將達到7、8us。

恩 這個中斷程序沒有結束另外的中斷有發生 就會造成后面的中斷打失 所以得用性能好的單片機 哈哈

注意本程序在編譯的時候要選擇pdata模式不然會失敗這是工程文件下載已經設置好了模式的: http://www.zg4o1577.cn/f/duoji_c.rar

程序源碼:

/**************************************************************************
文 件 名:pwm_18out.c
功能描述:利用STC89C52RC做下位機,控制18路舵機PWM
                  雙倍速,機器周期0.5us
日    期:2012-3-19
作    者:cazy peach-ATP
備    注: 18路舵機控制下位機
**************************************************************************/
#define uint unsigned int
#define uchar unsigned char
#include<reg52.h>
sbit pwm9=P1^0;
sbit pwm10=P1^1;
sbit pwm11=P1^2;
sbit pwm12=P1^3;
sbit pwm13=P1^4;
sbit pwm14=P1^5;
sbit pwm15=P1^6;
sbit pwm16=P1^7;
sbit pwm17=P0^7;
sbit pwm0=P2^7;
sbit pwm1=P2^6;
sbit pwm2=P2^5;
sbit pwm3=P2^4;
sbit pwm4=P2^3;
sbit pwm5=P2^2;
sbit pwm6=P2^1;
sbit pwm7=P2^0;
sbit pwm8=P0^6;
//***************************參數申明******************************
//指令格式:兩byte為一路PWM,前一個為PWM高電平定時器TH值、后一個為TL的值,由上位機計算所得,共20組。最后兩組分別為每9路PWM低電平和。
uint data pwm_val[40]={
 0XF4, 0XF0, 0XF7, 0X9B, 0XF6, 0XAE,
 0XF4, 0XF9, 0XF8, 0X01, 0XF6, 0X8F,
 0XF5, 0X02, 0XF7, 0X2B, 0XF6, 0X9D,
 0XF4, 0XF0, 0XF3, 0X1D, 0XF3, 0X16,
 0XF4, 0XF9, 0XF2, 0X8B, 0XF3, 0XB0,
 0XF5, 0X02, 0XF2, 0XE9, 0XF3, 0X9B,
 0XBB, 0X55, 0XD3, 0X04};
uchar zhilin[61];
uchar *point;
uchar data pwm_select=0;
uchar data pwm_scan=0;       //timer1使用
uchar data pwm_scan1=0;      //timer2使用
uchar data SCI_get=0;
//**************************函數聲明****************************
void SCI_INT(void) ;
void timer_INT(void) ;
//***************************主函數*****************************
void main()
{
 uchar j;
 P0=0X00; 
 P1=0x00;
 P2=0X00;
 point=zhilin;
 SCI_INT();
 timer_INT();
 for(j=0;j<61;j++){zhilin[j]=0;}
 while(1)
 {
   for(;;)                                   //指令接收
   {
    if(RI){RI=0;SCI_get=SBUF;*point++=SCI_get;j++;}else{continue;}
    if(SCI_get==0xff){point=zhilin;break;}   //0xff指令結束符
   }
 
   for(j=0;j<21;j++)                         //指令處理
   {                                       
    if(zhilin[j*3]==255){break;}             //判斷是否為指令結束符
    pwm_select=zhilin[j*3];
    pwm_val[pwm_select]=zhilin[j*3+1]; 
    pwm_val[pwm_select+1]=zhilin[j*3+2];
   }
 }
}
//***************************定時器中斷**************************
void timer0() interrupt 1 using 1
{
  if(pwm_scan==1)             //第1路pwm。
  {
   pwm0=1;
   TH0=pwm_val[0];
   TL0=pwm_val[1];
  }
  else if(pwm_scan==2)     //第2路pwm。
  {
   pwm0=0;
   pwm1=1;
   TH0=pwm_val[2];
   TL0=pwm_val[3];
  }
  else if(pwm_scan==3)     //第3路pwm。
  {
   pwm1=0;
   pwm2=1;
   TH0=pwm_val[4];
   TL0=pwm_val[5];
  }
  else if(pwm_scan==4)     //第4路pwm。
  {
   pwm2=0;
   pwm3=1;
   TH0=pwm_val[6];
   TL0=pwm_val[7];
  }
  else if(pwm_scan==5)     //第5路pwm。
  {
   pwm3=0;
   pwm4=1;
   TH0=pwm_val[8];
   TL0=pwm_val[9];
  }
  else if(pwm_scan==6)     //第6路pwm。
  {
   pwm4=0;
   pwm5=1;
   TH0=pwm_val[10];
   TL0=pwm_val[11];
  }
  else if(pwm_scan==7)     //第7路pwm。
  {
   pwm5=0;
   pwm6=1;
   TH0=pwm_val[12];
   TL0=pwm_val[13];
  }
  else if(pwm_scan==8)     //第8路pwm。
  {
   pwm6=0;
   pwm7=1;
   TH0=pwm_val[14];
   TL0=pwm_val[15];
  }
  else if(pwm_scan==9)     //第9路pwm。
  {
   pwm7=0;
   pwm8=1;
   TH0=pwm_val[16];
   TL0=pwm_val[17];
  }
  else if(pwm_scan==10)     //低電平。
  {
   pwm8=0;
   TH0=pwm_val[36];
   TL0=pwm_val[37];
   pwm_scan=0;
  }
  pwm_scan++;
}
void timer1() interrupt 3 using 2
{
  if(pwm_scan1==1)             //第10路pwm。
  {
   pwm9=1;
   TH1=pwm_val[18];
   TL1=pwm_val[19];
  }
  else if(pwm_scan1==2)     //第11路pwm。
  {
   pwm9=0;
   pwm10=1;
   TH1=pwm_val[20];
   TL1=pwm_val[21];
  }
  else if(pwm_scan1==3)     //第12路pwm。
  {
   pwm10=0;
   pwm11=1;
   TH1=pwm_val[22];
   TL1=pwm_val[23];
  }
  else if(pwm_scan1==4)     //第13路pwm。
  {
   pwm11=0;
   pwm12=1;
   TH1=pwm_val[24];
   TL1=pwm_val[25];
  }
  else if(pwm_scan1==5)     //第14路pwm。
  {
   pwm12=0;
   pwm13=1;
   TH1=pwm_val[26];
   TL1=pwm_val[27];
  }
  else if(pwm_scan1==6)     //第15路pwm。
  {
   pwm13=0;
   pwm14=1;
   TH1=pwm_val[28];
   TL1=pwm_val[29];
  }
  else if(pwm_scan1==7)     //第16路pwm。
  {
   pwm14=0;
   pwm15=1;
   TH1=pwm_val[30];
   TL1=pwm_val[31];
  }
  else if(pwm_scan1==8)     //第17路pwm。
  {
   pwm15=0;
   pwm16=1;
   TH1=pwm_val[32];
   TL1=pwm_val[33];
  }
  else if(pwm_scan1==9)     //第18路pwm。
  {
   pwm16=0;
   pwm17=1;
   TH1=pwm_val[34];
   TL1=pwm_val[35];
  }
  else if(pwm_scan1==10)     //低電平。
  {
   pwm17=0;
   TH1=pwm_val[38];
   TL1=pwm_val[39];
   pwm_scan1=0;
  }
  pwm_scan1++;
}
//********************************函數************************
void timer_INT(void)      //timer0、timer1初始化
{
 uchar a,b,c;
 TMOD|=0X11;
 IE|=0X8A;       //EA=1;ET0=1;ET1=1;
 TH0=256;
 TL0=255;
 TH1=256;
 TL1=255;
 TR0=1;
 for(c=1;c>0;c--)
 {
  for(b=38;b>0;b--)
  {
   for(a=130;a>0;a--);
  }
 }
 TR1=1;
}

void SCI_INT(void)        //timer2
{
 SCON=0X50;
 T2CON=0X30;
 TL2=RCAP2L=0XB2;  //9600 0XFFB2,  19200 0XFFD9
 TH2=RCAP2H=0XFF;
 PCON=0X00;
 TR2=1;
}
 

關閉窗口

相關文章

主站蜘蛛池模板: 一区二区三区在线 | 精品一区二区在线观看 | 日韩影音 | 久久久久久久久久久久一区二区 | 日韩视频国产 | 成人在线一区二区三区 | 国产精品一区久久久 | 亚洲免费精品一区 | 欧美激情精品久久久久久 | 国产精品免费av | 久久99精品久久 | 激情一区二区三区 | 欧美精品一二三 | 日本高清中文字幕 | 亚洲人成人一区二区在线观看 | 91久久视频 | 久热爱 | 日韩欧美在线观看 | 亚洲欧美一区二区三区1000 | 91精品国产综合久久婷婷香蕉 | 亚洲精品aⅴ| 日韩毛片中文字幕 | 欧美在线一区二区三区四区 | 天堂中文在线播放 | 国产一区二区在线91 | 一级一片在线观看 | 人人cao| 91精品国产欧美一区二区 | 2018国产精品| 美女久久久久久久 | 一区二区三区不卡视频 | 日韩欧美在线不卡 | 中文字幕第49页 | 99re在线视频观看 | 一级视频在线免费观看 | 久久国内 | 91九色porny首页最多播放 | 毛片在线看片 | 日韩精品一区二区三区在线播放 | 久久无毛| 国产成人在线一区二区 |