led=1;//点亮 delay(100);//延时100MS led=0;//熄灭 } else led=0;} void delay(unsigned int i){自己根据单片机频率写个1MS带形参的演示程序} 这个程序是现写的。。应该能执行,有些细节没有写,自己修改下,
同时开放了定时器中断,并将定时器中断优先级设置为1(即高优先级)。在无限循环中,不断检测K1和K2按键状态,以改变全局变量“freq”并控制LED灯的闪烁频率;然后使用一个计时器中断服务程序来控制LED灯的闪烁,具体实现方式
define uchar unsigned char sbit LED1=P1^7; //位定义。void delay_ms(uint);//mS级带参数延时函数。void main(){ while(1){ LED1=0;delay_ms(1000);LED1=1;delay_ms(1000);} } void delay_ms(uint z)
1、新建项目,如图所示。2、添加头文件,创建延迟函数。3、创建C主函数。4、添加死循环效果。5、点亮LED灯。P1=0x7e;二进制11111110。6、添加延迟效果。注意事项:很多公司都有51系列的兼容机型推出,今后很长的一段时间内
说明:单片机控制LED灯间隔时间闪烁 所用程序很简单,实际情况可作相应变化,也有多种方式实现。proteus电路图 所需元件清单:(分别是) 51单片机 电容 瓷片电容(也可用普通电容) 晶振 红色二极管 电阻 (tip:没有给高电
51单片机C程序实验LED灯:[1]单个灯闪烁
必须用逻辑器件的哥哥 你的输入是两种情况 输出需要3种情况,其实是4种 从信息论的角度就可以看出必须要逻辑器件,或者时钟触发
EA=1;TR0=1;Ied1=0;led2=1;while(1);}中断程序void time0 ()interrupt 1{TH0=……TL0=……a++;if(a==288000)//合计14400秒 { a=0;led1=!led1; led2=!led2;}}
//定义按键6sbit led1 = P2^0; //定义第一个LED灯sbit led2 = P2^1; //定义第二个LED灯//主函数,C语言的入口函数: void main(void){ while(1){ //循环扫描按键 if(key1==0) //按键1按下,LED1灯
你只要先定义 sbit P0^0=LED0;一定定义下去 然后再定义一个按钮 比如P1.1 sbit P1^1=key;代码里写 123456789while(true){if(key==1){LED0=0;LED1=0;..//把你要亮的灯置0就行了。阳极的话置1}}
AT89S52也是51系列的单片机,程序完全兼容,用51的程序就行了,包括外围电路也一样,直接用就行了。单灯亮就是在IO口输出一个二进制数中只有一位不同的数,比如说“00000001”,就只有最后一位是“1”,其余的都是“0”
编码方式 ,单片机的IO分成两路,一路直接接LED,另一路先通过一个 非门 再接LED,这样IO口输出0或者1时只点亮其中一个LED,即实现了控制。如果你还想要其他控制方式,那就是用串口的TXD发出数据了,这时要另一个单片机的
怎么用51单片机一个IO口控制两个LED分别亮
既然是单片机PWM波 就不用三极管了 LED串电阻直接单片机l/O
void ISR_Timer0(void) interrupt 1 //---我们就用定时器0来做,不用PWM硬件 { //---3.3333ms中断一次 counter++;if(counter >= 10) counter = 0;if(counter >= Set_PWM0) P1_0 = 0; else P1_0 =
用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0
是可以的。直流电机PWM调速实验 / 关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样 可以设定占空比可从1
你要用51产生PWM去控制LED,首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间
写论文的时候直接粘贴就行,单片机实验PWM更简单,只要你学过嵌入式应该就会的,拿51单片机来说就是I/O端口作为PWM输出,注意下单片机的总输入/输出电流不要超过设计范围就行,
用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。T0、T1定时器设置成:16位定时器。程序清单:(12MHz)PwmData0 ;T0定时t1所需的定时初值(字)PwmData1 ;T1定时T所需的定时初值(字);setb
如何用51单片机产生pwm 并利用pwm控制led灯的功率?
可以,但是亮度很暗,无法让LED工作高亮度状态,如果能外接电源,再用MOS管来控制那就比较好
51单片机自动路灯监控系统代码的编写可以分为以下几个步骤:1. 初始化设置:包括引脚设置、定时器设置、中断设置等。例如,设置光敏电阻的引脚为输入模式,设置定时器用于定时检测光敏电阻的数值。2. 光敏电阻检测:使用定时器
综上所述,基于51单片机的自动路灯控制系统需要以上几部分组成,通过光敏传感器感知光照强度,时钟模块提供时间信息,继电器控制路灯的开关,电源模块为系统供电,人机交互模块实现与系统的交互,电路板将各个模块连接在一起,程序
常见的保护模块有过压保护、过流保护和短路保护等。过压保护可以在输入电压超过一定范围时,自动切断电路,以保护LED路灯驱动电路不受损坏。过流保护可以在输出电流超过一定范围时,自动切断电路,以保护LED灯不受损坏。短路保护
总结起来,基于单片机的路灯控制中LED灯的恒流驱动是通过使用恒流驱动电路来实现的。这需要使用一个恒流源和一个电流调节器来确保LED灯的亮度稳定,并通过添加保护措施和提高电源的稳定性来提高整个系统的可靠性。
后面的是NPN管,RL的取值及管子的型号根据供电电压及LED导通电流计算获得。
首先分析一下错误之处:在极限情况下分析,假如线电压VSS跟LED的工作电压相等,那个限流电阻无限小,比如VSS为2.5V,限流电阻小到一欧,驱动红色LED(假设工作电压2.5V),控制端基极为0时,基极电压理想为0V电压,有些IC
51单片机做个led路灯照明,求1W led驱动电路
理工学科是指理学和工学两大学科。理工,是一个广大的领域包含物理、化学、生物、工程、天文、数学及前面六大类的各种运用与组合。 理学 理学是中国大学教育中重要的一支学科,是指研究自然物质运动基本规律的科学,大学理科毕业后通常即成为理学士。与文学、工学、教育学、历史学等并列,组成了我国的高等教育学科体系。 理学研究的内容广泛,本科专业通常有:数学与应用数学、信息与计算科学、物理学、应用物理学、化学、应用化学、生物科学、生物技术、天文学、地质学、地球化学、地理科学、资源环境与城乡规划管理、地理信息系统、地球物理学、大气科学、应用气象学、海洋科学、海洋技术、理论与应用力学、光学、材料物理、材料化学、环境科学、生态学、心理学、应用心理学、统计学等。 工学 工学是指工程学科的总称。包含 仪器仪表 能源动力 电气信息 交通运输 海洋工程 轻工纺织 航空航天 力学生物工程 农业工程 林业工程 公安技术 植物生产 地矿 材料 机械 食品 武器 土建 水利测绘 环境与安全 化工与制药 等专业。#include sfr CCON = 0xD8; sfr CMOD = 0xD9; sfr CL = 0xE9; sfr CH = 0xF9; sfr CCAP0L = 0xEA; sfr CCAP0H = 0xFA; sfr CCAPM0 = 0xDA; sfr CCAPM1 = 0xDB; #define uint unsigned int #define uchar unsigned char uchar whith_p=50; uchar max_p=255; uchar min_p=1; uint fre = 0xffff; sbit CR = 0xDE; sbit led = P2^0; void timer0_int (void) interrupt 1 using 1 { TH0 = fre >> 8; TL0 = fre & 0xff; led = ~led; } void timer0_init(void) { TMOD &= 0xf0; TMOD |= 0x1; TH0 = 0xff; TL0 = 0xff; TR0 = 1; ET0 = 1; } void pwm_init(void) { CMOD = 0x4; CL = 0x0; CH = 0x0; CCAP0H = whith_p; CCAPM0 = 0x42; CR = 1; } void soft_delay(uint _1ms) { unsigned int tmp; while(_1ms--!=0) { for(tmp=0;tmp<144;tmp++); } } void pwm_out(void) { whith_p=50; while(whith_p<max_p) { CCAP0H =whith_p; soft_delay(10); whith_p=whith_p+5; CCAP0H = whith_p; soft_delay(10); } whith_p=max_p; while(min_p<whith_p) { CCAP0H = whith_p; soft_delay(10); whith_p=whith_p-5; CCAP0H = whith_p; soft_delay(10); } } void main (void) { pwm_init(); timer0_init(); EA = 1; while(1){ pwm_out(); } } STC单片机具有PWM输出功能,最近玩12864LCD万年历时,用的是杜洋的FT4时钟电路,用他提供的H文件控制时,具有调光功能,由于只是玩一玩,没有购买源码,而网上流行的程序都没有此功能,无奈,只能自己弄,好在杜老师及人所及早在网站中备下了资料,简单攒一下,居然成功了,并成功的汇入了万年历的程序中,现在将其改成完整的控制程序公开于此供参考。 /************************************************* STC单片机单/双键控制LED亮度PWM调光程序 原创WanNengGong 2010/09/20 参考程序: 杜洋工作室PWM功能程序模块 *************************************************/ #include //头文件 #define uchar unsigned char #define uint unsigned int uchar vx=5; //vx=5在用于12864LCD的LED背光调整时上电为半亮度状态,可根据自己的用途及要求任意设定 sbit KEY_H=P2^4; sbit KEY_L=P2^5; /*******************************************************************************/ void PWM_init (void){//PWM初始化函数 CMOD=0x02; //设置PCA定时器 CL=0x00; CH=0x00; CCAPM1=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010) CCAP1L=0x00; //设置PWM0初始值与CCAP0H相同 CCAP1H=0x00; // PWM0初始时为0 CR=1; //启动PCA定时器 } /******************************************************************************/ void PWM0_set (uchar a){//PWM0占空比设置函数 CCAP1L=a; //设置值直接写入CCAP1L CCAP1H=a; //设置值直接写入CCAP1H } /*****************************************************************************/ void DelayM(unsigned int a){//延时函数 1mS/次(用于1T单片机) unsigned char n,i,j; while(--a!=0){ for(n=1;n>0;n--) for(j=222;j>0;j--) for(i=12;i>0;i--); } } /****************************************************************************/ void main(void) { KEY_H = 1;KEY_L = 1; PWM_init (); while(1) { PWM0_set(vx*24); //数字24是配合vx调试取得的,此时vx的赋值范围约为1-10对应最暗-最亮 //--------减调整---------// if (KEY_L == 0 ){ DelayM(20); //延时20毫秒消抖动 if(KEY_L == 0){ //如果20SM后KEY_L还是0状态则确认下调键是按下的 vx--; if(vx<1){vx=5;} //如果设定vx=10,将语句改为if(vx<1){vx=10;}则为单按键循环控制,则可去除加调整控制部分 } while(KEY_L == 0);//等待键松开 } //--------加调整---------// if (KEY_H == 0 ){ DelayM(20); if(KEY_H == 0){ vx++; if(vx>10){vx=5;} } while(KEY_H == 0); } } } 程序自己理解消化了,就可以编出你自己的程序了,你说的,完全可以实现,而且比这俩个例子简单N多。 这是百度里面别人的回答,感觉可以解决您单片机产生PWM的问题了,至于后面如何控制功率,那你就要搞清功率的单位是什么,除了w,还有什么,在时间一定的情况下,如何改变功率,只需要改变其PWM的占空比。如果一个周期里面,它有50%是高电平,那么它是正常输入的50%的功率,如果只有20%呢,10%呢?这不就在改变其功率么?
电流800mA,那要用大功率三极管了。单片机控制时,应采用二个三极复合的形式,即单片机控制一个小功率,再用小功率管推动大功率管。
确切的说一个IO口在指定时间内仅能输出一种状态(高和低,可以用来代表LED的亮和灭)。 如果楼主非要让一个LED长时间亮着的话,那就用缓冲吧!一般为了提高效率,我们会8个IO口一起操作,缓冲器也支持并且就是这样做的(所谓缓冲就是一些可以保存IO口某一时刻状态的电路)。 通俗说,单片机并不直接控制每一个LED的亮灭,而是通过相对应的缓冲器来间接控制。比如要控制1-8号LED全亮,单片机先选择1号缓冲器,然后发送一个全亮的指令给1号缓冲器,1号缓冲器会记住单片机的这个全亮指令控制并保持(直到单片机再发送来新的指令更改1-8号LED的状态)自己管理的8个LED的状态。 指令交给1号缓冲器后,单片机就可以选择二号缓冲器并发送控制9-16号LED的指令了,然后选择三号缓冲器并发送17-24号LED的指令.... 直到发送指令到第三百七拾五号缓冲器控制2992-3000号LED。有一个问题就是这样会需要375个缓冲器,并且需要24个IO口(8个IO口控制LED灯,16个IO口控制缓冲器)。 这个电路的效果就是单片机仅需要375*3=1125条指令就可以完全控制一遍这3000个LED,如果使用的单片机速度不太慢的话,这几乎不到10个毫秒,一秒钟可以控制3000个LED状态改变100次以上,虽然这个方法有点笨,成本还比较高,但他只使用了24个IO口!当然高手也许只需要16个甚至更少的IO口就能办到。
#include #define uchar unsigned char sbit key = P1^0; sbit led0 = P1^1; sbit led1 = P1^2; uchar count = 0; void delayms (uchar time)//延时 { for(time; time>0; time--) { TMOD |= 0x01; TH0 = 0xfc; TL0 = 0x18; TR0 = 1; //启动计数器0 while(TF0!=1);//计数溢出 TF0 = 0; TR0 = 0; } } void scan_key (void) { if (!key) { delayms (5); if (!key) { delayms (1); while (!key); count++; if (count==3) { count = 0; } } } } void main (void) { P1 = 0xff; while (1) { scan_key (); if (count==0) { led0 = 1; led1 = 1; } if (count==1) { led0 = 0; led1 = 1; } if (count==2) { led0 = 1; led1 = 0; } } }