【单片机】心形流水灯の制作指南(保姆级)

✌ 作者简介:神奇的汪同学,一名电子信息大学生.
📑 个人主页:神奇的汪同学主页👀
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
🔥 如果感觉博主的文章还不错的话,还请不吝 关注、点赞、收藏三连哦!


前言

提示:这里是本文的前言内容:
希望这条博客能帮助到一些刚入门51单片机的萌新,这完全就是保姆级教程啦!下面是这个小项目的大致的设计流程图:
在这里插入图片描述


提示:以下是本篇文章正文内容

一、原理图设计

A、模块电路设计

做这个项目之前可以先用 Proteus画出仿真电路图,仿真没有问题后;在用嘉立创EDA或者AD20绘制原理图再生成PCB打板。这里的模块设计是提供一个绘制原理图的设计思路:

1.最小系统

提示:如果对最小系统不熟悉或者还不是很了解的,可以点击这里: 最小系统
在这里插入图片描述

2.烧录电路

在这里插入图片描述

3.LED电路

在这里插入图片描述
在这里插入图片描述

4.供电电路

A、常用的DC供电电路
在这里插入图片描述
B、可自动切换DC供电(时可以给电池充电)和电池供电电的电路
在这里插入图片描述

5.其他电路

A、红外电路
在这里插入图片描述
B、蜂鸣器电路
在这里插入图片描述

B、整体电路设计

方案一:(AD20绘制)

在这里插入图片描述
PCB的3D效果展示:

心形流水灯PCB展示!

方案二:(立创DEA绘制)

请添加图片描述
PCB的3D效果展示:

【单片机】心形流水灯贴片版为了能免费打板用立创eda又重新画了一遍!新增电源管理模块可以给3.7v锂电池充电供电还有一些个人喜欢的logo

二、写程序仿真

1.Keil 5 编写程序

a.main.c函数

#include <REGX51.H>
#include "display.h"

//主函数
void main()
{
	while(1)
	{
		disp0_f_3();
		disp0_f_all();
		disp0_f_plus();
		disp0_f_updown();
		disp0_f_left();
		disp0_f_diagonal();
		disp0_f();
			
		disp1_CW();
	  	disp1_CW_B();
		disp1_CCW();
	    disp1_CCW_B();
		disp1_cwcc_4();
		disp1_CW_4();
		disp1_CW_4B();
		disp1_CCW_4();
		disp1_CCW_4B();
		disp1_CW_2();
		disp1_CCW_2();
		disp1_updown_2();
 		disp1_updown_2B();
		disp1_updown_2plus();
		disp1_downup_2();
		disp1_downup_2B();
		disp1_Lout();
		disp1_Rout();
			
		disp2_bright_cwout();
		disp2_bright_ccwout();

	}
}

b.display.c函数

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char


uchar i,j,k;
uint tt=70;
uint time=200;
uint time1=80;

uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar code table2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};

