产品选型

单片机led代码 51单片机之LED灯

小编 2025-06-17 产品选型 23 0

51单片机之LED灯

实验要求

LED灯以一秒的频率闪烁

众所众知,软件编程的第一个小程序就是打印“hello world”,同样硬件的编程也有他的第一个小程序,那就是LED灯的点亮,如果不做一个这样的小实验,学再多理论也是纸上谈兵。下面我们来实现LED灯闪烁的实验。

物料清单

电容

12M晶振

点阵开关

电阻

LED灯

AT89C52单片机(和51效果一样)

原理图

为了更形象的讲解LED灯闪烁的实验,笔者特意画了LED闪烁的原理图,他们的作用如下:

18脚和19脚接的是12M晶振系统,它是系统时序的由来;

9脚所接的是复位系统,当我们按下按键之后,系统会从程序最开始的代码开始运行;

P0.0接了一个电阻和一个LED灯,为什么接这个电阻呢?如果不加电阻,电流过大可能会烧坏LED灯,所以LED灯使用的时候一般都加限流电阻。

复位电路和晶振电路是单片机的固定外围电路,数据手册上已经给出,不需要我们花心思研究。

程序

我们要做的是让单片机控制LED灯以一秒的频率闪烁,这就避免不了写程序,看看现在的硬件产品吧,哪一个硬件产品里面没有集成电路,又有哪一个没有代码的“参与”。所以不要说硬件工程师就只做硬件,写单片机代码也是硬件工程师分内的事。下面把完整代码分享给大家。

#include <reg51.h>

void delay(void)

void main()

{

while(1)

{

P0=0x01;

delay();

P0=0x01;

}

void delay(void)

{

unsigned char a,b,c;

for(c=167;c>0;c--)

for(b=171;b>0;b--)

for(a=16;a>0;a--);

_nop_;

}

}

delay()函数是由单片机小精灵生成的,如果我们自己计算的话太麻烦了。

实验现象

视频加载中...

最后

我们实验的当中只用到了一个LED灯,所以直接用单片机驱动也可以,但是单片机的总的驱动电流就很小,如果LED灯多了的话,51单片机是驱动不了的,这时候就需要外加电源和开关管来驱动LED。

进阶教程:单片机独立按键,分别控制不同的LED点亮流水 代码详解

大家好,小伙伴们通过以上几篇文章的学习,我相信已经对于单片机控制LED流水的项目已经很熟悉了吧,其实还可以尝试着改一些代码实现花样流水地效果,感兴趣的小伙伴可以试一下,此处不再赘述。

我们言归正传继续说回我们今天的实验项目,单片机的独立按键控制流水灯点亮,其实这个只比上一个实验复杂一点点,就是在流水灯的基础上添加了按键独立控制。及有0~7八个按键及0~7八个LED,当按下按键对应的LED即被点亮。当有规律的不停按下按键时,就会呈现LED花样流水的效果。和上面几篇文章一样,我们同样从软件和硬件的两个角度来为大家讲解一下。

硬件方面

LED的原理已经说了很多次了,此处不再赘述。

按键的种类其实有很多,但是都大同小异,基本功能是不变的,下面先说一下最简单的也是今天实验中需要的点动开关按键:这种按键工作原理就是你一按下去,就会通电(或实现相应功能),像计算机键盘一样,汽车按键,电话按键一样,一松开就会自动弹起断电。如果一直按下去则会一直生效,直到按键再次弹起。

单片机关于控制方式和工作原理都不再重复,不明白的小伙伴请自行爬楼或者私信。

有一点我还是要说一下,既然是按键,那就要有人按,这里就涉及到一个误操作的问题,因为误操作往往不是我们想要的,往往会给我们带来损失或者麻烦,为了避免这种情况防止我们误操作,我们需要添加防止误操作的代码,我们单片机上通常叫做消抖,即消除按键抖动。好了,了解完了硬件以后那么我们下面开始讲解软件代码部分。

C语言参考源代码如下:

#include<reg52.h>

#define uint int //定义类型变量

#define uchar char //宏定义字符型变量

sbit S1 = P3^7; //用P3.7来检测按键是否被按下

sbit S2 = P3^6; sbit S3 = P3^5; sbit S4 = P3^4; sbit S5 = P3^3; sbit S6 = P3^2;

sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3;

sbit LED5 = P2^4; sbit LED6 = P2^5; sbit LED7 = P2^6; sbit LED8 = P2^7;

void delay(uint z);

void main()

