/***************************************************************
* 程序说明:使用P3.2和P3.4来控制P0端口的LED灯,达到手动调节渐亮或渐灭(也可一直按着),
到最亮或最暗时蜂鸣器发出提示声音;
晶振 11.0592M
* 利用定时器控制产生占空比可变的 PWM 波
* 按int0键,PWM值增加,则占空比减小,LED 灯渐暗。
* 按t0键,PWM值减小,则占空比增加,LED 灯渐亮。
什么是PWM技术?简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过计
数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然
是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。
电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即
是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟
值都可以使用PWM进行编码。
MCS-51系列单片机本身无PWM输出功能, 但可以采用定时器配合软件的方法对输出脉冲进行调
宽来模拟实现,对精度要求不是太高的场合是非常实用的。
****************************************************************/
#include
#include
sbit S1 =P3^2; //定义P3.2为增加键
sbit S2 =P3^4; //定义P3.3为减少键
sbit leds =P1^4; //定义P3.3为减少键
sbit BELL =P2^2; //定义蜂鸣器
unsigned char PWM=0x7f; //PWM赋初值
void Bee();
void delayms(unsigned char ms);
void delay(unsigned char t);
/*--------------------------------------------------*/
void main() //主程序
{
leds =0;
P0=0xff;
TMOD=0x21;
TH0=0xfc; //1ms延时常数
TL0=0x66; //频率调节
TH1=PWM ; //脉宽调节
TL1=0 ;
EA=1;
ET0=1;
ET1=1;
TR0=1 ;
while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Bee();
}
while(S1==0);
do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Bee() ;
}
while(S2==0);
}
}
// ---------------------------定时器0中断服务程序
void timer0() interrupt 1
{
TR1=0;
TH0=0xfc;
TL0=0x66;
TH1=PWM;
TR1=1;
P0=0x7f ; //启动输出
}
//---------------------------- 定时器1中断服务程序
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //结束输出
}
//-------------------------------蜂鸣器子程序
void Bee()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BELL=!BELL ;//BeLL取反
}
BELL=1 ; //关闭蜂鸣器
delayms(100);
}
//-------------------------------- 延时子程序1
void delay(unsigned char t)
{
while(t--);
}
//--------------------------------- 延时子程序2
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i=0;i<120;i++);
}
}