心形流水灯设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东英才学院
51单片机课程设计
心形流水灯
学院信息工程学院
专业班级本科电子信息工程
学生姓名
指导教师
2019年04月02日
设计要求:
o设计一个用单片机控制的心形流水灯系统;
o LED灯数量为32个;
o可以实现循环点亮、依次熄灭的基本功能;
o可以实现对角闪亮、间隔闪亮、顺时针闪亮、逆时针闪亮等多种功能(也可自行增加功能)。
学生需要完成的任务:
完成心形流水灯电路设计,利用Keil软件编写程序,Proteus软件进行电路功能仿真,并将仿真结果采用录屏形式生成视频,视频类型建议用.mp4格式,大小不超过200M。
目录
目录 (3)
一、总体方案设计 ................................................................................................................. - 4 -
1、单片机的选择 ........................................................................................................... - 4 -
2、LED灯控制方式的比较与选择 ................................................................................ - 4 -
3、硬件设计 ................................................................................................................... - 4 -
二、电路原理图设计 ............................................................................................................. - 5 -
1、时钟电路 ................................................................................................................... - 5 -
2、复位电路 ................................................................................................................... - 5 -
3、显示电路 ................................................................................................................... - 6 -
4、电源电路 ................................................................................................................... - 7 -
三、程序设计 ......................................................................................................................... - 9 -
1、Keil 软件介绍 ........................................................................................................... - 9 -
2、程序编写设计 ........................................................................................................... - 9 -
3、程序调试 .................................................................................................................- 10 -
4、电路功能仿真 .........................................................................................................- 11 - 附件: ...................................................................................................................................- 13 -
1、程序代码: .............................................................................................................- 13 -
2、小组成员任务分配表 .............................................................................................- 19 -
时钟电路
复位电路
图1-3.1
电 源
一、总体方案设计
1、单片机的选择
单片机作为该电路的主要控制器芯片,是整个系统核心部分,主要负责控制LED 灯的亮灭变化的速度以及变化效果。
89c51单片机共有32个I/O 口,能够满足32个流水灯的设计需求;另外80c51具有4k 字节的FLASH 闪存和128字节的RAM ,编写的程序很小,非常能够满足设计的需求;除此之外,89c51单片机还具有灵活性高且廉价的特点,综合考虑,选择89c51芯片作为设计的方案。
2、LED 灯控制方式的比较与选择
方案一:采用位操作的方式对32个i/o 口进行操作
方案二:采用总线的方式对32个i/o 口进行操作
由于采用位操作的方式,还需要声明32个i/o 口,另外在写程序的时候语句较多,过程繁琐;而采用总线操作的方式,则不需要声明i/o 口,与位操作相比,采用总线的方式在程序编写时能用很少的语句实现相同的功能效果;所以,选择方案二,即采用总线操作的方式对32个i/o 口操作。
3、硬件设计
心形流水灯设计所需的系统应该具有:由32个发光二极管组成的显示电路、由晶振和电容组成的时钟电路、电源、复位电路即软件部分。
心形流水灯的硬件设计框图如图1-3.1所示
二、电路原理图设计
1、时钟电路
单片机内有一个由反相放大器所构成的振荡电路,XTAL1 和XTAL2 分别为振荡电路的输入端和输出端。
在XTAL1 和XTAL2 引脚上外接石英晶体和微调电容构成并联振荡回路。
晶振频率设置为11.0592MHZ, 作用是产生时钟信号。
单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率纸上。
电容值为30pF, 可以起到频率微调作用。
时钟电路如图2-1.1所示:
图2-1.1
2、复位电路
当输入连续两个机器周期以上高电平时为有效,用来完成单片机的复位初始值操作,复位后程序计数器PC=0000H,即复位后将从程序储存器的0000H 单元读取第一条指令码,通俗的讲,就是单片机重新开始命令,防止程序走偏。
复位电路如图2-2.1所示:
图2-2.1
单片机的P0 口为8 位的漏极开路的双向I/O 口,当P0口作为普通的I/O 口使用时,需要上拉电阻,这时为准双向口。
P1 、P2、P3 都为8 位的准双向口,具有内部上拉电阻。
图 6 为显示电路,单片机I/O 口一对一直接控制LED 灯,显示电路中的32 个电阻既为上拉电阻,也起到电路分压作用,防止烧坏元器件。
显示电路如图2-3.1所示
图2-3.1
本次课程设计,单片机正常工作要求输出电压为稳定的5V,输出电压能够适应所带负载的启动项能。
并且电路还必须简单可靠,能够输出足够大的电流,但是不至于会烧坏元器件。
我们采用USB 取电,4.8V 锂电池供电。
电源电路如图所示,两个电阻起到滤波作用,两个电阻的作用是平衡电路中的电流,以免在只有 1 个LED 灯亮时烧坏元器件。
电源电路如图2-4.1所示。
图2-4.1
32心形流水灯原理图
三、程序设计
1、Keil 软件介绍
本次课程设计,我们采用Keil软件进行C语言编程。
Keil软件是美国Keil Software公司开发的,它适合WindowsXP、Win7 等系统,具有可视化操作界面,使用方便简单,并且支持C51 语言、汇编语言以及两者混合编程等多种方式的单片机设计,KeilC51 在兼容标准 C 语言的基础上,又增加了很多与51系列单片机硬件相关的编译特性,其生成的程序代码运行的速度快,所需的存储器空间小。
Keil 软件已被完全集成到一个功能强大的全新环境中,该开发环境集成了文件编译处理、编译链接、项目管理、工具引用、和仿真软件模拟器等多种功能。
Keil 软件具有丰富的库函数,同时也带有功能强大的集成开发调试工具,可以自动识别所编写程序的语法错误,编译效率也很高,能将源文件编译为二进制机器语言代码,其软件调试仿真功能也很强大,能通过单步、设置断点等功能让编程者了解CPU 正在进行的程序,并能监控各变量以及各寄存器是否符合编程者的要求。
2、程序编写设计
单片机的应用系统由硬件和软件组成,在硬件原理图搭建完成上电之后,暂时还不能看到流水灯循环点亮的现象,还需要编写程序控制单片机管脚电平的高低变化,来实现LED 灯的各种亮灭功能。
其程序流程图3-2.1如图所示:
例如,先将P0、P1、P2、P3 全部置1,即通入高电平,用16 进制表示为0XFF,则32个LED 灯全部处于熄灭状态。
然后给P0 口赋值0X7F,即只有P0.0 处于低电平时,LED1 灯点亮。
使用延时函数delay,并设置延时时间为0.2秒,延时时间一到P0 口的值就变为0X3F, 即P0.0和P0.1都
为高电平,LED2 也开始点亮,如此循环P0口控制的8 个LED 灯全部点亮,当高电平变为低电平时,LED 灯熄灭。
P1、P2、P3 口控制的LED灯闪亮和熄灭原理同P0 口一样,所以就可以看到LED 灯的流水效果了。
图3-2.1程序设计流程图
3、程序调试
在程序编写好了之后,需要连接工程并编译,经过反复的检查、编译、调试,程序没有错误后,最后获得目标代码Hex文件。
将程序代码文件调入Proteus软件,进行电路功能仿真,并根据仿真结果进行程序的修改和完善。
所以程序的调试就显得至关重要。
其中,将每个闪烁的部分都写成一个子函数,直接在主函数中调用即可实现闪烁的花样和效果,各子函数与主函数的结构框图如图3-3.1所示:
主函数
依次点亮
依次熄灭
间隔闪烁
顺时针闪
逆时针闪
对角闪
左右闪
上
下闪
全部闪亮
延时
延时
延时
4、电路功能仿真
在各部分电路设计的基础上,按照总体电路图在 Proteus 上一一进行器件选择,并连接。
将电路连接好后,为各个器件选择合适的参数,然后调入已编译好的目标代码Hex 文件,启动仿真。
根据 LED 灯是否发亮,判断所设计的电路是否可以实现 32 个 LED 灯依次点亮、依次熄灭、对角闪亮、对角熄灭、间隔闪亮、间隔熄灭等多种功能。
电路仿真的结果为 32 个 LED 灯依次发亮、依次熄灭,并可以实现多种亮灭功能。
仿真电路
附件:
1、程序代码:
#include<reg52.h>
#include<intrins.h> //库函数
#define uint unsigned int
#define uchar unsigned char//宏定义
void delay(uint xms)//延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void zys(uint t)//左右闪烁
{
while(t--)
{
P3=P2=0x00;
delay(500);
P3=P2=0xff;
P1=P0=0x00;
delay(500);
P1=P0=0xff;
}
}
void qs(uint t)//全部闪亮
{
while(t--)
{
P0=P1=P2=P3=0xff;
delay(300);
P0=P1=P2=P3=0x00;
delay(300);
}
P1=P2=P3=P0=0xff;
}
void ycdl(uint t)//依次点亮
{
uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
uint i;
while(t--)
{
for(i=0;i<8;i++)
{
P0=table[i];
delay(200);
}
for(i=0;i<8;i++)
{
P1=table[i];
delay(200);
}
for(i=0;i<8;i++)
{
P2=table[i];
delay(200);
}
for(i=0;i<8;i++)
{
P3=table[i];
delay(200);
}
}
}
void ycxm (uint t)//依次熄灭
{
uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
uint i;
while(t--)
{
P0=P1=P2=P3=0x00;
for(i=0;i<8;i++)
{
P0=~table[i];
delay(200);
}
for(i=0;i<8;i++)
{
P1=~table[i];
delay(200);
}
for(i=0;i<8;i++)
{
P2=~table[i];
delay(200);
}
for(i=0;i<8;i++)
{
P3=~table[i];
delay(200);
}
}
}
void jgs(uint t)//间隔闪烁{
while(t--)
{
P0=P1=P2=P3=0xaa;
delay(500);
P0=P1=P2=P3=~0xaa;
delay(500);
}
P0=P1=P2=P3=0xff;
delay(200);
}
void sszs(uint t)//顺时针闪烁{
uchar a,i;
while(t--)
{
a=0xfe;
for(i=0;i<8;i++)
{
P0=a;
delay(200);
a=_crol_(a,1);
}
P0=0xff;
a=0xfe;
for(i=0;i<8;i++)
{
P1=a;
delay(200);
a=_crol_(a,1);
}
P1=0xff;
a=0xfe;
for(i=0;i<8;i++)
{
P2=a;
delay(200);
a=_crol_(a,1);
}
P2=0xff;
a=0xfe;
for(i=0;i<8;i++)
{
P3=a;
delay(200);
a=_crol_(a,1);
}
P3=0xff;
}
}
void nszs(uint t)//逆时针闪烁{
uchar a,i;
while(t--)
{
a=0x7f;
for(i=0;i<8;i++)
{
P3=a;
delay(200);
a=_cror_(a,1);
}
P3=0xff;
a=0x7f;
for(i=0;i<8;i++)
{
P2=a;
delay(200);
a=_cror_(a,1);
}
P2=0xff;
a=0x7f;
for(i=0;i<8;i++)
{
P1=a;
delay(200);
a=_cror_(a,1);
}
P1=0xff;
a=0x7f;
for(i=0;i<8;i++)
{
P0=a;
delay(200);
a=_cror_(a,1);
}
P0=0xff;
}
}
void djs1(uint t)//对角闪烁2个顺时针
{
uchar i;
uchar code table[]={0xf0,0xe1,0xc3,0x87,0x0f,0x1f,0x3f,0x7f,
0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,
0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,
0xf0,0xe1,0xc3,0x87,0x0f,0x1f,0x3f,0x7f,0xff};
while(t--)
{
for(i=0;i<17;i++)
{
P0=P2=table[i];
P1=P3=table[i+17];
delay(200);
}
for(i=0;i<17;i++)
{
P1=P3=table[i+17];
P0=P2=table[i];
delay(200);
}
}
delay(300);
P0=P1=P2=P3=0xff;
}
void djs2(uint t)//对角闪4个逆时针
{
uchar i;
uchar code table[]={0x0f,0x87,0xc3,0xe1,0xf0,0x78,0x3c,0x1e,0x0f};
while(t--)
{
for(i=0;i<9;i++)
{
P1=P2=P3=P0=table[i];
delay(200);
}
}
}
void sxhx(uint t)//从上往下画心
{
uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
uint i;
while(t--)
{
for(i=0;i<8;i++)
{
P0=table[i];
P3=table[i+8];
delay(200);
}
for(i=0;i<8;i++)
{
P1=table[i];
P2=table[i+8];
delay(200);
}
P1=P2=P3=P0=0xff;
delay(300);
}
}
void main()
{
while(1)
{
ycdl(1);
ycxm(1);
jgs(3);
sszs(1);
nszs(1);
djs1(1);
djs2(3);
zys(3);
sxhx(1);
qs(3);
}
}
2、小组成员任务分配表。