单片机实验教程之LED灯亮灭实验

实验一 LED灯实验

一、实验目的

1.熟悉实验软件和硬件,进行正确的接线;
2.编程使得LED的闪烁;
3.编程实现跑马灯效果。

二、实验软硬件

1.Keil uVision4
2.PZISP自动下载软件
3.HC6800S开发板
三、实验原理
连接单片机管脚与共阴极二极管,并对于单片机的P0口进行编程。如果需要闪烁,可以先让P0口输出高电平,然后延时一段时间,让P0口保持高电平,此时二极管亮;然后再让P0口输出低电平,然后延时一段时间,让P0口保持低电平,此时二极管灭;如此循环,便实现了二极管亮灭的功能。

单片机接口
如果需要实现流水灯,可以先让P0口输出0X01(0000 0001),然后延时一段时间,让P0口保持,此时二极管最右边的灯亮,其余的灭;然后再让P0口输出0X02(0000 0010),然后延时一段时间,让P0口保持,此时第二个二极管亮;如此对于P0口进行写入,便实现了流水灯的功能。

共阴二极管电路
其中,74LS373:8数据锁存器。主要用于数码管、按键等等的控制。当使能为低时,将输出锁存在已建立的数据电平上。MCU的引脚有限,锁存器对于外设的控制非常有必要。
锁存器的真值表
Dn LE OE Qn
H H L H
L H L L
X L L Qo
X X H Z
H为高电平 L为低电平 X为不定 Z为高阻

四、软件流程图

二极管亮灭程序流程图

流水灯程序流程图

五、实验代码

1.// 二极管亮灭程序:  
2.#include <reg51.h>  
3.void Delay10ms(unsigned int c);   //延时10ms  
4.void main()  
5.{   
6.    while(1)  
7.    {     
8.        P0  = 0x00;       
9.        Delay10ms(50);    
10.        P0  = 0xff;           
11.        Delay10ms(50);   
12.    }  
13.}  
14.void Delay10ms(unsigned int c)   //误差 0us  
15.{  
16.    unsigned char a, b;  
17.    for (;c>0;c--)  
18.    {  
19.        for (b=38;b>0;b--)  
20.        {  
21.            for (a=130;a>0;a--);  
22.        }            
23.    }        
24.}  
25.//流水灯程序:  
26.#include <reg51.h>  
27.#include <intrins.h>  
28.void Delay10ms(unsigned int c);   //延时10ms  
29.void main(void)  
30.{  
31.    unsigned char LED;  
32.    LED = 0x01;  
33.    while(1)  
34.    {  
35.        P0 = LED;  
36.        Delay10ms(50);  
37.        LED = _crol_(LED,1);   
38.    }  
39.}  
40.void Delay10ms(unsigned int c)     
41.{  
42.    unsigned char a, b;  
43.    for (;c>0;c--)  
44.    {  
45.        for (b=38;b>0;b--)  
46.        {  
47.            for (a=130;a>0;a--);  
48.        }           
49.    }  
50.} 

六、实验步骤

1.连接开发板LED模块相关电路连线

硬件路线图
2.打开开发板电源

电源位置
3.编写调试LED程序,生成hex文件,下载程序。

程序下载界面
流水灯程序下载之后,发光二极管按照预定的方向相继点亮,亮灭的间隔时间基本符合预定的时间。

七、实验思考

这是用51单片机做的第一个实验,也是一个单片机入门的经典程序——点亮一颗灯。
我最大的收获是明白了为什么要用延时函数。因为单片机执行一条代码所需要的时间是微秒级别的,人是分辨或者感觉不出来的。比说,我们要灯闪烁,如果灯亮灭的频率太快,我们就会觉得灯是一直亮的,可能亮的程度有所变暗。这是实验中有切身体会到的事情,合理应用延时函数非常重要,关系到单片机的效率和功能实现等问题。
对寄存器进行读写非常接近单片机的底层,要对与硬件电路非常熟悉才行。单片机大部分时间是一直在工作的,如果代码写的非常短,这些代码执行完了之后,单片机就不工作了。所以一定要有一个死循环,作为主程序,一般用While(1)来实现。但是死循环是最初学C语言所极力避免的,因为之前学的课程所编写的代码需要确切的结果,要么是一个计算结果,要么是一段显示。但是单片机是一个系统,需要长时间保持工作,因此我们将会面临一个不会结束的程序。在程序执行过程中会遇到各种情况,我们需要在最初的编码时候想到并规避。总之,单片机不同以往我们所接触到的东西,里面还有很多东西需要探索。

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机实验教程之LED灯亮灭实验

发表评论