定時器中斷模擬PWM,並使用PWM控制LED亮度


pwm占空比來控制LED燈的明亮程度。

 

 

 

#include <reg52.h>

typedef unsigned char uint8;
typedef unsigned int  uint16;

sbit down = P3^0;
sbit up = P3^1;

uint8 t = 0;
uint8 PWM_T = 0;   //占空比控制變

void delay_1ms(uint16 t)
{
    uint16 x,y;
    for(x=t;x>0;x--)
        for(y=120;y>0;y--);
}
void main(void)      
{

    TMOD = 0x02;   //定時器0,工作模式2,8位定時模式
    TH0=210;     //寫入預置初值(取值1-255,數越大PWM頻率越高)
    TL0=210;     //寫入預置值 (取值1-255,數越大PWM頻率越高)
    TR0=1;       //啟動定時器
    ET0=1;       //允許定時器0中斷
    EA=1;        //允許總中斷
    P1=0xff;      //初始化P1,輸出端口
    PWM_T=30;
     while(1)      
    
     {   
           if(!up)
             {
                if(PWM_T<250)
                    {
                      PWM_T++;
                    }
                
                delay_1ms(10);
            }
         if(!down)
             {
                if(PWM_T>0)
                    {
                      PWM_T--;
                    }
                
                delay_1ms(10);
            }

    
     }      
}
timer0() interrupt 1  
{ 
     t++;    //每次定時器溢出加1
     
     if(t==250)   //PWM周期 100個單位
         {
              t=0;  //使t=0,開始新的PWM周期
              P1=0x00;  //輸出端口
         }
     
     if(PWM_T==t)  //按照當前占空比切換輸出為高電平
         {  
             P1=0xff;        //  
         }
}

 通過控制高電平在一個周期內的占比來控制。

可以通過定時器中斷來模擬PWMM。

 

 

用單片機制作的占空比均勻間隔可調PWM發生器:

占空比可調間隔為0.1。即可取得占空比為0%,10%,20%……90%到100%的PWM波。
該波的頻率固定為1KH(周期1000微秒)。
我所使用的QX-MCS51學習板上的操作鍵:
S2----占空比加            S3----占空比減

#include<reg52.h>

#define uint unsigned int 
uint pp;
char num=2,dis;
sbit pwm=P1^0;
sbit s2=P3^0;
sbit s3=P3^1;

sbit dula=P2^6;
sbit wela=P2^7;

unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void keyscan()
{
	if(s2==0)
	{
		while(!s2);
		num++;
		if(num==11)
			num=10;
		dis=num;
	}
	if(s3==0)
	{
		while(!s3);
		num--;
		if(num==-1)
			num=0;
		dis=num;
	}
}

void display(a)
{
   dula=0;
   P0=table[a];
   dula=1;
   dula=0;
   
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;   
}

void main()
{
	TMOD=0x01;		 //模式設置,00000001,可見采用的是定時器0,工作與模式1(M1=0,M0=1)。
	TR0=1;			 //打開定時器
	TH0=0Xff;		 //定時器設置,每隔100微秒發起一次中斷。
	TL0=0Xa4;
	ET0=1;			 //開定時器0中斷
	EA=1;			 //開總中斷
	while(1)
	{
		keyscan();
		if((num!=0)&&(num!=10))	//對於占空比為0和100%這兩種極端情況,最好分離出,單獨考慮
		{
			if(pp<=num)
				pwm=1;
			else
				pwm=0;
		}
		else if(num==0)	//當占空比為0
			pwm=0;
		else
			pwm=1; 
		if(pp==10)		//當占空比為100%
			pp=0;
	display(num);//顯示num當前值,占空比為num/10。
	}
}

void time0() interrupt 1
{	TH0=0Xff;
	TL0=0Xa4;
	pp++;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM