51单片机之LED灯
实验要求
众所众知,软件编程的第一个小程序就是打印“hello world”,同样硬件的编程也有他的第一个小程序,那就是LED灯的点亮,如果不做一个这样的小实验,学再多理论也是纸上谈兵。下面我们来实现LED灯闪烁的实验。
物料清单
电容
12M晶振
点阵开关
电阻
LED灯
AT89C52单片机(和51效果一样)
原理图
为了更形象的讲解LED灯闪烁的实验,笔者特意画了LED闪烁的原理图,他们的作用如下:
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;如果单片机引脚接...