三色可独立调整 led 源程序可执行 pwm概述.docx

上传人:b****1 文档编号:14066924 上传时间:2023-06-20 格式:DOCX 页数:36 大小:467.34KB
下载 相关 举报
三色可独立调整 led 源程序可执行 pwm概述.docx_第1页
第1页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第2页
第2页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第3页
第3页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第4页
第4页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第5页
第5页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第6页
第6页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第7页
第7页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第8页
第8页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第9页
第9页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第10页
第10页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第11页
第11页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第12页
第12页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第13页
第13页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第14页
第14页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第15页
第15页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第16页
第16页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第17页
第17页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第18页
第18页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第19页
第19页 / 共36页
三色可独立调整 led 源程序可执行 pwm概述.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

三色可独立调整 led 源程序可执行 pwm概述.docx

《三色可独立调整 led 源程序可执行 pwm概述.docx》由会员分享,可在线阅读,更多相关《三色可独立调整 led 源程序可执行 pwm概述.docx(36页珍藏版)》请在冰点文库上搜索。

三色可独立调整 led 源程序可执行 pwm概述.docx

三色可独立调整led源程序可执行pwm概述

 

单片机课程设计报告

 

题目:

简易可调色LED灯

学院:

水利电力学院

专业:

电气工程及其自动化

班级:

电气一班

成员:

蒲恒马永俊

鸣谢:

刘伟强

二〇一三年十二月十二日

基于AT89C52单片机的简易简易可调色LED灯

[摘要]:

本文主要使用单片机来设计简易可调色LED灯。

采用单片机I/O口,加以C语言编程实现LED渐亮再渐暗类似人的呼吸一样的效果。

基本原理:

C语言编程实现PWM(脉宽调制)输出驱动LED,逐渐增加PWM的占空比从而实现LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,实现呼吸灯的效果,同时实现了温度测试功能。

[关键词]:

单片机PWMLED可调色呼吸灯

ˎ

 

 

 

目录

第1章概述-1-

第2章系统方案设计-2-

2.1系统设计要求-2-

2.1.1基本要求-2-

2.1.2发挥部分-2-

2.2 LED可调色呼吸灯系统的组成-2-

第3章系统的硬件设计-3-

3.1系统功能框图-3-

3.2功能模块详细设计-3-

3.2.1主控核心-3-

3.2.2复位电路模块-4-

3.2.3时钟电路-5-

3.2.3键盘模块-5-

3.2.4LCD1602显示模块-6-

3.2.5LED显示模块-7-

第4章软件电路设计-8-

第5章测试方法与结果 -9-

第6章心得与结论-10-

参考文献-10-

附录-11-

1概述

单片机(单片微型计算机)是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠等特点。

单片机的应用相当广泛,从平常的家用电器到航空航天系统和国防军事、尖端武器都能找到它的身影。

因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。

本次设计提出了用AT89C52单片机为核心控制元件,设计一个简易LED可调色呼吸灯,本方案以AT89C52单片机作为主控核心,与LED显示、按键控制、液晶屏显示各色所占比例等部分组成核心模块。

 C语言编程使单片机输出PWM(脉宽调制),用来驱动LED,逐渐增加PWM的占空比从而实现LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,实现呼吸灯的效果。

利用液晶屏显示当前各色所占比例,按键控制调色过程,从而实现了简易LED可调色呼吸灯的基本功能,同时实现附加功能温度测试及显示。

 

2系统方案设计

2.1系统设计要求

本系统主要实现LED可调色呼吸灯基本功能,基本要求如下:

2.1.1基本要求

(1)红、蓝、绿三色可单独进行亮度的调节,从而实现调色。

(2)显示:

三色占有的比例。

(3)设置好的各色比例值,掉电后保持。

2.1.2发挥部分

(1)使用亚克力等材料自制灯罩,使调色效果明显。

(2)各色的调节步进值分细调和粗调2档。

(3)实现温度显示。

(4)使用多个LED。

2.2  LED可调色呼吸灯系统的组成 

本设计系统主要以AT89C52为主控核心,通过C语言编程来实现单片机输出PWM波(脉宽调制),用来驱动LED,逐渐增加PWM的占空比从而实现LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,实现呼吸灯的效果。

