//51微控制器PWM佔空比調整演示程式
//(透過測試,注意:AT89S51微控制器,有的微控制器P3_7需要改為P3^7)
/*****************************************************************************
* 程式名稱:PWM佔空比調整演示程式 *
*程式思路說明: *
* 只需要4個按鍵。 *
*關於頻率和佔空比的確定,對於12M晶振,輸出頻率為1KHZ,這樣定時中斷次數設定為 *
*10,即0.01MS中斷一次,則TH0=FF,TL0=F6;由於設定中斷時間為0.01ms,這樣可以設 *
*定佔空比可從1-99%變化。即0.01ms*100=1ms *
******************************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
uchar timer0_tick,ZKB=1;//timer0_tick計數,ZKB佔空比
uchar i=0,n=0,temp=0;
code seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1,2,3, 4, 5, 6, 7, 8, 9
code scan[2]={0xfd,0xfe};
uchar counter[2]={0,0};
sbit AN1=P3^2;//調整個位
sbit AN2=P3^3;//調整十位
sbit AN3=P3^4;//啟動按鍵
sbit AN4=P3^5;//確認按鍵
void delay(uint z)//軟體延時函式
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
static void timer0_isr(void) interrupt 1 using 0 //中斷函式
TR0=0;
TL0=0xf6;
TH0=0xff;
TR0=1;
if (ZKB>99) ZKB=1;
if (ZKB
counter[0]=ZKB%10;
counter[1]=ZKB/10;
n++;
if(n==100)
n=0;
i++;
if(i==2) i=0;
P0=seven_seg[counter[i]];
P2=scan[i];
timer0_tick++;
if(timer0_tick++==100)
timer0_tick=0;
if(AN2==0)
delay(100);
temp=1;
counter[0]++;
if(counter[0]==10)
counter[0]=0;
if(AN1==0)
counter[1]++;
if(counter[1]==10)
counter[1]=0;
ZKB=counter[0]+counter[1]*10;
if(AN4==0)
delay(5);
temp=0;
if(temp==1)
P3_7=0;// P3_7為脈衝輸出引腳
else
if (timer0_tick
P3_7=1;
P3_7=0;
static void timer0_initialize(void)//中斷初始化
EA=0;
TMOD=0x01;
PT0=0;
ET0=1;
EA=1;
void main(void)
STAR: delay(100);
if(AN3!=0) goto STAR;//按鍵3啟動脈衝
timer0_initialize();
while(1);
//按按鍵3啟動脈衝器,初始設定佔空比為1%,按鍵1調整十位,
//按鍵2調整個位,一旦調整,輸出為0,必須按確認鍵確認,
//輸出正確脈衝.可以佔空比1-99%任意調節。
//51微控制器PWM佔空比調整演示程式
//(透過測試,注意:AT89S51微控制器,有的微控制器P3_7需要改為P3^7)
/*****************************************************************************
* 程式名稱:PWM佔空比調整演示程式 *
*程式思路說明: *
* 只需要4個按鍵。 *
*關於頻率和佔空比的確定,對於12M晶振,輸出頻率為1KHZ,這樣定時中斷次數設定為 *
*10,即0.01MS中斷一次,則TH0=FF,TL0=F6;由於設定中斷時間為0.01ms,這樣可以設 *
*定佔空比可從1-99%變化。即0.01ms*100=1ms *
******************************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
uchar timer0_tick,ZKB=1;//timer0_tick計數,ZKB佔空比
uchar i=0,n=0,temp=0;
code seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1,2,3, 4, 5, 6, 7, 8, 9
code scan[2]={0xfd,0xfe};
uchar counter[2]={0,0};
sbit AN1=P3^2;//調整個位
sbit AN2=P3^3;//調整十位
sbit AN3=P3^4;//啟動按鍵
sbit AN4=P3^5;//確認按鍵
void delay(uint z)//軟體延時函式
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
static void timer0_isr(void) interrupt 1 using 0 //中斷函式
{
TR0=0;
TL0=0xf6;
TH0=0xff;
TR0=1;
if (ZKB>99) ZKB=1;
if (ZKB
counter[0]=ZKB%10;
counter[1]=ZKB/10;
n++;
if(n==100)
{
n=0;
i++;
if(i==2) i=0;
P0=seven_seg[counter[i]];
P2=scan[i];
}
timer0_tick++;
if(timer0_tick++==100)
{
timer0_tick=0;
}
if(AN2==0)
{
delay(100);
if(AN2==0)
{
temp=1;
counter[0]++;
if(counter[0]==10)
{
counter[0]=0;
}
}
}
if(AN1==0)
{
delay(100);
if(AN1==0)
{
temp=1;
counter[1]++;
if(counter[1]==10)
{
counter[1]=0;
}
}
}
ZKB=counter[0]+counter[1]*10;
if(AN4==0)
{
delay(5);
if(AN4==0)
temp=0;
}
if(temp==1)
P3_7=0;// P3_7為脈衝輸出引腳
else
{
if (timer0_tick
{
P3_7=1;
}
else
{
P3_7=0;
}
}
}
static void timer0_initialize(void)//中斷初始化
{
EA=0;
timer0_tick=0;
TR0=0;
TMOD=0x01;
TL0=0xf6;
TH0=0xff;
PT0=0;
ET0=1;
TR0=1;
EA=1;
}
void main(void)
{
STAR: delay(100);
if(AN3!=0) goto STAR;//按鍵3啟動脈衝
timer0_initialize();
while(1);
}
//按按鍵3啟動脈衝器,初始設定佔空比為1%,按鍵1調整十位,
//按鍵2調整個位,一旦調整,輸出為0,必須按確認鍵確認,
//輸出正確脈衝.可以佔空比1-99%任意調節。