导航:首页 > 操作系统 > 51单片机怎么控制灯亮度

51单片机怎么控制灯亮度

发布时间:2022-09-11 15:32:49

① 51单片机输出pwm波控制led灯亮度

频率50HZ,周期是20ms
看你调节的精度 如定时器定时1ms,高电平宽度一次变化是5%
如果想要调节精度高,定时器定时时间小,就要频繁地发生中断,会影响主程序的运行
如 要求占空比每步调节为1%,则定时器就要定时200us,对于CpU的影响就比较大了
这时自动重装模式可以缩短中断程序占用时间,但如果再提高PWM的频率,自动重装模式也十分吃力,因此许多增强型51单片机有硬件PWM功能

② 51单片机怎样控制LED的光亮度

pwm,用定时器T1溢出做pwm周期,在每次T1开始计数时触发输出,软件边增1计数边检查溢出标志。如果软件计数满则清输出,否则直到溢出清输出、清软件计数满值。改变软件计数满值就能改变亮度。

③ 如何利用AT89S51单片机控制一个LED灯的亮度

首先把频率定下来,最好定到大于100Hz,否则会有闪烁感。反正如果是感到有闪烁感,你就再把频率定高一点就没事了。然后就是调I/O口的占空比了。比如把亮的时间定为80% 灭的时间定为20% 这种效果是比较亮的。 而反过来把亮的时间定为20% 灭的时间定为80% 这种效果就比较暗了。

单片机高手团为你解答。

④ 51单片机,能不能用一个口同时控制40个LED灯的亮度变化

如果直接用51的IO来驱动这么多LED显然是不可能的,因为IO最大工作电流才10mA,输出电流就更小了,而普通LED工作电流可能都要5mA左右了。
可以利用IO口控制
(大导通电流的)MOS管或三极管的导通和关断,也即是其开关特性来驱动这么多LED,调整IO输出脉冲宽度(PWM)来控制LED的亮度大小,或者用专门的驱动芯片。

⑤ 51单片机如何用一个按键和一个定时器来模拟PWM控制一个LED灯的亮度

使用定时器T0产生PWM方波,
用按键调整占空比,20级可调
控制led灯的亮度等级.
#include "my51.h"
#include "timer0.h"

#define grading 20 //亮度20级变化
sbit keyS3=P3^5; //按键调整占空比,PWM_keyChange++
sbit keyS4=P3^6; // PWM_keyChange--

u8 PWM_keyChange=10; //初值,按键调整在1~20之间变化
//占空比 PWM_keyChange/grading

void T0_work() //本函数由T0定时器中断函数调用
{
if(timeMultiple1Flag)
{
led=off(7); //关闭7号灯
timeMultiple1Flag=0; //清定时器复用置位标志
}

if(timeMultiple2Flag)
{
led=on(7); //打开7号灯
timeMultiple2Flag=0; //清定时器复用置位标志
}
}

void main() //测试
{
u8 keyFlag=1; //程序中没有消抖处理,只是简易的按键进出自锁标志
led0=ledon; //先打开0号灯,用于和7号灯对比亮度
initT0(1,10,grading); //1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒
while(1)
{
if(0==keyS3)
{
if(keyFlag) //防止一次按键中多次执行
{
keyFlag=0; //清标志,类似同步锁
if(++PWM_keyChange>grading)
{
PWM_keyChange=grading; //占空比最大100%
}
initT0(1,PWM_keyChange,grading);
}
}
else if(0==keyS4)
{
if(keyFlag)
{
keyFlag=0;
if(0==--PWM_keyChange) //占空比减小
{
PWM_keyChange=1; //最小占空比 1/20
}
initT0(1,PWM_keyChange,grading); //占空比减小
}
}
else
{
keyFlag=1; //按键锁释放标志,下一次按键时允许调整占空比
}
}
}

C代码
#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include <stdio.h>
#include "mytype.h"

#ifndef _51LED_
#define _51LED_
#define led P1 //P1总线连8个led灯,灯连573锁存器,P1置低电平点亮
#define LED led
#define ON(x) P1&(~(1<<(x))) //打开某个灯,开多个灯用 ON(m) & ON(n)
#define OFF(x) P1|(1<<(x)) //关闭某个灯,关多个灯用 OFF(m)| OFF(n)
#define on(x) ON(x) //包含大小写
#define off(x) OFF(x)

