1 设计目的
(1)掌握单片机芯片AT89C51的基本功能和使用。
(2)熟悉Proteus仿真软件的使用,了解各元件的功能及作用。
(3)了解音乐的基本知识。
(4)提高数字电子电路的综合应用能力。
(5)掌握Keil软件的使用方法,以及如何创建文件和编写程序。
(6)提高焊接能力以及实际问题分析能力。
2 设计思路
(1)设计一个用单片机控制的心形流水灯系统;
(2)LED灯数量为32个;
(3)将仪器焊接到电路板上;
(4)可以实现循环点亮,依次熄灭的基本功能;
(5)可以实现对角闪亮,间隔闪亮,顺时针闪亮,逆时针闪亮,同时闪亮等多种功能。
3方案论证
1、单片机芯片的比较与选择
单片机作为该电路的主要控制器芯片,即整个系统的控制核心部分,主要是负责控制LED灯的不同变化速度以及变化效果。因此对单片机芯片的选择,必须要求其功耗低、数据转换速率快。
方案一:采用STC89C51单片机。40个引脚,8k Bytes Flash片内程序存储器, 256 bytes的随机存取数据存储器(RAM), 32个外部双向输入/输出(I/O)口, 5个中断优先级2层中断嵌套中断, 2个16位可编程定时计数器, 2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
方案二:选择TI公司生产的MSP430F149系列单片机系统。此款单片机具有低电压、超低功耗的特点,工作电压在3.6-1.8V之间,具有强大的功能和高效的运算处理能力。
方案选择:由于STC89C51芯片价格便宜,支持在线下载程序而且MSP430F149系列单片机的功能已经远远高于我们本系统,操作不便。
综合考虑,我们选择方案一。
4 设计过程
4.1硬件设计
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。电子琴是现代电子技术与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经融入现代人们的生活中,成为不可替代的一部分。
本设计是以AT89C51单片机为核心控制元件,把51单片机的4个I/O口与32个5mm高亮LED灯相接,通过单片机控制各I/O引脚的高低电平控制LED的亮灭从而形
成各种不同亮灭的花样。
(1)单片机控制模块
硬件电路要以单片机作为主芯片,针对本设计的功能和用途,采用AT89S51单片机更好,实现功能完全,性价比较高,更适合本设计。具体电路如图2所示。
(2)74HC245
5电路仿真与结果分析
5.1电路原理图
5.2 心形流水灯测试图
5.2 电路仿真图
5.3结果分析
根据仿真结果可知,本次课程设计能够准确并彻底的完成设计要求,完成了心形流水灯的设计,实现了LED灯的循环点亮、依次熄灭等基本功能,并且还实现了对角闪亮、间隔闪亮、顺时针闪亮,逆时针闪亮等多种功能。
6设计体会
这次课程设计我们换过几种方案,我们刚开始是选择完全的数字电路来实现,但我们做好仿真时,发现一个问题,频率不能很好的把握,指导老师说这在实物中更难把握,建议我们用单片机来实现,尽管我们现在还没有学习单片机的相关知识,但在老师的指导下,我们查阅相关的资料,进行相关的学习,最终我们实现了设计的要求,并且还新增了一些功能,同时还解决了第一次关于频率的问题,总体来说,此次课程设计使我们收获良多,虽然课程设计的过程中遇到了很多困难与问题,但我们最终还是完成了设计的任务及要求。具体来说可以分为以下几点:第一,不够细心,不够严谨;第二,因对课本理论的掌握度不够导致编程出现错误;第三,硬件方面,刚开始有的程序模块不能实现预期的效果,对于有的硬件,在实物制作过程中焊了比较多的排线,同时对于整体各元器件的布局都有很高的要求。不过在向同学请教,各方面都有了不同程度的改善;第四,在做人方面,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没有什么办不到的。这次课程设计中我们完成了基本任务,使我们有了一定的成就感,也使我们进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤, 初步掌握了单片机仿真软件Proteus的使用方法和键盘,同时也掌握了撰写课程设计报告的方法。总之,通过这次课程设计,我们都清楚明白了自己的能力有多深,想提高还得归于多锻炼,多动手,多向别人学习。
附件
实物图
完整程序:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table0[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//P0-P7依次点亮
uchar code table1[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//P0-P7依次熄灭
uchar code table2[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//P7-P7依次点亮
uchar code table3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//P7-P7依次熄灭
uchar temp,aa,bb,temp,temp1;
void delay(uint z);
void h();
void hh();
void hhh();
void hhhh();
void init();
void main()//主函数
{
init();
while(520)//大循环
{
h();
hh();
hhh();
hhhh();
}
}
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void h()
{
for(aa=0;aa<3;aa++)
{
for(bb=0;bb<8;bb++)
{
P0=table0[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P1=table0[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P3=table0[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P2=table0[bb];
delay(50);
}
delay(500);
for(bb=0;bb<8;bb++)
{
P0=table1[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P1=table1[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P3=table1[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P2=table1[bb];
delay(50);
}
}
for(aa=0;aa<3;aa++)
{
for(bb=0;bb<8;bb++)
{
P2=table2[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P3=table2[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P1=table2[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P0=table2[bb];
delay(50);
}
delay(500);
for(bb=0;bb<8;bb++)
{
P2=table3[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P3=table3[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P1=table3[bb];
delay(50);
}
for(bb=0;bb<8;bb++)
{
P0=table3[bb];
delay(50);
}
}
}
void hh()
{
for(bb=0;bb<3;bb++)
{
for(aa=0;aa<8;aa++)
{
P0=table0[aa];
P2=table2[aa];
delay(100);
}
for(aa=0;aa<8;aa++)
{
P3=table2[aa];
P1=table0[aa];
delay(100);
}
for(aa=0;aa<8;aa++)
{
P2=table3[aa];
P0=table1[aa];
delay(100);
}
for(aa=0;aa<8;aa++)
{
P1=table1[aa];
P3=table3[aa];
delay(100);
}
}
}
void init()
{
P1=P2=P3=P0=0x00;
delay(1000);
P1=P2=P3=P0=0xff;
delay(200);
temp=0xfe;
temp1=0x7f;
}
void hhh()
{
for(bb=0;bb<10;bb++)
{
for(aa=0;aa<8;aa++)
{
P0=temp;
temp=_crol_(temp,1);
delay(40);
}
P0=0xff;
for(aa=0;aa<8;aa++)
{
P1=temp;
temp=_crol_(temp,1);
delay(40);
}
P1=0xff;
for(aa=0;aa<8;aa++)
{
P3=temp;
temp=_crol_(temp,1);
delay(40);
}
P3=0xff;
for(aa=0;aa<8;aa++)
{
P2=temp;
temp=_crol_(temp,1);
delay(40);
}
P2=0xff;
}
}
void hhhh()
{
for(aa=0;aa<30;aa++)
{
P0=P1=0x00;
delay(100);
P1=P0=0xff;
P2=P3=0x00;
delay(100);
P2=P3=0xff;
}
}