專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)產(chǎn)生占空比可調(diào)方波(PWM)

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月17日   【字體:

/****************************************************************                                                       
            程序名稱:   發(fā)光二極管D1進(jìn)行亮度控制
            版本:      VER1.0
            適用板本:  51hei學(xué)習(xí)板     
利用定時(shí)器控制產(chǎn)生占空比可變的PWM波對(duì)發(fā)光二極管D1進(jìn)行亮度控制
按S2,PWM值增加,則占空比減小,D1燈變亮。
按S3,PWM值減小,則占空比增加,D1燈變暗。
當(dāng)PWM值增加到最大值或減小到最小值時(shí),蜂鳴器將報(bào)警。
*****************************************************************/

#include<reg51.h>
#include<intrins.h>
sbit  S2 =P3^4 ;        //PWM值減少鍵
sbit  S3 =P3^5 ;       //PWM值增加鍵
sbit  BEEP =P2^3 ;         //蜂鳴器
unsigned char PWM=0x03 ;   //賦初值

///////////////////////////////////////
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{  
    P1=0xff;
    TMOD=0x00 ;
  TH0=0x00 ;           //延時(shí)常數(shù)
    TL0=0x00 ;           //頻率調(diào)節(jié)
    TH1=PWM ;            //脈寬調(diào)節(jié)
    TL1=0xff ;
EA=1;
ET0=1;
ET1=1;
    TR0=1 ;


   while(1)
   {
 do{
     if(PWM!=0xff)
    {PWM++ ;delayms(10);}
        else Beep() ;
   }
    while(S3==0);

 do{
      if(PWM!=0x02)
     {PWM-- ;delayms(10);}
      else Beep() ;
   }
    while(S2==0);
  }
}

/*********************************************************/
// 定時(shí)器0中斷服務(wù)程序  (頻率)
/*********************************************************/
void timer0() interrupt 1

    TR1=0 ;
    TH0=0x00;
    TL0=0x00 ;
    TH1=PWM ;
    TR1=1 ;
    P1=0xfe ;      //啟動(dòng)輸出
}

/*********************************************************/
// 定時(shí)器1中斷服務(wù)程序 (脈寬)
/*********************************************************/
void timer1() interrupt 3
{
    TR1=0 ;
    P1=0xff ;     //結(jié)束輸出
}

/*********************************************************/
//蜂鳴器子程序
/*********************************************************/

void Beep()    
  {
    unsigned char i  ;
    for (i=0  ;i<100  ;i++)
      {
        delay(100)  ;
        BEEP=!BEEP  ;                //Beep取反
      }
    BEEP=1  ;                        //關(guān)閉蜂鳴器
 delayms(100);
  }

/*********************************************************/
// 延時(shí)子程序
/*********************************************************/ 
void delay(unsigned char t)
 {
   while(t--)   ;
 }

/*********************************************************/
// 延時(shí)子程序
/*********************************************************/
void delayms(unsigned char ms)

{
   unsigned char i ;
   while(ms--)
    {
      for(i = 0 ; i < 120 ; i++) ;
    }
}

/*********************************************************/

關(guān)閉窗口

相關(guān)文章