心形流水灯课程设计.docx

上传人:b****4 文档编号:4845069 上传时间:2022-12-10 格式:DOCX 页数:27 大小:142.52KB
下载 相关 举报
心形流水灯课程设计.docx_第1页
第1页 / 共27页
心形流水灯课程设计.docx_第2页
第2页 / 共27页
心形流水灯课程设计.docx_第3页
第3页 / 共27页
心形流水灯课程设计.docx_第4页
第4页 / 共27页
心形流水灯课程设计.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

心形流水灯课程设计.docx

《心形流水灯课程设计.docx》由会员分享,可在线阅读,更多相关《心形流水灯课程设计.docx(27页珍藏版)》请在冰豆网上搜索。

心形流水灯课程设计.docx

心形流水灯课程设计

心形流水灯设计

摘要

本课题是利用STC89C52设计了一个心形流水灯电路,该电路可以实现32个LED灯循环闪亮、依次熄灭、对角闪亮、对角熄灭、间隔闪亮、间隔熄灭等多种功能。

该电路主要由单片机芯片STC89C52、电源电路、时钟电路、复位电路和显示电路组成。

利用Keil软件编写C语言程序,并生成目标代码Hex文件。

使用Proteus软件设计仿真电路,并调入已编译好的目标代码,即可在仿真图中看到模拟实物的运行状态和过程。

使用AltiumDesigner软件对电路进行原理图设计和PCB设计,并对该电路行安装和调试,调试结果可以实现流水灯的多种亮灭循环的功能。

关键词:

AT89C52,复位电路,时钟电路,发光二极管

1绪论

1.1课题描述

 随着现代科学技术的持续进步和发展以及人们生活水平的不断提高,以大规模、超大规模集成电路为首的电子工艺技术的使用也越来越广泛,结合单片机技术设计的电子电路也层出不穷。

LED彩灯由于其丰富的灯光色彩、低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。

利用控制电路可使彩灯按一定的规律不断的改变状态,不仅可以获得良好的观赏效果,而且可以省电。

彩灯的运用已经遍布于人们的生活中,从歌舞厅到卡拉OK包房,从节日的祝贺到日常生活中的点缀,这些不仅说明了我们对生活的要求有了质的飞跃,也说明科技在现实生活中的运用有了较大的发展。

在这一设计中我们将运用单片机技术,与单片机芯片STC89C52的功能,对心形流水灯系统进行设计,来实现流水灯的多种亮与灭的循环,给人带来美感[1]。

1.2基本工作原理及框图

本课程设计的XX系统原理如图1所示。

 

图1基本工作原理框图

2相关芯片及硬件电路设计

2.1AT89C52芯片

图2AT89C52引脚图

2.1.1AT89C52的功能特性

STC89C52是STC公司生产的一种低功耗、高性能的微控制器,具有8K的系统可编程Flash存储器,其具有传统51单片机不具备的功能,在经典的MCS-51内核上做了很多的改进,使得STC89C52在处理嵌入式控制应用系统时更加高效、灵活。

STC89C52具有以下标准功能:

4个外部中断、全双工串行口、一个7向量4级中断结构、3个16位定时器/计数器、8K字节Flash、512字节RAM(随机存储器)、看门狗定时器,其12周期和6周期可以任意选择,其工作电压在3V~5.5V之间,工作频率在0~40MHZ,实际工作频率可达48MHZ[2]。

其管脚的封装图如图2所示。

2.1.2AT89C52的主要性能参数

AT89C52主要性能参数如下:

●与MC-51产品指令系统完全兼容

●VCC(38脚):

芯片电源,接+5V

●GND(16脚):

接地端

●XTAL1(15脚):

片内振荡器反相放大器和时钟发生器电路的输入端。

当使用片内振荡器时,该引脚连接外部石英晶体和微调电容;当采用外接时钟源时,该引脚接外部时钟振荡器的信号

