资源描述
井冈山大学
机电工程学院
单片机
课程设计汇报
课程名称:单片机
设计题目:心形流水灯
姓 名: 彭玉红
专 业:生物医学工程
班 级:11级医工本一班
学 号:
指导老师:王佑湖
11月27日
目录
1引言…………………………………………………………..2
1.1设计任务……………………………………….……….2
1.2设计要求……………………………………………… ..2
2 课题综述…………………………………………………….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 STC89C52
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 <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar 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、P1LED,熄灭后,再顺时针点亮P0、P3LED
{
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、P1LED,再顺时熄灭后,再顺时针点亮P0、P3LED,再顺时熄灭
{
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);
}
void disp30() //状态30 逐步逆时针点亮P2、P1LED,熄灭后,再逆时针点亮P0、P3LED
{
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;
}
}
void disp31() //状态31 逐步逆时针点亮P2、P1LED,再逆时熄灭后,再逆时针点亮P0、P3LED,再逆时熄灭
{
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++)
{
P1=table2[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++)
{
P0=table2[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)
展开阅读全文