TWAS手把手教你做呼吸灯-基于51单片机学习板

内容比较简单,发这个贴主要是针对新手!什么是呼吸灯?

顾名思义,灯光在微电脑控制之下完成由亮到暗的逐渐变化,感觉像是在呼吸。用专业的话来说是通过控制PWM的占空比来完成对LED亮度的控制

什么是PWM和占空比?

脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。

占空比:高电平在一个周期之内所占的时间比率。

呼吸灯原理

当一颗LED在高速闪烁,闪烁的频率已经超过了人眼的感知的范围,那么我们看到这颗LED就是一直亮的,也就是视觉暂留现象(余晖效应)。如果

我们控制一次闪烁中亮和灭的时间(修改占空比),就可以控制亮度。

代码实现:

/*******************************************************

*  程序名称:main.c

*  程序功能:实现呼吸灯的主程序文件

*  程序作者:TWAS

*  创建时间:2015-1-22

*  修改时间:

*  程序版本:V0.1

*******************************************************/

/* 包含的头文件 */

#include

/* 寻址变量定义 */

sbit LED_Drive = P3^5;         /* 定义驱动LED的IO口,LED为共阳 */

/******************************************************

* 函数名称:main

* 函数功能:主函数

* 入口参数:NULL

* 出口参数:NULL

*******************************************************/

int main()

{

unsigned char i;

/* 初始化 */

LED_Drive = 1;

/* 主循环 */

while(1)

{

for(i = 0; i < 200; i++)

{

/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED

* 通过修改if后面的值,就可以改变占空比

*/

if(i < 10)

{

LED_Drive = 0;

}

else

{

LED_Drive = 1;

}

}

}

return 0;

}

/******************************************

*                      程序结束

*****************************************/

可以明显看出我们所控制的LED比电源灯暗许多,既然我们会控制亮度,想实现呼吸灯也就变的简单了

代码实现:(为了节约空间和界面简洁,只贴出主要实现的部分)

int main()

{

unsigned char         i;

unsigned char ucNum = 0;                 /* 新增两个变量,ucNum控制占空比*/

bit            bAdd = 1;                 /* bAdd选择是增大占空比还是减小占空比 */

/* 初始化 */

LED_Drive = 1;

/* 主循环 */

while(1)

{

for(i = 0; i < 200; i++)

{

/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED

* 通过修改if后面的值,就可以改变占空比

*/

if(i < ucNum)

{

LED_Drive = 0;

}

else

{

LED_Drive = 1;

}

}

/* 选择是增大占空比还是减小占空比 */

if (1 == bAdd)

{

ucNum++;

}

else

{

ucNum--;

}

/* 当Num等于200也就是最大值时,bAdd置0,Num开始减小 */

if (200 == ucNum)

{

bAdd = 0;

}

/* 当Num等于200也就是最大值时,bAdd置1,Num开始增大 */

else if (0 == ucNum)

{

bAdd = 1;

}

}

return 0;

}

由于图片看不到效果,这个地方就不贴图了,根据测试,我们的所需要的功能实现了!

但是这时候有的人就有疑问了,这是很普通的LED,那如果是特殊一点的呢?比如我所用的

学习板上面,16颗LED是用595驱动的,那呼吸灯又该如何实现呢?

其实很简单,我们把驱动LED的函数封装一下,直接替换,其它不变就行了!

代码实现:(为了节约空间和界面简洁,只贴出主要实现的部分)

for(i = 0; i < 200; i++)

{

/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED

* 通过修改if后面的值,就可以改变占空比

*/

if(i < ucNum)

{

DriveLED(0x0003);   /* LED驱动,点亮D1和D2 */

}

else

{

DriveLED(0x0002);   /* LED驱动,熄灭D1点亮D2 */

}

}

当我把程序改成这样的时候,出了一点问题,不能呼吸,变成闪烁了!等等,先把LED驱动部分发一下:

