51單片機(jī)脈沖寬度調(diào)制(PWM)控制LED燈亮度
程序如下:
#include "AT89X51.H" //模擬PWM輸出控制燈的10個亮度級 unsigned int scale; //占空比控制變量 void main(void) // 主程序 { unsigned int n; //延時循環(huán)變量 TMOD=0x02; //定時器0,工作模式2(0000,0010),8位定時模式 TH0=0x06; //寫入預(yù)置初值6到定時器0,使250微秒溢出一次(12MHz) TL0=0x06; //寫入預(yù)置值 TR0=1; //啟動定時器 ET0=1; //允許定時器0中斷 EA=1; //允許總中斷 while(1) //無限循環(huán),實(shí)際應(yīng)用中,這里是做主要工作 { for(n=0;n<50000;n++); //每過一段時間,就自動加一個檔次的亮度 scale++; //占空比控制變量scale加1 if(scale==10) scale=0; //如果scale=10,使scale為0 } } timer0() interrupt 1 //定時器0中斷服務(wù)程序 { static unsigned int tt ; //tt用來保存當(dāng)前時間在一秒中的比例位置 tt++; //每250微秒增加1 if(tt==10) //2.5毫秒的時鐘周期 { tt=0; //使tt=0,開始新的PWM周期 P2_0=0; //使LED燈亮 } if(scale==tt) //按照當(dāng)前占空比切換輸出為高電平 P2_0=1; //使LED燈滅 } /*程序中從tt=0開始到scale為低電平,從scale開始到tt=10為高電平,由于scale是變量,所以改變scale就可以改變占空比。*/
我直接將該程序?qū)懭雴纹瑱C(jī)里面,單片機(jī)上指示燈的從亮→閃爍→滅,如此不斷循環(huán),如果我想讓單片機(jī)上的指示燈到最后一直保持在20%的亮度,而不是滅,此程序該如何修改?請高手指點(diǎn)迷津,小弟感激不盡!!! |