|
|
一種用51單片機(jī)實(shí)現(xiàn)的高效PWM方案,只需要兩次中斷即可實(shí)現(xiàn)可調(diào)的PWM,絕對(duì)原創(chuàng),盜版必究!
/********************************************************************************************************/
/*在現(xiàn)在我已知的用51單片機(jī)產(chǎn)生PWM的方法中,基本都是通過定時(shí)器中斷來實(shí)現(xiàn)的,這樣一個(gè)PWM周期就包含了很多
小中斷,浪費(fèi)了大量時(shí)間,尤其是當(dāng)程序較復(fù)雜時(shí),往往就會(huì)出問題!而本設(shè)計(jì)則克服了這個(gè)缺點(diǎn)!一個(gè)周期只需要兩
次中斷!絕對(duì)的好方法!
為了讓大家都能夠?qū)W到這個(gè)好方法,我特整理了這個(gè)程序,希望能對(duì)大家有所幫助! */
//作者:嘻嘻嘻 2012年4月
/********************************************************************************************************/
#include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
sbit OUT=P1^0; //定義PWM端口
unsigned int PWM;
unsigned int PWM_0;
unsigned int PWM_H,PWM_L;
bit sign=0;
/*------------------------------------------------
定時(shí)器2初始化子程序
------------------------------------------------*/
void Init_Timer2(void)
{
T2CON=0X00; //使用16位自動(dòng)重裝
RCAP2H=0XFE;
RCAP2L=0XE0; //給定初值,0.8MS
TH2=0XFE;
TL2=0XE0;
EXEN2=1;
OUT=1;
ET2=1; //定時(shí)器中斷打開
EA=1; //總中斷打開
TR2=1; //定時(shí)器開關(guān)打開
sign=0;
}
/*------------------------------------------------
主程序
------------------------------------------------*/
void delay()
{
unsigned char i=60;
for(;i>0;i--);
}
main()
{
Init_Timer2();
PWM_0=12000; //初始化PWM
//RCAP2H=(unsigned char)((65536-PWM)>>8);
//RCAP2L=(unsigned char)((65536-PWM)&0x00ff); //重新賦值,200US
while(1)
{
for(;PWM_0>2;PWM_0--) delay();
for(;PWM_0<9999;PWM_0++) delay();
}
}
/*------------------------------------------------
定時(shí)器中斷子程序
------------------------------------------------*/
void Timer2_isr(void) interrupt 5
{
if(sign==1)
{
TR2=0;
PWM=PWM_0;
RCAP2H=(unsigned char)((65536-PWM)>>8);
RCAP2L=(unsigned char)((65536-PWM)&0x00ff);
sign=0;
OUT=0;
TF2=0;
TR2=1;
}
else
if(sign==0)
{
TR2=0;
//PWM=660-PWM_0; //1000HZ
//PWM=3000-PWM_0; //300HZ
PWM=19550-PWM_0; //50HZ
RCAP2H=(unsigned char)((65536-PWM)>>8);
RCAP2L=(unsigned char)((65536-PWM)&0x00ff);
sign=1;
OUT=1;
TF2=0;
TR2=1;
}
}
|
評(píng)分
-
查看全部評(píng)分
|