📄 pwm.c
字号:
/*
名词解释:1、PWM(Pulse Width Modulation,脉宽调制)
2、占空比(Duty Cycle)
即: 在一串理想的脉冲序列中(如方波),
正脉冲的持续时间与脉冲总周期的比值。
例如:脉冲宽度为1s,信号周期为4s的脉冲序
列的占空比为0.25。
程序说明:通过调整单位时间内I/O口输出高电平持续的时间,
即可达到对占空比的调节,也即PWM,本程序即是
PWM的一个应用。
应用说明:图示仅画标出了占空比的几个特殊值可以适当调
整各个变量的初值,从而控制LED对应输出几个不
同的亮度级别。通过把周期设置的更小--频率
提高就可以达到0%--100%之间任意的亮度级别。
并且由于人眼的视觉暂留,看到的不是亮、灭的
跳变,而是明暗的均匀过渡。
(C)西安电子科技大学 测控技术与仪器 编写:郭世忠 日期:2008-04-04
*/
///////////////////////////////////////////////////////////////////////////
// 脉冲宽度 //
// | | //
// 0% 25% 50% |75% | 100% --->占空比 //
// __ ____ _____ ________ ___1 (高电平) //
// | | | | | | | | | //
// |________| |_______| |___| |__| | ___0 (低电平) //
// //
// | 500 | 500 | 500 | 500 | 500 | //
/* 500是一次高低电平变化的周期,可根据需要自定 */ //
// //
// 注意: 我们的学习板中,P1口的LED是低电平有效。因此, //
// 占空比为0%时最亮,占空比为100%时熄灭,注意区别。 //
///////////////////////////////////////////////////////////////////////////
/**************************************************************************
功能:使P1口的八个LED发的光由暗到亮,再由亮到暗均匀过渡
/**************************************************************************/
#include<reg52.h> //51寄存器头文件
void Delayms(int ms);//函数声明
void main(void) //主程序
{
unsigned int i,t; //定义变量
while(1) //主循环(死循环),单片机必须是死循环
{
/**************************这个for循环为由暗到亮的过程**********************/
for(t=0;t<=500;t++)
{
P1=0x00; //P1口输出低电平 即P1.7-----P1.0依次对应 0000 0000
for(i=0;i<t;i++); //延时,保持低电平,LED为熄灭状态
P1=0xff; //P1口输出高电平 即P1.7-----P1.0依次对应 1111 1111
for(i=0;i<500-t;i++); //延时,保持高电平,LED为发光状态
}
P1=0x00; //将P1口置低,防止跳变
Delayms(500); //短暂延时,用于区分变化效果
/**************************这个for循环为由亮到暗的过程**********************/
for(t=0;t<=500;t++)
{
P1=0xff; //P1口输出高电平 即P1.7-----P1.0依次对应 1111 1111
for(i=0;i<t;i++); //延时,保持低电平,LED为熄灭状态
P1=0x00; //P1口输出低电平 即P1.7-----P1.0依次对应 0000 0000
for(i=0;i<500-t;i++); //延时,保持高电平,LED为发光状态
}
P1=0xff; //将P1口置高,防止跳变
Delayms(500); //短暂延时,用于区分变化效果
}
}
/****************************************************************************
* 名 称:Delayms()
* 功 能:延迟1ms
* 入口参数:ms: 延迟毫秒数
* 出口参数:无
* 说 明: 11.0592MHz条件下
****************************************************************************/
void Delayms(int ms)
{
unsigned int i;
for(;ms>0;ms--) //循环ms次
{
for(i=0;i<113;i++); //每次1ms延迟@ 11.0592MHz
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -