以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。程序中使用了P1.0到P1.3作为控制灯的引脚,P3.2作为按键的引脚。每当按下
在上述代码中,我们首先将P1口设置为全灭状态,然后使用一个循环将P1口设置为全亮状态,并延时1秒钟。接着,我们将P1口设置为全灭状态,并再次延时1秒钟。这样,LED灯就会一亮一灭间隔1秒。需要注意的是,上述代码中的延
LED_D1 =1;//=1亮灯 ,=0灭灯当也要看电路,完善的电路还会有驱动电路如三极管点了,也要看LED固定的那端是接地还是接VCC。最终无非就是通过单片机的IO口输出一个0或1来是LED二极管电路正向导通形成发光。
1、创建项目,如图所示。2、创建延迟函数。3、创建C语言主函数。设计unsigned char k=0;变量。4、添加循环效果。5、点亮灯,通过k++,改变效果。6、添加延迟效果,单片机就可以控制8个灯依次亮,全亮了,然后再依次灭。
如何通过单片机来控制LED灯的亮灭?
比如要控制1-8号LED全亮,单片机先选择1号缓冲器,然后发送一个全亮的指令给1号缓冲器,1号缓冲器会记住单片机的这个全亮指令控制并保持(直到单片机再发送来新的指令更改1-8号LED的状态)自己管理的8个LED的状态。指令
1、新建项目,如图所示。2、添加头文件,创建延迟函数。3、创建C主函数。4、添加死循环效果。5、点亮LED灯。P1=0x7e;二进制11111110。6、添加延迟效果即可。注意事项:Proteus 自从有了单片机也就有了开发系统,随着单片机
两个 LED 有 4 种随机组合,用 1 表示灭,0 表示亮, 就是:00、01、10、11,所以必须搭建一个2 输出端的计数器, 按键有几十毫秒抖动,即高低电平时间不确定,用按键做时钟即可。在复杂些就做一个时钟电路,频率
输出控制 如图所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出
51单片机一个按键控制2个LED灯产生四种状态的 电路图怎么做啊。
你写的程序并没有加载到工程中,只是写了程序没有用的,不加到工程中,是不能编译的。程序是对的。见下图,首先要把写的程序保存,然后在画红圈的位置,点鼠标右键,把这个程序加进来,加载进来后,左边应该是那样的。
led=1;//点亮 delay(100);//延时100MS led=0;//熄灭 } else led=0;} void delay(unsigned int i){自己根据单片机频率写个1MS带形参的演示程序} 这个程序是现写的。。应该能执行,有些细节没有写,自己修改下,
1、新建项目,如图所示。2、添加头文件,创建延迟函数。3、创建C主函数。4、添加死循环效果。5、点亮LED灯。P1=0x7e;二进制11111110。6、添加延迟效果。注意事项:很多公司都有51系列的兼容机型推出,今后很长的一段时间内
说明:单片机控制LED灯间隔时间闪烁 所用程序很简单,实际情况可作相应变化,也有多种方式实现。proteus电路图 所需元件清单:(分别是) 51单片机 电容 瓷片电容(也可用普通电容) 晶振 红色二极管 电阻 (tip:没有给高电
51单片机C程序实验LED灯:[1]单个灯闪烁
0; i < 4; i++) { P0 = j; j = _crol_(j, 2); delay(1000);} j = 0xfd; for(i = 0; i < 4; i++) { P0 = j; j = _crol_(j, 2); delay(1000);} } } 延时时间自己调整一下。
思路:循环控制常亮状态的值,将其从最高位循环到最低位。这个用于最后状态的常亮 在常亮循环中,控制不是常亮的其它所有位进行再次循环,逐渐从最低位亮灭循环到最高位 代码如下:include
// 51单片机控制八个发光二极管 左右循环。include
i;while(1) { led=0xfe; for(i=0;i<8;i++) //左到右点亮 { P0=led; led=(led<<1)
} } if(k2==0) { delay(10); if(k2==0) { while(k2==0); flag=2; } } if(k3==0) { delay(10); if(k3==0) { while(k3==0); flag=3;
break;case 4:P0=led;led=_cror_(led,1);delay(100);break;} } }
P1口接8个LED灯,P3口接4个按键K1~K4,用于控制流水灯的四种效果,仿真图如下。
用51单片机写程序,4个按键灯控制8个彩灯切换九种灯光效果?
这是一个用定时计数器产生一个PWM波来控制LED灯的光亮程度的。首先,PWM是一个占空比波,比如一个2秒为周期的PWM波,占空比是高电平占一个周期的PWM波的比率。比如占空比是50%则高电平维持的时间是1秒。这样灯不是最亮,
val=analogRead(potpin);// 读取传感器的模拟值并赋值给val Serial.println(val);//显示val 变量 analogWrite(ledpin,val/4);// 打开LED 并设置亮度(PWM 输___出最大值255)delay(10);//延时0.01 秒 } 原理图:
2、软件延时法,可以设置一个延时函数,时间到就转换io电平也可以产生pwm信号。
用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0
用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。T0、T1定时器设置成:16位定时器。程序清单:(12MHz)PwmData0 ;T0定时t1所需的定时初值(字)PwmData1 ;T1定时T所需的定时初值(字);setb
如何用51单片机产生pwm 并利用pwm控制led灯的功率?
1、选择4个端口作为输入端口连接按键(独立按键,按键一端接单片机端口,另一端接地)。 三路为抢答的按键KEY1、KEY2、KEY3,一路为抢答后复位按键KEY0。2、选择3个端口作为输出端口连接LED灯(高电平点亮还是低电平点
当松手时,KEY1 = 1,不满足if语句不 进入循环,LED继续保持当前状态即LED = 0,如果再次按下按键,此时检测到KEY1 = 0,进入循环,LED取反得到LED = 0,灯亮。*/ delay(500); /*此处延迟,保证连续两次按键
include
while(key1==0); } if(key2==0) { led1=1; led2=0; while(key2==0); flag=1; } if(key3==0) { led2=1; flag=0; while(key3==0); } }}
使用外部中断,如果是51单片机,使用外部中断,这三个键都接到中断上,外部中断引脚是P3.2,按键按下时低电平传入外部中断,这三个按键再分别接三个引脚,比方说P2.0,P2.1,P2.2,按键消抖会吧。在中断内部判断P2.
c51单片机编程:如下图通过三个独立按钮控制灯的亮灭
#include typedef unsigned int UINT16;typedef unsigned char UCHAR;/************************************************************///½Ó¿Ú¶¨Òåsbit K1 = P1^0;sbit K2 = P1^1;sbit K3 = P1^2;sbit LED1 = P2^0;sbit LED2 = P2^1;sbit LED3 = P2^2;/***********************************************************///ÑÓʱº¯Êý///////***********************************************************/void Delay(UINT16 ui16Dly){ UINT16 i,j; for (i = ui16Dly; i > 0; i--); for (j = 110; j > 0; j--);}/***********************************************************///°´¼üɨÃè///////***********************************************************/UINT16 Key_Scan(void){ UINT16 ui16Key; ui16Key = 0x00; ui16Key |= (K1 == 0) ? 0x01 : 0; ui16Key |= (K2 == 0) ? 0x02 : 0; ui16Key |= (K3 == 0) ? 0x04 : 0; return (ui16Key);}/***********************************************************///LED¹Ø///////***********************************************************/void Led_Off(void){ LED1 = 1; LED2 = 1; LED3 = 1;}/***********************************************************///LEDָʾ///////***********************************************************/void Led_Flg(UINT16 ui16Flg){ switch (ui16Flg) { case 0: //K1 LED1 = 0; break; case 1: LED2 = 0; //K2 break; case 2: //K3 LED2 = 1; LED3 = 0; break; case 3: //K2 LED3 = 1; break; case 4: //K1 LED2 = 1; LED3 = 1; break; case 5: //K1 LED1 = 1; LED2 = 1; LED3 = 1; break; default : LED1 = 1; LED2 = 1; LED3 = 1; break; }}static UINT16 ui16Cnt[3];static UINT16 ui16Flg;/***********************************************************///Ö÷º¯Êý///////***********************************************************/void main(void){ UINT16 ui16Key,ui16Temp; ui16Cnt[0] = 0; ui16Cnt[1] = 0; ui16Cnt[2] = 0; ui16Flg = 0x00; Led_Off(); ui16Key = Key_Scan(); ui16Flg = 0xff; while (1) { //°´¼ü ui16Temp = Key_Scan(); if (ui16Key != ui16Temp) { Delay(5); ui16Temp = Key_Scan(); if (ui16Key != ui16Temp) { ui16Key = ui16Temp; } } //K1 if (ui16Temp & 0x01) { switch (ui16Cnt[0]) { case 0: ui16Flg = 0; break; case 1: ui16Flg = 4; break; case 2: ui16Flg = 5; break; } while (ui16Temp & 0x01) ui16Temp = Key_Scan(); ui16Cnt[0]++; if (ui16Cnt[0] > 2) ui16Cnt[0] = 0; } //K2 if (ui16Temp & 0x02) { if (ui16Cnt[1] > 0) ui16Flg = 3; else ui16Flg = 1; while (ui16Temp & 0x02) ui16Temp = Key_Scan(); ui16Cnt[1]++; if (ui16Cnt[1] > 1) ui16Cnt[1] = 0; } //K3 if (ui16Temp & 0x04) { ui16Flg = 2; while (ui16Temp & 0x04) ui16Temp = Key_Scan(); } //LED Led_Flg(ui16Flg); }}#includesbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit key1=P1^4;sbit key2=P1^5;sbit key3=P1^6;main(){while(1) { led1=key1; led2=key2; led3=key3; }}
第一,要理解中断在这里的作用是固定的“一小段”时间进入一次。 第二,PWM_ON在程序中的作用很大,它会由0------>CYCLE------>0并且一直循环下去。可以把它看成一个有规律的变化的量。 第三,每进入中断一次count++,满足条件count==PWM_ON或count==CYCLE时改变LED的当前状态。作用是给小灯亮或灭的时间不同。 第四,LED的亮度与其通电时间有关,也可以说成是占空比。上面的条件要理解成是呈线性增加或减小的频率。可以理解成三角波,对应的面积就是通电时间。 不知能不能给你讲明白!
P1口接8个LED灯,P3口接4个按键K1~K4,用于控制流水灯的四种效果,仿真图如下。
按键的按下与否各对应一个键值,主程序中根据键值控制灯的亮灭即可
#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; } } }
led应该是一个变量,是代表led灯 亮或者灭的一个变量。 当你按下开关后,s1==0,就执行 led=!led 这条语句。 led=!led 的意思就是取反的意思,即原来led灯亮的话 执行该条语句后就变成灭;原来灭的话 执行该条语句后 就变成亮。按键按下就打控制灯的io取反就可以了。如:if(key1==1){while(key1==1); // 等待按键放开led1=~led1;} 使用四个独立按键控制四个LED灯亮灭的汇编程序怎么弄? 单片机的P1.0-P1.3接四个发光二极管L1-L4的阴极,P1.4-P1.7接四个开关K1-K4程序:ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR AORl A,#0F0HMOV P1,ASJMP START可以检测单个按键,也可以同时检测多个按键过程:开始--读P1口数据到A--A中的数据右移4次--A中的内容和F0H相或--A中的数据送到P1口--回到开始