记录一下首个独立完成的小项目(虽然没有什么技术含量)

  • 硬件方面:入门级的单片机点灯电路
  • 软件方面:主要利用了c语言的位操作

整个项目的下载链接放在了文章最后

一、成品展示

  1. 正面

  1. 反面

二、元器件清单

  • STC89C52RC(51单片机) x 1
  • 单排弯针(4Pin) x 1
  • IC插座(40Pin) x1
  • LED x 33
  • 电阻(1KΩ) x 34
  • 自锁按键 x 1
  • 电容(33P) x 2
  • 电容(104P) x 1
  • 晶振(12MB) x 1
  • 导线

三、原理图

  1. 首先是51最小系统
  2. LED 的接线方式:阳极接VCC,阴极接IO口
  3. LED 的布局

四、思路

LED 的阳极接正极,阴极接IO口,所以

  • 将对应的IO口置为低电平即可点亮 LED
  • 将对应的IO口置为高电平即可熄灭LED

只需要对一个32位无符号整数 (C51中是unsigned long) 进行操作,最后将它的值分为4组,分别赋值给P0、P1、P2、P3 IO口。

void setLed(u32 res)
{P2 = (res & 0x000000FF) >> (0*4);P0 = (res & 0x0000FF00) >> (2*4);P1 = (res & 0x00FF0000) >> (4*4);P3 = (res & 0xFF000000) >> (6*4);
}


一定要注意 LED 的连接顺序

五、程序

a. 程序框架

