心形流水灯课程设计报告书.docx
《心形流水灯课程设计报告书.docx》由会员分享,可在线阅读,更多相关《心形流水灯课程设计报告书.docx(24页珍藏版)》请在冰豆网上搜索。
![心形流水灯课程设计报告书.docx](https://file1.bdocx.com/fileroot1/2022-11/17/fed74b6b-09bb-4181-8be6-8b5764fa3283/fed74b6b-09bb-4181-8be6-8b5764fa32831.gif)
心形流水灯课程设计报告书
心形流水灯设计
摘要
本课题是利用STC89C52设计了一个心形流水灯电路,该电路可以实现32个LED灯循环闪亮、依次熄灭、对角闪亮、对角熄灭、间隔闪亮、间隔熄灭等多种功能。
该电路主要由单片机芯片STC89C52、电源电路、时钟电路、复位电路和显示电路组成。
利用Keil软件编写C语言程序,并生成目标代码Hex文件。
使用Proteus软件设计仿真电路,并调入已编译好的目标代码,即可在仿真图中看到模拟实物的运行状态和过程。
使用AltiumDesigner软件对电路进行原理图设计和PCB设计,并对该电路行安装和调试,调试结果可以实现流水灯的多种亮灭循环的功能。
关键词:
AT89C52,复位电路,时钟电路,发光二极管
1绪论1
1.1课题描述1
1.2基本工作原理及框图1
2相关芯片及硬件电路设计2
2.1AT89C52芯片2
2.1.1AT89C52的功能特性2
2.1.2AT89C52的主要性能参数3
2.2时钟电路4
2.3复位电路4
2.4显示电路4
2.6总原理图设计5
3系统软件设计6
3.1程序主要流程6
3.2程序设计7
3.4电路功能仿真20
总结21
致谢22
参考文献23
1绪论
1.1课题描述
随着现代科学技术的持续进步和发展以及人们生活水平的不断提高,以大规模、
超大规模集成电路为首的电子工艺技术的使用也越来越广泛,结合单片机技术设计的电
子电路也层出不穷。
LED彩灯由于其丰富的灯光色彩、低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。
利用控制电路可使彩灯按一定的规律不断的改变状态,不仅可以获得良好的观赏效果,而且可以省电。
彩灯的运用已经遍布于人们的生活中,从歌舞厅到卡拉0K包房,从节日的祝贺到
日常生活中的点缀,这些不仅说明了我们对生活的要求有了质的飞跃,也说明科技在现实生活中的运用有了较大的发展。
在这一设计中我们将运用单片机技术,与单片机芯片STC89C52的功能,对心形流水灯系统进行设计,来实现流水灯的多种亮与灭的循环,给人带来美感⑴。
1.2基本工作原理及框图
本课程设计的XX系统原理如图1所示
图1基本工作原理框图
2相关芯片及硬件电路设计
2.1
AT89C52芯片
图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复位电路
2.4显示电路
单片机的P0口为8位的漏极开路的双向I/O口,当P0口作为普通
的I/O口使用时,需要上拉电阻,这时为准双向口。
P1、P2、P3都为
8位的准双向口,具有内部上拉电阻。
图5为显示电路,单片机I/O口一对一直接控制LED灯,显示电路中的32个电阻既为上拉电阻,也起到电路分
压作用,防止烧坏元器件⑸。
显示电路如图5所示
图5显示电路图
2.6总原理图设计
总结时钟电路、复位电路、以及显示电路,把其放入一个电路。
得到总体的电路。
总体电路如图6所示。
图6电路原理图
3系统软件设计
3.1程序主要流程
单片机的应用系统由硬件和软件组成,在硬件原理图搭建完成上电之后,暂时还不
能看到流水灯循环点亮的现象,还需要编写程序控制单片机管脚电平的高低变化,来实
现LED灯的各种亮灭功能。
先将P0、P1、P2、P3全部置1,即通入高电平,用16进制表示为OXFFH,则
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所示,
r=
开始
Lj
1
r
读取I/O
口状态
高电平
LED灯熄灭
LED灯点亮
4
延时
灯流动运行
结束
程序设计流程图
3.2程序设计
#include
#ineludevintrins.h>#defineuintunsignedint
#defineucharunsignedchar
逐个点亮0~7
逐个点亮7~0
逐个灭0~7
逐个灭7~0
ucharcodetable[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//
ucharcodetable1[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//ucharcodetable2[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//ucharcodetable3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//
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=P