{ uchar i;

uint k;

if(S1 == 0) //第一次检测按键被按下

{ delay(8); //延时8ms进行消抖

if(S1 == 0) //再次检测按键被按下,说明确实被按下了

{ for(i=0;i<3;i++) //for循环控制蜂鸣器响3声

{ for(k=0;k<5000;k++);//延时500ms

bell = 0; //输出低电平,使蜂鸣器鸣叫

for(k=0;k<10000;k++); //延时500ms

bell = 1; //输出高电平,使蜂鸣器停止 } } }

if(S2 == 0) //第一次检测按键被按下

{ delay(8); //延时8ms进行消抖

if(S2 == 0) //再次检测按键被按下,说明确实被按下了

{ LED1 = 0; //正向流动

delay(500); LED1 = 1; LED2 = 0;

delay(500); LED2 = 1; LED3 = 0;

delay(500); LED3 = 1; LED4 = 0;

delay(500); LED4 = 1; LED5 = 0;

delay(500); LED5 = 1; LED6 = 0;

delay(500); LED6 = 1; LED7 = 0;

delay(500); LED7 = 1; LED8 = 0;

delay(500);LED8 = 1; } }

if(S3 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖

if(S3 == 0) //再次检测按键被按下,说明确实被按下了

{ LED8 = 0; //反向流动 delay(500);

LED8 = 1; LED7 = 0;

delay(500); LED7 = 1; LED6 = 0; delay(500); LED6 = 1; LED5 = 0;

delay(500); LED5 = 1;LED4 = 0; delay(500); LED4 = 1; LED3 = 0;

delay(500); LED3 = 1; LED2 = 0; delay(500); LED2 = 1; LED1 = 0;

delay(500); LED1 = 1; } }

if(S4 == 0) //第一次检测按键被按下

{ delay(8); //延时8ms进行消抖

if(S4 == 0) //再次检测按键被按下,说明确实被按下了

{ LED1 = 0; //1、3、5、7亮

LED2 = 1; LED3 = 0; LED4 = 1; LED5 = 0; LED6 = 1; LED7 = 0; LED8 = 1; } }

if(S5 == 0) //第一次检测按键被按下

{ delay(8); //延时8ms进行消抖 if(S5 == 0) //再次检测按键被按下,说明确实被按下了

{ LED1 = 1; //2、4、6、8亮

LED2 = 0; LED3 = 1; LED4 = 0; LED5 = 1; LED6 = 0; LED7 = 1; LED8 = 0; } }

if(S6 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖

if(S6 == 0) //再次检测按键被按下,说明确实被按下了

{ LED1 = 1; //全部灯灭

LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7 = 1; LED8 = 1; } } }

void delay(uint z)

{ uint x,y; //定义循环变量

for(x=z;x>0;x--) //执行FOR循环语句

for(y=120;y>0;y--); //执行FOR循环语句

}

上述功能是用最基础的编程方法实现的,聪明的你想一想还有其他办法实现吗?通过以上代码,我用PROTEUS仿真图如下:结果8个按键可以分别控制8个LED,实验成功!

最后如果有什么问题或者建议请给我留言或者私信啊,看到一定第一时间回复,如果你喜欢我的文章,欢迎关注转发评论哦,我们下期再见!

专注基础,从软硬件两个维度,从零开始带你探寻单片机的神秘世界!

相关问答

【用 单片机 控制一个 led 灯,需要哪些电子元件啊,要什么型号和...

[最佳回答]如果要求元件最少的话,需要一个STC12c2052单片机,一个普通的LED,还有5V电源,要求再多点元件的话,可以再加一个1K的电阻,两个30pF的电容,12M的晶振等...

单片机 里声明 LED 数码管为共阴,共阳的 代码 怎么写?

共阳共阴不通用,共阳的消隐应该是P0=0。在位选打开之后首先读到的就是消隐程序(P0=0xff),郭的数码管是共阴,也就是位选低电平有效,而P0=0xff八位都是高...共...

51 单片机 c语言编程 led 灯1,3,5,7和2,4,6,8交替闪烁?

假设你的8个LED是通过低电平来点亮,即LED负极连接P口,正极连接电源:1.当1,3,5,7亮时,我们的P2口状态以二进制表示应该是10101010,也就是0xAA,程序应该写成...

单片机 led 怎么接线?

将单片机的输出引脚连接到LED的正极,LED的负极连接到单片机的地(GND)引脚。在连接时,确保使用适当的电阻来限制电流,以防止LED烧坏。选择合适的电阻值取决于...

LED代码 01是什么意思?

LED=LED|0x01这句是单片机C语言里的语句,该程序是先定义了某输出端口为LED,比如P1就是LED,那么LED=LED|0x01就是拿00000001与P1口输出寄存器按位...

单片机 的显示屏数字闪烁什么原因?

单片机的显示屏数字闪烁可能是由以下原因导致的:1.单片机部件损坏:可能是由于某个部件损坏导致的问题,比如说脉冲发生器、电压比较器、电压调节电路等。2...

51 单片机 led 是多大电阻?

51单片机控制LED的电阻大小通常取决于两个因素:供电电压和LED的额定工作电流。LED需要适当的电流来工作,过高的电流会损坏LED,过低的电流会导致LED不发光。...

单片机led 闪烁的原因?

32单片机LED灯闪烁的原因可能有以下几种:程序设计问题:如果程序中存在错误或者逻辑不严谨,可能会导致LED灯闪烁。例如,程序中可能存在死循环或者延时不准确...

单片机led =! led 1什么意思?

应该有一个LED的宏定义比如#defineledP10#defineled1P11"!"逻辑“非”;你问题应该是led!=led1应该是做逻辑判断if(l...

51 单片机led 灯加载什么电平?

51单片机引脚加载高低电平都可以驱动LED发光管,取决于引脚如何连接LED:如果LED的阳极接电源正极,阴极接单片机引脚,输出低电平可以点亮LED;如果单片机引脚接...

猜你喜欢