這是一個51產生PWM的演示程序 其中P1.3 P1.4是兩個輸出,這個程序比較匆忙,沒有嚴格驗證,可能有錯,如有錯誤請指正。 /***************************************************************************** * 程序名稱:PWM占空比調整演示程序 * * 編寫時間:2005.9.15 23:30分 * * 程序版本:1.0 * * * * ****************************************************************************** *程序思路說明: * * * *關于頻率和占空比的確定,對于12M晶振,假定PWM輸出頻率為1KHZ,這樣定時中斷次數 * *設定為C=10,即0.01MS中斷一次,則TH0=FF,TL0=F6;由于設定中斷時間為0.01ms,這樣* *可以設定占空比可從1-100變化。即0.01ms*100=1ms * ******************************************************************************/ #i nclude #define uchar unsigned char /***************************************************************************** * TH0和TL0是計數器0的高8位和低8位計數器,計算辦法:TL0=(65536-C)%256; * * TH0=(65536-C)/256,其中C為所要計數的次數即多長時間產生一次中斷;TMOD是計數器* * 工作模式選擇,0X01表示選用模式1,它有16位計數器,最大計數脈沖為65536,最長時 * * 間為1ms*65536=65.536ms * ******************************************************************************/ #define V_TH0 0XFF #define V_TL0 0XF6 #define V_TMOD 0X01 void init_sys(void); /*系統初始化函數*/ void Delay5Ms(void); unsigned char ZKB1,ZKB2; void main (void) { init_sys(); ZKB1=40; /*占空比初始值設定*/ ZKB2=70; /*占空比初始值設定*/ while(1) { if (!P1_1) //如果按了+鍵,增加占空比 { Delay5Ms(); if (!P1_1) { ZKB1++; ZKB2=100-ZKB1; } } if (!P1_2) //如果按了-鍵,減少占空比 { Delay5Ms(); if (!P1_2) { ZKB1--; ZKB2=100-ZKB1; } } /*對占空比值限定范圍*/ if (ZKB1>99) ZKB1=1; if (ZKB1=100) click="0"; if (click<=ZKB1) /*當小于占空比值時輸出低電平,高于時是高電平,從而實現占空比的調整*/ P1_3=0; else P1_3=1; if (click<=ZKB2) P1_4=0; else P1_4=1; } |