“Design of a Heart-shaped LED Neon Light Controller using 51 MCU”

基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计

必看!!视频讲解

基于51单片机的LED彩灯霓虹灯心形流水灯设计

这里写目录标题

  • 1 开发环境
  • 2 功能说明介绍
  • 3 仿真图
  • 4 程序
  • 5 原理图
  • 7 设计报告
  • 7.1 设计背景与意义
  • 7.2 设计目的
  • 7.3 本文结构安排
  • 8 资料清单下载链接
  • 1 开发环境

    仿真图:proteus8.9以上

    程序代码:KEIL4/KEIL5

    原理图:AD

    设计编号:A0005

    2 功能说明介绍

    结合实际情况,基于51单片机设计一个LED彩灯控制器设计。该系统应满足的功能要求为:

    具体功能:

    (1)至少10个发光管4种花样自动变换,循环往复;

    (2)彩灯花样变换的快慢节拍可以手动和自动方式控制,手动控制按钮按一次转换一次;

    (3)自动控制方式每15秒变换一次,1分钟循环一遍;

    (4)系统复位清零开关;操作简单、功能完善、精确度高。

    随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯。霓虹灯是城市的美容师,每当夜幕降临时,华灯初上,五颜六色的霓虹灯就把城市装扮得格外美丽。LED数码灯带采用全新的结构和专有技术,主体由高亮度发光二极管(简称LED)通过特殊的专利结构进行连接,运用特有的光学技术与专有的包覆层设计而形成。主要特性是节能、环保、防震、防水,其最大的特点就是发光均匀,360度通体发光,在工作状态下从外看不到LED的发光点,与传统霓虹灯的发光效果完全相同。但目前市场上的彩灯控制器结构往往有芯片过多、电路复杂、功率损耗大等缺点。此外,从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。因此有必要对现有的彩灯控制器进行改进。

    3 仿真图

    AT89C51是美国ATMEL公司生产的低电压,高性能CMOS16位单片机,片内含4k bytes的可反复擦写的只读程序存储器和128 bytes的随机存取数据存储器,期间采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用16位中央处理器和Flash存储单元,功能强大的AT89C51单片机可灵活应用于各种控制领域。

    AT89C51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个1 6位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

    本系统中央控制器采用的单片机AT89C51,复位电路采用上电复位电路。外接的晶振为12MHz晶振。

    img

    4 程序

    工程文件使用Keil4/keil5打开

    代码

    img

    部分代码

    
    #include <reg52.h>	  //包含头文件
    
    #include <intrins.h>
    
    #define uchar unsigned char  
    
    #define uint unsigned int 
    
    
    #define SPEED   10	//流水灯的速度
    
    
    sbit key0 = P2^0;	 //定义手动控制按键
    
    sbit key1 = P2^1;	 //定义自动控制按键
    
     
    
    uint js = 0,flag_auto=0;//定义计数15秒,自动变花样标志位
    
     
    
    uchar Run_mode=0;
    
    /****延时****/
    
    void delay(uint i)
    
    {
    
     uint j=1000;
    
     while(i--)
    
     {
    
     	j=1000;
    
     	while(j--);
    
     }
    
    }
    
     
    
    void delayms(uint z)	 //毫秒
    
    {
    
    ​	uint x,y;
    
      for(x=z;x>0;x--)
    
       for(y=110;y>0;y--);  
    
    }
    
     
    
    uchar LED_WATER1()
    
    {
    
    ​	static uchar temp1=0x01,temp2=0x80;
    
    ​	P1=~temp1;
    
    ​	temp1=_crol_(temp1,1);
    
    ​	P3=~temp2;
    
    ​	temp2=_cror_(temp2,1);
    
    ​	
    
    ​	delay(SPEED);
    
    ​	if(temp1==0x01)//循环了一圈
    
    ​	{return 1;}
    
    ​	else
    
    ​	return 0;
    
    }
    
     
    
    uchar LED_WATER2()
    
    {
    
    ​	static uchar temp1=0x01,temp2=0x01;
    
    ​	P1=~temp1;
    
    ​	temp1=_crol_(temp1,1);
    
    ​	P3=~temp2;
    
    ​	temp2=_crol_(temp2,1);
    
    ​	
    
    ​	delay(SPEED);
    
    ​	if(temp1==0x01)
    
    ​	{return 1;}
    
    ​	else
    
    ​	return 0;
    
    }
    
    uchar LED_WATER3()
    
    {
    
    ​	static uchar temp1=0x07,temp2=0x07;
    
    ​	P1=~temp1;
    
    ​	temp1=_crol_(temp1,1);
    
    ​	P3=~temp2;
    
    ​	temp2=_crol_(temp2,1);	
    
    ​	delay(SPEED);
    
    ​	if(temp1==0x07)
    
    ​	{return 1;}
    
    ​	else
    
    ​	return 0;
    
    }
    
    uchar LED_WATER4()
    
    {
    
    ​	static uchar temp1=0x07,temp2=0xe0;
    
    ​	P1=~temp1;
    
    ​	temp1=_crol_(temp1,1);
    
    ​	P3=~temp2;
    
    ​	temp2=_cror_(temp2,1);
    
    ​	
    
    ​	delay(SPEED);
    
    ​	if(temp1==0x07)//循环了一圈
    
    ​	{return 1;}
    
    ​	else
    
    ​	return 0;
    
    }
    
    
     
    
    void timer0() interrupt 1 using 1	//定时器0中断服务函数
    
    {
    
    ​	TH0=(65536-45872)/256;		//装初值11.0592M晶振定时50ms数为45872
    
    ​	TL0=(65536-45872)%256;	
    
    ​	js++;						//叠加20次 是一秒
    
    ​	if(js==300) 
    
    ​	{ 
    
    ​	 js=0;						//清空
    
    ​	 flag_auto=flag_auto+1;		//产生15s的倒计时
    
    ​	 if(flag_auto>3)  flag_auto=1;	//限幅,最多4个花样
    
    ​	 }
    
    }
    
     
    
    //主函数 
    
    void main()
    
    {	 
    
     uchar num=0;
    
    ​	Timer0_init(); //定时器初始化
    
     LED_WATER1();
    
     Run_mode=0;
    
    ​	while(1)
    
    ​	{
    
    ​		if(key1==0)  //自动控制按键
    
    ​		{  
    
    ​			delayms(3); //去除按键抖动
    
    ​			if(key1==0)
    
    ​			{ 
    
    ​				while(!key1);   //以上表示按下开始按键
    
    ​				flag_auto=0;	 //清零
    
    ​				TR0=1;       //开启定时器
    
    ​				while(1)
    
    ​				{
    
    ​					if(key0==0)   //调节到手动模式
    
    ​					{
    
    ​						TR0=0;    //关闭定时器
    
    ​						js=0;	flag_auto=0;//计数、自动换花样变量清零
    
    ​						break;	 //跳出
    
    ​					}
    
    ​					switch(flag_auto)//花样自动变化
    
    ​					{
    
    ​						case 0:  LED_WATER1(); break;
    
    ​						case 1:  LED_WATER2(); break;
    
    ​						case 2:  LED_WATER3(); break;
    
    ​						case 3:  LED_WATER4(); break;
    
    ​					}
    
    ​				}
    
    ​			}
    
    ​		}
    
    ​		if(key0==0)  //手动控制按键
    
    ​		{  
    
    ​			delayms(3); //去除按键抖动
    
    ​			if(key0==0)
    
    ​			{ 
    
    ​				while(1)
    
    ​				{
    
    ​					if(key1==0)  		//调节到自动模式
    
    ​					{
    
    ​						TR0=0;       //关闭定时器
    
    ​						js=0;	flag_auto=0;//计数、自动换花样变量清零
    
    ​						break;			//跳出
    
    ​					}
    
    ​					if(key0==0)  ++flag_auto;//换花样
    
    ​					if(flag_auto>3)  flag_auto=1;	//限幅,最多4个花样
    
    ​					switch(flag_auto)	//花样手动变化
    
    ​					{
    
    ​						case 0:  LED_WATER1(); break;
    
    ​						case 1:  LED_WATER2(); break;
    
    ​						case 2:  LED_WATER3(); break;
    
    ​						case 3:  LED_WATER4(); break;
    
    ​					}
    
    ​				}
    
    ​			}
    
    ​		}
    
    ​	}
    
    }
    
    

    。主程序流程图如下图所示。

    img

    在整个报警系统工作中,烟雾浓度信息经ADC0832转换处理后,由单片机进行分析处理,判断系统是否启动报警。主程序还包括LED八段式数码管浓度字符显示功能、手动报警功能、报警浓度设定功能,中断子程序等,使报警器功能更加完善,更加方便。

    预热后,程序就开始执行初始化子程序,初始化实现的功能是I/O口输入、输出状态设定, 寄存器初始化,中断功能等。首先,设定定时初值为50ms,利用IAP 写入EEPROM,作为取值间隔。然后,设置定时器0,选择方式1。方式1状态下,定时器的工作寄存器TH1、TL1,是全16位参与操作。接下来,定时器0中断的允许位置1,打开定时器0,关闭蜂鸣器,开启绿灯,设置报警限初值。

    5 原理图

    原理图由AD绘制,原理图和仿真图有出入,原理图需要电源,电源开关模块。此设计资料详细,硬件手册资料图片详细,不对硬件调试负责,做实物需要一定的基本功。主控芯片可以换为STC89C51/STC89C52

    img

    如图3.1是本系统的硬件设计方案,具体地,硬件电路由以下模块构成:

    (1)单片机最小系统。用于驱动和控制其他模块,以实现整体功能,其以STC89C51单片机为核心芯片,并辅以复位电路和晶振电路。

    (2)按键模块。用于实现自动模式与手动模式。

    (4)LED排灯模块。心形排列,用以实现多种花样电路;

    img

    (5)电源模块。用于整个系统的供电。

    7 设计报告

    7.1 设计背景与意义

    霓虹灯是城市的美容师,每当夜幕降临时,华灯初上,五颜六色的霓虹灯就把城市装扮得格外美丽。LED数码灯带采用全新的结构和专有技术,主体由高亮度发光二极管(简称LED)通过特殊的专利结构进行连接,运用特有的光学技术与专有的包覆层设计而形成。主要特性是节能、环保、防震、防水,其最大的特点就是发光均匀,360度通体发光,在工作状态下从外看不到LED的发光点,与传统霓虹灯的发光效果完全相同。因此,利用LED发光二极管设计彩色霓虹灯是一个不错的选择。

    本设计采用STC89C51单片机的彩灯控制系统,实现对LED彩灯的控制。根据用户需要可以编写若干种亮灯方式,并实现了手动控制及自动控制,各种亮灯时间的不同,在不同时刻输出灯亮或灯灭的控制信号,驱动各种颜色的灯亮或灭。亮灯方式多,用户可以根据不同场合和时间来调节亮灯频率和亮灯时间。彩灯控制系统得到了广泛应用。

    7.2 设计目的

    (1)巩固和加深对单片机原理和接口技术知识的理解;

    (2)培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;

    (3)学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;

    (4)掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;

    (5) 能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图、仿真图和流程图。

    7.3 本文结构安排

    本文围绕着基于51单片机的LED彩灯控制器展开设计,以LED花样灯需求为出发点,首先明确了研究背景与意义,介绍了设计目的,并论述了设计要求及设计内容,接下来的几章将具体展开相关设计与研究:

    第二章介绍系统总体方案及相关理论知识,重点阐述了系统功能需求和系统方案论证,接着简要介绍了系统硬件及软件基本知识。

    第三章重点展开硬件系统设计,首先明确硬件电路设计的思路及框架。接着依次介绍了:单片机最小系统、按键电路、LED灯电路、电源电路等。通过对以上重点电路的介绍,强化了硬件电路设计的细节和重点。

    第四章展开软件系统设计,通过对软件设计进行需求分析,明确软件设计的目的与需求,进一步通过程序流程图展示设计思路及框架。

    第五章介绍仿真实现步骤,特别是仿真电路实现的流程和仿真测试,完美实现了设计需求及目标。

    第六章总结全文,总结本文所做的工作及贡献,并根据存在的问题展望此课题今后的研究方向。

    img

    8 资料清单下载链接

    见文章视频

    img

    本资料下载链接

    物联沃分享整理
    物联沃-IOTWORD物联网 » “Design of a Heart-shaped LED Neon Light Controller using 51 MCU”

    发表评论