#define ledon 0 //某个灯,打开
#define ledoff 1 //某个灯,关闭

sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //锁定当前8个led的状态,0锁定 ,1不锁定

#endif

/*************二进制输入宏****************************/
#ifndef _LongToBin_
#define LongToBin(n) \
( \
((n >> 21) & 0x80) | \
((n >> 18) & 0x40) | \
((n >> 15) & 0x20) | \
((n >> 12) & 0x10) | \
((n >> 9) & 0x08) | \
((n >> 6) & 0x04) | \
((n >> 3) & 0x02) | \
((n ) & 0x01) \
)
#define bin(n) LongToBin(0x##n##l)
#define BIN(n) bin(n)
#define B(n) bin(n)
#define b(n) bin(n)
#endif

/*************单个数据位的置位宏*********************/
#ifndef _BIT_
#define BIT(n) (1<<n)
#define bit(n) BIT(n)
#endif

#define high 1 //高电平
#define low 0 //低电平

sbit beep=P2^3; //蜂鸣器

extern void delayms(u16 ms);
extern void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////

#endif

C代码
#ifndef _TIMER0_H
#define _TIMER0_H
#include "my51.h"

extern u8 timeMultiple1Flag; //中断时间复用置位标志,须手动清零
extern u8 timeMultiple2Flag; //中断时间复用置位标志,须手动清零
extern void T0_work(); //该函数未实现,需外部实现
extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定时器初始化

#endif

C代码
#include "timer0.h"

u8 TH0Cout=0 ; //初值
u8 TL0Cout=0 ;
u16 T0IntCouts1=0; //中断计数
u16 T0IntCouts2=0; //中断计数
u16 timeMultiple1=0; //中断复用时间的倍数
u16 timeMultiple2=0; //中断复用时间的倍数
u8 timeMultiple1Flag=0; //中断时间复用置位标志,须手动清零
u8 timeMultiple2Flag=0; //中断时间复用置位标志,须手动清零

//开启定时器,定时完成后需要手动关闭TR0,否则将循环定时
//参数一是定时的毫秒数,参数二和三是定时基时的倍率数(定时复用)
void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) //定时器初始化设定,ms取值不超过65
{
u16 N=11059.2*ms/12; //定时器总计数值
TR0=STOP; //停掉定时器
ET0=CLOSE; //关定时器中断

//对于110592晶振,ms为5的整数倍时没有计算误差,但ms最大不超过71毫秒
TH0Cout =(65536-N)/256; //装入计时值零头计数初值
TL0Cout =(65536-N)%256;
if(0==t_multiple1) //0倍的基准时间是不合理的,至少1倍
{
t_multiple1=1;
}
if(0==t_multiple2) //0倍的基准时间是不合理的,至少1倍
{
t_multiple2=1;
}
timeMultiple1=t_multiple1; //倍时
timeMultiple2=t_multiple2; //倍时
TMOD &= 0xf0; //清定时器0配置
TMOD |= 0x01; //配置定时器0的工作方式为1

EA =OPEN; //打开总中断
ET0=OPEN; //打开定时器中断

TH0=TH0Cout; //定时器装入初值
TL0=TL0Cout;
TR0=START; //启动定时器
}
void T0_times() interrupt 1 //T0定时器中断函数
{
TH0=TH0Cout; //重装初值
TL0=TL0Cout;
if(++T0IntCouts1==timeMultiple1) //判断是否复用定时器
{
T0IntCouts1=0; //中断次数清零,重新计时
timeMultiple1Flag=1; //复用定时器标志,须在T0_work()中手动清零
}
if(++T0IntCouts2==timeMultiple2) //判断是否复用定时器
{
T0IntCouts1=0; //这个也要清,防止到达最小公倍数时乱掉
T0IntCouts2=0; //中断次数清零,重新计时
timeMultiple2Flag=1; //复用定时器标志,须在T0_work()中手动清零
}
T0_work(); //调用工作函数
}

