历史上的今天
返回首页

历史上的今天

今天是: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 绘制仿真电路


推荐阅读

史海拾趣

诚润电子(CHEVRON)公司的发展小趣事

在电子行业中,创新是企业持续发展的动力。诚润电子一直保持着对新技术、新产品的敏锐洞察力。他们不断投入研发资金,引进先进的生产设备和技术人才,致力于研发出更加先进、更加符合市场需求的产品。正是这种不断创新的精神,使得诚润电子在电子保护元件领域始终保持领先地位。

Cosel公司的发展小趣事

在电子行业,技术创新是企业发展的关键。Cosel公司深知这一点,因此在发展过程中不断引进先进的技术和管理理念。1979年,公司引进了质量控制圈(QC circle)活动,通过全员参与的方式提高产品质量和客户满意度。随后,公司又引进了TQC(全面质量管理)和方针管理,进一步提升了企业的运营效率和产品质量。这些举措使得Cosel公司的产品在市场上获得了良好的口碑。

Dresden Elektronik公司的发展小趣事

在技术和产品的双重驱动下,Dresden Elektronik公司开始积极拓展市场。他们不仅在国内市场上取得了显著的成绩,还积极开拓国际市场。通过参加国际展会、与跨国企业合作等方式,公司的知名度和影响力逐渐提升,市场份额也不断扩大。

HN Electronic Components GmbH & Co Kg公司的发展小趣事

背景:HN Electronics成立于20世纪90年代初,正值全球电子市场快速崛起的时期。公司由一群在半导体领域拥有丰富经验的工程师创立,他们看到了智能手机和消费电子产品市场的巨大潜力。

发展:初期,HN Electronics专注于研发高性能的电源管理芯片,通过技术创新解决了当时市场上存在的能效低、发热量大等问题。公司迅速获得了业界的认可,并与几家知名手机制造商建立了合作关系。

关键事件:1995年,HN Electronics成功推出其首款自主研发的电源管理芯片,该产品迅速成为市场热销产品,为公司赢得了第一桶金。

Atlantic Microwave Ltd公司的发展小趣事

随着国内市场的饱和,Atlantic Microwave Ltd公司开始将目光投向了更广阔的国际市场。公司组织了一支专业的国际营销团队,深入调研不同国家和地区的市场需求和文化习惯,制定了针对性的市场推广策略。同时,公司还积极参与国际电子展会和技术交流活动,展示公司的最新产品和技术实力,成功打开了多个国际市场的大门。

粤翔(FlyWin)公司的发展小趣事
保护计算机中的数据不因突然断电而丢失。

问答坊 | AI 解惑

一个典型的数控电源分析,答warrenzb等网友

网友warrenzb发主题: 数控电源  https://bbs.eeworld.com.cn/viewthread.php?tid=58642&pid=99438&page=1&extra=#pid99438 请帮助分析一下电路所附的电路,并问:为什么运放的输出接到电压输出?    这是一个很有意思 ...…

查看全部问答>

ARM简单的OS问题

现在想用ARM写一个简单的OS,需要建一个进程表,然后从进程表里面读取进程的内容,运行,删除这个进程,再读取下一个。进程的内容为很简单的应用,如利用SWI输出“Hello World!\"之类的。输出为如下的格式: Welcome! Starting process #0 Hello ...…

查看全部问答>

串口MDD问题

在串口驱动MDD层中的COM_INIT函数中有这样两条: InitializeListHead( &pSerialHead->OpenList ); InitializeCriticalSection(&(pSerialHead->OpenCS)); 这是初始化链表和初始化临界区吗?? 请问链表、临界区在这个程序中的作用是什么???…

查看全部问答>

wince控制面板里的对话框比我的屏幕尺寸大

当我点击控制面板里的图标时,wince控制面板里的对话框比总是我的屏幕尺寸要大,哪们高手有没有好的办法让弹出来的对话框大小和我的屏幕尺寸一致呢?谢谢!…

查看全部问答>

像51一样操作LM3S的I/O,很小很小的技巧

         刚从沈阳出差回来,终于看到心仪已久的板子了,太兴奋了。哈哈哈     学TI的ARM有段时间了,总感觉操作I/O不方便,写起来字太多,累得慌。没事的时候就研究了一下寄存器和驱动库的 ...…

查看全部问答>

电源开关设计30例之三

《电源开关设计30例》电子书第三季,终于完成了,come and have a look。 [ 本帖最后由 德州仪器 于 2011-3-14 15:25 编辑 ]…

查看全部问答>

430TACLK的一个问题

我看datasheet上面说TACLK引脚是定时器A时钟源输入引脚,但是如果直接置高电平或者低电平表示什么意思?希望给我大侠给我解释下…

查看全部问答>

问个wire定义问题

小弟刚学习verilog,关于有一下问题请路过的大哥帮忙解释一下谢谢 声明 wier[7:0 ] bus,wier[0:40] bus1 bus[2:0]//选择的是BUS的低3位; bus1[0:1]//选择的是bus1的高2位 bus选择低3位我能理解因为最高位是7吗; 但是bus1的高二位请问怎么理 ...…

查看全部问答>

电路常识性概念三--TTL与CMOS电平 / OC门

一.TTL      TTL集成电路的主要型式为晶体管-晶体管逻辑门(transistor-transistor logic gate),TTL大部分都采用5V电源。1.输出高电平Uoh和输出低电平Uol       Uoh≥2.4V,Uol≤0.4V2.输入高电平和输 ...…

查看全部问答>