/*** Author:BY @ DLU Intelligent Control* Time: 2020-12-13* Version: 1.0*/#include <reg52.h>
#include <intrins.h>#define DELAY_MS 10typedef unsigned long u32;void setLed(u32 res);
void delay(u32 ms);void main()
{u32 a = ~(0x00000001), b = 0;u32 k = 0, i = 0;while(1){// 将特效代码粘贴在这里}
}void setLed(u32 res)
{P2 = (res & 0x000000FF) >> (0*4);P0 = (res & 0x0000FF00) >> (2*4);P1 = (res & 0x00FF0000) >> (4*4);P3 = (res & 0xFF000000) >> (6*4);
}void delay(u32 n)
{u32 i = 0, j = 0;for (i = 0; i < n; i++)for (j = 0; j < 123; j++);
}

程序说明:

  1. 宏定义 DELAY_MS 是延迟时间,单位是毫秒,可以通过它控制流水灯的频率
  2. 变量 i 是特效的执行次数,只需改变 i 的值,就能改变对应特效的持续次数和时间
  3. 变量 a 是将要操作的32位整数,改变 a 的初值,可以实现不同的特效

b. 特效代码

// 闪烁
i = 20;
a = 0;
for(k = 0; k < i; k++)
{delay(DELAY_MS * 2);a = ~a;setLed(a);
}

// 正转1圈
i = 32;
a = ~(0x00000001);
for(k = 0; k < i; k++)
{delay(DELAY_MS / 2);a = _lrol_(a, 1);setLed(a);
}// 反转1圈
i = 32;
a = ~(0x80000000);
for(k = 0; k < i; k++)
{delay(DELAY_MS / 2);a = _lror_(a, 1);setLed(a);
}

// 逐个点亮
i = 32;
a = ~(0x00000001);
for(k = 0; k < i; k++)
{delay(DELAY_MS);a = a >> 1;setLed(a);
}// 逐个灭掉
i = 32;
a = 0;
for(k = 0; k < i; k++)
{delay(DELAY_MS);a = (a + 1) << 1;setLed(a);
}

// 只灭一个,正转1圈
i = 32;
a = 0x00000001;
for(k = 0; k < i; k++)
{delay(DELAY_MS / 2);a = _lrol_(a, 1);setLed(a);
}// 只灭一个,反转1圈
i = 32;
a = (0x80000000);
for(k = 0; k < i; k++)
{delay(DELAY_MS / 2);a = _lror_(a, 1);setLed(a);
}

// 两边逐个点亮
i = 16;
a = ~(0xFFFF0001);
b = ~(0xFFFF8000);
for(k = 0; k < i; k++)
{delay(DELAY_MS);a = a << 1;b = b >> 1;setLed((a << 16) | b);
}

// 循环闪烁(只灭8个)
i = 100;
a = (0x11111111);
for(k = 0; k < i; k++)
{delay(DELAY_MS);a = _lrol_(a, 1);setLed(a);
}

// 循环闪烁(只亮8个)
i = 100;
a = ~(0x11111111);
for(k = 0; k < i; k++)
{delay(DELAY_MS);a = _lrol_(a, 1);setLed(a);
}

特效当然不只这么多,你可以自己思考一下,做出更多有意思的特效

c. 完整的程序

/*** Author:BY @ DLU Intelligent Control* Time: 2020-12-13* Version: 1.0*/#include <reg52.h>
#include <intrins.h>#define DELAY_MS 10typedef unsigned long u32;void setLed(u32 res);
void delay(u32 ms);void main()
{u32 a = ~(0x00000001), b = 0;u32 k = 0, i = 320;while(1){// 正转1圈i = 32;a = ~(0x00000001);for(k = 0; k < i; k++){delay(DELAY_MS / 2);a = _lrol_(a, 1);setLed(a);}// 反转1圈i = 32;a = ~(0x80000000);for(k = 0; k < i; k++){delay(DELAY_MS / 2);a = _lror_(a, 1);setLed(a);}// 逐个点亮i = 32;a = ~(0x00000001);for(k = 0; k < i; k++){delay(DELAY_MS);a = a >> 1;setLed(a);}// 逐个灭掉i = 32;a = 0;for(k = 0; k < i; k++){delay(DELAY_MS);a = (a + 1) << 1;setLed(a);}// 逐个点亮i = 32;a = ~(0x00000001);for(k = 0; k < i; k++){delay(DELAY_MS);a = a >> 1;setLed(a);}// 闪烁几下i = 20;a = 0;for(k = 0; k < i; k++){delay(DELAY_MS * 2);a = ~a;setLed(a);}// 只灭一个,正转1圈i = 32;a = 0x00000001;for(k = 0; k < i; k++){delay(DELAY_MS / 2);a = _lrol_(a, 1);setLed(a);}// 只灭一个,反转1圈i = 32;a = (0x80000000);for(k = 0; k < i; k++){delay(DELAY_MS / 2);a = _lror_(a, 1);setLed(a);}// 两边逐个点亮i = 16;a = ~(0xFFFF0001);b = ~(0xFFFF8000);for(k = 0; k < i; k++){delay(DELAY_MS);a = a << 1;b = b >> 1;setLed((a << 16) | b);}// 两边逐个点亮i = 16;a = ~(0xFFFF0001);b = ~(0xFFFF8000);for(k = 0; k < i; k++){delay(DELAY_MS);a = a << 1;b = b >> 1;setLed((a << 16) | b);}// 循环闪烁(只灭8个)i = 100;a = (0x11111111);for(k = 0; k < i; k++){delay(DELAY_MS);a = _lrol_(a, 1);setLed(a);}// 两边逐个点亮i = 16;a = ~(0xFFFF0001);b = ~(0xFFFF8000);for(k = 0; k < i; k++){delay(DELAY_MS);a = a << 1;b = b >> 1;setLed((a << 16) | b);}// 两边逐个点亮i = 16;a = ~(0xFFFF0001);b = ~(0xFFFF8000);for(k = 0; k < i; k++){delay(DELAY_MS);a = a << 1;b = b >> 1;setLed((a << 16) | b);}// 闪几下i = 20;a = 0;for(k = 0; k < i; k++){delay(DELAY_MS * 2);a = ~a;setLed(a);}// 循环闪烁(只亮8个)i = 100;a = ~(0x11111111);for(k = 0; k < i; k++){delay(DELAY_MS);a = _lrol_(a, 1);setLed(a);}}
}void setLed(u32 res)
{P2 = (res & 0x000000FF) >> (0*4);P0 = (res & 0x0000FF00) >> (2*4);P1 = (res & 0x00FF0000) >> (4*4);P3 = (res & 0xFF000000) >> (6*4);
}void delay(u32 n)
{u32 i = 0, j = 0;for (i = 0; i < n; i++)for (j = 0; j < 123; j++);
}

六、扩展

1、还可以利用PWM做出呼吸灯的效果

2、可以使用下面这种彩色的 LED ,效果会更好

七、完整项目下载

点击下载完整项目(基于Keil)


板子焊完了

程序写出来了

就等国家分配对象了


致正在学习嵌入式的小伙伴们:
嵌入式的学习是要基础知识 + 动手实践同步进行的,在这里给大家推荐一个可以系统学习嵌入式和刷题的网站:牛客网(传送门:牛客网)。

牛客网原本是一个刷 IT 题库的网站,经过多年的发展,已经成为了一个集 课程+刷题+面经+求职+讨论区分享 的一站式求职学习网站,最最最重要的里面的资源全部免费, 而最近他们正打算将这套模式推广到嵌入式行业,专门为嵌入式工程师开设了相应的板块,正在学习嵌入式、寻找嵌入式专项题库、想要找嵌入式相关工作但又缺乏经验的小伙伴们,千万不要错过(链接在下面哦)!

  • 牛客网 - 嵌入式专项题库
  • 牛客网 - 嵌入式学习专区

【造物笔记】基于51单片机的心形流水灯相关推荐

  1. 基于51单片机的心形流水灯

    心形流水灯套件 1  设计目的 (1)掌握单片机芯片AT89C51的基本功能和使用. (2)熟悉Proteus仿真软件的使用,了解各元件的功能及作用. (3)了解音乐的基本知识. (4)提高数字电子电 ...

  2. 基于51单片机的简易花样流水灯3(原理图+程序+仿真)

    目录 硬件电路设计 仿真电路设计 程序设计 学习了LED灯的左移和右移后,下面实现多种方式的花样流水灯. 硬件电路设计 结合51单片机最小系统的知识,利用AD19画好最小系统电路(未包括电源部分). ...

  3. 基于51单片机的8位流水灯设计

    1.要求 1.1-完成51最小系统的搭建,并且能够点亮一个LED: 1.2-8个LED灯流水闪烁(跑马灯): 1.3-设置3个按键(A按键启动.B按键控制低中高三种流水速度.C按键控制暂停与蜂鸣器长响 ...

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

    ✌ 作者简介:盐焗小星球_wyb,一名电子信息大学生.

  5. 【单片机】心形流水灯——27种流水方式

    ✌ 作者简介:盐焗小星球_wyb,一名在读的电子信息工程专业大学生.

  6. 基于51单片机《按键控制流水灯》

    1.用4个LED灯发光二极管实现至少四种灯光效果 2.可以通过输入按键在几种灯光之间切换 3.可以通过暂停按键停止彩色灯光效果,使小灯全亮,再次按下按键后继续之前的效果 4.增加自动在几种效果间切换功 ...

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

    基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计 必看!!视频讲解 基于51单片机的LED彩灯霓虹灯心形流水灯设计 这里写目录标题 1 开发环境 2 功能说明介绍 3 仿真图 4 ...

  8. 【DIY】多模式51单片机心形流水灯+呼吸灯+蜂鸣器音乐

    目录: 总体设计 1.基础硬件DIY设计 1)整体原理图 2)PCB电路 3)3D_PCB 2.单片机程序设计 1)呼吸灯[简易模拟PWM] 2)蜂鸣器音乐 3)几种简易流水灯方式 3.效果展示 1) ...

  9. 立创开源 51编程炫酷心形流水灯

    随着AI人工智能和物联网的兴起下一个信息革命即将到来,信息时代的AI和物联网无意识地扩散到生产和生活各个领域.物联网是用于扩展通信网络和互联网的应用程序.使用传感技术和智能设备来感知和控制物理世界.它 ...