整个设计系统只要有:

单片机AT89C52、LED灯、按键模块、液晶屏显示4部分组成。

按键控制LED灯可调色,同时在液晶屏上显示此时各色LED所占的比例,从而达到了本次设计的基本要求。

 

3硬件电路设计 

3.1系统功能框图

液晶屏显示

当前温度

液晶屏显示当前各色所占比例

 

键盘电路控制

AT89C52

LED可调色显示

时钟电路

复位电路

(图一)

该系统主要有五部分组成,包括:

单片机AT89C51、键盘控制模块、LED显示、液晶屏显示各色所占比例、复位电路、时钟电路组成。

3.2功能模块详细设计

3.2.1主控核心

本设计采用AT89C52作为主控核心:

89C52是INTEL公司MCS-51系列单片机中

基本的产品,它采用INTEL公司可靠的CHMOS

工艺技术制造的高性能8位单片机,属于标准

的MCS-51的HCMOS产品。

89C52内置8位中

央处理单元、256字节内部数据存储器RAM、8k

片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。

此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。

89C52有PDIP(40pin)

和PLCC(44pin)两种封装形式。

3.2.2复位电路模块

当单片机的复位引脚RST出现2个机器周期以上的高电平时,单片机就执行复位操作。

如果RET持续为高电平,单片机就处于循环复位状态。

根据应用的要求,复位操作通常有两种基本形式:

上电复位和上电或开关复位。

本次设计采用手动复位电路。

 

在单片机启动后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。

当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。

随着时间的推移,电容的电压从5V释放到变为了1.5V,甚至更小。

根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。

单片机系统自动复位

(复位电路)

3.2.3时钟电路

时钟电路用于产生单片机工作所需的时钟信号。

震荡有两种方式:

外部震荡、内部震荡。

 在AT89C52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2,在芯片的外部通过这两个引脚跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器,如图7所示。

电路中的电容一般取30pF左右,而晶体的振荡频率范围通常为1.2~12MHz。

本设计采用12MHz的晶振。

(时钟电路)

3.2.4键盘模块

键盘是最常用的单片机输入设备,大致可以分为独立连接式键盘和矩阵式。

 独立连接式键盘是最简单的键盘电路,每个键独立接入一根数据线。

这种键盘结构简单,使用方便,但是占用的I/O口线较多。

矩阵式键盘由行线和列线组成,按键位于行列的交叉点上,行线通过上拉电阻接到高电平。

行列式键盘可节省I/O口,适合按键数较多的场合。

所以本例的4X4键盘采用行列式键盘。

(按键模块)

3.2.4LCD1602显示模块

LCD1602显示当前三色等所占的比例,显示电路设计如下:

(LCD1602显示)

通过单片机编程,输出液晶屏LCD1602,显示当前各色灯显示的所占百分比,根据所占百分比来调色,三色所占百分比不同,三色光组合的颜色则不同;同时单片机编程输出程序,在液晶屏上显示当前的温度。

3.2.5LED显示模块

(LED显示模块)

单片机输出PWM波(脉宽调制),用来驱动LED,逐渐增加PWM的占空比从而实现LED模拟呼吸的过程。

三色所占比例不同,调出不同种颜色的光,同时也可以红、蓝、绿三色可单独进行亮度的调节,从而实现调色。

 

4软件电路设计

目前普通低档单片机的编程中,一般会用汇编和C。

 汇编语言非常接近计算机的硬件,因此,它可以最大限度地发挥计算机硬件的性能。

用汇编写的程序执行速度相当快,适用于实时性要求较高的场合。

但是用汇编写的程序比较庞大,编写速度也比较慢,而且汇编程序的移植性较差。

 

C语言作为高级语言,运用灵活,可自定义很多东西,更改方便,移植性好,且无需懂得单片机的具体硬件也能编出程序。

但C语言写好后是不能直接运行,需要编译,经过编译生成单片机专用的机器码后才能直接运行,效率是要低于直接用汇编写出来的代码的。

不过如果谈到开发速度、软件质量、结构严谨、程序坚固等方面的话,则C语言的完美绝非汇编语言编程所可比拟的。