●XTAL2(14脚):

片内振荡器反相放大器的输出端。

当使用片内振荡器时,该引脚连接外部石英晶体和微调电容;当采用外部时钟源时,该引脚悬空

●ALE(27脚):

用来锁存P0口送出的低8位地址

●PSEN(26脚:

外部ROM读选通信号

●RST(4脚):

复位信号输入端

●EA/Vpp(29脚):

内外ROM选择/片内EPROM编程电源

●P0口:

8位,漏极开路的双向I/O口

●P1口:

8位,准双向I/O口,具有内部上拉电阻

●P2口:

8位,准双向I/O口,具有内部上拉电阻

●P3口:

8位,准双向I/O口,具有内部上拉电阻

2.2时钟电路

单片机内有一个由反相放大器所构成的振荡电路,XTAL1和XTAL2分别为振荡电路的输入端和输出端。

在XTAL1和XTAL2引脚上外接石英晶体和微调电容构成并联振荡回路。

晶振频率设置为11.0592MHZ,作用是产生时钟信号。

单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。

电容值为30pF,可以起到频率微调作用[3]。

时钟电路如图3所示。

图3时钟电路图

2.3复位电路

单片机RST接口为复位信号输入端,高电平有效。

在该引脚上加上持续时间大于两个机器周期的高电平,就可以使单片机复位。

在单片机正常工作时,此引脚应为小于或等于0.5V的低电平。

复位电路接单片机RST端口,在RST输入端出现高电平时实现复位和初始化[4]。

复位电路如4所示。

图4复位电路

2.4显示电路

单片机的P0口为8位的漏极开路的双向I/O口,当P0口作为普通的I/O口使用时,需要上拉电阻,这时为准双向口。

P1、P2、P3都为8位的准双向口,具有内部上拉电阻。

图5为显示电路,单片机I/O口一对一直接控制LED灯,显示电路中的32个电阻既为上拉电阻,也起到电路分

压作用,防止烧坏元器件[5]。

显示电路如图5所示

图5显示电路图

2.6总原理图设计

总结时钟电路、复位电路、以及显示电路,把其放入一个电路。

得到总体的电路。

总体电路如图6所示。

图6电路原理图

3系统软件设计

3.1程序主要流程

单片机的应用系统由硬件和软件组成,在硬件原理图搭建完成上电之后,暂时还不能看到流水灯循环点亮的现象,还需要编写程序控制单片机管脚电平的高低变化,来实现LED灯的各种亮灭功能。

先将P0、P1、P2、P3全部置1,即通入高电平,用16进制表示为0XFFH,则32个LED灯全部处于熄灭状态。

然后给P0口赋值0X7FH,即只有P0.0处于低电平时,LED1灯点亮。

使用延时函数delay,并设置延时时间为2秒,延时时间一到P0口的值就变为0X3FH,即P0.0和P0.1都为高电平,LED2也开始点亮,如此循环P0口控制的8个LED灯全部点亮,当高电平变为低电平时,LED灯熄灭。

P1、P2、P3口控制的LED灯闪亮和熄灭原理同P0口一样,所以就可以看到LED灯的流水效果了

[6]。

程序流程图如图7所示,

 

低电平

高电平

图7程序设计流程图

3.2程序设计

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

ucharcodetable[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//逐个点亮0~7

ucharcodetable1[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//逐个点亮7~0

ucharcodetable2[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//逐个灭0~7

ucharcodetable3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//逐个灭7~0

voiddelay(uintt);//延时

voidzg(uintt,uchara);//两边逐个亮

voidqs(uintt,uchara);//全部闪烁

voidzgxh(uintt,uchara);//逆时针逐个点亮

//voidzgxh1(uintt,uchara);//顺时针逐个点亮

voiddjs(uintt,uchara);//对角闪

voidlbzgm(uintt,uchara);//两边逐个灭

//voidsszgm(uintt,uchara);//顺时针逐个灭

voidnszgm(uintt,uchara);//逆时针逐个灭

voidsztl(uintt,uchara);//顺时逐个同步亮

voidnztl(uintt,uchara);//逆时逐个同步亮

voidsztm(uintt,uchara);//顺时逐个同步灭

voidnztm(uintt,uchara);//逆时逐个同步灭

voidhwzjl(uintt,uchara);//横往中间亮

voidhwzjm(uintt,uchara);//横往中间灭

//voidswzjl(uintt,uchara);//竖往中间亮

//voidswzjm(uintt,uchara);//竖往中间灭

voidnzdl(uintt,uchara);//逆时逐段亮

voidnzdgl(uintt,uchara);//逆时逐段一个点亮

voidjgs(uintt,uchara);//间隔闪

voidzg(uintt,uchara)//两边逐个亮

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

P0=0x7f;delay(t);

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

{

P0=table1[i+1];

P2=table1[i];

delay(t);

}

P2=0x00;P1=0xfe;

delay(t);

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

{

P1=table[i+1];

P3=table1[i];

delay(t);

}

P3=0x00;delay(t);

}

}

voidqs(uintt,uchara)//全部闪烁

{

ucharj;

for(j=0;j

{

P0=P1=P2=P3=0xff;

delay(t);

P0=P1=P2=P3=0x00;

delay(t);

}

}

voidzgxh(uintt,uchara)//逆时针逐个点亮

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

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

{

P0=table1[i];

delay(t);

}

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

{

P1=table[i];

delay(t);

}

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

{

P3=table[i];

delay(t);

}

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

{

P2=table[i];

delay(t);

}

}

}

voidnszgm(uintt,uchara)//逆时针逐个灭

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0x00;

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

{

P0=table3[i];delay(t);

}

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

{

P1=table2[i];delay(t);

}

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

{

P3=table2[i];delay(t);

}

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

{

P2=table2[i];delay(t);

}

}

}

