51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。一、原理图 图一二、固定脉宽PWM输出 用T0定时器完成PWM
首先,可以利用MCS-51单片机的IO口来接收光敏电阻的信号,实时监测环境光强度。当环境光强度低于一定阈值时,单片机可以自动控制路灯的开启,保证夜间道路的照明。而当环境光强度高于一定阈值时,单片机可以自动控制路灯的关闭,
第三,每进入中断一次count++,满足条件count==PWM_ON或count==CYCLE时改变LED的当前状态。作用是给小灯亮或灭的时间不同。第四,LED的亮度与其通电时间有关,也可以说成是占空比。上面的条件要理解成是呈线性增加或减小的
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<<(
51单片机控制led灯右循环亮 可以用移位命令来实现,比如说LED接口为P0 那么共阴极就是 P0=(P0>>1)||0X80; 移位函数来实现是最简单的就是 intrinis 51单片机用单键来控制led灯的渐亮 可通过按钮的动作改变输出LE
可以设两个按键,一个调亮一个调暗 用定时器就可以产生不同占空比的PWM信号,占空比越高LED越亮,占空比越低就越暗 检测两个按键动作,然后调整PWM信号的占空比就行了 只能说说原理,具体细节无法一一说清了
//12M晶体,PWM频率20HZ,分辨率32级,P1.0=0:LED亮,P1.0=1:LED灭,P1.1:按键(按下为0)include "reg51.h"char LiangDu,JiShuQi;//亮度 ,亮度计数器 char KeyOld,KeyNew,KeyJS;// 按键值,按
你好,我看到你说你可以用MCS-51单片机通过按键产生PWM信号来控制LED灯的不同亮度,可以发给我吗?
pwm周期自己看实际情况定义。如果要控制电灯泡的话,频率不用太高,50hz可以了。关键是要做隔离,用光电隔离加双向可控硅来控制。呵呵,声明两点:1 源程序网上应该有的,或者自己买本书就什么也有了。2 不鼓励直接给别人源
else led=1;//关灯 f(t>80)t=0;//t置零,要改呼吸频率就改掉“80”这个数还有下面的一个“80”也一起改 } } void Timer0Interrupt(void) interrupt 1 //T0中断,用来控制PWM电平,每50微秒,t自加一次 {
; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。;当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警 ;资源:p0口,8路指示灯。p1.4,p1.5亮度控制按键(端口按键)p3.7小喇叭报警 ;***/ include
第三,每进入中断一次count++,满足条件count==PWM_ON或count==CYCLE时改变LED的当前状态。作用是给小灯亮或灭的时间不同。第四,LED的亮度与其通电时间有关,也可以说成是占空比。上面的条件要理解成是呈线性增加或减小的
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<<(
51单片机控制led灯右循环亮 可以用移位命令来实现,比如说LED接口为P0 那么共阴极就是 P0=(P0>>1)||0X80; 移位函数来实现是最简单的就是 intrinis 51单片机用单键来控制led灯的渐亮 可通过按钮的动作改变输出LE
//12M晶体,PWM频率20HZ,分辨率32级,P1.0=0:LED亮,P1.0=1:LED灭,P1.1:按键(按下为0)include "reg51.h"char LiangDu,JiShuQi;//亮度 ,亮度计数器 char KeyOld,KeyNew,KeyJS;// 按键值,按键
如何使MCS-51单片机通过按键产生PWM信号来控制LED灯的不同亮度?
控制亮度,51需要设置io口为推挽输出,在设置相应的引脚输出高低电平,即可控制灯的亮灭
3.编写程序:使用单片机的编程软件(如Arduino IDE、Keil等),编写控制LED灯的程序。以下是一个简单的示例程序(以Arduino为例):// 定义LED灯连接的引脚 const int ledPin = 13;void setup() { // 将LED引脚设置为
首先要计算一下LED驱动总电流,比如10个LED每个5mA总电流就需要50mA,然后要选择一个限流电阻,假定电源电压为5V,那么R=5-2(黄色LED正向压降)/50=60欧姆,可选标称值62欧姆0.5W电阻,若低电平有效驱动可选8550三极管,L
LED_D1 =1;//=1亮灯 ,=0灭灯当也要看电路,完善的电路还会有驱动电路如三极管点了,也要看LED固定的那端是接地还是接VCC。最终无非就是通过单片机的IO口输出一个0或1来是LED二极管电路正向导通形成发光。
51单片机怎样控制LED的光亮度
1、可以拆开把电路板用无水酒精清洗一下,仔细点,所有的地方,尤其是集成块的管脚。2、注意功率管的导热硅脂保护好,弄没了,或脏了,散热不好以后问题更多,然后烘干,太阳下晒也行,然后再装上。3、一般是受潮进水的
电磁炉通电滴一声按开机键没反应,首先看一下控制版指示灯是否亮,如果灯亮,不开机最大可能就是开机按键损坏,其次是主板与控制版之间的排线接触不好或断了。电磁炉的基本结构:电磁加热控制板、线盘线盘中间会有一个传感
1.灯管损坏,闪一下之后灯丝烧断造成灯管不亮。(方法:把不亮的与亮的相互换一下,看看灯亮不亮,判断是否烧断。)2.控制线断一根(方法:按开关看是否是同一组开关的灯不亮,如果是就是开关这条线有断点。查询并接好试一
控制亮度,51需要设置io口为推挽输出,在设置相应的引脚输出高低电平,即可控制灯的亮灭
不知道你是要控制LED的亮度,还是要控制LED灯亮的数量,如是控制亮度,可以用PWM,可以无级调光,也可以设置调节级数。可以键控,也可以可调电阻调节。如是控制LED亮的数量,可用一只按键控制多只LED亮或灭,也可用一只对应
关于单片机控制led灯亮如何设置啊,就是好像电磁炉控制温度那样,按一下钮多亮一个灯,再按下再多亮一?
led=0;else led=1;//关灯 f(t>80)t=0;//t置零,要改呼吸频率就改掉“80”这个数还有下面的一个“80”也一起改 } } void Timer0Interrupt(void) interrupt 1 //T0中断,用来控制PWM电平,每50微秒,t自加
; 按K1,PWM值增加,则占空比减小,LED 灯渐暗。; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。;当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警 ;资源:p0口,8路指示灯。p1.4,p1.5亮度控制按键(端口按键)
可以设两个按键,一个调亮一个调暗 用定时器就可以产生不同占空比的PWM信号,占空比越高LED越亮,占空比越低就越暗 检测两个按键动作,然后调整PWM信号的占空比就行了 只能说说原理,具体细节无法一一说清了
pwm,用定时器T1溢出做pwm周期,在每次T1开始计数时触发输出,软件边增1计数边检查溢出标志。如果软件计数满则清输出,否则直到溢出清输出、清软件计数满值。改变软件计数满值就能改变亮度。51单片机输出pwm波控制led灯亮度 频率
u8 PWM_keyChange=10; //初值,按键调整在1~20之间变化 //占空比 PWM_keyChange/grading void T0_work() //本函数由T0定时器中断函数调用 { if(timeMultiple1Flag){ led=off(7); //关闭7号灯 timeMu
51单片机如何用一个按键和一个定时器来模拟PWM控制一个LED灯的亮度??
电平状态输出相应的信号来控制LED的亮灭。将按键与某个IO口相连。当按下按钮时,IO口会被拉低(变为低电平),未按下按钮时为高电平。在程序中通过循环检测IO口的状态,检测到低电平表示按钮被按下,可以执行相应操作。
1、首先打开编程软件Keil uVision4,新建一个工程文件,在菜单栏中Project—— New uVision Project..。2、然后选择单片机型号是 Atmel 公司的 AT89c52,单击OK。3、再单击工具栏上新建按钮,新建一个文档,然后再点击保存,
int0中断 程序我先试试 include
if(!KEY1) //检测到按键按下 { LED = ~LED; /*LED取反,此时LED = 0,灯亮。当松手时,KEY1 = 1,不满足if语句不 进入循环,LED继续保持当前状态即LED = 0,如果再次按下按键,此时检测到KEY1 = 0,进入
51单片机的按键控制小灯亮灭的问题(程序类型:c语言)怎么解决?
如果用STC90系列以后的单片机,由于内置了PWM模块,直接按手册中的例程就可以,如果是AT89系列的,就要用定时器模拟了,这个比较复杂,你百度一下,网上有的#include #define uchar unsigned char #define uint unsigned int sbit lamp=P2^0;//输出 sbit k1=P3^3;//加键 sbit k2=P3^2;//减键 sbit k3=P3^4;//停止 uchar a=10; void delay(uint x)//延时函数 { uchar i; while(x--) for(i=0;i<110;i++); } void init() { TMOD=0X01;//晶振11.0592,定时器定时方式1 TH0=0XFF;//100us定时 TL0=0XA4; EA=1;//开总中断 ET0=1;//开定时器中断 TR0=1;//开定时器 } void key() { if(!k1) { delay(10); if(!k1) { a++; if(a==99) a=1; } } // while(!k1); if(!k2) { delay(10); if(!k2) { a--; if(a==1) a=99; } } // while(!k2); if(!k3) { delay(10); if(!k3) { TR0=~TR0;//开定时器 } } while(!k3); } void main() { init(); while(1) { key(); } } void timer0() interrupt 1 using 3 { uchar count; /*中断次数计数器变量*/ TH0=0xFF; /*恢复定时器初始值*/ TL0=0xA4; count++; if (count>=100) count=0; if (count<=a) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/ lamp=0; else lamp=1; }
用几个变量表示按键的按下/松开状态,然后用定时器中断设置PWM的频率,例如要50hz的频率,那么定时器中断周期(PWM周期的一半)可以设置为10ms,在中断服务程序内根据按键的状态确定是否需要对PWM输出管脚进行翻转。改方法可以输出占空比为50%的PWM信号。 LED是英文 light emitting diode (发光二极管)的缩写,它的基本结构是一块电致发光的半导体材料芯片,用银胶或白胶固化到支架上,然后用银线或金线连接芯片和电路板,然后四周用环氧树脂密封,起到保护内部芯线的作用,最后安装外壳,所以 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 //#include #include #include #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(); //调用工作函数 }