51单片机-控制LED灯

发布者:cyzcee最新更新时间:2022-07-12 来源: csdn关键字:51单片机  控制LED灯 手机看文章 扫描二维码
随时随地手机看文章

1.硬件设计

通过原理图分析,LED 采用共阳接法,即所有 LED 阳极管脚接电源 VCC(5V),阴极管脚通过一个限流电阻接到 P2 口上;要让 LED 发光即对应的阴极管脚应该为低电平,若为高电平则熄灭;所以如何配置P2口的高低电平(P2寄存器),就是怎么去控制这8颗LED灯。

2.软件设计

2.1.点亮一颗LED灯

功能需求:点亮D1这一颗LED灯


程序设计:根据原理图去配置对应的寄存器(P2口),去控制LED灯的亮灭状态,如:D1亮,其他灯不亮,即P20输入低电平,其他管脚输入高电平;

#include

 

void main()

{

P2=0XFE;//1111 1110 D1灯亮,其他灯不亮

}

进阶1:除了main函数,增加循环语句while,while(1)表示当括号里边的逻辑表达式为真的时候;就执行大括号里边的内容


#include

 

void main()

{

while(1)

{

    P2=0XFE;//1111 1110

}

}


进阶2:利用头文件中已经定义好的位寄存器,去单独控制我们想要控制的管脚,如:P2=0XFE-相当于P2_0=0

#include

 

void main()

{

while(1)

{

P2_0=0;//P2=0XFE;

}

}


2.2.LED闪烁

功能需求:要让D1这颗LED灯,按固定延时呈闪烁现象


程序设计:闪烁无非就是将LED点亮,再熄灭,然后重复这个动作,但如果只是如下的程序方案,我们无法看到闪烁现象,因单片机的工作频率是以MHz为单位,亮灭之间,停留的时间太短,所以看到的现象就是个LED常亮的现象


#include

 

void main()

{

while(1)

{

P2=0XFE;//1111 1110 点亮第一颗灯

P2=0XFF;//1111 1111 熄灭第一颗灯

}

}


所以想要肉眼能看到LED的闪烁现象,需在亮灭之间,增加延时函数,如下:在亮灭各自的状态下,增加500毫秒延时;


#include

#include

 

void Delay500ms() //@12.000MHz

