2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 自动感光调节LED灯亮度C语言程序 单片机PWM调节LED灯亮度

自动感光调节LED灯亮度C语言程序 单片机PWM调节LED灯亮度

时间:2020-07-15 06:28:42

相关推荐

自动感光调节LED灯亮度C语言程序 单片机PWM调节LED灯亮度

刚搞完飞思卡尔智能车,昨天我一起做车的搭档跑来跟我说魏老师(我们系的前主任,不知道他们怎么认识的....)叫他帮忙做个可通过无线遥控调节LED灯亮度的设计方案,问我有没有兴趣做做,主要是魏老师也是受他以前的老同学(合工大的....)所托,他自己估计没怎么搞过这个,开始自己不敢接,很担心自己不会做,自己几斤几两自己还不清楚,呵呵,后来实在央求不过,算了,做就做吧,还以为是什么大项目...了解了才知道,我能需要做的很简单,只要通过无线按键控制增减调节灯得亮度,甚至只要通过按键实现一定范围变化的模拟变化量输出就OK了,回来上网搜索了一些资料,昨晚花了一晚上的时间写了一个很简单的通过单片机PWM调节LED灯亮度的代码,估计我想通过调节灯得亮度一般都是通过PWM来调节的,(网上一般都是这样的设计)

上午又写了个,主要是感觉昨晚的那个不怎么好,而且控制的不够精准,两个程序都贴出来吧,主要大家一起学习!这两个程序都是经过我亲自调试过!下载到自己使用只需要修改相关的控制引脚就OK了.......

昨晚的程序如下:

// PWM 控制 LED 灯渐亮渐灭程序

// 晶振为12M

// 利用定时器控制产生占空比可变的 PWM 波

// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。

// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

#include < reg51.h >

sbit K1 =P3^0

;//增加键

sbit K2 =P3^1 ;

sbit P10=P1^0

;//减少键

sbit BEEP =P3^7

;//蜂鸣器

unsigned char PWM=0x7f;//赋初值

void Beep();

void delayms(unsigned char ms);

void delay(unsigned char t);

void main()

{

/初始化/

K1=1;

K2=1;

TMOD=0x21;

TH0=0xfc;//1ms延时常数

TL0=0x18;//频率调节

TH1=PWM;//脉宽调节

TL1=0;

EA=1;

ET0=1;

ET1=1;TR0=1;

/主循环//while(1)

{

if(K1==0)//递增按键考虑消抖..

{

delayms(20);

if(K1==0)

{if(PWM==255)

{PWM=255;

Beep();}

else

PWM++;

}

}

if(K2==0)//递减按键

{

delayms(20);

if(K2==0)

{if(PWM==0)

{PWM=0;

Beep();}

else PWM--

;

}

}

}

}

// 定时器0中断服务程序.

void timer0() interrupt 1

{

TH0=0xfc

;

TL0=0x18

;

TH1=PWM

;//定时器自动重装值由PWM提供

TR1=1

;

P10=0

;//启动输出

}

// 定时器1中断服务程序

void timer1() interrupt 3

{

TR1=0;

P10=1

;//结束输出

}

//蜂鸣器子程序

void

Beep(){

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delay(200) ;

BEEP=!BEEP

;//Beep取反

}

BEEP=1

;//关闭蜂鸣器

delayms(200);

}

// 延时子程序

void delay(unsigned char t)

{

while(t--);

}

// 延时子程序

void delayms(unsigned char ms)

{

unsigned

char i ;

while(ms--)

{

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

}

}

上午的程序,也是从网上下修改修改的,通过示波器可以很明显的观察到PWM占空比的变化

#include

//模拟PWM输出控制灯的10个亮度级

unsigned int scale;

sbit K1 =P3^0

;//增加键

sbit K2 =P3^1 ;

sbit P11=P1^2 ;

sbit P10=P1^0

;//减少键

sbit BEEP =P3^7

;//蜂鸣器

unsigned char PWM=20;//赋初值//占空比控制变量

void Beep();

void delayms(unsigned char ms);

void delay(unsigned char t);

void main(void)// 主程序

{

TMOD=0x02;//定时器0,工作模式2(0000,0010),8位定时模式

TH0=0x06;//写入预置初值6到定时器0,使250微秒溢出一次(12MHz)

TL0=0x06;//写入预置值

TR0=1;//启动定时器

ET0=1;//允许定时器0中断

EA=1;//允许总中断

while

(1)//无限循环,实际应用中,这里是做主要工作

{

if(K1==0)//递增按键

{

delayms(100);

if(K1==0)

{if(scale==40)

{//PWM=255;

Beep();}

else scale++;

;

}

}

if(K2==0)//递减按键

{

delayms(100);

if(K2==0)

{if(scale==0)

{//PWM=0;

Beep();}

else scale--

;

}

}

}

}

void timer0(void) interrupt 1 //定时器0中断服务程序

{

static

unsigned int n ; //n用来保存当前时间在一秒中的比例位置

n++;//每250微秒增加1

if(n==40)//1秒的时钟周期

{

n=0;//使n=0,开始新的PWM周期

P10=0; //使LED灯亮

}

if(scale==n)//按照当前占空比切换输出为高电平

P10=1; //使LED灯灭

}

//程序中从tt=0开始到scale为低电平,从scale开始到n=10为高电平,

//由于scale是变量,所以改变scale就可以改变占空比。

/下面的程序同上面一样///

//蜂鸣器子程序

void

Beep(){

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delay(200) ;

BEEP=!BEEP

;//Beep取反

}

BEEP=1

;//关闭蜂鸣器

delayms(200);

}

// 延时子程序

void delay(unsigned char t)

{

while(t--);

}

// 延时子程序

void delayms(unsigned char ms)

{

unsigned

char i ;

while(ms--)

{

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

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。