閱讀885 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PWM 調光

 /*-----------------------------------------------
  名稱:PWM 調光
  日期:2013,4,29
  修改:無
  內容:1、學習目的:利用定時器產生PWM,了解原理和使用方法
        2、硬件要求:LED燈 定時器
        3、試驗現象:LED燈由亮到滅,由滅到亮逐步變化,也就是調光現象
------------------------------------------------*/


#include<reg52.h>     //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義


sbit LED=P1^0;      //定義LED燈,通過LED顯示調光效果
sbit LED1=P1^6;     //  亮度增加時亮
sbit LED2=P1^7;   //亮度減小時亮
unsigned char CYCLE;  //定義周期 該數字X基準定時時間 如果是10 則周期是10 x 0.1ms
unsigned char PWM_ON ;//定義高電平時間
/******************************************************************/
/*                    延時函數                                    */
/******************************************************************/
void delay(unsigned int cnt)
{
 while(--cnt);
}
/******************************************************************/
/*                    主函數                                      */
/******************************************************************/
main()
{
bit Flag;


TMOD |=0x01;              //定時器設置 0.1ms in 12M crystal
TH0=(65536-100)/256; 
TL0=(65536-100)%256;      //定時0.1mS 
IE= 0x82;                 //打開中斷
TR0=1;


CYCLE = 10;               // 時間可以調整 這個是10調整 8位PWM就是256步
while(!Flag)
  {
   delay(20000);          //延時時間,從一個亮度到下一個亮度的間隔時間,速度快就能看到連續效果
   PWM_ON++;              //這個使用較長延時,以便能看清楚變化過程
   LED1=0;
   if(PWM_ON == CYCLE)
     {                    //這個裏可以添加其他程序 如到最亮時候控製設備
      Flag=1;
 LED1=1;
 LED2=0;
 }
  }


 while(Flag)              //亮度遞減 同上,是個相反的過程
  {
   delay(20000);
   PWM_ON--;
   if(PWM_ON == 0)
     {
      Flag=0;
 LED2=1;
 LED1=0;
 }
  }
}
/******************************************************************/
/*                    定時器中斷函數                              */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; 
TH0=(65536-100)/256; 
TL0=(65536-100)%256;     //定時0.1mS 
if (count==PWM_ON)
    {
     LED = 1;            //燈滅 
    }
  count++;
if(count == CYCLE)
    {
    count=0;
if(PWM_ON!=0)        //如果左右時間是0 保持原來狀態
  LED = 0;          //燈亮
    }


}

最後更新:2017-04-03 19:06:50

  上一篇:go static用法小結
  下一篇:go 紅外遙控器解碼