⑥ 请教51单片机利用PWM控制灯的亮度的程序

第一,要理解中断在这里的作用是固定的“一小段”时间进入一次。

第二,PWM_ON在程序中的作用很大,它会由0------>CYCLE------>0并且一直循环下去。可以把它看成一个有规律的变化的量。

第三,每进入中断一次count++,满足条件count==PWM_ON或count==CYCLE时改变LED的当前状态。作用是给小灯亮或灭的时间不同。

第四,LED的亮度与其通电时间有关,也可以说成是占空比。上面的条件要理解成是呈线性增加或减小的频率。可以理解成三角波,对应的面积就是通电时间。

不知能不能给你讲明白!

⑦ 51单片机按钮控制一个灯泡逐渐亮灭

可以使D/A数模转换的方法将单片机的数据转换成电压模拟量来控制灯泡的电压,来达到灯泡亮度的变化。这样可以做到精确控制灯的亮度,还可以实现灯光的无级变化。

⑧ 51单片机控制led灯点亮与熄灭

// 51单片机控制八个发光二极管 左右循环。

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

unsigned char TAB[]= {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff}; // 改变这里 LED 各种花样

uchar t,i;

void main()

{

TMOD=0x10;

TH1=(65535-50000)/256; // 50ms一次

TL1=(65535-50000)%256;

EA=1;

ET1=1;//开定时器1中断

TR1=1;//启动定时器1

t=0;

i=0;

while(1)

{

}

}

void timer1() interrupt 3

{

TH1=(65535-50000)/256; // 50ms一次

TL1=(65535-50000)%256;

t++;

if(t==20)

{

t=0;

P2=TAB[i];

i++;

if(i==18) { i=0;}

}

}

⑨ 如何使MCS-51单片机通过按键产生PWM信号来控制LED灯的不同亮度

可以设两个按键,一个调亮一个调暗
用定时器就可以产生不同占空比的PWM信号,占空比越高LED越亮,占空比越低就越暗
检测两个按键动作,然后调整PWM信号的占空比就行了
只能说说原理,具体细节无法一一说清了

⑩ 用51单片机c语言让八个led亮度自左向右逐渐变亮(pwm)

#include<iom16.h>
#include<avr_macros.h>

voidInit_IO(void)
{
DDRA=0xFF;
PORTA=0x00;
}
/*以上代码51忽略*/
voidLED1(unsignedcharx,unsignedcharLEDx)
{
unsignedcharCount=0;
Count=LEDx*36;//最小0,最大7*36=252,char型最大不能超过255;
Count=Count+1;//加1的目的是针对LED0不亮

if(x<=Count) //<=是针对LED0不亮
PORTA|=(1<<LEDx);//51怎么改?。P0|=(1<<LEDx);PWM正占空
else
if(x>Count)
PORTA&=~(1<<LEDx);//51怎么改?。P0&=~(1<<LEDx);PWM负占空
}

voidmain(void)
{
unsignedchardelay=0;
unsignedcharLEDx=0;
Init_IO();
while(1)
{
delay++;
if(delay==250)
{
delay=0;
LEDx++;
if(LEDx>7)
LEDx=0;
}
LED1(delay,LEDx);
}
}

阅读全文

与51单片机怎么控制灯亮度相关的资料

热点内容
新电脑管家下载好怎么解压 浏览:528
php获取接口数据 浏览:763
最后的命令 浏览:921
如何添加手机app桌面快捷图标 浏览:427
ui设计师与程序员 浏览:417
寿司pdf 浏览:828
pythonbg是什么 浏览:248
c数值算法程序大全 浏览:785
android整点报时 浏览:221
稀土pdf 浏览:536
单片机电子锁 浏览:596
通达信机智资金流指标公式源码 浏览:216
php安装xsl扩展 浏览:842
python如何使用help 浏览:367
上汽荣威app在哪里查询 浏览:903
冰柜压缩机温度108 浏览:720
阿里云邮smtp服务器地址 浏览:252
解压馆认知理解 浏览:239
为什么使用非官方服务器会封号 浏览:9
佛山加密文档软件 浏览:813