(主要程序见附录)

 

5测试方法与结果 

          完成了硬件的设计、制作和软件编程之后,要使系统能够按

设计意图正常运行,必须进行系统调试。

系统调试包括硬件调试和软件调试两个部分。

不过,作为一个单片机系统,其运行是软硬件相结合的,因此,软硬件的调试也是绝对不可能分开的。

 

            程序的调式应一个模块一个模块地进行,单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各个子程序连接起来总调。

联调需要注意的是,各程序模块间能否正确传递参数特别要注意各子程序的现场保护与恢复。

调试的基本步骤如下:

 

将单片机实验相与计算机连接,然后在keil中进行编译程序,运

行程序,根据单片机所显示的结果分析程序,修改程序直到程序正常。

 

在调试过程中出现的问题:

 

(1)指示灯显示不正常,经分析原因在与灯的表格列的不对,指示灯输出低电瓶时亮,结果程序中都是以高电平输出,经修改后正常 最后打开开关,发现灯全部以每2秒一暗一亮的频率运行正常。

 

(2)由于呼吸灯的程序在仿真软件Proteus中实现的效果不明显,很难辨别LED是否具有呼吸的效果。

所以边用keil调试程序边用STC烧写软件直接写入开发板,从而很明显看出LED是否具有呼吸效果; 

(3)程序运行时,出现LED闪烁过快,由于人眼的暂留效应看似LED全部一直亮着,经调试,修改延时时间,实现呼吸效果。

6心得与总结

在本次设计中,C语言程序在开发板中得以实现应有的功能。

在调试过程中,发现很多问题都是由于不细心导致的,因此在以后的设计方案中,要集中精力,莫粗心大意。

再者就是知识量的不足,虽然是一个小小的设计方案,但是查阅了很多相关资料,在日后,要多充足自己的知识量,保证C程序的编写质量

 

参考文献 

 [1]郭天祥.新概念51单片机C语言教程.电子工业出版社,2009年1月 

 [2]徐爱钧.单片机高级语言C51应用程序设计.电子工业出版社,2000年5月

[3]倪云峰.单片机原理及应用[M].西安:

西安电子科技大学出版社,2009.

[4]张齐.单片机原理与应用系统设计.北京:

电子工业出版社,2010.2

 

附录:

源程序代码

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitLEDB=P1^0;//---LED蓝灯

sbitLEDR=P1^1;//LED红灯

sbitLEDG=P1^2;//LED绿色

sbitLEDC=P1^3;//白的灯泡

bitledjc=0;//led检测,

sbitk1=P1^4;//---按键1

sbitk2=P1^5;//---按键2

sbitk3=P1^6;//---按键3

sbitstop=P1^7;//---按键4

sbitDQ1=P2^0;//温度显示

sbitE=P2^7;//1602使能引脚

sbitRW=P2^6;//1602读写引脚

sbitRS=P2^5;//1602数据/命令选择引脚

ucharrcount,bCount,yCount,rZKB,bZKB,yZKB,temp;

ucharTempBuffer[5],temp_value,play,wendu;

ucharge,shi,bai,num,wendu,play,mode;

uintPWM_LOW=0;//定义周期并赋值

uintbCYCLE=900,rCYCLE=700,gCYCLE=600;

voidinti();

voidkeyscan();

voiddisplay();

voiddisplay1();

voiddisplay2();

voidfuction();

voiddelayms(uintz);

voidDelay(unsignedintt);//函数声明

voidshow_temperture();

ucharkey();

voidDelay(uintt);

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

*名称:

delay()

*功能:

延时,延时时间大概为5US。

*输入:

*输出:

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

voiddelay()

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

