|
|
- AT89S51本身沒有PWM接口,程序采用軟件模擬PWM,P1口控制LED亮度,模擬PWM輸出控制燈的10個亮度級。
- #include <reg51.h>
- #define uInt unsigned int
- #define uchar unsigned char
- uchar PWM_T = 0; //占空比控制變量
- //////////////////主程序入口//////////////////////
- void main(void)
- {
- bit flag = 1; //控制燈漸亮漸熄方式
- uInt n;
- TMOD=0x02; //定時器0,工作模式2,8位定時模式
- TH0=241; //寫入預(yù)置初值241到定時器0,使15微秒溢出一次(11.0592MHz)
- TL0=241; //寫入預(yù)置值
- TR0=1; //啟動定時器
- ET0=1; //允許定時器0中斷
- EA=1; //允許總中斷
- P1=0xff; //初始化P1
- while(1)
- {
- for(n=0;n<300;n++); //延時,將響應(yīng)定時器中斷,燈會自動加/減一個檔次的亮度
- if(flag==1) //燈漸亮
- PWM_T++;
- else //燈漸熄
- PWM_T--;
- if(PWM_T>=10) //設(shè)置燈亮度級別為10
- flag=0;
- if(PWM_T==0) //限定最低亮度級別為0
- flag = 1;
- }
- }
- ///////////////////定時器0中斷模擬PWM////////////////////
- timer0() interrupt 1 using 2
- {
- static uchar t ; //t用來保存當(dāng)前時間在一秒中的比例位置
- t++; //每15微秒增加1
- if(t==10) //1.5毫秒的時鐘周期
- {
- t=0; //使t=0,開始新的PWM周期
- P1=0x00; //使LED燈亮
- }
- if(PWM_T==t) //按照當(dāng)前占空比切換輸出為高電平
- P1=0xff; //使LED燈滅
- }
-
復(fù)制代碼
|
|