自动感光调节LED灯亮度C语言程序,PWM控制LED灯的亮度(C 语言)

原标题:PWM控制LED灯的亮度(C 语言)

控制 的亮度,通过调节电压的方式可以达到,但不理想,而且可调的范围很小,电压稍高,还容易把 烧毁,唯一可行的方法就是通过PWM(脉冲宽度调节)来控制其亮度.

以下程序是在中控制LED...

//***********************

// LED发光亮度

// 作者:周 勇

//***********************

#include

sbit speaker=P2^1; //定义喇叭控制引脚

sbit up=P1^5; //定义UP键

sbit down=P1^6; //定义DOWN键

static unsigned char pwm;

unsigned char t;

main ()

{

void delay (unsigned char ms);

void beep (void);

voil_delay (void);

TMOD=0X21;

ET0=1;

ET1=1;

EA=1;

TH0=0XFC; //定时器0,定时1ms

TL0=0X18;

TH1=0X9C; //定时器1,定时0.1ms

TL1=0X00;

TR0=1;

PT1=1; //定义定时器1优先中断

pwm=0x9c;

while (1)

{

do

{

pwm++;

delay (10);

if (pwm==0xff) beep();

}

while (pwm!=0xff);

do

{

pwm--;

delay (10);

if (pwm==0x01) beep ();

}

while (pwm!=0x01);

}

}

void timer0 (void) 1 //定义定时器0

{

TH0=0XFC;

TL0=0X18;

TR1=1;

TH1=pwm;

P0=0X00;

}

void timer1(void) interrupt 3 //定义定时器1

{

P0=0XFF;

TR1=0;

}

void delay (unsigned char ms) //延时

{

unsigned char i=120;

while (ms--)

{

while (i--)

{}

}

}

void beep (void) //报警

{

unsigned char b;

for (b=40;b>=2;b--)

{speaker=!speaker;

alarm_delay ();

}

speaker=1;

}

void alarm_delay (void) //报警延时

{

unsigned char time;

for (time=0;time<120;time++)

{}

}

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nrf51822并没有PWM模块,但是如果巧妙的结合PPI模块,并加上一个定时器中断就可以轻松的实现了PWM,思路是这样的: 定时器使用三个比较器 cc0、cc1和cc2,当三个比较器任何一产生比较事件的时候都会通过PPI去翻转GPIO的引脚,在初始化的时候这样设置这三个比较器: NRF_TIMER2->CC[0] = MAX_SAMPLE_LEVELS + next_sample_get(); NRF_TIMER2->CC[1] = MAX_SAMPLE_LEVELS; // CC2 will be set on the first CC1 interrupt. NRF_TIMER2->CC[2] = 0; 这是初始化的配置,到这里会有一个思考,这样的话计数器技术到cc0的时候依然会继续的往下计数,那这样的话他的再溢出的值就将回到cc2的时候也就是归零的时候,那这样的波形就分为了三段了,这不是我们所需要的,那这样要实现PWM就要把cc2的比较值往后挪,让他超过cc0,并且cc2到之前的一个比较值是固定的,这样就需要从新设置cc2的值,还有一个办法就是当计数器到cc0的时候请求中断重置计数器,但是这样做有一个问题就是进入中断是需要时间的,而当计数器到达cc0的时候就需要重置,同时计数器的下一个值就是cc2,这样就会造成冲突,所以我们使用了第一种方案。 具体实现是这样的,使能cc1比较中断,在第一次中断中重新设置cc1,让他的值变成了两倍,同时从新设置cc2,让他的值变成了cc1+N,N就是占空比参数,在第二次中断中,也是从新设置cc1,但是和上一次中断不同的是这时候设置的是cc0,而不是cc2 这样造成的计数器溢出值是这样的:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值