pwm占空比來控制LED燈的明亮程度。
#include <reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit down = P3^0; sbit up = P3^1; uint8 t = 0; uint8 PWM_T = 0; //占空比控制變 void delay_1ms(uint16 t) { uint16 x,y; for(x=t;x>0;x--) for(y=120;y>0;y--); } void main(void) { TMOD = 0x02; //定時器0,工作模式2,8位定時模式 TH0=210; //寫入預置初值(取值1-255,數越大PWM頻率越高) TL0=210; //寫入預置值 (取值1-255,數越大PWM頻率越高) TR0=1; //啟動定時器 ET0=1; //允許定時器0中斷 EA=1; //允許總中斷 P1=0xff; //初始化P1,輸出端口 PWM_T=30; while(1) { if(!up) { if(PWM_T<250) { PWM_T++; } delay_1ms(10); } if(!down) { if(PWM_T>0) { PWM_T--; } delay_1ms(10); } } } timer0() interrupt 1 { t++; //每次定時器溢出加1 if(t==250) //PWM周期 100個單位 { t=0; //使t=0,開始新的PWM周期 P1=0x00; //輸出端口 } if(PWM_T==t) //按照當前占空比切換輸出為高電平 { P1=0xff; // } }
通過控制高電平在一個周期內的占比來控制。
可以通過定時器中斷來模擬PWMM。
用單片機制作的占空比均勻間隔可調PWM發生器:
占空比可調間隔為0.1。即可取得占空比為0%,10%,20%……90%到100%的PWM波。
該波的頻率固定為1KH(周期1000微秒)。
我所使用的QX-MCS51學習板上的操作鍵:
S2----占空比加 S3----占空比減
#include<reg52.h>
#define uint unsigned int
uint pp;
char num=2,dis;
sbit pwm=P1^0;
sbit s2=P3^0;
sbit s3=P3^1;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void keyscan()
{
if(s2==0)
{
while(!s2);
num++;
if(num==11)
num=10;
dis=num;
}
if(s3==0)
{
while(!s3);
num--;
if(num==-1)
num=0;
dis=num;
}
}
void display(a)
{
dula=0;
P0=table[a];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
}
void main()
{
TMOD=0x01; //模式設置,00000001,可見采用的是定時器0,工作與模式1(M1=0,M0=1)。
TR0=1; //打開定時器
TH0=0Xff; //定時器設置,每隔100微秒發起一次中斷。
TL0=0Xa4;
ET0=1; //開定時器0中斷
EA=1; //開總中斷
while(1)
{
keyscan();
if((num!=0)&&(num!=10)) //對於占空比為0和100%這兩種極端情況,最好分離出,單獨考慮
{
if(pp<=num)
pwm=1;
else
pwm=0;
}
else if(num==0) //當占空比為0
pwm=0;
else
pwm=1;
if(pp==10) //當占空比為100%
pp=0;
display(num);//顯示num當前值,占空比為num/10。
}
}
void time0() interrupt 1
{ TH0=0Xff;
TL0=0Xa4;
pp++;
}