voidzgxh1(uintt,uchara)//顺时针逐个点亮

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

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

{

P2=table1[i];

delay(t);

}

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

{

P3=table1[i];

delay(t);

}

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

{

P1=table1[i];

delay(t);

}

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

{

P0=table[i];

delay(t);

}

}

}

voidsszgm(uintt,uchara)//顺时针逐个灭

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0x00;

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

{

P2=table3[i];delay(t);

}

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

{

P3=table3[i];delay(t);

}

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

{

P1=table3[i];delay(t);

}

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

{

P0=table2[i];delay(t);

}

}

}

voiddjs(uintt,uchara)//对角闪

{

ucharj;

for(j=0;j

{

P0=P1=P2=P3=0xff;

P0=P3=0x00;

delay(t);

P0=P1=P2=P3=0xff;

P1=P2=0x00;

delay(t);

}

}

voidlbzgm(uintt,uchara)//两边逐个灭

{

uchari,j;

for(j=0;j

{

P0=P2=0x00;

P3=0x01;delay(t);

for(i=7;i>1;i--)

{

P1=table[i-1];P3=table1[i-2];

delay(t);

}

P1=0xfe;P3=0xff;delay(t);

P1=0xff;P2=0x01;delay(t);

for(i=7;i>1;i--)

{

P0=table1[i-1];

P2=table1[i-2];

delay(t);

}

P0=0x7f;P2=0xff;delay(t);

P0=0xff;delay(t);

}

}

voidsztl(uintt,uchara)//顺时逐个同步亮

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

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

{

P0=table[i];

P1=P2=P3=table1[i];

delay(t);

}

}

}

voidnztl(uintt,uchara)//逆时逐个同步亮

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

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

{

P0=table1[i];

P1=P2=P3=table[i];

delay(t);

}

}

}

voidsztm(uintt,uchara)//顺时逐个同步灭

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0x00;

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

{

P0=table2[i];

P1=P2=P3=table3[i];

delay(t);

}

}

}

