51单片机(呼吸灯)C语言版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机与PWM的呼吸灯设计
实训指导教师:
班级:
设计人姓名:
设计日期:
设计地点:
完成时间:
摘要
本设计是基于单片机的原理与接口设计,采用单片机I/O口,加以C 语言编程实现LED渐亮再渐暗类似人的呼吸一样的效果。
关键词
AT89C51,PWM(脉宽调制)
一、设计要求:
呼吸灯就是让LED灯的闪烁像呼吸一样,时呼时吸,时亮时暗,利用LED的余辉和人眼的暂留效应,看上去和人的呼吸一样。
二、设计原理:
用C语言编程实现PWM(脉宽调制)输出驱动LED,逐渐增加PWM的占空比从而实现LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,看上去就和人的呼吸一样。三、整体方案设计
8个LED按照顺序逐个实现呼吸效果。加以其他闪烁花样增加更炫彩的效果。
四、实验元件及器材
(1)元件: LED(发光二极管)8个
1KΩ电阻8个
1nf电容2个
晶振1个
AT89C51芯片1个
(2)器件:Atmega128开发板1块
计算机1台
五、硬件原理
(1)主电路:8个LED分别连接AT89C51的P1口,使用共阳方式,并加以1kΩ的电阻接入电源。
(2)时钟电路:外部时钟方式是使用外部振荡脉冲信号。
六、软件设计及系统仿真调试
(1)调试方法:利用keil软件进行C语言程序编写及调试,再利用Proteus 仿真软件进行仿真实验。
(2)调试过程所遇问题:
1、由于呼吸灯的程序在仿真软件Proteus中实现的效果不明显,很难辨别LED是否具有呼吸的效果。所以边用keil调试程序边用STC烧写软件直接写入开发板,从而很明显看出LED是否具有呼吸效果;
2、程序运行时,出现LED闪烁过快,由于人眼的暂留效应看似LED全部一直亮着,经调试,修改延时时间,实现呼吸效果。
七、结论与心得
在本次设计中,C语言程序在开发板中得以实现应有的功能。在调试过程中,发现很多问题都是由于不细心导致的,因此在以后的设计方案中,要集中精力,莫粗心大意。再者就是知识量的不足,虽然是一个小小的设计方案,但是查阅了很多相关资料,在日后,要多充足自己的知识量,保证C程序的编写质量。
参考文献
[1]郭天祥,《新概念51单片机C语言教程》,电子工业出版社,2009年1月
[2]徐爱钧,《单片机高级语言C51应用程序设计》,电子工业出版社,2000年5月
附件A:呼吸灯设计电路图
附件B:C语言程序清单
#include
/*-----------定义单片机引脚-----*/ sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
void Delay(unsigned int t); //函数声明unsigned int z,y;
void main (void)//主函数
unsigned int CYCLE=500,PWM_LOW=0;//定义周期并赋值
while (1) //主循环
{
/*--------整排LED灯呼吸---------*/
P1=0x00;
Delay(500); //加延时,可以看到熄灭的过程(下面程序同理)
for(PWM_LOW=1;PWM_LOW P1=0x00; Delay(PWM_LOW); P1=0xff; Delay(CYCLE-PWM_LOW); } P1=0xff; for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) //与逐渐变亮相反的过程 { P1=0x00; //点亮LED Delay(PWM_LOW); P1=0xff; //熄灭LED Delay(CYCLE-PWM_LOW); //主循环中添加其他需要一直工作的程序,延时长度,600次循环中从599减至1 } /*--------第一颗LED灯呼吸---------*/ LED0=1; Delay(500); for(PWM_LOW=1;PWM_LOW { LED0=0; Delay(PWM_LOW); LED0=1; Delay(CYCLE-PWM_LOW); } LED0=0; for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) { LED0=0; Delay(PWM_LOW); LED0=1; Delay(CYCLE-PWM_LOW); } /*--------第二颗LED灯呼吸----------*/ LED1=1; Delay(500); for(PWM_LOW=1;PWM_LOW LED1=0; Delay(PWM_LOW); LED1=1; Delay(CYCLE-PWM_LOW); } LED1=0; for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) { LED1=0; Delay(PWM_LOW); LED1=1; Delay(CYCLE-PWM_LOW); }