51单片机实训(二):基于Proteus的花样流水灯设计

文章目录

  • 前言
  • 一、项目概述
  • 1.1 系统概述
  • 1.2 功能设计
  • 二、项目硬件设计
  • 2.1 AT89C51单片机最小系统
  • 2.2 外设电路
  • 三、项目软件设计
  • 3.1 程序代码设计
  • 四、项目调试与分析
  • 4.1 Proteus 仿真调试
  • 4.2 结果分析
  • 总结
  • 附录

  • 前言

  • 大家好,我是三🐎!这是我51单片机专栏的第四篇文章,本文分享另一个简单实用的小项目————基于Proteus的花样流水灯设计。

  • 一、项目概述

    1.1 系统概述

    流水灯是在控制系统的控制下按照设定的顺序和时间来发亮和熄灭,形成一定视觉效果的一组灯。流水灯常安装于店面、招牌、夜间建筑物,可以让门面或建筑变得更加美观显眼。形成一定的视觉效果,常安装于店面和招牌上。

    1.2 功能设计

    为实现流水灯的实际效果所采用了按钮与流水灯相结合的设计方案,使效果更佳个性化与多元化,更能满足客户的需求,以80C51为核心构架硬件电路,外附LED按以及钮进行显示于控制,同时利用C语言编程实现流水灯的显示功能。
    流水灯控制原理为:三极管在电路中充当开关的作用,当电路导通,最左边的LED首先点亮。基极串出一电容连接下一个三极管的集电极。当电容充分充电后,下一个三极管导通使得第二个LED点亮,以此类推。可以通过调节电容的容量值,来控制流水灯点亮的时间。


    二、项目硬件设计

    本系统的硬件设计包括AT89C51控制器核心电路以及外设电路设计,按钮控制模块以及LED流水灯模块,并在Proteus仿真软件上设计系统的仿真电路。

    2.1 AT89C51单片机最小系统

    单片机最小系统电路,又称最小应用电路,是指用最少的元件组成的单片机可以工作的系统,AT89C51的最小系统电路主要由单片机、晶振电路、复位电路组成。如下图所示:

    2.2 外设电路

    1. LED流水灯模块
      发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,从P区注入到N区的空穴和由N区注入到P区的电子,在PN结附近数微米内分别与N区的电子和P区的空穴复合,产生自辐射的荧光。不同的半导体材料中电子和空穴所处的能量状态不同。当电子和空穴复合时释放出的能量多少不同,释放出的能量越多,则发出的光的波长越短。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压大于5伏。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过二极管的电流。
      发光二极管的核心部分是由P型半导体和N型半导体组成的晶片,在P型半导体和N型半导体之间有一个过渡层,称为PN结。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。当它处于正向工作状态时(即两端加上正向电压),电流从LED阳极流向阴极时,半导体晶体就发出从紫外到红外不同颜色的光线,光的强弱与电流有关。


    2. 控制按钮模块
    按钮是一种常用的控制电器元件,常用来接通或断开‘控制电路’(其中电流很小),从而达到控制电动机或其他电气设备运行目的的一种开关。按钮是一种人工控制的主令电器。主要用来发布操作命令,接通或开断控制电路,控制机械与电气设备的运行。按钮的工作原理很简单对于常开触头,在按钮未被按下前,电路是断开的,按下按钮后,常开触头被连通,电路也被接通;对于常闭触头,在按钮未被按下前,触头是闭合的,按下按钮后,触头被断开,电路也被分断。
    按钮的用途很广,例如车床的起动与停机、正转与反转等;塔式吊车的起动,停止,上升,下降,前、后、左、右、慢速或快速运行等,都需要按钮控制。
    本设计中,通过控制不同按钮,可以实现流水灯的不同效果。


    三、项目软件设计

    本系统的软件代码设计采用Keil uVision4编写。利用基于Proteus仿真软件的单片机设计流程对系统进行仿真测试,通过向单片机中烧录编写的程序,来实现系统所需要完成的全部功能。基于Proteus的花样流水灯设计流程如图所示。

    3.1 程序代码设计

    基于Proteus的花样流水灯设计代码设计如下:

    #include<reg51.h>
    
    void delay(unsigned int xms){  //延时函数
    	unsigned int i, j;
    	for(i=0; i<xms; ++i)
    		for(j=0; j<110; ++j);
    }
    
    void main(){
    	while(1)
    	{	
    		while(P0==0xFE)
    		{
    		P2=0xFE;
    		delay(200);
    		
    		P2=0xFD;
    		delay(200);
    
    		P2=0xFB;
    		delay(200);
    
    		P2=0xF7;
    		delay(200);
    
    		P2=0xEF;
    		delay(200);
    
    		P2=0xDF;
    		delay(200);
    
    		P2=0xBF;
    		delay(200);
    
    		P2=0x7F;
    		delay(200);
    		}
    			
    		while(P0==0xFD)
    		{
    		P2=0xFE;
    		delay(200);
    		
    		P2=0xFD;
    		delay(200);
    
    		P2=0xFC;
    		delay(200);
    
    		P2=0xFB;
    		delay(200);
    
    		P2=0xEA;
    		delay(200);
    
    		P2=0xDF;
    		delay(200);
    
    		P2=0xBE;
    		delay(200);
    
    		P2=0x7D;
    		delay(200);			
    		}
    			
    	    while(P0==0xFB)
    		{	
    		P2=0xFA;
    		delay(200);
    		
    		P2=0xF4;
    		delay(200);
    
    		P2=0xF6;
    		delay(200);
    
    		P2=0xF7;
    		delay(200);
    
    		P2=0xA4;
    		delay(200);
    
    		P2=0x56;
    		delay(200);
    
    		P2=0x47;
    		delay(200);
    
    		P2=0x7F;
    		delay(200);
    		}
    	
    		while(P0==0xF7)
    		{
    		P2=0xFE;
    		delay(50);
    		
    		P2=0xFD;
    		delay(50);
    
    		P2=0xFB;
    		delay(50);
    
    		P2=0xF7;
    		delay(50);
    
    		P2=0xEF;
    		delay(50);
    
    		P2=0xDF;
    		delay(50);
    
    		P2=0xBF;
    		delay(50);
    
    		P2=0x7F;
    		delay(50);
    		
         	}
         	
    		while(P0==0xEF)
    		{
    		P2=0xFE;
    		delay(50);
    		
    		P2=0xFD;
    		delay(50);
    
    		P2=0xFC;
    		delay(50);
    
    		P2=0xFB;
    		delay(50);
    
    		P2=0xEA;
    		delay(50);
    
    		P2=0xDF;
    		delay(50);
    
    		P2=0xBE;
    		delay(50);
    
    		P2=0x7D;
    		delay(50);			
    		}
    
    	    while(P0==0xDF)
    	    {
    	    P2=0xFF;
    	    delay(500);
    	    
    	    P2=0x00;
    	    delay(500);
         	 }
    		
    		while(P0==0xBF)
    		{
    		P2=0xEA;
    		delay(200);
    
    		P2=0xDF;
    		delay(200);
    
    		P2=0xBD;
    		delay(200);
    
    		P2=0x7E;
    		delay(200);
    		}
    	 
            while(P0==0x7F)
            {
    		P2=0xFF;
    	    delay(500);
    	    }
    	}
    }
    

    四、项目调试与分析

    打开Protues软件,可以对系统进行Proteus仿真,将程序生成的.hex文件导入仿真系统的单片机内,运行仿真系统。

    4.1 Proteus 仿真调试

    通过控制按钮,可以实现LED灯D1~D8的亮与灭,实现花样流水灯的效果。

    4.2 结果分析

    通过测试,本系统可以实现课题预期所有功能。本次设计是基于Proteus花样流水灯的设计包括硬件电路和软件编程两部分。发现单调的流水灯没有很好的满足用户的需求,那么就采用了按钮结合许多花样的流水灯来增加丰富度。


    总结

    在本次课程设计中,为实现流水灯的实际效果所采用了按钮与流水灯相结合的设计方案,使效果更佳个性化与多元化,更能满足客户的需求,以AT89C51单片机为主控单元构架硬件电路,控制不同按钮进行LED灯的亮与灭,实现花样流水灯的效果。


    附录


    附录A 元件清单图

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机实训(二):基于Proteus的花样流水灯设计

    发表评论