【造物笔记】基于51单片机的心形流水灯
记录一下首个独立完成的小项目(虽然没有什么技术含量)
- 硬件方面:入门级的单片机点灯电路
- 软件方面:主要利用了c语言的位操作
整个项目的下载链接放在了文章最后
一、成品展示
- 正面
- 反面
二、元器件清单
STC89C52RC(51单片机)
x 1单排弯针(4Pin)
x 1IC插座(40Pin)
x1LED
x 33电阻(1KΩ)
x 34自锁按键
x 1电容(33P)
x 2电容(104P)
x 1晶振(12MB)
x 1导线
三、原理图
- 首先是
51最小系统
- LED 的接线方式:阳极接
VCC
,阴极接IO口
- 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++);
}
程序说明:
- 宏定义
DELAY_MS
是延迟时间,单位是毫秒,可以通过它控制流水灯的频率- 变量
i
是特效的执行次数,只需改变i
的值,就能改变对应特效的持续次数和时间- 变量
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单片机的心形流水灯相关推荐
- 基于51单片机的心形流水灯
心形流水灯套件 1 设计目的 (1)掌握单片机芯片AT89C51的基本功能和使用. (2)熟悉Proteus仿真软件的使用,了解各元件的功能及作用. (3)了解音乐的基本知识. (4)提高数字电子电 ...
- 基于51单片机的简易花样流水灯3(原理图+程序+仿真)
目录 硬件电路设计 仿真电路设计 程序设计 学习了LED灯的左移和右移后,下面实现多种方式的花样流水灯. 硬件电路设计 结合51单片机最小系统的知识,利用AD19画好最小系统电路(未包括电源部分). ...
- 基于51单片机的8位流水灯设计
1.要求 1.1-完成51最小系统的搭建,并且能够点亮一个LED: 1.2-8个LED灯流水闪烁(跑马灯): 1.3-设置3个按键(A按键启动.B按键控制低中高三种流水速度.C按键控制暂停与蜂鸣器长响 ...
- 【单片机】心形流水灯の制作指南(保姆级)
✌ 作者简介:盐焗小星球_wyb,一名电子信息大学生.
- 【单片机】心形流水灯——27种流水方式
✌ 作者简介:盐焗小星球_wyb,一名在读的电子信息工程专业大学生.
- 基于51单片机《按键控制流水灯》
1.用4个LED灯发光二极管实现至少四种灯光效果 2.可以通过输入按键在几种灯光之间切换 3.可以通过暂停按键停止彩色灯光效果,使小灯全亮,再次按下按键后继续之前的效果 4.增加自动在几种效果间切换功 ...
- 基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计
基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计 必看!!视频讲解 基于51单片机的LED彩灯霓虹灯心形流水灯设计 这里写目录标题 1 开发环境 2 功能说明介绍 3 仿真图 4 ...
- 【DIY】多模式51单片机心形流水灯+呼吸灯+蜂鸣器音乐
目录: 总体设计 1.基础硬件DIY设计 1)整体原理图 2)PCB电路 3)3D_PCB 2.单片机程序设计 1)呼吸灯[简易模拟PWM] 2)蜂鸣器音乐 3)几种简易流水灯方式 3.效果展示 1) ...
- 立创开源 51编程炫酷心形流水灯
随着AI人工智能和物联网的兴起下一个信息革命即将到来,信息时代的AI和物联网无意识地扩散到生产和生活各个领域.物联网是用于扩展通信网络和互联网的应用程序.使用传感技术和智能设备来感知和控制物理世界.它 ...
最新文章
- pam_frpintd.so 错误修复
- qq无限时间撤回消息bug_手机QQ新功能汇总,比微信有意思多了
- R语言使用scales包的hue_pal函数获取ggplot2任何级别的离散色码、使用scales包的hue_pal函数获取ggplot2任何级别的反序(reverse)离散色码
- 华为交换机端口组配置实例
- cambridge map
- ocp 043 第十三章:管理资源
- 记录一个layui框架之自定义模块出现的问题
- python二叉树的创建与遍历
- windows查看linux文件中文,Linux 系统下无法查看Windows 中创建的中文文件名
- linux tomcat 改端口号,Ubuntu中Tomcat更改80端口
- 三角学——极坐标_2
- 把本地的jar包打包到maven本地仓库里
- ObservableScrollView实现
- mysql浮点数据怎么_MySQL数据浮点类型的实际应用操作
- 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(全部根到叶子结点组组成的数字相加)】...
- java将多张图片合成视频
- 1331:【例1-2】后缀表达式的值
- ECCV2020超分辨率方向论文整理笔记
- (FFT)快速傅里叶变换在目标跟踪中的运用
- ARM汇编寄存器和常用指令详解
热门文章
- 【Unity 3D 从入门到实战】Unity 3D 导航系统
- 【网络协议详解】——GNS3的使用(学习笔记)
- 元宇宙赛道火热已是共识!上市公司正加码布局,基础设施支撑待完善
- 页面提交后提示“连接被重置”或“载入页面时到服务器的连接被重置”的问题分析
- Cleaning Shifts POJ - 2376(反贪?)
- 微擎在平台入口不显示安装的模块_【微擎系统】2.0.8更新说明
- STM32使用stm32cubemx LL库系列教程
- 面向对象封装放大镜js代码
- 时序约束之 set_max_delay / set_min_delay
- 设置/恢复系统隐藏文件 - Windows系统