单片机学习笔记(二)51单片机采用PWM(脉宽调制)方式调节LED亮度的原理及程序详解

采用PWM方式调节LED亮度的原理

调节LED亮度的两种方式:

1.改变LED流过的电流大小来调节亮度,流过的电流越大,LED亮度越亮

2.改变LED通电时间长短来调节亮度,通电时间长,亮度高

(1)现象

单片机P1.7引脚外接的LED先慢慢变亮,然后慢慢变暗

(2)程序说明

程序中的第一个for语句会执行499次,每执行一次,P1.7引脚输出的PWM脉冲会变窄一些。即LED7=0持续时间会变长,LED7=1的持续时间变短,LED会越来越亮,在for语句执行499次时,LED7=0持续时间最长,LED7=1持续时间最短。

//用PWM方式调节LED亮度的程序
#include<reg51.h>
sbit LED7=P1^7;
void Delay(unsigned int t);
void main (void)
{
unsigned int T=500,Toff=0;
    while (1){
        for (Toff=1;Toff<T;Toff++)

    {    LEd7=0;
    Delay(Toff);
LEd7=1;
Delay(T-Toff);
}
    for(Toff=T-1;Toff>0;Toff--){
     LEd7=0;
    Delay(Toff);
LEd7=1;
Delay(T-Toff);
    }
        }
}
void Delay(unsigned int t)
{
while (--t);
}

  • 10
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
单片机输出PWM脉宽调制)信号可以通过改变信号的占空比来控制LED亮度。占空比是指PWM信号中高电平的时间与一个周期的比例,比例越大,LED亮度越高。 具体实现步骤如下: 1. 首先需要选择一个支持PWM的IO口,比如STC89C52开发板上的P1.0口。 2. 在程序中设置IO口为输出模式。 3. 在主函数中初始化定时器,设定定时器的时钟源、计数器的初值和重载值,并打开定时器。 4. 在定时器中断服务函数中,改变PWM信号的占空比,从而改变LED亮度。 下面是一个简单的示例代码: ```c #include <reg52.h> sbit LED = P1^0; // 选择P1.0口作为PWM输出口 void timer0_init() // 初始化定时器0 { TMOD |= 0x01; // 设置定时器0为模式1(16位定时器) TH0 = 0xFC; // 设定计数器初值为0xFC67 TL0 = 0x67; ET0 = 1; // 打开定时器0中断 TR0 = 1; // 启动定时器0 } void main() { LED = 0; // 初始化LED灯状态 timer0_init(); // 初始化定时器0 while (1) { // 程序主循环 } } void timer0_isr() interrupt 1 // 定时器0中断服务函数 { static unsigned int count = 0; static unsigned char duty_cycle = 0; count++; if (count >= 1000) // 每1秒更新一次PWM占空比 { count = 0; duty_cycle++; if (duty_cycle > 100) duty_cycle = 0; // 占空比范围为0~100 } if (duty_cycle > count / 10) LED = 1; // 设定PWM高电平时间 else LED = 0; } ``` 在上面的示例代码中,定时器0被设置为16位定时器,时钟源为系统时钟,计数器初值为0xFC67,重载值为65535,计数器每计数一次,定时器0中断服务函数就会被调用一次。在定时器0中断服务函数中,通过静态变量count和duty_cycle来控制PWM信号的占空比,从而改变LED亮度。在每1秒钟内,duty_cycle的值会逐渐增加,当count除以10的商小于duty_cycle时,PWM信号为高电平,LED亮度较高;否则为低电平,LED亮度较低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值