voiddelayms(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

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

*名称:

bitBusy(void)

*功能:

这个是一个读状态函数,读出函数是否处在忙状态

*输入:

输入的命令值

*输出:

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

bitBusy(void)

{

bitbusy_flag=0;

RS=0;

RW=1;

E=1;

delay();

busy_flag=(bit)(P0&0x80);

E=0;

returnbusy_flag;

}

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

*名称:

wcmd(uchardel)

*功能:

1602命令函数

*输入:

输入的命令值

*输出:

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

voidwcmd(uchardel)

{

while(Busy());

RS=0;

RW=0;

E=0;

delay();

P0=del;

delay();

E=1;

delay();

E=0;

}

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

*名称:

wdata(uchardel)

*功能:

1602写数据函数

*输入:

需要写入1602的数据

*输出:

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

voidwdata(uchardel)

{while(Busy());

RS=1;

RW=0;

E=0;

delay();

P0=del;

delay();

E=1;

delay();

E=0;

}

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

*名称:

L1602_init()

*功能:

1602初始化,请参考1602的资料

*输入:

*输出:

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

voidL1602_init(void)

{

wcmd(0x38);

delay();

wcmd(0x38);

delay();

wcmd(0x38);

delay();

wcmd(0x38);

delay();

wcmd(0x0c);

wcmd(0x06);

delay();

wcmd(0x01);

}

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

*名称:

L1602_char(ucharhang,ucharlie,charsign)

*功能:

改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下

L1602_char(1,5,'b')

*输入:

行,列,需要输入1602的数据

*输出:

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

voidL1602_char(ucharhang,ucharlie,ucharsign)

{

uchara;

if(hang==1)a=0x80;

if(hang==2)a=0xc0;

a=a+lie-1;

wcmd(a);

wdata(0x30+sign);

}

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

*名称:

L1602_string(ucharhang,ucharlie,uchar*p)

*功能:

改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下

L1602_string(1,5,"abcdef;")

*输入:

行,列,需要输入1602的数据

*输出:

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

voidL1602_string(ucharhang,ucharlie,uchar*p)

{

uchara,b=0;

if(hang==1)a=0x80;

if(hang==2)a=0xc0;

a=a+lie-1;

while

(1)

{

wcmd(a++);

b++;

if((*p=='\0')||(b==16))break;

wdata(*p);

p++;

}

}

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

//定时器0中断服务程序.

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

voidtimer0()interrupt1

{

TH0=(65536-10)/256;//装入初值,定时50ms;

TL0=(65536-10)%256;

rcount++;

bCount++;

yCount++;

if(rcount>599)rcount=0;

if(bCount>599)bCount=0;

if(yCount>599)yCount=0;

if(rcount>=rZKB)

{LEDG=1;}

else

{LEDG=0;}

if(yCount>=yZKB)

{LEDR=1;}

else

{LEDR=0;}

if(bCount>=bZKB)

{LEDB=1;}

else

{LEDB=0;}

}

voidw1()

{rZKB++;

if(rZKB>=600&&rZKB<600)

rZKB=599;

if(rZKB>=600)

rZKB=0;

//num=0;

}

voidw2()

{

bZKB++;

if(bZKB>=600&&bZKB<600)

bZKB=599;

if(bZKB>=600)

bZKB=0;

//num=0;

}

voidw3()

{delay();

yZKB++;

if(yZKB>=600&&yZKB<600)

yZKB=599;

if(yZKB>=600)

yZKB=0;

//num=0;

}

//启动输出

voidw4()

{

if((rZKB<=600)&&(0==ledjc))

{

rZKB+=8;

if(rZKB>600)

{

ledjc=1;

rZKB=600;

}

}

if((rZKB>=0)&&(1==ledjc))

{

rZKB-=8;

if(rZKB<0)

{

ledjc=0;

rZKB=0;

}

num=0;

}

}

voidw5()

{

bZKB+=8;

if(bZKB>=600&&bZKB<600)

bZKB=599;

if(bZKB>=600)

bZKB=0;

num=0;

}

voidw6()

{

//delay();

yZKB+=8;

if(yZKB>=600&&yZKB<600)

yZKB=599;

if(yZKB>=600)

yZKB=0;

num=0;

}

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

//定时器初始化

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

voidinti()

{

TMOD=0x1;//T0方式1工作

IE=0x82;//EA=1;允许所有中断,ET0==1;允许T0中断

TH0=(65536-8)/256;//装入初值,定时50ms;

TL0=(65536-8)%256;

TR0=1;//启动定时器

}

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

//LCD1602占空比显示程序

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

voiddisplay()

{

L1602_string(1,1,"B");

bai=(u

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2