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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2253|回復: 2
打印 上一主題 下一主題
收起左側

如何在超聲波檢測模塊中加入 PWM控制舵機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:549313 發表于 2019-8-10 00:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 LINSA 于 2019-8-10 00:37 編輯

/******************************************************************************/
/*  Name:  LCD12864(St7920/St7921)+超聲波測距模塊+STC89C52                    */
/*  hy-SRF05 超聲波測距模塊 DEMO 程序                                                                              */
/*  晶振:11.0592M                                                            */
/*  接線:模塊TRIG接 P3.7  ECH0 接P3.6                                                                                  */
/*      RS        接  P24;                                                                                                       */
/*      RW        接  P23;                                                                                              */
/*      E         接  P22;                                                                                                  */
/*      PSB       接  P27;                                                                                              */
/******************************************************************************/
    #include   <REG51.H>
        #include   <intrins.h>        
//引腳定義
    sbit     RX    =  P3^6;
    sbit     TX    =  P3^7;
sbit RS = P2^6;
sbit RW = P2^5;
sbit E  = P2^7;
sbit RES = P2^5;
sbit PSB = P3^2;
sbit PAUSE = P1^6;




#define DataPort P0        //MCU P1<------> LCM
               


//Function Definition 函數聲明
void delayms(unsigned int ms);


void Delay(int num);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
unsigned int ReadTemperature(void);
void clock_out(unsigned char dd);
unsigned char clock_in(void);
unsigned char read_clock(unsigned char ord);
void write_clock(unsigned char ord, unsigned char dd);
void Disp(void);
void id_case1_key(void);
void id_case2_key(void);
void Set_time(unsigned char sel,bit sel_1);
void Timer0_Init(void);
void Init_1302(void);
void Set_Bell(unsigned char sel, bit sel_1);
void Bell(void);
//12864
void Write_char(bit start, unsigned char ddata);
void Send_byte(unsigned char bbyte);
void Delaynms(unsigned int di);
void Lcd_init(void);
void Disp_img(unsigned char *img);
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_set_xy( unsigned char x, unsigned char y );
unsigned char code num[]={"0123456789 :.-"};
unsigned char code waves[]={"測量值:"};
unsigned char code znwk[] ={"設置值:"};
unsigned char code CM[] =  {"米"};
unsigned char code DU[] =  {"度"};
unsigned int  time=0;
         long S=0;
         bit  flag =0;