{

unsigned char i, j, k;

 

_nop_();

i = 4;

j = 205;

k = 187;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

 

void main()

{

while(1)

{

P2=0XFE;//1111 1110

Delay500ms();//延时500毫秒

P2=0XFF;//1111 1111

Delay500ms();//延时500毫秒

}

}


延时函数,对初学者来说,不需要自己去编写,甚至其原理都可以不需要懂,可通过STC等工具自动生成,如:

2.3.LED流水灯

功能需求:LED流水灯的原理是让这8颗LED灯依次点亮,呈流水灯效果


软件设计:考虑LED灯依次点亮,考虑固定延时,如下:从第1-8颗灯依次点亮,且在每颗灯之间加入固定500ms的延时


#include

#include

 

void Delay500ms() //@12.000MHz

{

unsigned char i, j, k;

 

_nop_();

i = 4;

j = 205;

k = 187;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

 

void main()

{

while(1)

{

P2=0XFE;//1111 1110

Delay500ms();

P2=0XFD;//1111 1101

Delay500ms();

P2=0XFB;//1111 1011

Delay500ms();

P2=0XF7;//1111 0111

Delay500ms();

P2=0XEF;//1110 1111

Delay500ms();

P2=0XDF;//1101 1111

Delay500ms();

P2=0XBF;//1011 1111

Delay500ms();

P2=0X7F;//0111 1111

Delay500ms();

}

}

        以上流水灯方案的的缺点是:延时固定,且不可调,除非重新修改延时函数;那怎么让流水灯的延时变得可调呢,如下:


进阶1:首先通过STC的延时计算器,生成1个固定的基本延时函数,然后增加无符号整形变量xms,然后通过改变delay函数括号里边的行参,即可调整每颗LED灯的延时参数;


#include

#include

 

void Delay1ms(unsigned int xms) //@12.000MHz;设置无符号整形变量Xms

{

unsigned char i, j;

while(xms)// 当xms非0,即循环后面的延时函数

{

i = 2;

j = 239;

do

{

while (--j);

} while (--i);

xms--;

}

}

void main()

{

while(1)

{

P2=0XFE;//1111 1110

Delay1ms(100);//延时100ms 执行括号里边的参数(行参)

P2=0XFD;//1111 1101

Delay1ms(500);//延时500ms

P2=0XFB;//1111 1011

Delay1ms(100);

P2=0XF7;//1111 0111

Delay1ms(100);

P2=0XEF;//1110 1111

Delay1ms(100);

P2=0XDF;//1101 1111

Delay1ms(300);//延时300ms

P2=0XBF;//1011 1111

Delay1ms(100);

P2=0X7F;//0111 1111

Delay1ms(100);

}

}

3.知识点

3.1.while函数的应用

/*------------------------------------------------

如果逻辑表达式成立

    执行循环体

执行后再次判断

若还成立则继续执行直到表达式不成立

------------------------------------------------*/

while(逻辑表达式)

{

循环体;

}


3.2.常用数据类型

3.3.延时函数的自动生成

通过STC生成想要的延时函数,需要注意的是系统频率要选择单片机对应的频率,确定需要延时的长度,选择适用单片机型号的指令集;

关键字:51单片机  控制LED灯 引用地址:51单片机-控制LED灯

上一篇:51单片机-控制数码管
下一篇:c51单片机学习笔记-IO扩展(串转并)实验 - 74HC595

推荐阅读最新更新时间:2024-11-04 12:28

51单片机学习———2--LED闪烁+流水
LED闪烁实现 原理+代码 #include reg52.h sbit L1=P2^0; typedef unsigned char u8; typedef unsigned int u16; void delay(u16 i)//延时函数 { while(i--); } void main() { while(1) { L1=0; delay(30000);//max=65535 L1=1; delay(30000);//闪烁间隔约为270ms } } LED流水实现 原理+代码 #include reg52.h #include intrins.h #define A P2
[单片机]
从零开始51单片机教程 —— 单片机条件转移指令
条件转移指令是指在满足一定条件时进行相对转移 判A内容是否为0转移指令 JZ rel JNZ rel 第一指令的功能是:如果(A)=0,则转移,不然次序执行(执行本指令的下一条指令)。转移到什么地方去呢?如果按照传统的办法,就要算偏移量,很麻烦,好在现在我们能借助于机器汇编了。因此这第指令我们能这样理解:JZ 标号。即转移到标号处。下面举一例说明: MOV A,R0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END 在执行上面这段程序前如果R0中的值是0的话,就转移到L1执行,因此最终的执行结果是R1中的值为0FFH。而如果R0中的值不
[单片机]
从零开始<font color='red'>51单片机</font>教程 —— 单片机条件转移指令
基于89C51单片机的智能视频监控系统控制电路设计
  键盘是数字视频监控录像系统中最重要的输入设备之一,是人机接口的重要组成部分。目前常用的工业控制计算机键盘除配置电子锁开关防止非法键盘输入外,与 PC键盘并没有多大区别。这种键盘不仅键数多,操作不灵活,而且通常只能作为输入设备,主机无法通过键盘与外设进行通信。本文在分析PC机键盘通信方式的基础上,设计出以89C51单片机为核心的数字视频监控系统键盘及报警控制卡,该卡具有键盘通信和输入输出报警两种功能,采用标准PCI卡的结构,但不占用主机硬件资源。其中,报警部分有4路输入和4路输出,可以与标准的报警传感器相连;键盘部分有16个键,通信方式与PC机完全兼容。    键盘接收主机命令和参数   主机首先将时钟线置为低电平,随后将数
[单片机]
基于89C<font color='red'>51单片机</font>的智能视频监控系统<font color='red'>控制</font>电路设计
51单片机行列式键盘扫描程序
#include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int unsigned char code seg7 ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};//0到f的字型码 unsigned char code hao ={0x0e,0x0d,0x0b,0x07}; unsigned char code key_ ={1,2,3,15,4,5,6,14,7,8,9,13,0,10,11,12}
[单片机]
stc51单片机怎么学, 先掌握STC单片机程序烧录方法!
今天我在这里和大家探讨一下关于 51单片机怎么学 这个话题。 08年我在大学里学习单片机课程的时候,学习内容主要包括单片机的发展历史,单片机的框架,单片机的寄存器,以及单片机的操作指令,用汇编语言实现一些简单的功能。 当时学习的时候知识课本知识,而又没有配套的开发板,可以让我们动手。 当时的感触就是一个字:难,两个字:枯燥。 也许大多数的同学和我是一样的,一大堆指令,感到非常的无趣,没有什么意思,考试也是一大堆理论知识。 当然现在大学里的课程可能已经做了升级,关于单片机编程以及 单片机C语言 这一块了不知道大学里有没有增加,课程有没有优化的更加人性化一点。 后来参加电赛,自己买了一个开发板,不断的编代码,实践。 刚开始用汇编语言,
[单片机]
51单片机--键盘识别
单片机的键盘由于介入了人为操作,并不都是机器按流程跑,所以必须考虑到人的操作时长远大于机器周期,所以对于键盘状态的检测必须是写在while中,进行循环检测,这些需要实时检测的状态是:从没有按下到按下,和从已经按下到松手。而为了可以使while中的循环可以跳出,进入while的判断语句中的变量要在while循环中再次赋值,而这个赋值必须是与新状态相关的。 P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { tem
[单片机]
51单片机操作DS1302时钟芯片
#define uint unsigned int #define uchar unsigned char sbit lcdrs = P1^0; sbit lcdrw = P1^1; sbit lcden = P1^2; sbit key0 = P2^0;//功能键,选择时分秒 sbit key1 = P2^1;//加1键 sbit key2 = P2^2;//减1键 sbit key4 = P2^4; sbit clk_1302 = P1^5; //1302芯片位定义 sbit io_1302 = P1^6; sbit rst_1302 = P1^7; uchar bdata dat; sbit dat0 = dat^0; sb
[单片机]
DS2450转换器与51单片机接口设计
在普通方式下其串行通信速率为16.3kbps,而超速工作模式时的速率可达 142kbps,片内16位循环冗余校验码生成器可用于检测通信的正确性。DS2450是DALLAS公司生产的单总线四通道逐次逼近式A/D转换器芯片,它的输入电压范围、转换精度位数和报警门限电压均可编程;每个通道均可用各自的存储器来存储电压范围设置、转换结果和门限电压等参数。DS2450采用8脚SOIC小体积封装。它既可用单5V电源供电,也可采用寄生电源方式供电,芯片正常工作时的功耗仅2.5mW,空闲时的功耗为25μW。多个DS2450或其它功能的具有MicroLAN接口的单总线芯片可以并联,CPU只需一根端口线就能与诸多单总线芯片通信,而且占用微处理器的端
[单片机]
DS2450转换器与<font color='red'>51单片机</font>接口设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved