单片机按键控制pwm_单片机产生按键控制的pwm波形 - CSDN
  • 之前说到利用51单片机输出pwm,但是输出的pwm是固定占空比的,如果想要改变占空比,还得回过头来修改程序并重新烧写进单片机。这样做的话不但麻烦、效率低,还又...这样在用pwm控制电机的时候就能使用按键来控制电机...

    之前说到利用51单片机输出pwm,但是输出的pwm是固定占空比的,如果想要改变占空比,还得回过头来修改程序并重新烧写进单片机。这样做的话不但麻烦、效率低,还又把芯片的可烧写次数减少了一次,虽然51的芯片现在很便宜,但能省点就省点,能不浪费就不浪费,哈哈,开玩笑啦!最主要的还是为了灵活性,为此特地通过加入按键的功能来实现动态修改输出的pwm的占空比。这样在用pwm控制电机的时候就能使用按键来控制电机转速了。废话不多说,见下:

    #include<reg51.h>
    
    
    #define uint unsigned int
    
    #define uchar unsigned char
    
    
    uchar time;
    
    double count=26; //定义占空比,并初始占空比为26%
    
    sbit PWM=P2^0; //P2^0口输出PWM
    
    sbit key_add=P3^4; //电机加速的按键 的I/O口
    
    sbit key_dec=P3^5; //电机减速的按键 的I/O口
    
    
    
    /************函数声明**************/
    
    void delayxms(uint z); //延时
    
    void Motor_add(); //电机加速,即增加占空比
    
    void Motor_dec(); //电机减速,即减少占空比
    
    void timer0_init(); //定时器0初始化
    
    
    /*********主函数********************/
    
    void main()
    
    {
    
    timer0_init();
    
    delayxms(5);
    
    while(1)
    
    {
    
    Motor_add();
    
    Motor_dec();
    
    }
    
    }
    
    
    /****************延时处理**********************/
    
    void delayxms(uint z) //延时xms程序
    
    {
    
    uint x,y;
    
    for(y=z;x>0;x--)
    
    for(y=110;y>0;y--);
    
    }
    
    
    
    void Motor_add() //电机加速
    
    {
    
    if(key_add==0)
    
    {
    
    delayxms(2); //此处时间不能太长,否者会的中断产生冲突
    
    if(key_add==0)
    
    {
    
    count+=0.5; //每按一次加速按键占空比加0.5
    
    if(count>=32) //限定占空比上限
    
    {
    
    count=32;
    
    }
    
    }
    
    while(!key_add);
    
    }
    
    }
    
    
    void Motor_dec()//电机减速
    
    {
    
    if(key_dec==0)
    
    {
    
    delayxms(2);//此处时间不能太长,否者会的中断产生冲突
    
    if(key_dec==0)
    
    {
    
    count-=0.5; //每按一次减速按键占空比减0.5
    
    if(count<=25) //限定占空比下限
    
    {
    
    count=25;
    
    }
    
    }
    
    while(!key_dec);
    
    }
    
    }
    
    
    /***********定时器0初始化***********/
    
    void timer0_init()
    
    {
    
    TMOD=0x01; //定时器0工作于方式1
    
    TH0=(65536-10)/256;
    
    TL0=(65536-10)%256;
    
    TR0=1;
    
    ET0=1;
    
    EA=1;
    
    }
    
    
    /**************定时0中断处理******************/
    
    void timer0_int() interrupt 1
    
    {
    
    
    TR0=0; //设置定时器初值期间,关闭定时器
    
    TH0=(65536-10)/256;
    
    TL0=(65536-10)%256;
    
    TR0=1;
    
    
    time++;
    
    if(time<count) //count为占空比
    
    {
    
    PWM=1; //输出高电平
    
    }
    
    else
    
    PWM=0;
    
    if(time>=100)
    
    {
    
    time=0;
    
    }
    
    }
    
     

     

    1.  


     

    我特地标注了重要部分程序的注释。另外,可以在程序中修改按键每次增加或者减少的占空比,但有的时候发现在按键调节占空比时,不想占空比一直增加或者减少下去,还可以在程序里面修改限定占空比的上下限,当达到上限或下限时,相应的增加或减少占空比的按钮这时就不再增加或者减少占空比了。这样在电机控制时就可以防止不小心让电机速度增加到规定速度以上或以下了。这些在程序注释里面课看见在哪里改。除此之外,还可以加进来很多功能。这里就不举相应的子了。

    --------------------- 本文来自 大漠飞鹰lb 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/dmfylb/article/details/72605221?utm_source=copy

    展开全文
  • 这个是MSP430F149单片机PWM输出,通过按键控制占空比的增减
  • 干货,干货,代码可用,51单片机按键控制PWM呼吸灯,#include #define uchar unsigned char #define uint unsigned int sbit s1=P3^0; sbit s2=P3^4; sbit s3=P3^5; sbit beep=P2^3; uint pwm; uint num; //延时 ...
  • STM32 通过按键PWM

    2020-07-30 23:30:12
    基于STM32f10 通过按键控制PWM 按键在中断中执行 把原子的历程拼在了一起
  • 内含51单片机程序主要包含矩阵键盘、独立按键、数码管以及PWM输出的程序,独立按键消抖,矩阵键盘控制8位静态数码管,矩阵键盘控制8位动态数码管。很适合于51单片机的学习。
  • LED PWM调光程序,学习51单片机控制LED PWM调光程序必备资料
  • STM32F411RE Nucleo笔记-按键控制PWM占空比 此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。 首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。 图1 PWM配置 图2 按键IO口配置...

    STM32F411RE Nucleo笔记-按键控制PWM占空比

    此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。

    首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。


    图1 PWM配置


    图2 按键IO口配置

    然后生成Keil工程。

    用Keil打开。

             首先修改有关PWM方面的代码。

    PWM初始化代码如下:

    /* TIM10 init function */
    void MX_TIM10_Init(void)
    {
      TIM_OC_InitTypeDef sConfigOC;
    
      htim10.Instance = TIM10;
      htim10.Init.Prescaler = 0;
      htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim10.Init.Period = 0;
      htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      HAL_TIM_Base_Init(&htim10);
    
      HAL_TIM_PWM_Init(&htim10);
    
      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 0;
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
      sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
      HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);
    }
    

    查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:




    从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。

    比如将改变一下两个语句:

    htim10.Init.Period = 1000;

    sConfigOC.Pulse = 200;

    便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%。

     

    要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:



    修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);

    要想PWM工作,需要启动PWM。查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:


    这是PWM启动与停止的函数。

     

    最后看看按键,只需要把按键配置为上拉模式就好。

    在按键初始化中,将

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    改为

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    接下来便可以写主函数。

    int main(void)
    {
    
      /* USER CODE BEGIN 1 */
    	int i=100;
      /* USER CODE END 1 */
    
      /* MCU Configuration----------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* System interrupt init*/
      /* Sets the priority grouping field */
      HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
      HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_TIM10_Init(1000,100);//PWM初始化
    
      /* USER CODE BEGIN 2 */
    	HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
      /* USER CODE END 2 */
    
      /* USER CODE BEGIN 3 */
      /* Infinite loop */
      while (1)
      {
    		if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下
    		{
    			i=i+100;
    			if(i==1000) i=100;
    			HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM
    			MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i
    			HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
    			while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放
    		}
      }
      /* USER CODE END 3 */
    
    }
    

     

    编译程序,下载程序,可以看到现象:


    每次按下按键,占空比会增加10%。

                                                                                                                                                          HJL

                                                                                                                                                          2015.1.26










    展开全文
  • 之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。 所用硬件:步进电机及驱动器、STC89C52...

        之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。

        所用硬件:步进电机及驱动器、STC89C52单片机、直流电源

    1、硬件连接图

                  

    • 注意:上图为共阳极接法,实际连接参考总体线路连接。
    • 驱动器信号端定义:

    PUL+:脉冲信号输入正。( CP+ )

    PUL-:脉冲信号输入负。( CP- )

    DIR+:电机正、反转控制正。

    DIR-:电机正、反转控制负。

    EN+:电机脱机控制正。

    EN-:电机脱机控制负。

    • 电机绕组连接

    A+:连接电机绕组A+相。

    A-:连接电机绕组A-相。

    B+:连接电机绕组B+相。

    B-:连接电机绕组B-相。

    • 电源连接

    VCC:电源正端“+”

    GND:电源负端“-”

    注意:DC直流范围:9-32V。不可以超过此范围,否则会无法正常工作甚至损坏驱动器.

    • 总体线路连接

    输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信 号DIR+,DIR-③脱机信号EN+,EN-。输入信号接口有两种接法,可根据 需要采用共阳极接法或共阴极接法。

    在这里我采用的是共阴极接法:分别将 PUL-,DIR-,EN-连接到控制系统的地端(接入单片机地端); 脉冲输入信号通过PUL+接入单片机(代码中给的P2^6脚),方向信号通过DIR+接入单片机(代码中给的P2^4脚),使能信号通过EN+接 入(不接也可,代码中未接,置空)。按键连接见代码,分别用5个按键控制电机启动、反转、加速、减速、正反转。

    注意:接线时请断开电源,电机接线需注意不要错相,相内相间短路, 以免损坏驱动器。

    2、代码

    #include<reg51.h> 
    #define MotorTabNum 5
    unsigned char T0_NUM;
    sbit K1 = P3^5;        // 启动
    sbit K2 = P3^4;        // 反转
    sbit K3 = P3^3;        // 加速
    sbit K4 = P3^2;        // 减速
    sbit K5 = P3^1;        //正反转
    
    sbit FX      = P2^4;     // 方向
    //sbit MotorEn = P2^5;     // 使能
    sbit CLK     = P2^6;     // 脉冲
    
    int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};           
    
    unsigned char g_MotorSt = 0;     // 
    unsigned char g_MotorDir = 0;    // 
    unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};
    
    signed char g_MotorNum = 0;
    
    void delayms(xms);
    void mDelay(unsigned int DelayTime);                
    void T0_Init();
    
    void KeyScan(void);
    
    
    
    void main(void)
    {
            T0_Init();            
     //       MotorEn = 0;     // 
            FX = 0;
            while(1)
            {
                    KeyScan();              // 
            }
    
    
    }
    
    void T0_Init()
    {
            TMOD = 0x01;
            TH0 = (65535-100)/256;  // 1ms
            TL0 = (65535-100)%256;
            EA = 1;
            ET0 = 1;
    //        TR0 = 1; 
    
    }
    
    void T0_time() interrupt 1
    {
    //        TR0 = 0;
            TH0 = (65535-100)/256;   
            TL0 = (65535-100)%256;
            T0_NUM++;
            if(T0_NUM >= MotorTab[g_MotorNum])        // 
            {
                    T0_NUM = 0;
                    CLK=CLK^0x01;               //   
            }
    //        TR0 = 1;
    }         
    
    
    //-----????---------------------
    void KeyScan(void)
    {
            if(K1 == 0)
            {
                    delayms(10);   
                    if(K1 == 0)
                    {
                            g_MotorSt = g_MotorSt ^ 0x01;
                          //  MotorEn ^= 1;
                            TR0 = 1; 
    						FX ^= 0;   //反转
                    }
            }
    
            if(K2 == 0)
            {
                    delayms(10);   //正转
                    if(K2 == 0)
                    {    
                            g_MotorDir = g_MotorDir ^ 0x01;
                            FX ^= 1;    //加速
                    }
            }
    
            if(K3 == 0)  // 
            {
                    delayms(5);   //加速
                    if(K3 == 0)
                    {   
                            g_MotorNum++;
                            if(g_MotorNum > MotorTabNum)
                                    g_MotorNum = MotorTabNum;
                    }
            }
    
            if(K4 == 0)  // 
            {
                    delayms(5);   // 减速
                    if(K4 == 0)
                    {       
                        g_MotorNum--;
                        if(g_MotorNum < 0)
                        g_MotorNum = 0;
                    }
            }
    
    		if(K5 == 0)  // 
    		{
    				delayms(10);   // 正反转
    				if(K5 == 0)
    				{      
    				    g_MotorSt = g_MotorSt ^ 0x01;
    					g_MotorDir = g_MotorDir ^ 0x01;
                        MotorEn ^= 1;
                        TR0 = 1;
    			        while(1)
    					{
                           FX ^= 1;    //													        
                           delayms(90000);
    					   FX ^= 0;    //
    					   delayms(90000);
    					}
    				}
    		}
    }
    
    void delayms(xms)//延时
    {
             unsigned int x,y;
             for(x=xms;x>0;x--)
                     for(y=110;y>0;y--);
    }

    3、常见问题解答

    • 控制信号高于5v一定要串联电阻,否则可能会烧坏驱动器控制接口电路。
    • 接通电源后如果驱动器灯亮,但是无法控制电机旋转,考虑控制部分驱动能力不足或者驱动器所设置的驱动电流不够(我就遇到过这种情况,后来通过调高驱动器限制电流解决的此问题)。如果调高驱动电流步进电机仍无法转动,查看电路板上的按键有没有接对,程序中按键引脚可根据电路板设计的按键引脚连接自行改动。
    • 判断步进电机四条线的定义:将任意两条线接在一起,用手旋转电机,如果有阻力,则两条线是同一相。用相同方法测试另外两条线是否是同一相。确定同相的两条线任意接入两相接口,如果旋转方向相反只需换相即可。
    • 增加启停及加减速功能代码:https://download.csdn.net/download/weixin_42670445/11978165
    展开全文
  • 51单片机按键控制舵机旋转---------------------------------------------------------------------------------------------------------------------------------1.舵机的与单片机的连接2.PWM波的简单了解3.程序...
    51单片机按键控制舵机旋转

    ---------------------------------------------------------------------------------------------------------------------------------

    1.舵机的与单片机的连接

    2.PWM波的简单了解

    3.程序示例

    4.开发程序难点

    ---------------------------------------------------------------------------------------------------------------------------------

    1.舵机的与单片机的连接


        如图所示,舵机正极接单片机vcc,负极接gnd,signal的连接可自定义。

    ---------------------------------------------------------------------------------------------------------------------------------

    2.PWM波的简单了解

        51单片机通过按键来控制舵机正反转,需要通过PWM波来实现,本文仅对如何使用PWM波控制舵机旋转做出解释。

        对于一般的舵机来说,所对应的PWM波的周期为200ms,即单片机信号口输出200ms为一个周期。设信号口输出‘1’的时间为 x ms,剩余时间均输出‘0’,x/200的比值即为占空比的值。单片机通过控制占空比的值来控制舵机的旋转。

        对于常见的舵机来说,占空比的值与对应的角度有以下关系:

        0.5ms/200ms = 0 度

        1.0ms/200ms = 45 度

        1.5ms/200ms = 90 度

        2.0ms/200ms = 135 度

        2.5ms/200ms = 180 度

        在51单片机中,通过定时器来计时,通过信号输出口输出‘1’或‘0’来控制舵机的旋转。

    ---------------------------------------------------------------------------------------------------------------------------------

    3.程序示例

    #include<reg52.h>  


    sbit key1 = P3^2;  
    sbit key2 = P3^3;
    sbit pwm1 = P2^0;  


    unsigned int target =12,percent = 0;  
      
    void Timer0Initial();  
    void initial_Timer();  
    void delay(unsigned int x);  
    void keyscan();  


    void keyscan()  
    {
    delay(30);
    if(key1 == 0)  
      {  
    delay(10);  
        if(key1 == 0)  
        {  
    if(target >= 5)  
    target -= 1;   
        }    
      }  
      
      if(key2 == 0)  
      {  
    delay(10);  
        if(key2 == 0)  
    {  
    if(target <= 25)  
    target += 1;   
        }  
      }  

      
    void initial()  
    {  
    key1 = 1;  
      key2 = 1;  
      initial_Timer();  
    }  


    void Timer0Initial()  
    {  
      TH0 = (65536-65)/256;  
      TL0 = (65536-65)%256;  

      
    void initial_Timer()  
    {  
      EA = 1; 
      ET0 = 1; 
      TMOD = 0x01;
      Timer0Initial();  
      TR0 = 1;
    }  
      
    void delay(unsigned int x)  
    {  
      unsigned int i,j;  
      for(i=x;i>0;i--)  
        for(j=110;j>0;j--); 



    void main()  
    {  
      initial();  
      while(1)  
      {  
        keyscan();  
      }  
    }


    void Timer0() interrupt 1 using 0  

    percent+=1;
    if(percent<=target)
    pwm1=1;
    else
    pwm1=0;
    if(percent==200)
    percent=0;
      Timer0Initial();  

    }

        注释:

        P3^3和P3^2为独立按键,P2^0为输出信号口。

    ---------------------------------------------------------------------------------------------------------------------------------

    4.开发程序难点

        在实际进行操作时,常常会遇到两种情况而导致程序无法正常运行:

        1>程序运行速度与舵机转速的不匹配

            在实际操作时,由于舵机的转动与程序中target的增加并不是同步进行的,这就会导致松开按键时,由于程序运行速度远大于舵机转动速度,target的值已经到达25,但是舵机直转到90度位置,松开按键后会继续旋转。

            解决方法为,在keyscan函数中添加延时语句delay()来使程序运行速度变慢,通过多次尝试使得舵机旋转角度与target的值同步。

        2>0.5ms到2.5ms的区间并不能使得舵机从0度转到180度

            不同的舵机可能由于制作精度的区别而导致误差,可以通过调整PWM波的占空比来确定具体的角度。

            比如,我使用的舵机从0到180度实际的PWM波的ms为6ms~27ms,我室友的舵机从0到180度实际的PWM波为4~18ms。

    展开全文
  • 舵机、使用51单片机的定时器中断实现PWM

    SCU 的电子信息学院的某个社团会每年举办船模大赛。




    因为去年的船模比赛时候懒,所以就买了成品的遥控器(天地飞6)来参赛,控制自己制作的遥控船上面的电调和舵机。最近有心情想在今年的船模比赛中自己制作遥控器,先从第一步开始吧:使用单片机来控制舵机(控制电调的原理类似)。

    0x01.什么是舵机?

            其实舵机就是一种伺服电机,根据要求旋转一定的角度,在我看来,知道这些就够了~~

    0x02.舵机有什么用?

            就拿模型来说吧,船要转弯的话,可以采用的一种方式就是改变船后面舵片的角度来改变两侧对水的阻力,以此来让船转向,这个也是舵机一词的由来。

    0x03.怎么控制?

            PWM波,这是什么东西呢?其实就是一种方波,其频率为50Hz,周期就是20ms,在每个周期里面,高电平的占空比在0.5ms到2.5ms之间。而0.5ms代表的是0度,2.5ms代表的是180度。其他的度数可以直接按照比例换算过去*(这个有点想ARDUINO里面的map函数的意思)

    0x04.如何实现PWM?

            实现脉冲宽度调制波有很多种方法,很多单片机已经有“原生支持”的pwm输出引脚,用来输出pwm波形。

            我采用比较土的一种方法,如下图:

    就用这玩意输出了,他是STC公司生产的89C52RC型号的单片机,内核是51单片机,运用其中的定时器中断方式输出pwm波。


    0x05.实现效果

           是用单片机的P2^7引脚输出PWM波形,使用P2^4,P2^5引脚操作独立按键来控制舵机的角度


    使用KEIL 4平台,代码如下:

    主函数:



    // GYZ
    // 1路PWM波形输出,可以控制舵机和电调
    
    #include<reg52.h>
    
    //引脚位定义
    sbit key1 = P2^5;
    sbit key2 = P2^4;  //独立按键引脚
    sbit pwm1 = P2^7;
    
    //全局变量定义 
    unsigned int target =6,percent = 0;
    
    // 头文件包含
    #include<Timer.h>
    #include<interrupt.h>	
    #include<key.h>
    
    //函数声明
    void Timer0Initial();
    void initial_Timer();
    void delay(unsigned int x);
    void keyscan();
    
    
    void main()
    {
    	initial();
    	while(1)
    	{
    		keyscan();
    	}
    }


    独立按键扫描

    key.h

    void keyscan()
    {
    	if(key1 == 0)
    	{
    	delay(3);
    	if(key1 == 0)
    	{
    		if(target >= 7)
    		{
    			target -= 1;
    		}
    		while(key1 == 0)
    		{P1 = 0x00;}
    	}
    	P1 = 0xFF;
    	}
    
    	if(key2 == 0)
    	{
    		delay(3);
    		if(key2 == 0)
    		{
    			if(target <= 26)
    			{
    				target += 1;
    			}
    			while(key2 == 0)
    			{P1 = 0x00;}
    		}
    		P1 = 0xFF;
    	}
    }//按键检测程序
    
    void initial()
    {
    	key1 = 1;
    	key2 = 1;
    	P1 = 0xff;
    	initial_Timer();
    }

    定时器程序

    Timer.h

    //Timer Configuration
    //使用12Mhz晶振
    //理论上,12Mhz晶振12分频之后
    //应该是100次计数时间是100us
    //通过示波器实测
    //选用65次计数产生一次中断
    
    void Timer0Initial()
    {
    	TH0 = (65536-65)/256;
    	TL0 = (65536-65)%256;
    } //该初值使每0.1ms产生一次中断
    
    void initial_Timer()
    {
    	EA = 1;		   //开启总中断
    	ET0 = 1;	   //允许T0中断
    	TMOD = 0x01;	//定时器模式,T0使用工作方式1
    	Timer0Initial();	  //装初值,0.1ms产生一次中断
    	TR0 = 1;			  //打开T0定时器
    }
    
    void delay(unsigned int x)
    {
    	unsigned int i,j;
    	for(i = 0;i< x; ++i)
    		for(j = 120; j >0 ; --j)
    			;
    }


    最后,中断的程序

    interrupt.h

    void Timer0() interrupt 1 using 0
    {
    	percent += 1;
    	if(percent == 200)
    	{
    		percent = 0;
    		pwm1 = 1;//拉高电平的引脚,来维持50hz的频率
    	}
    	if(percent == target)
    	{
    		pwm1 = 0;
    	}
    	Timer0Initial();
    
    }



    展开全文
  • 答案就是PWM控制。 在一定的频率的方波中,调整高电平和低电平的占空比,即可实现。 比如我们用低电平点亮一个LED灯,我们假设把一个频率周期分为 10个时间等份,如果方波中的高低电平占空比是9:1,这是就是一 个...
  • 单片机PWM调光

    2020-04-25 21:37:03
    由三个按键分别控制LED的开关、变亮、变暗。灯的亮度调节采用单片机产生的PWM实现。 C语言代码如下: /*----------------------------- FileName:PWMDimming.h Function: 头文件 Author: Zhang Kaizhou Date: 2019-6...
  • 按键调节pwm

    2020-07-29 14:20:13
    使用stm32zet6单片机,通过按键控制,来调节pwm的输出,实现可调占空比
  • 51单片机PWM控制电机

    2015-01-04 13:29:13
    电机种类众多,就属控制直流电机最简单,只要对调正负极就能改变电机的转向。另外,直流电机负载能力强,适合做越野车的驱动电机。为了做可调速的越野车,就有了这篇文章。  电源电压输出是固定的,电机的转速也...
  • 串口控制pwm程序

    2020-07-29 14:20:06
    c语言编写的51单片机串口控制调节PWM占空比的程序,可以实现使用51单片机输出占空比可调的功能。
  • 按键控制 按键1——前进 按键2——后退 按键3——加速 按键4——减速 (板子上只有四个按键) 串口控制 ‘1’——前进 ‘2’——后退 ‘3’——加速 ‘4’——减速 ‘5’——左转 ‘6’——右转 源码:...
  • 51单片机pwm调光程序

    2020-07-30 23:32:00
    51单片机实现pwm调光程序,通过pwm调节led等的亮度,程序简单易懂
  • 工作上的一个项目,基于STC单片机pwm实现的数字控制器,很适合单片机新人学习参考。
  • 利用51单片机输出pwm

    2018-09-29 10:59:21
    51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。  用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是...
1 2 3 4 5 ... 20
收藏数 1,590
精华内容 636
关键字:

单片机按键控制pwm