/******************************************************

* 函数名称:SendData

* 函数功能:74HC595数据的发送

* 入口参数:unsigned int uiDataOne, unsigned int uiDataTwo

* 出口参数:void

*******************************************************/

void SendData(unsigned char ucDataOne, unsigned char ucDataTwo)

{

unsigned int i = 0;

/* 将片选信号置为低电平 */

HC595RCK = 0;

/* 输入第一个数据:uiDataOne */

for (i = 0; i < 8; i++)

{

/* 给出脉冲信号,首先将CLK置为0 */

HC595CLK = 0;

if (0 != (ucDataOne & 0x80))

{

HC595DATA = 1;

}

else

{

HC595DATA = 0;

}

/* 给出脉冲信号,首先将CLK置为1 */

HC595CLK = 1;

/* 准备第二个数据 */

ucDataOne = ucDataOne << 1;

}

/* 输入第二个数据:uiDataTwo */

for (i = 0; i < 8; i++)

{

/* 给出脉冲信号,首先将CLK置为0 */

HC595CLK = 0;

if (0 != (ucDataTwo & 0x80))

{

HC595DATA = 1;

}

else

{

HC595DATA = 0;

}

/* 给出脉冲信号,首先将CLK置为1 */

HC595CLK = 1;

/* 准备第二个数据 */

ucDataTwo = ucDataTwo << 1;

}

/* 将片选信号置为高电平 */

HC595RCK = 1;

}

/********************************************************

*  函数名称:DriveLED

*  函数功能:595驱动程序是分两个数据发的,

*            本函数把它合并成一个数据

*  入口参数:uiData:16颗LED需要显示的数据

*  出口参数:NULL

*******************************************************/

void DriveLED(unsigned int uiData)

{

SendData(uiData >> 8,uiData);

}

继续刚刚的问题,呼吸灯变成闪烁了,怎么回事呢?在程序逻辑上是没有问题的,

我们只是更改了LED的驱动部分,看来就是LED驱动的问题了!先来Debug看一下,执行

DriveLED这个函数,时间是接近400微妙,循环200次,就是差不多80毫秒,那么LED的

闪烁频率为12.5HZ(都是大概的值,没有精确计算),还不足以形成视觉暂留现象。

那怎么办呢,减少循环次数为50,频率增大到50HZ左右,像这样:

for(i = 0; i < 50; i++)

{

/* 通过修改ucNum的值,就可以改变占空比*/

if(i < ucNum)

{

DriveLED(0x0003);   /* LED驱动,点亮D1和D2 */

}

else

{

DriveLED(0x0002);   /* LED驱动,熄灭D1点亮D2 */

}

}

经过验证!成功了!

如有错误的地方,希望大家批评指正!

