找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2137|回复: 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);
        }
}


回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表