井冈山大学机电工程学院单片机课程设计报告课程名称:单片机设计题目:心形流水灯姓名:玉红专业:生物医学工程班级:11级医工本一班学号:*************:***2013年11月27日目录1引言 (2)1.1设计任务 (2)1.2设计要求……………………………………………… ..22 课题综述 (2)2.1课题的来源 (2)2.2面对的问题 (2)3 系统分析 (2)3.1 STC89C52单片机引脚图及引脚功能介绍 (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.1 STC 89C52单片机引脚图及引脚功能介绍本次设计的目的在于加深STC89C52单片机的理解,首先来简单认识一下,它的引脚如图3-1所示:图3.1 STC89C52STC89C52引脚可以分为四个部分,各个引脚功能如下:主电源引脚(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 元件清单元件名称型号数量(个)单片机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 <REGX52.H>#define uint unsigned int#define uchar unsigned charuchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED从低位往高位移uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED从高位往低位移uchar code table2[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//LED从1个亮到8个都点亮(从低位往高位)uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//LED从1个亮到8个都点亮(从高位往低位)uchar code table4[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//LED 从8个全亮到一个都不亮(从低位往高位)uchar code table5[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//LED 从8个全亮到一个都不亮(从高位往低位)uchar code table6[]={0xfe,0xfc,0xfa,0xf6,0xee,0xde,0xbe,0x7e};//LED从低位往高位移(最低位始终为0)uchar code table7[]={0x7f,0x3f,0x5f,0x6f,0x77,0x7b,0x7d,0x7e};//LED从高位往低位移(最高位始终为0)uchar i,j;uint tt=70;void delay(uint time) //延时函数{uint x,y;for(x=time;x>0;x--)for(y=110;y>0;y--);}void disp0() //状态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);}}void disp1() //状态1 LED顺时针转一圈{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;}void disp2() //状态2 LED逆时针转一圈{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;}void disp3() //状态3 4个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;}void disp4() //状态4 2个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;}void disp5() //状态5 2个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;}void disp6() //状态6 LED自上而下逐渐点亮(一半点亮一半不亮) {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;}void disp7() //状态7 LED自下而上逐渐点亮(直到全部点亮) {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);}}void disp8() //状态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;}}void disp9() //状态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);}void disp10() //状态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);}void disp11() //状态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;}}void disp12() //间断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);}void disp13() //状态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);}void disp14() //状态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);}}void disp15() //状态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);}void disp16() //状态16 LED灯交替闪烁(频率有慢变快) {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);}void disp17() //状态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;}void disp18() //状态18 LED从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;}void disp19() //状态19 LED从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;}void disp20() //状态20 LED从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;}void disp21() //状态21 2个LED开始上下移动半圈{for(i=0;i<8;i++){P0=table1[i];P2=table1[i];delay(100);}P0=0xff; P2=0xff;for(i=0;i<8;i++){P1=table0[i];P3=table1[i];delay(100);}for(i=0;i<8;i++){P1=table1[i];P3=table0[i];delay(100);}P1=0xff; P3=0xff;for(i=0;i<8;i++){P0=table0[i];P2=table0[i];delay(100);}}void disp22() //装态22 2个LED自上而下移动(循环5次,且频率渐快,到最快时持续循环16次,然后循环5次频率再逐渐降低){for(j=0;j<5;j++){for(i=0;i<8;i++){P0=table1[i];P2=table1[i];delay(tt);}P0=0xff; P2=0xff;for(i=0;i<8;i++){P1=table0[i];P3=table1[i];delay(tt);}P1=0xff; P3=0xff;tt=tt-10;}for(j=0;j<16;j++) {for(i=0;i<8;i++){P0=table1[i];P2=table1[i];delay(20);}P0=0xff; P2=0xff;for(i=0;i<8;i++){P1=table0[i];P3=table1[i];delay(20);}P1=0xff; P3=0xff;}tt=20;for(j=0;j<5;j++){for(i=0;i<8;i++){P0=table1[i];P2=table1[i];delay(tt);}P0=0xff; P2=0xff;for(i=0;i<8;i++){P1=table0[i];P3=table1[i];delay(tt);}P1=0xff; P3=0xff;tt=tt+10;}tt=70;}void disp23() //状态23 LED上下交替闪烁{for(i=0;i<2;i++){P0=0x00; P2=0x00;delay(1000);P0=0xff; P2=0xff;P1=0x00; P3=0x00;delay(1000);P1=0xff; P3=0xff;}}void disp24() //状态24 LED左右交替闪烁{P1=0xff; P3=0xff; P0=0xff; P2=0xff;for(i=0;i<2;i++){P0=0x00; P1=0x00;delay(1000);P0=0xff; P1=0xff;P2=0x00; P3=0x00;delay(1000);P2=0xff; P3=0xff;}}void disp25() //状态25 LED交替闪烁{for(i=0;i<5;i++){P0=0xaa; P1=0xaa; P2=0xaa; P3=0xaa;delay(1000);P0=~P0; P1=~P1; P2=~P2; P3=~P3;delay(1000);}}void disp26() //状态26 2个LED开始上下移动半圈(LED不亮流水) {P0=0x00;P1=0x00;P2=0x00;P3=0x00;for(i=0;i<8;i++){P0=~table1[i];P2=~table1[i];delay(200);}P0=0x00; P2=0x00;for(i=0;i<8;i++){P1=~table0[i];P3=~table1[i];delay(200);}for(i=0;i<8;i++){P1=~table1[i];P3=~table0[i];delay(200);}P1=0x00; P3=0x00;for(i=0;i<8;i++){P0=~table0[i];P2=~table0[i];delay(200);}}void disp27() //状态27 逐步顺时针点亮P2、P1的LED,熄灭后,再顺时针点亮P0、P3的LED{P0=0xff; P1=0xff; P2=0xff; P3=0xff;for(j=0;j<2;j++){for(i=0;i<8;i++){P2=table3[i];P1=table3[i];delay(100);}P2=0xff; P1=0xff;for(i=0;i<8;i++){P0=table2[i];P3=table3[i];delay(100);}P0=0xff; P3=0xff;}}void disp28() //状态28 P1、P2和P0、P3交替闪烁{for(i=0;i<2;i++){P1=0x00; P2=0x00; P0=0xff; P3=0xff;delay(1000);P1=0xff; P2=0xff; P0=0x00; P3=0x00;delay(1000);}P1=0xff; P2=0xff; P0=0xff; P3=0xff;}void disp29() //状态29 逐步顺时针点亮P2、P1的LED,再顺时熄灭后,再顺时针点亮P0、P3的LED,再顺时熄灭{P0=0xff; P1=0xff; P2=0xff; P3=0xff;for(j=0;j<2;j++){for(i=0;i<8;i++){P2=table3[i];P1=table3[i];delay(100);}for(i=0;i<9;i++){P2=table5[i];P1=table5[i];delay(100);}for(i=0;i<8;i++){P0=table2[i];P3=table3[i];delay(100);}for(i=0;i<9;i++){P0=table4[i];P3=table5[i];delay(100);}}delay(200);}逆时针点亮P0、P3的LED{P0=0xff; P1=0xff; P2=0xff; P3=0xff;for(j=0;j<2;j++){for(i=0;i<8;i++){P2=table2[i];P1=table2[i];delay(100);}P2=0xff; P1=0xff;for(i=0;i<8;i++){P0=table3[i];P3=table2[i];delay(100);}P0=0xff; P3=0xff;}}后,再逆时针点亮P0、P3的LED,再逆时熄灭{P0=0xff; P1=0xff; P2=0xff; P3=0xff;for(j=0;j<2;j++){for(i=0;i<8;i++){P2=table2[i];P1=table2[i];delay(100);}for(i=0;i<9;i++){P2=table4[i];P1=table4[i];delay(100);}for(i=0;i<8;i++){P0=table3[i];P3=table2[i];delay(100);}for(i=0;i<9;i++){P0=table5[i];P3=table4[i];delay(100);}}delay(200);}void disp32() //状态32 LED自上而下逐步点亮,然后从下往上逐步熄灭{for(i=0;i<8;i++){P0=table3[i];P2=table3[i];delay(100);}for(i=0;i<8;i++){P3=table3[i];delay(100);}for(i=0;i<9;i++){P1=table5[i];P3=table4[i];delay(100);}for(i=0;i<9;i++){P0=table4[i];P2=table4[i];delay(100);}}void disp33() //状态33 LED从左往右开始点亮(直到全亮),然后从左右两边开始熄灭(直到全部熄灭){for(i=0;i<8;i++){P1=table2[i];delay(100);}for(i=0;i<8;i++){P2=table3[i];P3=table2[i];delay(100);}delay(500);for(i=0;i<9;i++){P2=table4[i];P3=table5[i];P1=table4[i];P0=table4[i];delay(100);}delay(300);}void disp34() //状态34 LED从左往右开始点亮(直到全亮),然后从中间往左右边熄灭{for(i=0;i<8;i++){P2=table2[i];P3=table3[i];delay(100);}for(i=0;i<8;i++){P0=table3[i];P1=table3[i];delay(100);}delay(500);for(i=0;i<9;i++){P2=table5[i];P3=table4[i];P1=table5[i];P0=table5[i];delay(100);}delay(300);}void disp35() //状态35 从P2.7、P1.7开始同时顺时针旋转,直到LED全亮{for(i=0;i<8;i++){P2=table3[i];P1=table3[i];delay(100);}for(i=0;i<8;i++){P3=table3[i];P0=table2[i];delay(100);}}void disp36() //状态36 从P0.7、P3.1开始同时逆时针旋转,直到LED全亮{for(i=0;i<8;i++){P0=table3[i];P3=table2[i];delay(100);}for(i=0;i<8;i++){P1=table2[i];P2=table2[i];delay(100);}}void disp37() //状态37 2个LED自上而下移动,并点亮最下2个LED,然后2个LED再自下而上回去,同时4个LED(上下各2个LED)再来回移动一次{for(i=0;i<8;i++){P0=table1[i];P2=table1[i];delay(100);}P0=0xff; P2=0xff; for(i=0;i<8;i++) {P1=table0[i];P3=table1[i];delay(100); }for(i=0;i<8;i++) {P1=table7[i];P3=table6[i];delay(100); }P1=0x7f; P3=0xfe; for(i=0;i<8;i++) {P0=table0[i];P2=table0[i];delay(100); }for(i=0;i<8;i++)。