精华内容
下载资源
问答
  • 利用51单片机输出pwm

    万次阅读 多人点赞 2018-09-29 10:58:09
    51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。  用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是...

    51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。

      用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。

      下面重点介绍用一个定时器的实现PWM的方法。以周期为1ms(1kHZ)为例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先要确定PWM的周期T和占空比D,确定了这些以后,就可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n。

      因为这里我们是产生周期为1ms(1kHZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:

       1、当time>=100时,time清零(此语句保证频率为1kHZ);

       2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平;

       3、当time<=n时,让单片相应的I/O口输出高电平,此时占空比就为%n。

     下面程序产生30%占空比的pwm:

     

     
    #include<reg51.h>
    
    #define uint unsigned int
    
    #define uchar unsigned char
    
    
    sbit PWM=P2^0;// P2.0输出pwm
    
    uchar time; // 定义占空比的变量
    
    
    void main()
    
    {
    
    TMOD=0x01;//定时器0工作方式1
    
    TH0=0xff;//(65536-10)/256;//赋初值定时
    
    TL0=0xf7;//(65536-10)%256;//0.01ms
    
    EA=1;//开总中断
    
    ET0=1;//开定时器0中断
    
    TR0=1;//启动定时器0
    
    while(1)
    
    {
    
    }
    
    }
    
    
    void tim0() interrupt 1
    
    {
    
    TR0=0;//赋初值时,关闭定时器
    
    TH0=0xff;//(65536-10)/256;//赋初值定时
    
    TL0=0xf7;//(65536-10)%256;//0.01ms
    
    TR0=1;//打开定时器
    
    
    time++;
    
    if(time>=100) //1khz
    
    time=0;
    
    if(time<=30) //占空比%30,可改
    
    PWM=1;
    
    else PWM=0;
    
    }
    
    

     

       最后的到波形,在示波器上显示如下图所示:

     

       如果想修改占空比,直接在程序里面修改下面这句即可。

       if(time<=30)//占空比%30,可改占空比

     

       当然我们可以加入其它的手段来动态改变占空比,比如按键,上位机等。

     

     

    展开全文
  • 利用51单片机输出PWM

    千次阅读 多人点赞 2020-07-23 10:11:55
    利用51单片机输出PWM波 用一个定时器时(如定时器T0),首先确定PWM的周期T和占空比D,确定了这些以后,用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则DT=nt,类似的可以求出PWM低电平...

    利用51单片机输出PWM波

    用一个定时器时(如定时器T0),首先确定PWM的周期T和占空比D,确定了这些以后,用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则DT=nt,类似的可以求出PWM低电平时间需要多少个时间基准n。
    因为这里我们是产生周期为1ms(1000HZ)的PWM,所以可设置中断的时间间隔为0.01ms,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:
    1、当time>=100时,time清零(此语句保证频率为1000HZ)
    2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平
    3、当time<n时,让单片相应的I/O口输出高电平,此时占空比就为百分之n。

    程序1,使单片机的I/O口输出固定频率的PWM波

    程序说明:

    1、关于频率的确定:对于11.0592M晶振, PWM输出频率为1KHZ, 此时设定时器0.01ms中断一次,时中断次数100次即为1KHZ( 0.01ms*100=1ms,即为1000HZ)此时, 定时器计数器赋初值为TH0=FF,TL0=F7。

    2、关于占空比的确定:此时我们将来time的值从0-100之间进行改变,就可以将占空比从%0-%100之间进行变化,上面程序中time<=20时 PWM1=0; else PWM1=1;意思就是%20的时间输出低电平,%80的时间输出高电平,即占空比为%80。如需得到其它占空比,如%60,只需将time的值改为40即可。(程序为if(time<=40) PWM1=0;else PWM1=1;)

    3、编写程序时也可以定义一个标志位如flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了 n ,如果到了说明高电平的时间够了,那么就改变flag为0,输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据flag=0的情况跳去判断记录变量的值是否到了 n’ 如果到了,说明PWM的低电平时间够了,那么就改flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到想要的PWM波形

    /*******************************************************************/
    
    /* 程序名:单片机输出固定频率的PWM波*/
    
    /* 晶振:11.00592 MHz CPU型号:STC89C52 */
    
    /* 功能:P2^0口输出周期为1ms(1000HZ),占空比为%80的PWM波*/
    
    /*****************************************************************/
    
    #include<reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit PWM1=P2^0;//接IN1 控制正转
    sbit PWM2=P2^1;//接IN2 控制反转
    uchar time;
    
    void main()
    {
    	TMOD=0x01;//定时器0工作方式1
    	TH0=0xff;//(65536-10)/256;//赋初值定时
    	TL0=0xf7;//(65536-10)%256;//0.01ms
    	EA=1;//开总中断
    	ET0=1;//开定时器0中断
    	TR0=1;//启动定时器0
    	while(1){}
    }
    
    
    void delay(uint z)
    {
    	uint x,y;
    	for(x=z;x>0;x--)
    	{
    		for(y=500;y>0;y--);
    	}
    }
    
     
    
    void tim0() interrupt 1
    {
           TR0=0;		//赋初值时,关闭定时器
           TH0=0xff;	//(65536-10)/256;//赋初值定时
           TL0=0xf7;	//(65536-10)%256;//0.01ms
           TR0=1;		//打开定时器
           time++;
           if(time>=100) time=0;	//1khz
           if(time<=20) PWM1=0;		//点空比%80
           else PWM1=1;
           PWM2=0;
    }
    
    程序2,使用单片机I/O口输出PWM波,并能通过按键控制正反转

    在程序中我们通常需要控制电机的正反转,如通过一个按键控制正反转,此时我们也可以设置一个标志位如flag。在主程序中当按键每次被按下时,flag相应取反。然后在子程序中当flag为1时,进行正转程序,当flag为0时执行反转程序。

    /*******************************************************************/
    
    /* 程序名:PWM直流电机调速 */
    
    /* 晶振:11.00592 MHz CPU型号:STC89C52 */
    
    /* 功能:直流电机的PWM波控制,可以通过按键控制正反转 */
    
    /*****************************************************************/
    
    #include<reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    
    uchar time,count=50,flag=1;//低电平的占空
    
    sbit PWM1=P2^0;		//PWM 通道 1,反转脉冲
    sbit PWM2=P2^1;		//PWM 通道 2,正转脉冲
    sbit key_turn=P3^7; //电机换向
    
     
    
    /************函数声明**************/
    void delayxms(uint z);
    void Motor_turn(void);
    void timer0_init(void);
    
    /*********主函数********************/
    
    void main(void)
    {
    	timer0_init();
    	while(1)
    	{
    		 Motor_turn();
    	}
    }
    
     
    
    /****************延时处理**********************/
    
    void delayxms(uint z)//延时xms程序
    {
        uint x,y;
        for(y=z;x>0;x--)
              for(y=110;y>0;y--);
    }
    
     
    
    /************电机正反向控制**************/
    
    void Motor_turn(void)
    {
    	if(key_turn==0)
    	 {
    	    delayxms(2);//此处时间不能太长,否者会的中断产生冲突
    	    if(key_turn==0)flag=~flag;
    	    while(!key_turn);
    	 }
    }
    
     
    
    /***********定时器0初始化***********/
    
    void timer0_init(void)
    {
    	TMOD=0x01; //定时器0工作于方式1
    	TH0=(65536-10)/256;
    	TL0=(65536-10)%256;
    	TR0=1;
    	ET0=1;
    	EA=1;
    }
    
     
    
    /**************定时0中断处理******************/
    
    void timer0_int(void) interrupt 1
    {
    	TR0=0;//设置定时器初值期间,关闭定时器
    	TH0=(65536-10)/256;
    	TL0=(65536-10)%256;
    	TR0=1;
    
    	if(flag==1)//电机正转
    	{
    		PWM1=0;
    		time++;
    		if(time<count)PWM2=1;
    		else  PWM2=0;
    		
    		if(time>=100)time=0;
    	}
    
    	else //电机反转
    	{
    		PWM2=0;
    		time++;
    		if(time<count) PWM1=1;
    		else PWM1=0;
    		
    		if(time>=100)time=0;
    	}
    }
    
    程序3、使单片机输出PWM,并能控制正反转和实现调速

    下面再给出一个复杂一点的程序,实现的功能为通过一个按键控制正反转并通过另外两个按键使之可以在0到20级之间调速的程序。

    /*******************************************************************/
    
    /* 程序名:PWM直流电机调速 */
    
    /* 晶振:11.00592 MHz CPU型号:STC89C52 */
    
    /* 直流电机的PWM波控制,可以通过按键控制正反转并在0到20级之间调速 */
    
    /*****************************************************************/
    #include<reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    
    uchar time,count=50,flag=1;//低电平的占空比
    
     
    sbit PWM1=P2^0;			//PWM 通道 1,反转脉冲
    sbit PWM2=P2^1;			//PWM 通道 2,正转脉冲
    sbit key_add=P3^5;		//电机加速
    sbit key_dec=P3^6;		//电机减速
    sbit key_turn=P3^7;		//电机换向
    
     
    
    /************函数声明**************/
    
    void delayxms(uint z);
    void Motor_turn();
    void Motor_add();
    void Motor_dec();
    void timer0_init();
    
     
    /*********主函数********************/
    
    void main()
    {
        timer0_init();
        while(1)
        {
           Motor_turn();
           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_turn()
    {
    	if(key_turn==0)
    	{
    		delayxms(2);//此处时间不能太长,否者会的中断产生冲突
    		if(key_turn==0)
    		{
    			flag=~flag;
    		}
    		while(!key_turn);
    	}
    
    }
    
     
    
    void Motor_add()//电机加速
    {
    	if(key_add==0)
    	{
    		delayxms(2);//此处时间不能太长,否者会的中断产生冲突
    		if(key_add==0)
    		{
    			count+=5;
    			if(count>=100)
    			{
    				count=0;
    			}
    		}
    		while(!key_add);
    	}
    }
    
     
    
    void Motor_dec()//电机加减速
    {
    	if(key_dec==0)
    	{
    		delayxms(2);//此处时间不能太长,否者会的中断产生冲突
    		if(key_dec==0)
    		{
    			count-=5;
    			if(count>=100)
    			{
    				count=0;
    			}
    		}
    		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;
    
        if(flag==1)//电机正转
        {
           PWM1=0;
           time++;
            if(time<count) PWM2=1;
            else           PWM2=0;
    
            if(time>=100) time=0;
        }
    
        else //电机反转
        {
           PWM2=0;
           time++;
            if(time<count) PWM1=1;
            else           PWM1=0;
    
    		if(time>=100) time=0;
        }
    }
    
    
     
    
    程序四:利用单片机输出PWM简单控制小车直行
    #include<reg52.h>
    
    #define uint unsigned int
    
    #define uchar unsigned char
    
     
    
    sbit PWM1=P2^0;//接IN1 控制正转
    
    sbit PWM2=P2^1;//接IN2 控制反转
    
     
    
    sbit PWM3=P2^2;//接IN3 控制正转
    
    sbit PWM4=P2^3;//接IN4 控制反转
    
     
    
    sbit PWM5=P2^4;//接IN3 控制正转
    
    sbit PWM6=P2^5;//接IN4 控制反转
    
     
    
    sbit PWM7=P2^6;//接IN3 控制正转
    
    sbit PWM8=P2^7;//接IN4 控制反转
    
     
    
    uchar time;
    
     
    
    void main()
    
    {
    
        TMOD=0x01;//定时器0工作方式1
    
        TH0=0xff;//(65536-10)/256;//赋初值定时
    
        TL0=0xf7;//(65536-10)%256;//0.01ms
    
        EA=1;//开总中断
    
        ET0=1;//开定时器0中断
    
        TR0=1;//启动定时器0
    
        while(1)
    
        {
    
              
    
        }         
    
    }
    
     
    
    void delay(uint z)
    
    {
    
        uint x,y;
    
        for(x=z;x>0;x--)
    
           for(y=500;y>0;y--);
    
    }
    
     
    
    void tim0() interrupt 1
    
    {
    
        TR0=0;//赋初值时,关闭定时器
    
        TH0=0xff;//(65536-10)/256;//赋初值定时
    
        TL0=0xf7;//(65536-10)%256;//0.01ms
    
        TR0=1;//打开定时器
    
     
    
        time++;
    
        if(time>=100) time=0;//1khz
    
        PWM2=0;
    
        PWM4=0;   
    
        if(time<=75) PWM1=1;
    
        else PWM1=0;
    
        if(time<=80) PWM3=1;
    
        else PWM3=0;
    
     
    
        PWM6=0;
    
        PWM8=0;   
    
        if(time<=50) PWM5=1;
    
        else PWM5=0;
    
        if(time<=50) PWM7=1;
    
        else PWM7=0;     
    
    }
    
    展开全文
  • PWM这个功能在飞思卡尔、STM32等高档的单片机内部有专用的模块,用此类芯片...但是如果要用51单片机的话,也是可以的,但是比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。
  • 如何利用51单片机输出PWM波.doc
  • 利用51单片机输出pwm-CH549DS1.PDF
  • 51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。  用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是...
  • 51单片机输出PWM.zip

    2020-07-16 11:16:45
    程序是一个三基色合成演示装置,可以通过串口屏和案件控制PWM脉宽,从而调节亮度,利用51单片机用一个定时器实现PWM来调节三个灯的亮度,51单片机用一个定时器实现PWM来调节三个灯的亮度,
  • 89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。1软件延时法利用软件延时函数,控制电平持续的时间,达到模拟...

    89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。

    1软件延时法

    利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。

    程序如下:

    #includesbitpwm=P1^0;main(){while(1){pwm=1;delayus(60);//置高电平后延时60us,占空比60%pwm=0;delayus(40);}}voiddelayus(uintx){while(x--);}

    proteus软件仿真结果如下:

    f3c1d6d6948de498d2f164383752d9e8.png

    可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显。当程序除了要输出pwm波还要执行其他操作比如键盘扫描、显示等操作时,需要占用CPU一定的机器周期,这样就会影响pwm的准确度。现在很少会用到这种方法,接下来要介绍的是比较常用的方法。

    2定时器产生pwm

    这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。

    2.1注意事项

    2.2.1中断服务程序的内容。

    一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。2.2.2定时器装入初值的问题。

    装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。

    2.2定时器工作方式

    在定时器工作方式的选择上,可以选择定时器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定时器,这样可以获得较宽的调频范围。

    2.3定时器初值的计算

    设占空比为α,频率为f

    产生高电平时装入定时器高8位的值应为

    产生高电平时装入定时器低8位的值应为

    显然,产生低电平时的公式只要把α换成(1-α)就行了。

    然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。关于C51的乘除法问题,可以看以下这篇文章:http://blog.163.com/ssou_1985/blog/static/295320362010311102232210/

    修改后的公式如下:a为100倍占空比,fr为0.01倍频率TH0=(65535-a*100/fr)/256;//高位初值TL0=(65535-a*100/fr)%256;同样,低电平的公式只需把a换成(100-a)即可。

    2.4例程

    本例程采用定时器T0在工作方式1下产生一路PWM,用独立键盘控制频率、占空比的加减,频率可调范围100Hz-10kHz,占空比0-100%(均为理论值,实际值略低)部分代码如下:

    99ec98d01935f0ae47d52566376d469a.png

    注:T0_H,T0_L,T1_H,T1_L均用于暂时存储初值,进入中断服务程序后直接给寄存器TH0、TL0赋值,避免了在中断中计算。

    f2a93ec56fe199e278a9249cb15def59.png

    注:flag为pwm输出标志,flag=1输出高电平,flag=0输出低电平

    2.5软件仿真结果

    2.5.1频率为100Hz

    a.占空比约15%

    0a156f804aba870d293202a2a2778ede.png

    b.占空比95%

    e643b0277d19921630fa8698df341efb.png

    2.5.2频率为10KHz

    a.占空比15%

    30b11621b2add5fb56859f94d9f0995b.png

    b.占空比90%

    683453200bbeece079b606f69e608fe4.png

    展开全文
  • 51单片机按键控制输出pwm的占空比

    千次阅读 多人点赞 2018-09-29 11:00:40
    之前说到利用51单片机输出pwm,但是输出的pwm是固定占空比的,如果想要改变占空比,还得回过头来修改程序并重新烧写进单片机。这样做的话不但麻烦、效率低,还又把芯片的可烧写次数减少了一次,虽然51的芯片现在很...

    之前说到利用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

    展开全文
  • STC系列51单片机利用PCA定时器产生PWM信号例程,使用STC系列单片机自带PWM功能
  • 利用中断和延时程序 实现按钮控制单片机输出PWM波,用于控制双足机器人
  • 本例程由c语言编写,使用stc89c52rc单片机定时器实现,6ms周期pwm输出,实现led灯31级亮度调节。
  • 51单片机输出PWM

    2013-04-19 15:35:31
    利用Atmel89C51单片机的定时器输出占空比可调的PWM
  • 基于51单片机模拟PWM

    2018-12-26 20:16:07
    脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。本程序基于51单片机所涉及的模拟PWM的脉宽输出
  • 详细介绍了51系列单片机输出PWM的两种方法
  • 单片机_PWM输出原理详解

    万次阅读 多人点赞 2019-02-24 20:30:51
    单片机_PWM输出原理详解 理论篇   博主自己的经历告诉我,PWM波的理解和应用确实还是挺重要的,这里专门花一期详细介绍一下 什么是PWM?   PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是...
  • 基于51单片机可调PWM发生器

    千次阅读 2021-12-13 21:11:34
    源码:基于51单片机可调PWM发生器 一、设计任务 PWM信号频率范围为10Hz ~ 100kHz 占空比为5%~95% 键盘设置PWM频率和占空比 液晶模块显示输出频率和占空比 二、硬件设计 1、硬件总体框图 原理:采用8位的51单片机做...
  • 两种方法教你利用单片机输出PWM脉冲来源:华强电子网作者:华仔浏览:406时间:2017-05-04 23:52标签:摘要:51单片机没有PWM输出功能,可以采用定时器配合软件的方法实现,对精度要求不高的场合是非常实用的。...
  • 单片机PWM输出原理与实践

    千次阅读 2020-11-26 16:05:51
      博主自己的经历告诉我,PWM波的理解和应用确实还是挺重要的,这里专门花一期详细介绍一下 什么是PWM?   PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,153
精华内容 461
关键字:

利用51单片机输出pwm