unsigned char disbuff[4]           ={ 0,0,0,0,};
unsigned char code logo[]={  
/*--  調入了一幅圖像:logo.bmp  -- */
/*--  寬度x高度=128x64 歡迎使用本產品LOGO --*/
/*--  調入了一幅圖像:C:\Documents and Settings\lwd\桌面\新建文件夾\X.bmp  --*/
/*--  寬度x高度=128x64  --*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xEF,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xEF,0x99,0xFF,0x9F,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x9F,0xFF,0xEF,0xF9,0xFF,
0xFF,0xEF,0x99,0xFF,0x9F,0xFF,0xFF,0x7F,0xFE,0xFF,0xFF,0x1F,0xFF,0xEF,0xF9,0xFF,
0xFF,0xFF,0x19,0xFE,0x9F,0xF7,0xFE,0xFF,0xFF,0xFF,0xFF,0x99,0xFF,0xEF,0xF9,0xFF,
0xFF,0x6F,0x00,0xFF,0x9F,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0x99,0xFF,0xEF,0x79,0xFF,
0xFF,0xEF,0xF9,0xFF,0x9F,0xE8,0xFE,0xFF,0x8F,0xFF,0x0F,0x9F,0xFF,0x6F,0x09,0xFF,
0xFF,0x0F,0x7F,0xFF,0x1F,0xEE,0xFF,0x07,0x80,0xFF,0xE9,0x0F,0xF8,0x6F,0x70,0xFF,
0xFF,0xE1,0x00,0xFF,0x87,0x6E,0xFF,0x07,0xEF,0xFF,0x6F,0x80,0xFF,0x69,0x7E,0xFF,
0xFF,0xEF,0x7F,0xFF,0x9F,0x7E,0xFF,0xF7,0xEF,0xFF,0xEF,0x99,0xFF,0x89,0x6E,0xFF,
0xFF,0x8F,0x07,0xFF,0x1F,0x7E,0xFF,0xF7,0xE9,0xFF,0xF7,0x99,0xFF,0x6F,0x60,0xFF,
0xFF,0x67,0x71,0xFF,0x9F,0x7E,0xFF,0x07,0xE0,0xFF,0x97,0x91,0xFF,0x67,0x6E,0xFF,
0xFF,0xE7,0x1F,0xFF,0x8F,0x6E,0xFF,0xF7,0xEF,0xFF,0x87,0xF7,0xFF,0xEF,0x6E,0xFF,
0xFF,0xE9,0xF0,0xFF,0x91,0xEE,0xFF,0xF7,0xEF,0xFF,0x91,0x66,0xFF,0xEF,0x00,0xFF,
0xFF,0xE9,0xF7,0xFF,0x9F,0x96,0xFF,0xF7,0xE7,0xFF,0x91,0x68,0xFF,0x8F,0x98,0xFF,
0xFF,0xEF,0x07,0xF8,0x9F,0x96,0xFF,0x07,0xF8,0xFF,0x97,0x08,0xFF,0x9F,0x9E,0xFF,
0xFF,0x6F,0xE0,0xFF,0x9F,0x08,0xFF,0xF7,0xFF,0xFF,0x97,0xF9,0xFF,0x77,0x8E,0xFF,
0xFF,0xEF,0xF7,0xFF,0x9F,0xE8,0xFE,0xF7,0xFF,0xFF,0x87,0x9F,0xFF,0x77,0x9E,0xFF,
0xFF,0xEF,0x99,0xFF,0x9F,0xEE,0xFE,0xFF,0xFF,0xFF,0xF7,0x96,0xFE,0xF7,0xFE,0xFF,
0xFF,0xEF,0x79,0xFF,0x9F,0xF7,0xF9,0xFF,0xFF,0xFF,0x77,0x60,0xFE,0xF9,0xF8,0xFE,
0xFF,0xEF,0x7E,0xFE,0x8F,0xF9,0xF9,0xFF,0x00,0xFE,0x7F,0x86,0xFE,0xF9,0x01,0xF8,
0xFF,0x6F,0xFF,0xF8,0x9F,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};






/******************************************************************************/
void Lcd_init(void)        //初始化LCD
{
   delayms(40);           //大于40MS的延時程序
   PSB=1;                 //設置為8BIT并口工作模式
   delayms(1);            //延時
   RES=0;                 //復位
   delayms(1);            //延時
   RES=1;                 //復位置高
   delayms(1);
   Write_char(0,0x30);       //選擇基本指令集
   delayms(1);         //延時大于100us
   Write_char(0,0x30);       //選擇8bit數據流
   delayms(1);         //延時大于37us
   Write_char(0,0x0c);       //開顯示(無游標、不反白)
   delayms(1);         //延時大于100us
   Write_char(0,0x01);       //清除顯示,并且設定地址指針為00H
   delayms(1);           //延時大于10ms
   Write_char(0,0x06);       //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位,光標從右向左加1位移動
   delayms(1);         //延時大于100us
}


/******************************************************************************/
/*------------------------------------------------
                    檢測忙位
------------------------------------------------*/
void Check_Busy()
{  
    RS=0;
    RW=1;
    E=1;
    DataPort=0xff;
    while((DataPort&0x80)==0x80);//忙則等待
    E=0;
}




void Write_char(bit start, unsigned char ddata) //寫指令或數據
{
//        unsigned char start_data,Hdata,Ldata;
          if(start==0)
{        Check_Busy();
        RS=0;
        RW=0;
        E=1;
        DataPort=ddata;
//        delayms(5);
        E=0;
//        delayms(5);        
}
    else   
{        Check_Busy();
        RS=1;
        RW=0;
        E=1;
        DataPort=ddata;
//        delayms(5);
        E=0;
//        delayms(5);  
}
}




/******************************************************************************/
void Delaynms(unsigned int di) //延時
{
        unsigned int da,db;
         for(da=0;da<di;da++)
                   for(db=0;db<10;db++);
}


/******************************************************************************/
void Disp_img(unsigned char  *img)        //圖形方式12864顯示字模221 橫向取膜
{
        unsigned char i,j;
        unsigned int k = 0;


        Write_char(0,0x36); //圖形方式
        for(i=0;i<32;i++)
          {
                Write_char(0,0x80+i);
                Write_char(0,0x80);
            for(j=0;j<16;j++)
                {
                        Write_char(1,img[k++]);
                }
          }


         for(i=0;i<32;i++)
          {
                Write_char(0,0x80+i);
                Write_char(0,0x88);
            for(j=0;j<16;j++)
                {
                        Write_char(1,img[k++]);
                  }
        }
}
        
/******************************************************************************/
void Clr_Scr(void)//清屏函數
{
        Write_char(0,0x01);
}


/******************************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{        //設置LCD顯示的起始位置,X為行,Y為列
    unsigned char address;
        switch(x)
        {
                case 0: address = 0x80 + y; break;   
            case 1: address = 0x80 + y; break;
                case 2: address = 0x90 + y; break;
                    case 3: address = 0x88 + y; break;
                case 4: address = 0x98 + y; break;
                default:address = 0x80 + y; break;
        }
    Write_char(0, address);
}


/******************************************************************************/
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
{        //        中英文字符串顯示函數
        LCD_set_xy( X, Y );
   
    while (*s)
    {
                Write_char( 1, *s );
            s ++;
                Delaynms(1);
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:549313 發表于 2019-8-10 00:37 | 只看該作者
/******************************************************************************/
void LCD_Write_number(unsigned char s)//        數字顯示函數
{        
        Write_char(1,num);
        Delaynms(1);
}
/******************************************************************************/
void Lcd_Mark2(void)
{
        Clr_Scr();//清屏
        LCD_Write_string(1,0,znwk);//
        LCD_Write_string(3,0,waves);//        
        LCD_Write_string(3,7,CM);//        
    LCD_Write_string(1,7,CM);//        
    LCD_Write_string(2,7,DU);//        
    LCD_Write_string(4,7,DU);//        
}


/********************************************************/
    void Conut(void)
        {
           time=TH0*256+TL0;
           TH0=0;
           TL0=0;
         S=(time*1.8)/10;     //算出來是mM
         if((S>=7000)||flag==1) //超出測量范圍顯示“-”
         {         
          flag=0;
           LCD_set_xy( 3, 4 );
           LCD_Write_number(13);
           LCD_Write_number(12);
           LCD_set_xy( 3, 5 );
           LCD_Write_number(13);
           LCD_Write_number(13);
           LCD_Write_number(13);
         
           }
         else
          {
          disbuff[0]=S/1000;
          disbuff[1]=S/100%10;
          disbuff[2]=S/10%10;
          disbuff[3]=S%10;
           LCD_set_xy( 3, 4 );
           LCD_Write_number(disbuff[0]);
           LCD_Write_number(12);
           LCD_set_xy( 3, 5 );
           LCD_Write_number(disbuff[1]);
           LCD_Write_number(disbuff[2]);
           LCD_Write_number(disbuff[3]);
          }
        }
/********************************************************/
void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}
/********************************************************/
     void zd0() interrupt 1                  //T0中斷用來計數器溢出,超過測距范圍
  {
    flag=1;                                                         //中斷溢出標志
        RX=0;
  }
void Timer_Count(void)
{
                 TR0=1;                            //開啟計數
             while(RX);                        //當RX為1計數并等待
             TR0=0;                                //關閉計數
         Conut();                        //計算


}


/********************************************************/
   void  StartModule()                          //T1中斷用來掃描數碼管和計800MS啟動模塊
  {
          TX=1;                                         //800MS  啟動一次模塊
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX=0;
  }


/********************************************************/
void main(void)
{  
    unsigned int valA;


        Lcd_init();       //設置液晶顯示器
        Clr_Scr();        //清屏        
        Disp_img(logo);          //顯示歡迎使用本產品LOGO
        delayms(80);
        Lcd_init();       //從圖形顯示狀態下返回
    Lcd_Mark2();
         TMOD=0x01;                   //設T0為方式1,GATE=1;
         TH0=0;
         TL0=0;         
         ET0=1;             //允許T0中斷
         EA=1;                           //開啟總中斷                        


        while(1)
          {
               
                delayms(60);
                RX=1;
            StartModule();
        for(valA=7510;valA>0;valA--)
            {
                  
               if(RX==1)
                   {
           Timer_Count();
                   }
             }
          }
}              




*******PWM******


//#include <STC15.h>
//#include"STC89C5xRC.H"



#include "reg51.h"


#define uint8        unsigned char   
#define uint16        unsigned short int
#define uint32        unsigned long


sbit SERVO0=P0^0;                        //控制舵機的PWM輸出口


uint16 Servo0PwmDuty=1500;        //PWM脈沖寬度


/***********************************************************
* 名    稱: DelayMs(uint16 ms)
* 功    能: 延時ms毫秒
* 入口參數: ms        毫秒
* 出口參數: 無
* 說    明:                                          
/**********************************************************/
void DelayMs(uint16 ms)
{
        uint16 i,j;
        for(i=0;i<85;i++)                //89單片機用85,12系列單片機用800
                for(j=0;j<ms;j++);
}
/***********************************************************
* 名    稱:InitTimer0()
* 功    能:時鐘0初始化
* 入口參數:無
* 出口參數:無
* 說    明:12M晶振,12分頻,所以計數器每遞增一個數就是1微秒,完全滿足舵機控制的精度要求
                        因為定時器是TH0,TL0都要全部計數到0xFF后在計1個數就會產生中斷,所以要想產生
                        x毫秒的中斷,那么TH0,TL0就應該賦值(0xFFFF-x)        從這個值開始計數產生定時中斷                                         
/**********************************************************/
void InitTimer0(void)
{
        TMOD &= 0xF0;                //設置定時器模式
        TMOD |= 0x01;                //設置定時器模式
        TL0 = 0x00;                        //設置定時初值
        TH0 = 0x00;                        //設置定時初值
        TF0 = 0;                        //清除TF0標志
        TR0 = 1;                        //定時器0開始計時
        ET0 = 1;                        //開定時器0中斷
}
/***********************************************************
* 名    稱:Timer0Value(uint16 pwm)  
* 功    能:給定時器0計數器賦值產生定時中斷
* 入口參數:pwm                控制舵機的PWM脈沖寬度值(范圍:500~2500)
* 出口參數:無
* 說    明:12M晶振,12分頻,所以計數器每遞增一個數就是1微秒,完全滿足舵機控制的精度要求
                        因為定時器是TH0,TL0都要全部計數到0xFF后在計1個數就會產生中斷,所以要想產生
                        pwm毫秒的中斷,那么TH0,TL0就應該賦值(0xFFFF-pwm)        從這個值開始計數產生定時中斷                                          
/**********************************************************/
void Timer0Value(uint16 pwm)
{
        uint16 value;
        value=0xffff-pwm;        
        TR0 = 0;
        TL0=value;                        //16位數據給8位數據賦值默認將16位數據的低八位直接賦給八位數據
    TH0=value>>8;                //將16位數據右移8位,也就是將高8位移到低八位,再賦值給8位數據        
        TR0 = 1;
}
/***********************************************************
* 名    稱: main()
* 功    能: 入口函數
* 入口參數: 無
* 出口參數: 無
* 說    明:                                          
/**********************************************************/
void main(void)
{


        InitTimer0();        //定時器0初始化
        EA = 1;                        //開總中斷
        while(1)                //大循環
        {        
                Servo0PwmDuty = 500;                //脈沖寬度在500微秒,對應-90°
                DelayMs(1000);                //延時1秒
                Servo0PwmDuty = 1000;        //脈沖寬度在1000微秒,對應-45°
                DelayMs(1000);
                Servo0PwmDuty = 1500;
                DelayMs(1000);
                Servo0PwmDuty = 2000;
                DelayMs(1000);
                Servo0PwmDuty = 2500;
                DelayMs(1000);
                Servo0PwmDuty = 2000;
                DelayMs(1000);
                Servo0PwmDuty = 1500;
                DelayMs(1000);
                Servo0PwmDuty = 1000;
                DelayMs(1000);
        }
}


/***********************************************************
* 名    稱: Timer0_isr() interrupt 1 using 1
* 功    能: 時鐘0中斷處理
* 入口參數: 無
* 出口參數: 無
* 說    明:                                          
/**********************************************************/
void Timer0_isr(void) interrupt 1 using 1
{
        static uint16 i = 1;        //靜態變量:每次調用函數時保持上一次所賦的值,
                                                        //跟全局變量類似,不同是它只能用于此函數內部
        switch(i)
        {
                case 1:
                        SERVO0 = 1;        //PWM控制腳高電平
                        //給定時器0賦值,計數Pwm0Duty個脈沖后產生中斷,下次中斷會進入下一個case語句
                        Timer0Value(Servo0PwmDuty);        
                        break;
                case 2:
                        SERVO0 = 0;        //PWM控制腳低電平
                        //高脈沖結束后剩下的時間(20000-Pwm0Duty)全是低電平了,Pwm0Duty + (20000-Pwm0Duty) = 20000個脈沖正好為一個周期20毫秒
                        Timer0Value(20000-Servo0PwmDuty);
                        i = 0;        
                        break;         
        }
        i++;
}




回復

使用道具 舉報

板凳
ID:549313 發表于 2019-8-10 01:48 | 只看該作者
怎么把PWM控制舵機寫入超聲波中,測超聲波時 舵機也能轉動
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线男人天堂 | 久久久久亚洲视频 | 99热.com| 欧美v日韩v | 美日韩精品 | 久久久久久高潮国产精品视 | 黄色毛片黄色毛片 | 亚洲区在线 | 特黄特色大片免费视频观看 | www.久| 亚洲一区有码 | 国产欧美二区 | 亚洲视频中文字幕 | 欧美黄色一区 | 一区二区三区四区国产 | 日本不卡免费新一二三区 | 激情一区二区三区 | 午夜天堂精品久久久久 | 午夜视频免费 | 免费人成在线观看网站 | 天天操 天天操 | 日韩电影一区 | 亚洲国产自产 | 欧洲精品视频一区 | 欧美一级在线 | 中文字幕精品视频在线观看 | 成人国产网站 | 精品视频一区二区三区 | 精品国产免费一区二区三区演员表 | 欧美成人一区二区 | 日本理论片好看理论片 | 国产欧美精品区一区二区三区 | 成人欧美一区二区三区白人 | 一区二区三区亚洲 | 亚洲性网 | 福利影院在线看 | 九色在线观看 | 免费1区2区3区 | 一区二区三区视频免费观看 | 91在线精品视频 | 日韩在线精品强乱中文字幕 |