最新文章

  1. pam_frpintd.so 错误修复
  2. qq无限时间撤回消息bug_手机QQ新功能汇总,比微信有意思多了
  3. R语言使用scales包的hue_pal函数获取ggplot2任何级别的离散色码、使用scales包的hue_pal函数获取ggplot2任何级别的反序(reverse)离散色码
  4. 华为交换机端口组配置实例
  5. cambridge map
  6. ocp 043 第十三章:管理资源
  7. 记录一个layui框架之自定义模块出现的问题
  8. python二叉树的创建与遍历
  9. windows查看linux文件中文,Linux 系统下无法查看Windows 中创建的中文文件名
  10. linux tomcat 改端口号,Ubuntu中Tomcat更改80端口
  11. 三角学——极坐标_2
  12. 把本地的jar包打包到maven本地仓库里
  13. ObservableScrollView实现
  14. mysql浮点数据怎么_MySQL数据浮点类型的实际应用操作
  15. 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(全部根到叶子结点组组成的数字相加)】...
  16. java将多张图片合成视频
  17. 1331:【例1-2】后缀表达式的值
  18. ECCV2020超分辨率方向论文整理笔记
  19. (FFT)快速傅里叶变换在目标跟踪中的运用
  20. ARM汇编寄存器和常用指令详解

热门文章

  1. 【Unity 3D 从入门到实战】Unity 3D 导航系统
  2. 【网络协议详解】——GNS3的使用(学习笔记)
  3. 元宇宙赛道火热已是共识!上市公司正加码布局,基础设施支撑待完善
  4. 页面提交后提示“连接被重置”或“载入页面时到服务器的连接被重置”的问题分析
  5. Cleaning Shifts POJ - 2376(反贪?)
  6. 微擎在平台入口不显示安装的模块_【微擎系统】2.0.8更新说明
  7. STM32使用stm32cubemx LL库系列教程
  8. 面向对象封装放大镜js代码
  9. 时序约束之 set_max_delay / set_min_delay
  10. 设置/恢复系统隐藏文件 - Windows系统