首页  /  单片机教程  /  闪烁的LED  /  

闪烁的LED

点击打开在线编译器,边学边练

延时是单片机入门必学的应用!


1.序

上一讲我们已经实现点亮一盏灯,但是很多时候程序的执行都是要死循环的,不能让程序像是停在那里不执行了。所以这一讲在前面的原理图基础上实现让LED2从点亮一段时间到熄灭一段时间再点亮一段时间如此循环下去,实现闪烁LED2的功能。


2.代码普及

我们知道CPU执行一条语句是很快的,如果我们这样写程序来实现灯的闪烁:

#include <reg52.h> 
sbit LED2  = P0^0;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
   
void main()
{  
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 

    ADDR2 = 1;//**************************
    ADDR1 = 1;//让三八译码器的IO6输出低电平
    ADDR0 = 0;//**************************

    while (1)
    {
        LED2=0;//点亮最右端的灯
        LED2=1;//熄灭最右端的灯
    }
}

那我们看到的现象就是灯一直亮着,不会闪烁。原因就是执行“LED2=0;”把灯点亮之后执行“LED2=1;”去熄灭,但是这个熄灭语句只持续一瞬间就循环又开始执行“LED2=0;”了,熄灭状态的持续时间太短我们人眼也就观察不到闪烁的现象。

 

3.延时语句

要想实现LED2闪烁,必须让LED2被点亮持续一段时间,被熄灭持续一段时间,也就是IO端口保持低电平一段时间,接着跳变保持高电平一段时间,此时我们需要用上延时。

#include <reg52.h> 
sbit LED2  = P0^0;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
  
void main()
{  
    unsigned int i;//定义一个16位无符号整形变量  
    ADDR3 = 1;//使能三八译码器
    ENLED = 0;// 
   
    ADDR2 = 1;//**************************
    ADDR1 = 1;//让三八译码器的IO6输出低电平
    ADDR0 = 0;//**************************
   
    while (1)
    {
        LED2=0;//点亮最右端的灯
        for(i=0;i<30000;i++);//延时一段时间
        LED2=1;//熄灭最右端的灯
        for(i=0;i<30000;i++);//延时一段时间
    }
}

“for(i=0;i<30000;i++);”其实就是CPU空运行让i不断相加到30000之后不满足“i<30000”的判断条件就结束这条运行代码,接着去执行下一条语句了,通过占用CPU的执行时间来达到短暂的电平保持状态,也就能让LED2亮一小段时间,接着又灭一小段时间,这样LED2在while(1)的死循环下就实现不停循环的亮灭闪烁了。


4.补充

对刚入门单片机编程的初学者来说,以前我们C语言基础上机操作的时候都是只见过别人int,char的去定义变量,而在单片机入门编程中看到的都是unsigned int,unsigned char这样定义,原因是单片机在入门的时候用的变量的取值都是0和正整数(正整数不包括0),所以才会用unsigned去定义无符号整形变量。


本文固定URL:https://www.dotcpp.com/course/180

上一课:点亮LED 下一课:软件调试查看运行时间
第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)