PWM就是用数字方式产生模拟信号的方法其产生模拟信号幅度由数字信号的宽度决定。#include<STC12C5A60S2.H>
sbit ENLED=P1^1;
sbit p20=P0^0;
unsigned char HighRH=0;
unsigned char HighRL=0;
unsigned char LowRH=0;
unsigned char LowRL=0;
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void main()
{
unsigned int i;
EA=1;
ENLED=0;
P2=0xFE;
while(1)
{
ConfigPWM(100, 10); //ƵÂÊ1000hz£¬Õ¼¿Õ±È10
for(i=0;i<40000;i++);
ClosePWM();
ConfigPWM(100,40);
for(i=0;i<40000;i++);
ClosePWM();
ConfigPWM(100,90);
for(i=0;i<40000;i++);
ClosePWM();
for(i=0;i<40000;i++);
}
}
void ConfigPWM(unsigned int fr, unsigned char dc)
{
unsigned int high, low;
unsigned long tmp;
tmp=(33784300/12)/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;
TMOD=0x01;
TH0=HighRH;
TL0=HighRL;
ET0=1;
TR0=1;
p20=1;
}
void ClosePWM()
{
TR0=0;
ET0=0;
p20=1;
}
void InterruptTimer0() interrupt 1
{
if (p20==1)
{
TH0=LowRH;
TL0=LowRL;
p20=0;
}
else
{
TH0=HighRH;
TL0=HighRL;
p20=1;
}
|