单片机课程设计报告心形流水灯.docx
《单片机课程设计报告心形流水灯.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告心形流水灯.docx(42页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告心形流水灯
井冈山大学
机电工程学院
单片机
课程设计报告
课程名称:
单片机
设计题目:
心形流水灯
姓名:
彭玉红
专业:
生物医学工程
班级:
11级医工本一班
学号:
110615017
指导教师:
王佑湖
2013年11月27日
1引言…………………………………………………………..2
1.1设计任务……………………………………….……….2
1.2设计要求………………………………………………..2
2课题综述…………………………………………………….2
2.1课题的来源……………………………………………..2
2.2面对的问题……………………………………………2
3系统分析…………………………………………………….2
3.1STC89C52单片机引脚图及引脚功能介绍……………2
4系统设计…………………………………………………….4
4.1硬件设计………………………………………………...4
4.1.1硬件框图…………………………………………..4
4.1.2硬件详细设计……………………………………..5
4.2软件设计………………………………………..............5
4.3硬件原理图……………………………………………..6
4.4元件清单………………………………………………..6
4.5硬件焊接图……………………………………………..6
4.6代码编写………………………………………………..7
5心得体会……………………………………………………...7
6致谢…………………………………………………………..8
参考文献…………………………………………………….....8
1引言
单片机课程设计主要是为了让我们增进对STC89C51单片机电路的感性认识,加深对理论方面的理解。
了解软硬件的有关知识,并掌握软硬件设计过程、方法及实现,为以后设计和实现应用系统打下良好基础。
另外,通过简单课题的设计练习,使我们了解必须提交的各项工程文件,达到巩固、充实和综合运用所学知识解决实际问题的目的。
1.1设计任务
设计一个单片机控制的流水灯系统
1.2设计要求
(1)32个LED灯;
(2)可实现多种的亮灯(如左循环,右循环,间隔闪,90度交叉闪等)。
2课题综述
2.1课题的来源
当今社会,这种由单片机芯片控制各种硬件工作的技术也日益成熟,并普及在交通、化工、机械等各个领域。
而流水灯这项技术在生活中的应用更是广泛,较为贴近生活。
而流水灯控制的设计所需要的知识也正好吻合了我们本学期对于单片机这门课程的学习,所以设计流水灯控制的这个课题让我们对知识的学习和巩固都有了进一步的加深。
2.2面对的问题
这次课程设计是通过STC89C52位单片机实现。
但面对的问题却是两方面的:
一个是软件的设计,也就是实现流水灯控制功能的程序编辑;另一个是硬件的设计,需要我们自己连接、焊接电路板。
而更为严峻的就是设计的最后还要将软硬件相结合。
3系统分析
3.1STC89C52单片机引脚图及引脚功能介绍
本次设计的目的在于加深STC89C52单片机的理解,首先来简单认识一下,它的引脚如图3-1所示:
图3.1STC89C52
STC89C52引脚可以分为四个部分,各个引脚功能如下:
主电源引脚(2根)
•Vcc:
电源输入,接+5V电源
GND:
接地线
•外接晶振引脚(2根)
XTAL1:
片内振荡电路的输入端
XTAL2:
片内振荡电路的输出端
•控制引脚(4根)
RST/PROG:
复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/VPP:
地址锁存允许信号
PESN:
外部存储器选通信号
EA/VPP:
程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
•可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
P0口:
8位双向I/O口线
P1口:
8位准双向I/O口线
P1口:
8位双向I/O口线
P2口:
8位准双向I/O口线
P3口:
8位准双向I/O口线
4系统设计
4.1硬件设计
4.1.1.硬件框图
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
STC89C52单片机是本次课程设计运用的主要原件。
流水灯控制设计是用一个带有32个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。
从原理图中可以看出,如果要让接在P1、P2、P3、P0口的LED亮起来,那么只要把P2、P1、P3、P0口的电平变为低电平就可以了;因此,要实现流水灯功能,我们只要将发光二极管LED1~LED32依次点亮、熄灭,32只LED灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
4.1.2.硬件详细设计
(1)复位电路部分
当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。
(2)晶振部分
4.2软件设计
单片机的应用系统由硬件和软件组成,在硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。
4.3硬件原理图
4.4元件清单
表4-1元件清单
元件名称
型号
数量(个)
单片机
STC89C52
1
单片机芯片底座
DIP40
1
晶振
12MHz
1
瓷介电容
30pF
2
电解电容
10uF
1
按钮开关
/
2
普通电阻
10kΩ
1
贴片电阻
470
32
发光二级管
红色
32
电源
+5V(VCC)
1
USB连接线
/
1
万能板
9*15
1
4.5效果实物图
(1)背面实物图
(2)正面实物图
4.6代码编写
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED从低位往高位移
ucharcodetable1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED从高位往低位移
ucharcodetable2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//LED从1个亮到8个都点亮(从低位往高位)
ucharcodetable3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED从1个亮到8个都点亮(从高位往低位)
ucharcodetable4[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//LED从8个全亮到一个都不亮(从低位往高位)
ucharcodetable5[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//LED从8个全亮到一个都不亮(从高位往低位)
ucharcodetable6[]={0xfe,0xfc,0xfa,0xf6,0xee,0xde,0xbe,0x7e};//LED从低位往高位移(最低位始终为0)
ucharcodetable7[]={0x7f,0x3f,0x5f,0x6f,0x77,0x7b,0x7d,0x7e};//LED从高位往低位移(最高位始终为0)
uchari,j;
uinttt=70;
voiddelay(uinttime)//延时函数
{
uintx,y;
for(x=time;x>0;x--)
for(y=110;y>0;y--);
}
voiddisp0()//状态0所有LED闪烁3次
{
for(i=0;i<3;i++)
{
P0=0x00;P2=0x00;P3=0x00;P1=0x00;
delay(300);
P0=0xff;P2=0xff;P3=0xff;P1=0xff;
delay(300);
}
}
voiddisp1()//状态1LED顺时针转一圈
{
for(i=0;i<8;i++)
{
P2=table1[i];
delay(100);
}
P2=0xff;
for(i=0;i<8;i++)
{
P3=table1[i];
delay(100);
}
P3=0xff;
for(i=0;i<8;i++)
{
P1=table1[i];
delay(100);
}
P1=0xff;
for(i=0;i<8;i++)
{
P0=table0[i];
delay(100);
}
P0=0xff;
}
voiddisp2()//状态2LED逆时针转一圈
{
for(i=0;i<8;i++)
{
P0=table1[i];
delay(100);
}
P0=0xff;
for(i=0;i<8;i++)
{
P1=table0[i];
delay(100);
}
P1=0xff;
for(i=0;i<8;i++)
{
P3=table0[i];
delay(100);
}
P3=0xff;
for(i=0;i<8;i++)
{
P2=table0[i];
delay(100);
}
P2=0xff;
}
voiddisp3()//状态34个LED同时顺时、逆时针移动1/4圈
{
for(i=0;i<8;i++)
{
P0=table1[i];
P1=table1[i];
P2=table1[i];
P3=table0[i];
delay(100);
}
for(i=0;i<8;i++)
{
P0=table0[i];
P1=table0[i];
P2=table0[i];
P3=table1[i];
delay(100);
}
P3=0xff;P0=0xff;
}
voiddisp4()//状态42个LED同时顺时针移动半圈
{
for(i=0;i<8;i++)
{
P2=table1[i];
P1=table1[i];
delay(100);
}
P2=0xff;P1=0xff;
for(i=0;i<8;i++)
{
P3=table1[i];
P0=table0[i];
delay(100);
}
P3=0xff;P0=0xff;
}
voiddisp5()//状态52个LED同时逆时针移动半圈
{
for(i=0;i<8;i++)
{
P0=table1[i];
P3=table0[i];
delay(100);
}
P0=0xff;P3=0xff;
for(i=0;i<8;i++)
{
P1=table0[i];
P2=table0[i];
delay(100);
}
P1=0xff;P2=0xff;
}
voiddisp6()//状态6LED自上而下逐渐点亮(一半点亮一半不亮)
{
for(i=0;i<8;i++)
{
P0=table3[i];
P2=table3[i];
delay(100);
}
P0=0xff;P2=0xff;
for(i=0;i<8;i++)
{
P1=table2[i];
P3=table3[i];
delay(100);
}
P1=0xff;P3=0xff;
}
voiddisp7()//状态7LED自下而上逐渐点亮(直到全部点亮)
{
for(i=0;i<8;i++)
{
P1=table3[i];
P3=table2[i];
delay(100);
}
for(i=0;i<8;i++)
{
P0=table2[i];
P2=table2[i];
delay(100);
}
}
voiddisp8()//状态8间断8格的4个LED亮并逆时针旋转
{
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
P0=table1[i];
P2=table0[i];
P1=table0[i];
P3=table0[i];
delay(100);
}
P0=0xff;P2=0xff;P1=0xff;P3=0xff;
for(i=0;i<8;i++)
{
P0=table1[i];
P2=table0[i];
P1=table0[i];
P3=table0[i];
delay(100);
}
P0=0xff;P2=0xff;P1=0xff;P3=0xff;
}
}
voiddisp9()//状态9间断8格的4个LED亮,然后逆时针逐渐点亮(直到全部点亮)
{
for(i=0;i<8;i++)
{
P0=table3[i];
P2=table2[i];
P1=table2[i];
P3=table2[i];
delay(100);
}
delay(500);
}
voiddisp10()//状态10从LED全部亮到全不亮(间断8格的4个LED开始逆时针熄灭)
{
for(i=0;i<9;i++)
{
P0=table5[i];
P2=table4[i];
P1=table4[i];
P3=table4[i];
delay(100);
}
delay(300);
}
voiddisp11()//状态11间断8格的4个LED亮并顺时针旋转
{
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
P0=table0[i];
P2=table1[i];
P1=table1[i];
P3=table1[i];
delay(100);
}
P0=0xff;P2=0xff;P1=0xff;P3=0xff;
for(i=0;i<8;i++)
{
P0=table0[i];
P2=table1[i];
P1=table1[i];
P3=table1[i];
delay(100);
}
P0=0xff;P2=0xff;P1=0xff;P3=0xff;
}
}
voiddisp12()//间断8格的4个LED亮,然后顺时针逐渐点亮(直到全部点亮)
{
for(i=0;i<8;i++)
{
P0=table2[i];
P2=table3[i];
P1=table3[i];
P3=table3[i];
delay(100);
}
delay(1000);
}
voiddisp13()//状态13从LED全部亮到全不亮(间断8格的4个LED开始顺时针熄灭)
{
for(i=0;i<9;i++)
{
P0=table4[i];
P2=table5[i];
P1=table5[i];
P3=table5[i];
delay(100);
}
delay(300);
}
voiddisp14()//状态14从LED不亮到全亮(从P0.0、P1.0、P2.0、P3.7开始逐步点亮)
{
for(i=0;i<8;i++)
{
P0=table2[i];
P1=table2[i];
P2=table2[i];
P3=table3[i];
delay(100);
}
}
voiddisp15()//状态15从LED全亮到全不亮(P0.7、P1.7、P2.7、P3.0逐步熄灭)
{
for(i=0;i<9;i++)
{
P0=table5[i];
P1=table5[i];
P2=table5[i];
P3=table4[i];
delay(100);
}
delay(300);
}
voiddisp16()//状态16LED灯交替闪烁(频率有慢变快)
{
for(i=0;i<5;i++)
{
P0=0xaa;P1=0xaa;P2=0xaa;P3=0xaa;
delay(100);
P0=~P0;P1=~P1;P2=~P2;P3=~P3;
delay(100);
}
for(i=0;i<5;i++)
{
P0=0xaa;P1=0xaa;P2=0xaa;P3=0xaa;
delay(200);
P0=~P0;P1=~P1;P2=~P2;P3=~P3;
delay(200);
}
for(i=0;i<5;i++)
{
P0=0xaa;P1=0xaa;P2=0xaa;P3=0xaa;
delay(300);
P0=~P0;P1=~P1;P2=~P2;P3=~P3;
delay(300);
}
P0=0xff;P2=0xff;P1=0xff;P3=0xff;
delay(300);
}
voiddisp17()//状态17从P0.7开始逆时针逐步点亮,(循环2次)并且速度会逐步提高
{
for(i=0;i<8;i++)
{
P0=table3[i];
delay(100);
}
for(i=0;i<8;i++)
{
P1=table2[i];
delay(100);
}
for(i=0;i<8;i++)
{
P3=table2[i];
delay(100);
}
for(i=0;i<8;i++)
{
P2=table2[i];
delay(100);
}
P0=0xff;P1=0xff;P3=0xff;P2=0xff;
for(i=0;i<8;i++)
{
P0=table3[i];
delay(50);
}
for(i=0;i<8;i++)
{
P1=table2[i];
delay(50);
}
for(i=0;i<8;i++)
{
P3=table2[i];
delay(50);
}
for(i=0;i<8;i++)
{
P2=table2[i];
delay(50);
}
P0=0xff;P1=0xff;P3=0xff;P2=0xff;
}
voiddisp18()//状态18LED从P0.7开始逆时针逐步点亮(每亮8位后就熄灭)
{
for(i=0;i<8;i++)
{
P0=table3[i];
delay(100);
}
P0=0xff;
for(i=0;i<8;i++)
{
P1=table2[i];
delay(100);
}
P1=0xff;
for(i=0;i<8;i++)
{
P3=table2[i];
delay(100);
}
P3=0xff;
for(i=0;i<8;i++)
{
P2=table2[i];
delay(100);
}
P2=0xff;
}
voiddisp19()//状态19LED从P2.7开始顺时针逐步点亮,(循环2次)并且速度会逐步提高
{
for(i=0;i<8;i++)
{
P2=table3[i];
delay(100);
}
for(i=0;i<8;i++)
{
P3=table3[i];
delay(100);
}
for(i=0;i<8;i++)
{
P1=table3[i];
delay(100);
}
for(i=0;i<8;i++)
{
P0=table2[i];
delay(100);
}
P0=0xff;P1=0xff;P3=0xff;P2=0xff;
for(i=0;i<8;i++)
{
P2=table3[i];
delay(50);
}
for(i=0;i<8;i++)
{
P3=table3[i];
delay(50);
}
for(i=0;i<8;i++)
{
P1=table3[i];
delay(50);
}
for(i=0;i<8;i++)
{
P0=table2[i];
delay(50);
}
P0=0xff;P1=0xff;P3=0xff;P2=0xff;
}
voiddisp20()//状态20LED从P2.7开始顺时针逐步点亮(每亮8位后就熄灭)
{
for(i=0;i<8;i++)
{
P2=table3[i];
delay(100);
}
P2=0xff;
for(i=0;i<8;i++)
{
P3=table3[i];
delay(100);
}
P3=0xff;
for(i=0;i<8;i++)
{
P1=table3[i];
delay(100);
}
P1=0xff;
for(i=0;i<8;i++)
{
P0=table2[i];
delay(100);
}
P0=0xff;
}
voiddisp21()//状态212个LED开始上下移动半圈
{
for(i=0;i<8;i++)
{
P0=table1[i];
P2=table1[i];
delay(100);
}
P0=0xff;