历史上的今天
今天是:2025年12月15日(星期一)
2022年12月15日 | 【单片机】萌新の心形流水灯制作指南(保姆级)
2022-12-15 来源:zhihu
前言
希望这条博客能帮助到一些刚入门51单片机的萌新,这完全就是保姆级教程啦!
下面是这个小项目的大致的设计流程图:

提示:以下是本篇文章正文内容
一、原理图设计
A、模块电路设计
做这个项目之前可以先用 Proteus画出仿真电路图,仿真没有问题后;在用嘉立创EDA或者AD20绘制原理图再生成PCB打板。这里的模块设计是提供一个绘制原理图的设计思路:
1.最小系统
提示:如果对最小系统不熟悉或者还不是很了解的,可以点击这里: 最小系统

2.烧录电路
3.LED电路
4.供电电路
A、常用的DC供电电路
B、可自动切换DC供电(时可以给电池充电)和电池供电电的电路
5.其他电路
A、红外电路
B、蜂鸣器电路
B、整体电路设计
方案一:(AD20绘制)
PCB的3D效果展示:
方案二:(立创DEA绘制)
PCB的3D效果展示:
二、写程序仿真
1.Keil 5 编写程序
a.main.c函数
#include#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#include #define uint unsigned int#define uchar unsigned charuchar 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 绘制仿真电路
史海拾趣
|
网友warrenzb发主题: 数控电源 https://bbs.eeworld.com.cn/viewthread.php?tid=58642&pid=99438&page=1&extra=#pid99438 请帮助分析一下电路所附的电路,并问:为什么运放的输出接到电压输出? 这是一个很有意思 ...… 查看全部问答> |
|
现在想用ARM写一个简单的OS,需要建一个进程表,然后从进程表里面读取进程的内容,运行,删除这个进程,再读取下一个。进程的内容为很简单的应用,如利用SWI输出“Hello World!\"之类的。输出为如下的格式: Welcome! Starting process #0 Hello ...… 查看全部问答> |
|
当我点击控制面板里的图标时,wince控制面板里的对话框比总是我的屏幕尺寸要大,哪们高手有没有好的办法让弹出来的对话框大小和我的屏幕尺寸一致呢?谢谢!… 查看全部问答> |
|
刚从沈阳出差回来,终于看到心仪已久的板子了,太兴奋了。哈哈哈 学TI的ARM有段时间了,总感觉操作I/O不方便,写起来字太多,累得慌。没事的时候就研究了一下寄存器和驱动库的 ...… 查看全部问答> |
|
《电源开关设计30例》电子书第三季,终于完成了,come and have a look。 [ 本帖最后由 德州仪器 于 2011-3-14 15:25 编辑 ]… 查看全部问答> |
|
小弟刚学习verilog,关于有一下问题请路过的大哥帮忙解释一下谢谢 声明 wier[7:0 ] bus,wier[0:40] bus1 bus[2:0]//选择的是BUS的低3位; bus1[0:1]//选择的是bus1的高2位 bus选择低3位我能理解因为最高位是7吗; 但是bus1的高二位请问怎么理 ...… 查看全部问答> |
|
一.TTL TTL集成电路的主要型式为晶体管-晶体管逻辑门(transistor-transistor logic gate),TTL大部分都采用5V电源。1.输出高电平Uoh和输出低电平Uol Uoh≥2.4V,Uol≤0.4V2.输入高电平和输 ...… 查看全部问答> |