voidnztm(uintt,uchara)//逆时逐个同步灭

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

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

{

P0=table3[i];

P1=P2=P3=table2[i];

delay(t);

}

}

}

voidhwzjl(uintt,uchara)//横往中间亮

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

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

{

P0=P2=P1=table1[i];

P3=table[i];delay(t);

}

}

}

voidhwzjm(uintt,uchara)//横往中间灭

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0x00;

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

{

P0=P2=P1=table3[i];

P3=table2[i];delay(t);

}

}

}

voidswzjl(uintt,uchara)//竖往中间亮

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

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

{

P0=P2=P1=table[i];

P3=table1[i];delay(t);

}

}

}

voidswzjm(uintt,uchara)//竖往中间灭

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0x00;

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

{

P0=P2=P1=table2[i];

P3=table3[i];delay(t);

}

}

}

voidnzdl(uintt,uchara)//逆时逐段亮

{

uchari,j;

for(j=0;j

{

P0=P1=P2=P3=0xff;

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

{

P0=table1[i];

delay(t);

}

P0=0xff;

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

{

P1=table[i];

delay(t);

}

P1=0xff;

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

{

P3=table[i];

delay(t);

}

P3=0xff;

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

{

P2=table[i];

delay(t);

}

P2=0xff;

}

}

voidnzdgl(uintt,uchara)//逆时逐段一个点亮

{

uchari,j,k,l;

for(j=0;j

{

k=table1[0];

P0=k;l=table[0];

P1=P2=P3=l;delay(t);

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

{

k=_crol_(k,-1);

P0=k;

l=_crol_(l,1);

P1=P2=P3=l;

delay(t);

}

}

}

voidjgs(uintt,uchara)//间隔闪

{

ucharj;

for(j=0;j

{

P0=0x55;P1=P2=P3=0xaa;

delay(t);

P0=0xaa;P1=P2=P3=0x55;

delay(t);

}

}

voidmain()

{

uchari;

while

(1)

{

zg(100,1);//两边逐个亮

lbzgm(100,1);//两边逐个灭

jgs(300,10);

djs(100,20);//对角闪

P1=P2=P3=0xff;

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

{

P0=0x00;delay(800);

P0=0xff;delay(800);

}

P0=0x00;

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

{

P1=0x00;delay(800);

P1=0xff;delay(800);

}

P1=0x00;

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

{

P3=0x00;delay(800);

P3=0xff;delay(800);

}

P3=0x00;

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

{

P2=0x00;delay(800);

P2=0xff;delay(800);

}

qs(500,3);

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

{

zgxh(50,1);

nszgm(50,1);

}

djs(100,20);//对角闪

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

{

zg(100,1);//两边逐个亮

lbzgm(100,1);//两边逐个灭

}

qs(200,10);djs(100,50);

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

{

sztl(200,1);//顺时逐个同步亮

nztm(200,1);

nztl(200,1);

sztm(200,1);//顺时逐个同步灭

}

djs(300,10);//对角闪

nzdgl(300,10);//逆时逐段一个点亮

jgs(300,10);//间隔闪

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

{

zgxh(100,1);

nszgm(100,1);

}

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

{

zgxh1(100,1);

sszgm(100,1);

}

nzdl(200,3);//逆时逐段亮

jgs(50,100);//间隔闪

P0=P1=P2=P3=0xff;

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

{

P0=table1[i];

delay(200);

}

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

{

P1=table[i];

delay(200);

}

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

{

P0=P1=0x00;delay(200);

P0=P1=0xff;delay(200);

}

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

{

P2=table1[i];

delay(200);

}

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

{

P3=table1[i];

delay(200);

}

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

{

P2=P3=0x00;delay(200);

P2=P3=0xff;delay(200);

}

nzdgl(50,40);//逆时逐段一个点亮

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

{

zg(100,1);qs(100,10);

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1