uchar code table4[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
uchar code table5[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};



void delay(uint time)        
{
	uint x,y;
	for(x=time;x>0;x--)
	for(y=110;y>0;y--);
}


void disp0_f_3()
{
	for(i=0;i<3;i++)
	{
		P0=0x00; P2=0x00; P1=0x00; P3=0x00;
		delay(200);
		P0=0xff; P2=0xff; P1=0xff; P3=0xff;
		delay(200);
	}
}

void disp0_f_all()
{
	for(i=0;i<8;i++)
	{
		P1=~P1;
		P3=~P3;
		P2=~P2;
		P0=~P0;
		delay(100);
	}
}


void disp0_f_plus()
{
	for(i=0;i<9;i++)
	{
		P0=0x00; P1=0x00; P2=0x00; P3=0x00;
		delay(time);
		P0=~P0; P1=~P1; P2=~P2; P3=~P3;
		delay(time);
		time=time-22;
		if(time==2) time=200;
	}
}


void disp0_f_updown() 
{
	for(i=0;i<8;i++)
	{
		P1=0x00; P0=0x00;
		P2=0xff; P3=0xff;
		delay(100);
		P1=0xff; P0=0xff;
		P2=0x00; P3=0x00;
		delay(100);
	}
}


void disp0_f_left()
{
	for(i=0;i<8;i++)
	{
		P1=0x00; P3=0x00;
		P0=0xff; P2=0xff;
		delay(100);
		P1=0xff; P3=0xff;
		P0=0x00; P2=0x00;
		delay(100);
	}
}


void disp0_f_diagonal()
{
	for(i=0;i<8;i++)
	{
		P1=0x00; P2=0x00;
		P0=0xff; P3=0xff;
		delay(100);
		P1=0xff; P2=0xff;
		P0=0x00; P3=0x00;
		delay(100);
	}
	P0=0xff; P3=0xff;
}


void disp0_f()
{
	P2=0x00;P3=0x00;
	for(i=0;i<8;i++)
	{
		P1=table2[i];
		P0=table2[i];
		delay(100);
	}
	disp0_f_3();
	P0=0xff;P1=0xff;
	P2=0xff;P3=0xff;
}

void disp1_CW()
{
	for(i=0;i<8;i++)
	{
		P0=table0[i];
		delay(100);
	}
	P0=0xff;
	for(i=0;i<8;i++)
	{
		P2=table1[i];
		delay(100);
	}
	P2=0xff;
	for(i=0;i<8;i++)
	{
		P3=table1[i];        
		delay(100);
	}
	P3=0xff;
	for(i=0;i<8;i++)
	{
		P1=table1[i];
		delay(100);
	}
	P1=0xff;
}



void disp1_CW_B()
{
	for(j=0;j<3;j++)
	{
		for(i=0;i<8;i++)
		{
			P0=table2[i];
			delay(time1);
		}
		for(i=0;i<8;i++)
		{
			P2=table3[i];
			delay(time1);
		}
		for(i=0;i<8;i++)
		{
			P3=table3[i];        
			delay(time1);
		}
		for(i=0;i<8;i++)
		{
			P1=table3[i];
			delay(time1);
		}
		time1=time1-20;
		if(time1<30) time1=80;
		P1=0xff;	P3=0xff; 	P2=0xff;	P0=0xff;
	}
}


void disp1_CCW()
{
	for(i=0;i<8;i++)
	{
		P1=table0[i];
		delay(100);
	}
	P1=0xff;
	for(i=0;i<8;i++)
	{
		P3=table0[i];
		delay(100);
	}
	P3=0xff;
	for(i=0;i<8;i++)
	{
		P2=table0[i];        
		delay(100);
	}
	P2=0xff;
	for(i=0;i<8;i++)
	{
		P0=table1[i];
		delay(100);
	}
	P0=0xff;
}

void disp1_CCW_B()
{
	for(j=0;j<3;j++)
	{
		for(i=0;i<8;i++)
		{
			P1=table2[i];
			delay(time1);
		}
		for(i=0;i<8;i++)
		{
			P3=table2[i];
			delay(time1);
		}
		for(i=0;i<8;i++)
		{
			P2=table2[i];        
			delay(time1);
		}
		for(i=0;i<8;i++)
		{
			P0=table3[i];
			delay(time1);
		}
		time1=time1-20;
		if(time1<30) time1=80;
		P1=0xff;	P3=0xff; 	P2=0xff;	P0=0xff;
	}
}


void disp1_cwcc_4()
{
	for(i=0;i<8;i++)
	{
		P1=table1[i];
		P3=table1[i];
		P2=table1[i];
		P0=table0[i];
		delay(100);
	}
	for(i=0;i<8;i++)
	{
		P1=table0[i];
		P3=table0[i];
		P2=table0[i];
		P0=table1[i];
		delay(100);
	}
}


void disp1_CW_4()
{
	for(i=0;i<8;i++)
	{
		P1=table1[i];
		P3=table1[i];
		P2=table1[i];
		P0=table0[i];
		delay(100);
	}
	P1=0xff;	P3=0xff; 	P2=0xff;	P0=0xff;
}


void disp1_CW_4B()
{
	for(i=0;i<8;i++)
	{
		P1=table3[i];
		P3=table3[i];
		P2=table3[i];
		P0=table2[i];
		delay(100);
	}
	P1=0xff;	P3=0xff; 	P2=0xff;	P0=0xff;
}


void disp1_CCW_4()
{
	for(i=0;i<8;i++)
	{
		P1=table0[i];
		P3=table0[i];
		P2=table0[i];
		P0=table1[i];
		delay(100);
	}
	P1=0xff;	P3=0xff; 	P2=0xff;	P0=0xff;
}


void disp1_CCW_4B()
{
	for(i=0;i<8;i++)
	{
		P1=table2[i];
		P3=table2[i];
		P2=table2[i];
		P0=table3[i];
		delay(100);
	}
	P1=0xff;	P3=0xff; 	P2=0xff;	P0=0xff;
}


void disp1_CW_2()
{
	for(i=0;i<8;i++)
	{
		P1=table0[i];
		P2=table0[i];
		delay(100);
	}
	P1=0xff;
	P2=0xff;
	for(i=0;i<8;i++)
	{
		P3=table0[i];
		P0=table1[i];
		delay(100);
	}
	P3=0xff;
	P0=0xff;
}


void disp1_CCW_2()
{
	for(i=0;i<8;i++)
	{
		P3=table1[i];
		P0=table0[i];
		delay(100);
	}
	P3=0xff;
	P0=0xff;
	for(i=0;i<8;i++)
	{
		P1=table1[i];
		P2=table1[i];
		delay(100);
	}
	P1=0xff;
	P2=0xff;
}


void disp1_updown_2()
{
	for(i=0;i<8;i++)
	{
		P1=table0[i];
		P0=table0[i];
		delay(50);
	}
	P1=0xff;P0=0xff;
	for(i=0;i<8;i++)
	{
		P3=table0[i];
		P2=table1[i];
		delay(50);
	}
	P3=0xff;P2=0xff;
}


void disp1_updown_2B()
{
	for(i=0;i<8;i++)
	{
		P1=table2[i];
		P0=table2[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P3=table2[i];
		P2=table3[i];
		delay(50);
	}
	P1=0xff;P0=0xff;
	P3=0xff;P2=0xff;
}


void disp1_updown_2plus()
{

	for(j=0;j<5;j++)
	{
		for(i=0;i<8;i++)
		{
			P1=table0[i];
			P0=table0[i];
			delay(tt);
		}
		P1=0xff; P0=0xff;
		for(i=0;i<8;i++)
		{
			P3=table0[i];
			P2=table1[i];
			delay(tt);
		}
		P3=0xff; P2=0xff;
		tt=tt-10;
	}


	for(j=0;j<16;j++)
	{
		for(i=0;i<8;i++)
		{
			P1=table0[i];
			P0=table0[i];
			delay(20);
		}
		P1=0xff; P0=0xff;
		for(i=0;i<8;i++)
		{
			P3=table0[i];
			P2=table1[i];
			delay(20);
		}
		P3=0xff; P2=0xff;
	}
	
	tt=20;

	for(j=0;j<5;j++)
	{
		for(i=0;i<8;i++)
		{
			P1=table0[i];
			P0=table0[i];
			delay(tt);
		}
		P1=0xff; P0=0xff;
		for(i=0;i<8;i++)
		{
			P3=table0[i];
			P2=table1[i];
			delay(tt);
		}
		P3=0xff; P2=0xff;
		tt=tt+10;
	}
	tt=70; 

}


void disp1_downup_2()
{
	for(i=0;i<8;i++)
	{
		P3=table1[i];
		P2=table0[i];
		delay(100);
	}
	P3=0xff;
	P2=0xff;
	for(i=0;i<8;i++)
	{
		P1=table1[i];
		P0=table1[i];
		delay(100);
	}
	P1=0xff;
	P0=0xff;
}


void disp1_downup_2B()
{
	for(i=0;i<8;i++)
	{
		P3=table3[i];
		P2=table2[i];
		delay(100);
	}
	for(i=0;i<8;i++)
	{
		P1=table3[i];
		P0=table3[i];
		delay(100);
	}
	P1=0xff;	P3=0xff; 	P2=0xff;	P0=0xff;
}


void disp1_Lout() 
{
	P1=0xff;P0=0xff;
	P2=0xff;P3=0xff;
	for(i=0;i<8;i++)
	{
		P1=table2[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P3=table2[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P2=table2[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P0=table3[i];
		delay(50);
	}
	
	delay(100);
	for(i=0;i<8;i++)
	{
		P1=table4[i];
		P0=table4[i];
		delay(50);
	}
	P1=0xff;P0=0xff;
	for(i=0;i<8;i++)
	{
		P3=table4[i];
		P2=table5[i];
		delay(50);
	}
	P3=0xff;P2=0xff;
	delay(100); 
}


void disp1_Rout()  
{
	P1=0xff;P0=0xff;
	P2=0xff;P3=0xff;
	for(i=0;i<8;i++)
	{
		P0=table2[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P2=table3[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P3=table3[i];
		delay(50);
	}
	for(i=0;i<8;i++)
	{
		P1=table3[i];
		delay(50);
	}
	
	delay(100);
	for(i=0;i<8;i++)
	{
		P1=table4[i];
		P0=table4[i];
		delay(50);
	}
	P1=0xff;P0=0xff;
	for(i=0;i<8;i++)
	{
		P3=table4[i];
		P2=table5[i];
		delay(50);
	}
	P3=0xff;P2=0xff;
	delay(100); 
}


void disp2_bright_cwout()
{
	P1=0x00; P3=0x00; P2=0x00; P0=0x00;
	for(i=0;i<8;i++)
	{
		P1=table5[i];
		P3=table5[i];
		P2=table5[i];
		P0=table4[i];
		delay(100);
	}
	P1=0xff; P3=0xff;P2=0xff;P0=0xff;
}


void disp2_bright_ccwout()
{
	P1=0x00; P3=0x00; P2=0x00; P0=0x00;
	for(i=0;i<8;i++)
	{
		P1=table4[i];
		P3=table4[i];
		P2=table4[i];
		P0=table5[i];
		delay(100);
	}
	P1=0xff; P3=0xff;P2=0xff;P0=0xff;
}

c.display.h函数

#ifndef __DISPLAY_H__
#define __DISPLAY_H__

/*--------闪烁--------*/
void disp0_f_3();
void disp0_f_all();
void disp0_f_plus();
void disp0_f_updown();
void disp0_f_left();
void disp0_f_diagonal();
void disp0_f();

/*--------单个流水--------*/
void disp1_CW();
void disp1_CW_B();
void disp1_CCW();
void disp1_CCW_B();
void disp1_cwcc_4();
void disp1_CW_4();
void disp1_CW_4B();
void disp1_CCW_4();
void disp1_CCW_4B();
void disp1_CW_2();
void disp1_CCW_2();
void disp1_updown_2();
void disp1_updown_2B();
void disp1_updown_2plus();
void disp1_downup_2();
void disp1_downup_2B();
void disp1_Lout();
void disp1_Rout();


/*--------全亮全灭--------*/
void disp2_bright_cwout();
void disp2_bright_ccwout();


#endif

2.Proteus 8 绘制仿真电路

在这里插入图片描述

【单片机】Proteus仿真心形流水灯

三、PCB布局

提示:以下虽是AD20画板流程,但用立创EDA画板时同样可以参考绘制流程

1.布局、布线和放置Logo

在这里插入图片描述

2.铺铜和DRC检查

a、顶层
在这里插入图片描述
b、底层
在这里插入图片描述

3.生成Gerber文件

生成Gerber文件
在这里插入图片描述
检查DRC
在这里插入图片描述
导出到工程文件夹
在这里插入图片描述在这里插入图片描述

四、打板、采样、焊接和烧录

1.打板

上传Gerber文件后,选择层数、尺寸和板子数量(默认5片)
请添加图片描述
确认生产稿选择:不需要(其他默认如图设置)
请添加图片描述
可以选择自己喜欢的阻焊颜色:这里默认绿色(嘉立创紫色也挺好看的)
在这里插入图片描述
选择交期:默认选择免费加急
在这里插入图片描述
SMT贴片:选择不需要
在这里插入图片描述
激光网选项:选择不需要
请添加图片描述
填写自己的收货地址和联系方式
请添加图片描述

2.采样

下面是元器件采样清单(仅供参考)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

平台是有优惠券的,可以选择优惠券再下单哦!

在这里插入图片描述

3.焊接

准备好焊接工具:电烙铁、锡丝和铁架台(海绵垫)即可
在这里插入图片描述
准备好PCB板和元器件:
a、PCB电路板:
在这里插入图片描述
在这里插入图片描述

b、元器件:

4.烧录

准备好一个烧录器:
在这里插入图片描述
用STC-ISP软件把写好得hex文件下载到单片机里面
在这里插入图片描述

五、成品展示


总结

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神奇的汪同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值