呼吸流水灯c语言程序,单片机流水灯与呼吸灯结合-滴水灯程序及详细教程相关推荐

  1. led交通灯c语言程序设计,单片机控制的交通灯C语言编程.doc

    单片机控制的交通灯C语言编程 单片机控制的交通灯 红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换.四个方向各有一个红.黄.绿显示和两个数码管. 东西道为人行道(20秒),南北道为车行道(60秒),黄灯 ...

  2. c语言流水灯程序详细讲解,用c语言编写单片机流水灯程序详解

    用C语言编写的单片机流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. ? 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组 ...

  3. 单片机c语言程序编写步骤,用c语言编写单片机流水灯程序详解

    用C语言编写的流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口, ...

  4. 单片机串口中断控制流水灯c语言,利用单片机中断实现流水灯

    在我们的生活中,随处可见各式各样的彩灯,给这本来充满美丽的世界又添加了一份别致的美,想知道流水灯是怎么实现的吗?现在就跟我走进这实现流水灯的大道吧! 其实利用单片机的中断功能就可以实现.本篇文章是当每 ...

  5. 流水灯c语言及汇编程序,流水灯C语言及汇编程序.doc

    一.51单片机流水灯C语言源程序 文件说明:流水灯C程序程序说明:MCU采用AT89S51,外接11.0592M晶振,P2口输出 ?? #include?? //51系列单片机定义文件#define ...

  6. 51单片机呼吸灯c语言,51单片机呼吸灯C语言版.doc

    基于单片机与PWM的呼吸灯设计 实训指导教师: 班 级: 设 计 人姓名: 设 计 日 期: 设 计 地 点: 完 成 时 间: 摘要 本设计是基于单片机的原理与接口设计,采用单片机I/O口,加以C语 ...

  7. 单片机霹雳灯双灯c语言,HOLTEK单片机-8LED霹雳灯

    功能说明: HT48F49E控制8个LED构成的霹雳灯本文引用地址:http://www.eepw.com.cn/article/201611/323312.htm 介绍: 本例以 HT48F49E ...

  8. 51单片机生成C语言矩形波,单片机产生方波、锯齿波、三角波程序

    单片机 产生方波.锯齿波.三角波程序 #include#define uchar unsigned char #define uint unsigned int unsigned char x=0,m ...

  9. 单片机三角波c语言程序,单片机产生方波、锯齿波、三角波程序

    单片机产生方波.锯齿波.三角波程序 #include #define uchar unsigned char #define uint unsigned int unsigned char x=0,m ...

  10. c4d语言包英文,Maxon Cinema 4D R23(C4D R23)中英文安装及设置详细教程(附下载)

    中文包安装方法: 离线方法:打开下载好的语言包文件,在顶部菜单栏找到"Help>Manual Installation" 打开语言包的位置,选择要安装的.c4dupdate包 ...

最新文章

  1. STC单片机功率控制下载板
  2. MyBatis】MyBatis一级缓存和二级缓存
  3. gwt 嵌入html_GWT和HTML5画布演示
  4. PHP 备份还原 MySql 数据库
  5. Oops! the requested resource is not found!
  6. 未捕获typeerror: $形象。cropper不是函数_没有学不会的python--细说自定义函数的细节...
  7. 构建小型Linux跟文件系统镜像(Ext2 或 Ext3)
  8. msdev devenv 的命令行用法
  9. 《统计学》第八版贾俊平第九章分类数据分析知识点总结及课后习题答案
  10. 《畅玩NAS》第2章 VMware ESXI安装与使用
  11. linux取ip地址命令,linux下命令取IP地址的多种方法
  12. u盘中病毒文件夹变成.exe解决
  13. 利用矩阵快速幂求解斐波那契数列
  14. 刘宇凡:一棵树给我的真理
  15. 低代码到底是银弹,还是行业毒瘤?
  16. linux pv命令-q,pv命令 - Linux命令大全 | linux教程
  17. 【C Primer Plus 编程题】里程和耗油量的测量方案
  18. PA1--实现基础设施、表达式求值和监视点
  19. icon和文本垂直居中对齐
  20. matlab 裕度指令,稳定裕度的计算开环传递函数Matlab命令num.PPT

热门文章

  1. Visual Studio(VS2017/VS2019) C++ 配置 CPLEX 教程
  2. 项目中常用到的正则(价格千位分割格式化,手机号3-4-4格式化,密码验证,去除空格,获取url参数,检测24小时时间制,检测url前缀,检测中文,检测手机号,英文单词前后加空格,判断版本号)
  3. 测试人员常用的20个Linux命令(附Linux视频教程)
  4. 如何在MSWord中加入MSAgent
  5. 第三章:SQL Server2019数据库 之 开启 SQL 语言之旅
  6. webview的使用套餐
  7. Linux扫描工具rootkit部署
  8. 最适合人工智能开发的5种编程语言首选Python的原因
  9. LoadRunner11在Win10 下的破解解决办法(整合)
  10. zutuanxue.com-DNS服务器