单片机产生可调PWM程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**************************************************/
//晶振12M
//利用定时器控制产生频率10MHZ占空比的可变PWM波形
//按K1,PWM值增加,则占空比增加。
//按K2,PWM值减小,则占空比减小。
//按K3,复位,频率10KHZ的占空比为50%的波形
//P2^3输出PWM波形
/**************************************************/
#include
void delay(unsigned char t);
sbit K1=P1^0; //增加键
sbit K2=P1^1; //减少键
sbit K3=P1^2; //复位
sbit KEY=P2^3; //PWM输出
unsigned char PWM=0xce; //赋初值脉宽50%
/*************************************************/
void main()
{
TMOD=0x22; //T0、T1方式2
TH0=0x9c; //产生频率10KHZ 即周期100us
TL0=0x9c; //频率调节
TH1=PWM; //脉宽调节
TL1=PWM;
EA=1; //开定时器中断T0、T1
ET0=1;
ET1=1; //开定时器T0关定时器T1
TR0=1;
TR1=0;
while(1)
{
if(K1==1) //增加脉宽
{
if(PWM!=0xfa)
{
delay(10);
if(K1==1)
{
PWM++;
while(K1=1);
}
}
}
if(K2==1) //减少脉宽
{
if(PWM!=0x0A)
{
deiay(10);
if(K2==1)
{
PWM--;
while(K2==1);
}
}
}
if(K3==1) //脉宽复位
{
delay(10);
if(K3==1)
{
PWA=0xce;
while(K3==1);
}
}
}
}
/**************************************************/
//定时器0中断服务程序
/*************************************************/
void timer0()interrupt 1
{
TR0=0;
TH1=PWM; //赋脉宽值
TL1=PWM;
TR1=1;
TR0=1;
KEY=0; //输出高脉宽
}
/**************************************************/
//定时器1中断服务程序
/*************************************************/
void timer0()interrupt 3
{
TR0=0;
KEY=1; //输出高脉宽
}
/**************************************************/
//延时之程序
/*************************************************/
void delay(unsigned char t)
{
while(t--);
}