廢話不多說直接上程序仿真圖
仿真工程文件下載:
PWM.rar
(25.81 KB, 下載次數: 101)
2016-11-30 10:59 上傳
點擊文件名下載附件
單片機源程序:
- #include <reg52.h>
- unsigned char HighRH = 0; //高電平重載值的高位
- unsigned char HighRL = 0; //高電平重載值的低位
- unsigned char LowRH = 0; //低電平重載值的高位
- unsigned char LowRL = 0; //低電平重載值的低位
- unsigned int cnt=0; //記錄T1中斷次數
- unsigned int i=0;
- unsigned char dc=0;//PWM占空比
- unsigned char fr=0; //PWM頻率
- unsigned char out=0; //PWM輸出指示
- sbit PWMOUT=P3^7; //PWM輸出端口
- void ConfigPWM();
- void ClosePWM();
- sbit k0=P1^0; //占空比+5
- sbit k1=P1^1; //占空比-5
- sbit k2=P1^2; //頻率+
- sbit k3=P1^3; // 頻率-
- sbit k4=P1^4; //輸出PWM
- sbit k5=P1^5; //停止輸出PWM
- unsigned char code LEDChar[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- unsigned char code LEDBuff[]={0xF7,0xFB,0x7F,0xBF};
- void delay(int ms) //延時函數用于數碼管的顯示
- {
- unsigned int x,y;
- for(x=ms;x>0;x--)
- for(y=110;y>0;y--);
- }
- void LEDstate()
- {
- P0=LEDBuff[0];
- P2=LEDChar[dc%10];
- delay(3);
- P0=LEDBuff[1];
- P2=LEDChar[dc/10];
- delay(3);
- P0=LEDBuff[2];
- P2=LEDChar[fr%10];
- delay(3);
- P0=LEDBuff[3];
- P2=LEDChar[fr/10];
- delay(3);
-
- }
- void Key(void)
- {
- if(out==0)
- {
- if(k0==0) //停止輸出波形才能進行調整
- {
- if(dc<100) //占空比+5
- dc+=5;
- while(k0==0);
- }
- if(k1==0) //占空比-5
- {
- if(dc=0)
- dc-=5;
- while(k1==0);
- }
-
- if(k2==0) //頻率+1
- {
- fr+=10;
- while(k2==0);
- }
- if(k3==0) //頻率-1
- {
- if(fr!=0)
- fr-=10;
- while(k3==0);
- }
- }
- if(k4 == 0) //輸出波形
- out =1;
- if(k5 == 0) //停止輸出波形
- out =0;
- }
- void main()
- {
-
-
-
- while (1)
- {
- LEDstate();
- Key();
- ConfigPWM(); //調用PWM配置函數
- /* if(out==0)
- ClosePWM();
- */
-
- }
- }
- /* 配置PWM,fr頻率,dc-占空比 */
- void ConfigPWM()
- {
- unsigned int high, low;
- unsigned long tmp;
-
- tmp = (11059200/12)/100/fr; //計算一個周期所需要的計數值
- high = (tmp*dc)/100; //計算高電平所需要的計數值
- low = tmp - high; //計算低電平所需要的計數值
- high = 65536 - high + 12; //計算高電平的重載值并補償中斷延時
- low = 65536 - low + 12; //計算低電平的重載值并補償中斷延時
- HighRH = (unsigned char)(high>>8); //高電平重載值拆分高低字節
- HighRL = (unsigned char)high;
- LowRH = (unsigned char)(low>>8); //低電平重載值拆分高低字節
- LowRL = (unsigned char)low;
- TMOD &= 0xF0; //清除T0的控制段?
- TMOD |= 0x01; //T0為模式1
- TH0 = HighRH; //加載T0重載值
- TL0 = HighRL;
- ET0 = 1; //使能T0中斷
- TR0 = 1; //啟動T0
- EA = 1; //開關總使能
- PWMOUT=1; //輸出高電平
- }
- /*關閉PWM */
- void ClosePWM()
- {
- TR0 =0; //停止定時器
- ET0 =0; //禁止中斷
- PWMOUT=1; //輸出高電平
- }
- /* T0中斷服務程序,產生PWM波 */
- void InterruptTimer0() interrupt 1
- {
- if (PWMOUT==1) //當輸出為高電平,加載低電平值并輸出低電平
- {
- TH0 = LowRH;
- TL0 = LowRL;
- PWMOUT = 0;
- }
- else //當輸出為低電平,加載高電平值并輸出高電平
- {
- TH0 = HighRH;
- TL0 = HighRL;
- PWMOUT = 1;
- }
- }
復制代碼 |