课程设计报告
【课题名称】 多功能流水灯的设计
【摘 要】 城市夜景中,变幻多姿的霓虹灯历来是一道亮丽的风景,利用单片机的自动控制功能,设计出相应不同的电路,可以设计出彩灯不同模式的流水效果。单片机具有体积小,功能强,成本低,应用面广等优点。设计中主要采用AT89S52这款芯片作为控制主体,用发光二极管来作为显示灯,系统通过P0口外接8个发光二极管,P3口接4个按键,两个按键进行流向选择,用两个键来控制流水灯流动的速度。设计中辅以简单的设备和必要的电路,设计了一款流水灯,最终达到预期的目的。
【关 键 词】 流水灯 单片机AT89S52 发光二级管
目录
第一章 引言.....................................................................................................4
1.1单片机的背景及意义………………………………………………….4
第二章总体
构思………………………………………………………...4
第三章 设计原理分析……………………………………………………...5
3.1 硬件系统模块………………………………………………………..5
3.1.1 单片机最小系统………………………………………………..5
3.1.2 按键控制模块……………………………………………………8
3.1.3 晶振电路………………………………………………………..9
3.1.4 流水灯模块……………………………………………………..10
3.1.5 复位电路………………..………………………………………10
3.2 程序
……………………..…………………………………….10
第四章 具体电路的实现…………………………………………………….11
4.1 原理图部分…………………………………………………………….11
4.2 PCB图部分……………………………………………………………11
第五章 总结与体会……………………………………………………….....12
参考文献…………………………………………………………………….....12
附录1……………………………………………………………….……….…13
第1章 引言
单片机控制系统能够取代以前利用复杂电子线路或者数字电路构成的控制系统,可以软件控制来实现,并能够实现智能化。现在的单片机的控制范畴无所不在,例如通信产品、家用电器、智能仪器仪表、过程控制和专用控制装置等等,单片机的应用领域越来越广泛。
1.1单片机的背景及意义
随着经济的发展、科技的突飞猛进,芯片业得到了迅速的发展,是单片机技术在各种民用和工业控制等领域得到更广泛的应用。单片机凭借其低成本、高性能的不可代替优势已经成为了微电脑 控制的主力军。学习单片机的有效
是将理论与实践并重,因此通过对单片机可控流水灯的设计和研究,鼓励学生在熟悉基本原理的前提下,与实际应用相联系,提出自己的方案,来完善设计,使得他们更好的掌握单片机的应用。
第二章 总体方案设计
实现这个课题我们使用89S52作为控制主体,使用八个共阳极发光二极管作为LED显示流水灯,外接4个按钮,其中用两个按键进行流向选择,用两个键来控制流水灯流动的速度。,外接一个晶振来提供外接时钟脉冲, 用C语言来为单片机编程,通过编程来控制单片机各引脚在不同时间输出的不同的电平,进而控制个发光二级管的亮灭,以及控制流水灯的流速和流动方向。
第三章 设计原理分析
3.1.硬件系统模块
3.1.1 单片机最小系统
芯片82S52是核心,P0、P1、P2、P3口均可以作为I/O口使用。P0口外接8个发光二极管,P3口接4个按键,两个按键进行流向选择,用两个键来控制流水灯流动的速度。
(1)管脚说明:
图1 主体控制模块图
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每个端口可独立控制。内部无上拉电阻,为高阻状态,所以不能正常的输出高/低电平,所以在使用时要接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,每个口可独立控制,P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,每个口可独立控制,,与P1口相似。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,每个口可独立控制,做第一功能使用时就当作普通的I/O口,与P1口相似。做第二功能使用时,各引脚的定义如表1:
表1 P3口第二功能说明
标号
引脚
第二功能
说明
P3.0
10
RXD
串行输入口
P3.1
11
TXD
串行输出口
P3.2
12
/INT0
外部中断0
P3.3
13
INT1
外部中断1
P3.4
14
T0
定时器/计数器0外部输入端
P3.5
15
T1
定时器/计数器1外部输入端
P3.6
16
/WR
外部数据存储器写脉冲
P3.7
17
/RD
外部数据存储器读脉冲
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
X1:反向振荡放大器的输入及内部时钟工作电路的输入。
X2:来自反向振荡器的输出。
(2)震荡器特性: X1和X2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何
,但必须保证脉冲的高低电平要求的宽度。
(3)芯片擦除: 整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
3.1.2按键控制模块
按键控制模块采用独立式按键接口设计。独立式按键是每一个按键占用一根I/O端线。特点:各个按键相互独立,电路配置灵活;按键数量较多时,I/O端线耗费较多,电路复杂;软件结构简单。
按键去抖动问题:键盘的抖动时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。
软件去抖动:检测到按键按下后,执行延时子程序后再确认是否确实按下,消除抖动影响。
图2 按键电路
3.1.3 晶振电路
晶振的外围电路由两个电容和一个晶振构成,晶振为11.0592MHZ,电容为20~30PF,这里用的是22PF的。安装时要注意,接线要短而粗,要紧挨着芯片;电容的引脚要尽量的短;电容的地与芯片的地要就近接;芯片,晶振与地最近。其电路图如图4所示。
图3 晶振电路
3.1.4流水灯模块
发光二极管就是LED,是一种由磷化镓等半导体材料制成的、能直接将电能转换成光能的发光显示器件。当其内部有一定电流通过时,就是发光。发光二极管具有功耗低、体积小、可靠性高、寿命长和相应快等优点。
流水灯模块采用8个LED发光二极管,通过代码的编写,实现流速的变化,其中电阻的作用是保护二极管,向它提供较小的电流,防止二极管因为电流过大而烧毁。
设计中,发光二极管是共阴极接法的,我们只需要将其初值不断的左移或右移就会看到LED轮流的被点亮,也就实现了流水灯的功能。
图4 灯的电路
3.1.5 复位电路
复位电路的按键按下,相当于高电平1,系统恢复初始化状态
图5 手动复位电路
3.2 程序流程图(具体程序见附录1)
第四章 具体电路的实现
4.1 原理图部分
4.2 PCB 图部分
第五章 总结与体会
因为这是我第一次设计电路板,所以我很重视这次实验,投入的时间也比较多,很认真的去做,为以后的设计奠定好的习惯。在大一的时候,我们学过C语言,当时并不知道C语言怎么应用与实际生活中,也很久没接触它。做了这次的课程设计,我才知道,原来我们还可以用C语言给单片机编程,来实现多功能流水灯的设计。
这次设计的初步工作做得比较充分,所以后面原理图和程序写起来也顺手很多,但因为是第一做板,所以在对板调试过程中遇到了一些问题,但后面在同学的帮助下还是解决。
通过这次的课程设计,让我学习到了很多知识以及认识到了很多问题。同时我意识到了一个很重要的问题,那就是课程设计之前的准备工作也是很重要的,包括提前预习设计的题目,上网和去图书馆查阅资料。我清楚的知道了,资料也是那么重要,否则在一个新颖的题目面前,你将无从下手。通过准备工作,这样可以保证在设计的时候,有了充足的准备,使得自己不会在真正要开始课程设计的时候,对着题目发呆,没有什么进展。因此,我觉得这个也是对待学习的一种好的态度,以后在学习中,也要一直以这种好的态度对待。我更加熟悉了C语言的运用,懂得了设计电路中的每一个环节,电路中各个部分的功能是如何实现的;使我对单片机有了初步的了解,也让我对单片机产生了浓烈的兴趣。
这次设计我最大的收获是动手能力的提高,细心和耐心的培养,以及品尝到自己的劳动成果的喜悦在这次的设计中,我也学到了很多,也享受到了其中的乐趣。从这次课程设计中我了解到流水灯的设计还是很好玩的,以前在路上夜景中的流水灯看上去很复杂,现在自己编程以后,知道了原理,相信在器件的允许下,我们也是可以完成那种效果的。
【参考文献】
1. 郭天祥 《51单片机C语言教程——入门、提高、开发、拓展全攻略》 , 电子工业出版社, 2009
2. 谭浩强 《C程序设计(第三版)》 清华大学出版社 2005
3. 杨素行 《模拟电子技术基础简明教程(第三版)》 高等教育出版社 ,2005
附录1
#include
#include //52系列头文件
#define uint unsigned int
#define uchar unsigned char
sbit jian1=P3^0;
sbit jian2=P3^1;
sbit jian3=P3^2;
sbit jian4=P3^3;
uchar aa,t,ting,sudu,fangx,key,key1,key2,key3,key4;
void delay(uint);
void init();
void keyscan()
{
while(key)
{
if(jian1==0)
{
delay(10);
if(jian1==0)
{
key1=1;
while(!jian1);
key=0;
}
}
if(jian2==0)
{
delay(10);
if(jian2==0)
{
key2=1;
while(!jian2);
key=0;
}
}
if(jian3==0)
{
delay(10);
if(jian3==0)
{
key3=1;
while(!jian3);
key=0;
}
}
if(jian4==0)
{
delay(10);
if(jian4==0)
{
key4=1;
while(!jian4);
key=0;
}
}
}
if(key1==1) //按下按键1,实现左移的功能
{
key1=0;
key=1;
fangx=1;
}
if(key2==1) //按下按键2,实现右移功能
{
key2=0;
key=1;
fangx=2;
}
if(key3==1) //按下按键3,实现减速功能
{
Key3=0;
key=1;
sudu--;
if(sudu<=1) //定义当流速小于0.05S/个时,流速变为0.05S/个
sudu=1;
}
if(key4==1) //按下按键4,实现减速功能
{
Key4=0;
key=1;
sudu++;
if(sudu>=10) //定义当流速大于0.5S/个时,流速变为0.5S/个
sudu=10;
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
t=0;ting=0;sudu=2;key=1;fangx=0;aa=0x01;
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-45872)/256; //装初值
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void time() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
t++;ting++;
if(t>=sudu)
{
t=0;
if(ting<=200) //定义10S间歇一次
{
if(fangx==0) //如果fangx为0,实现自控功能
{
if(ting<=100) //自控往返时间为5S
aa=_crol_(aa,1);
if(ting>100)
aa=_cror_(aa,1);
}
if(fangx==1) //如果fangx为1,实现手控左移
aa=_crol_(aa,1);
if(fangx==2) //如果fangx为2,实现手控右移
aa=_cror_(aa,1);
}
P0=aa;
if(ting>220) //定义间歇时间为1S
ting=0;
}
}
PAGE
1
_1385838854.vsd
�
�
初始化
判断按键是否按下�
按键一按下�
按键二按下�
按键三按下�
按键四按下�
左移�
右移�
加速�
减速