点亮一个LED

一、为什么灯会亮

简单的串联电路, D4,D5,D6 板子上有标记, D5 一端通过电阻接 5v ,另外一端接着 "LED1 标志的线 " ,我们发现在89C52RC 的电路图中也有 LED1 的标志,是在 P3 IO 口组中,在 P3.7 引脚,所以编程让 P3.7 出 低电平(0 )就让 D5 灯完成一个串联电路,所以亮。

 也就是说,给LED1对应标号的P3^7一个低电平,就能点亮灯

sbit Led1 = P3^7;
Led1 = 0;
sbit“ 指令 :对应可位寻址空间的一个位,小白先理解成 一个 IO / 针脚 的地址中数据

 二、如何控制灯闪烁

在点亮一个LED灯后,加一个STC-ISP自带延时函数delay();

#include "reg52.h"
sbit Led1  = P3^7 ;

void Delay100ms()        //@11.0592MHz
{
    unsigned char i, j;

    i = 180;
    j = 73;
    do
    {
        while (--j);
    } while (--i);
}

void main ()
{
        //灯灭,给一个高电平
        //重复执行
        while ( 1 ){
                //灯亮,给一个P3.7 低电平
                Led1  = 0 ;
                //数数,数的期间,维持低电平,灯亮,延迟
                Delay500ms ();
                //灯灭,给一个高电平
                Led1  = 1 ;
                //数数,数的期间,维持高电平,灯灭,延迟
                Delay100ms ();
        }
} 

 三、用按键控制灯(查询法)

原理:按键和灯不是我们传统理解的思维,传统按键和灯是在同一个电路中的。而我们单片机编程按键 和灯是分开的两个电路,通过单片机作为媒介来处理数据,通过逻辑来实现按键控制灯。
1、查询法按键控制灯
怎么知道SW 1 按键被按下:KEY1位置和 GND 接通,表现为低电平,值为 0;
怎么知道 sw1 按键没有被按下:KEY1位置通过上拉电阻到 5V ,表现为高电平,值为 1。

通过查询原理图得知 
KEY1 接到 STC89C52RC P2.1 口,我们只要不断检测 P2.1 口的值( 0- 按下, 1- 松开)就知道按键是否被按下
#include "reg52.h"
sbit Key1 = P2^1 ;
sbit Led1  = P3^7 ;
void main ()
{
        while ( 1 ){
        //注意:用 “==” 两个等于号表示判断,新手容易犯错
                if ( Key1 == 0 ){ //KEY1 位置和 GND 接通,表现为低电平,值为 0
                        //灯亮,给一个P3.7低电平
                        Led1 = 0 ;
                }
        }
}
2、软件消抖

在STC-ISP自带延时函数含有_nop_();需要加入头文件#include <intrins.h>

SW1开,SW2关,案例中只在SW1添加软件消抖

#include "reg52.h"
#include <intrins.h>
sbit Key1 = P2^1 ;
sbit Key2 = P2^0 ;
sbit Led1  = P3^7 ;
void Delay50ms () //@11.0592MHz
{
        unsigned char i , j , k ;
        _nop_ ();
        _nop_ ();
        i = 3 ;
        j = 26 ;
        k = 223 ;
        do
        {
        do
        {
                while ( -- k );
                } while ( -- j );
                } while ( -- i );
        }
void main ()
{
        //查询法检测,是否被按下
        while ( 1 ){
                if ( key1 == 0 ) //KEY1 位置和 GND 接通,表现为低电平,值为 0
               {
                //感觉被按下,不知道是抖动还是人为,延迟50ms 再判断一次
                //软件消除抖动
                Delay50ms ();
                if ( Key1 == 0 ){
                        //灯亮,给一个P3.7低电平
                        Led1 = 0 ;
                }
                if ( Key2 == 0 ){ //KEY2 位置和 GND 接通,表现为低电平,值为 0
                        Led1  = 1 ; //
                }        
        }
}
3、状态位控制LED 

定义一个状态位ledMark;使用ledMark的状态改变来控制LED的亮灭

使用 #define 定义一个标识符来表示一个常量,让标志位的状态改变的意义更加明显

#include  "reg52.h"

#define ON_STATUS 1
#define OFF_STATUS 0

void main ()
{
        int ledMark = OFF_STATUS ;
        ledOne = 1 ;
        //查询法检测,是否被按下
        while ( 1 ){
                if ( key1 == 0 ) //KEY1 位置和 GND 接通,表现为低电平,值为 0
                {
                        //感觉被按下,不知道是抖动还是人为,延迟50ms再判断一次
                        //软件消除抖动
                        Delay50ms ();
                        if ( key1 == 0 ){
                                //记住,key1被按下,记住,在其他地方点灯
                                ledMark = ON_STATUS ;
                        }
                }
                if ( key2 == 0 ){ //KEY2 位置和 GND 接通,表现为低电平,值为 0
                        ledMark = OFF_STATUS ;
                }
                if ( ledMark == OFF_STATUS ){
                        ledOne = 1 ;
                } else {
                        ledOne = 0 ;
                }
        }
}
  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值