基于单片机的流水灯设计讲解.docx
《基于单片机的流水灯设计讲解.docx》由会员分享,可在线阅读,更多相关《基于单片机的流水灯设计讲解.docx(16页珍藏版)》请在冰豆网上搜索。
基于单片机的流水灯设计讲解
****
课程设计报告书
系别:
机械与电子工程学院
专业:
学生姓名:
学号:
课程设计题目:
基于单片机的流水灯设计
起迄日期:
课程设计地点:
指导教师:
下达任务书日期:
2013年12月16日
第一章设计背景
单片机的应用已经广泛的渗透到国民经济的各个领域,随着在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未有的速度被单片机智能控制系统所取代,它已经成为工科大学生的必修课程之一。
单片机技术含有硬﹑软两个方面的技术。
硬件是以单片机为核心,再加以其他各元器件组成的电子电路的一个实体。
它既有单片机的技术,又有电子类专业所必须的模拟﹑数字﹑高频电子电路的综合运用。
单片机的种类繁多,目前单片机应用系统开发工具也有不少,但同一系列单片机的开发工具或实验系列基本相同。
51系列单片机时目前应用最广泛的一种8为单片机之一,它具有体积小﹑功能强﹑成本低﹑应用面广等优点。
经过20多年的推广与发展,51系列单片机形成了一个规模庞大,功能齐全,资源丰富的产品群。
当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
随着电子技术的迅速发展,单片机得到了越来越多的运用。
本设计用单片机8951结合LED制作了一种新型的LED流水灯控制系统的设计,以AT89C51作为主控核心,利用软件实现对LED流水灯进行控制。
本系统具有体积小、硬件少、电路结构简单及容易操作等优点。
本文设计的是基于单片机89C51的流水灯设计
关键词:
LEDAT89C51单片机控制系统流水灯
第二章硬件设计
2.1硬件组成
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS8位单片机,具有丰富的内部资源:
4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。
因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位等电路和必要的软件组成的单个单片机。
2.2AT89C51引脚功能
图1AT89C51引脚图
VCC:
供电电压。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为低八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(计时器0外部输入)
P3.5T1(计时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出
2.3晶振
晶振,它的基本构成大致是:
从一块石英晶体上按一定方位角切下薄片(简称为晶片,石英晶体谐振器,简称为石英晶体或晶体、晶振;而在封装内部添加IC组成振荡电路的晶体元件称为晶体振荡器。
晶振是控制CPU的时钟频率的,也就是产生高低电平的周期(产生一个高电平,和一个低电平为一个周期,)一般说来次频率越高,电脑在单位时间里处理的速度越快晶振本身并不产生振荡,但它会以一个固定的频率与外电路发生谐振,前提是外电路的振荡频率必须与晶振的固有振荡频率相一致,起码也要非常接近,否则电路将停振
此次流水灯设计,我们用1MHZ晶振和30pf的电容,它们组成一个稳定的自己振荡器。
电容的大小可以影响震荡频率的高低,振荡器的稳定性和起振的快速性。
为单片机提供标准时钟。
图2时钟电路
2.4复位状态
复位是单片机的初始化操作,其主要功能是将程序计数器PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化外,当程序运行出错或操作错误使系统处于死锁状态时,也须重新启动单片机,使其复位。
单片机复位后,除P1.0~P1.7的端口锁存器被设置成FFH、堆栈指针SP设置成07H和串行口的SBUF无确定值外,其它各专用寄存器包括程序计数器PC均被设置成00H。
片内RAM不受复位的影响,上电后RAM中的内容是随机的。
记住这些特殊功能寄存器的复位状态,对熟悉单片机操作,简短应用程序中的初始化部分是十分必要的。
单片机的复位操作有上电自动复位和手动按键复位两种方式。
上电自动复位操作要求接通电源后自动实现复位操作。
如图所示。
上电瞬间由于电容C上无储能,其端电压近似为零,RST获得高电平,随着电容器C的充电,RST引脚上的高电平将逐渐下降,当RST引脚上的电压小于某一数值后,单片机就脱离复位状态,进入正常工作模式。
只要高电平能保持复位所需要的时间(约两个机器周期),单片机就能实现复位。
图3复位电路
2.5流水灯硬件原理图
其具体硬件组成如图1所示。
图4流水灯硬件原理图
从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
2.6MCS-51系列单片机内部采用模块式结构
其结构组成框图如图所示。
图5MCS-51系列单片机组成框图
由图1可见,MCS-51系列单片机主要由以下部件通过片内总线连接而成:
中央处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、并行输入/输出口(P0口~P3口)、串行口、定时器/计数器、中断控制、总线控制及时钟电路。
2.7元件清单
元件
规格
数量
电容
30pf/1nf
2/1
电阻
8220Ω/10KΩ
16/1
发光二极管
2v10mA
16
单片机芯片
AT89C51
1
晶振
1MHz
1
图6元件清单表
2.8程序流程图
程序中LIGHT7为多种亮灯方式结合循环
延时子程序DELAY为100毫秒延时,延时子程序DELAY1为100毫秒延时端口P1.0~P1.07控制的16个发光二极管亮灯方式程序中有标注
图7程序流程图
第三章软件编程
单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。
软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。
下面我们以最简单的流水灯控制功能即实现16个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。
3.1位控法
这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,从而来控制相应LED灯的亮灭。
程序如下:
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVA,#0FEH;初值11111110送入A
MOV30H,#7;30单元作计数器,初始为左移次数
LEFT:
MOVP1,A;A送入P1口(初始点亮P1.0)
LCALLDELAY;延时
RLA;循环左移
DJNZ30H,LEFT;未够7次继续左移
MOV30H,#7;重置计数器,为右移次数
RIGHT:
MOVP1,A;A送入P1口
LCALLDELAY;延时
RRA;循环右移
DJNZ30H,RIGHT;未够7次继续右移
AJMPMAIN
DELAY:
MOVR5,#195;延时
C1:
MOVR6,#255
DJNZR6,$
DJNZR5,C1
RET
END
3.2C语言编程
3.2.1C语言程序
在上个程序中我们是一个个控制P1.0至P1.7端口的每个来实现的,下面我们用c语言程序来控制各个端口赋值来实现P1.0至P1.7的发光二极管的亮与灭,我们将初始值11111110赋值给led,并将led赋值给P1.0端口,然后每隔100毫秒led左移一位改变P1.1端口,实现P1.0端口的灭和P1.1端口的亮,其他几个端口按此方法依次执行,实现各个端口依次亮与灭,做流水工作。
当P1.7端口灭时,led又变回11111110,完成流水灯的循环工作。
#include
#include
#defineucharunsignedchar
voiddelay_ms(ucharms);//延时毫秒@12M,ms最大值255
voidmain()
{
ucharled;//为P1口赋值的变量
uchari;//循环控制变量
while
(1)
{
led=0xfe;//初值为11111110
for(i=0;i<7;i++)
{
P1=led;//led值送入P1口
delay_ms(100);//延时100ms
led=_crol_(led,1);//led值循环左移1位
}
for(i=0;i<7;i++)
{
P1=led;//led值送入P1口
delay_ms(100);//延时100ms
led=_cror_(led,1);//led值循环左移1位
}
}
}
voiddelay_ms(ucharms)//延时毫秒@12M,ms最大值255
{uchari;
while(ms--)
for(i=0;i<124;i++);
}
3.2.2编程注意事项
这里需要说明的是,按从语言编写的要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则:
每行的格式应为:
标号:
命令参数;注释。
即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。
需要使用标号时标号后面必须有“:
”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。
由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。
标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。
在宏汇编ASM51中标号的长度不受限制,但标号中不能包含‘:
'或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。
当标号作参数用(如标号作转移地址),在命令后面出现时,必须舍去‘:
'(如上面程序中的AJMPSTART中的START是不能再有:
)。
每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。
由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。
在源程序中的字母不区分大小写,也就是说start和START是一样的,请不要用大小写方式去区分不同的标号。
我们知道了汇编语言程序的规则,现在就动手编辑源程序吧。
马上启动Keil单片机集成开发环境,建立新工程liu01.UV2,将上面的源程序liu01.asm导入到工程中,设置好Keil工程的编译参数,编译得到hex格式的目标文件liu01.hex,用ISP编程器将目标文件liu01.hex烧写到AT89S51单片机中,接下来就是将写好的AT89S51从编程器上取下,放到“S51增强型单片机实验板”上通电,我们就看到了LED1~LED8的"流水"效果了。
到此,我们做的流水灯已成功,工作原理也清楚了,我们将发光二极管的顺序改变一下,可以同时将流水灯从"左向右流"改为从"右向左流",也可以改为"两边向内流"、"内部向外流"......,
在前面学习的程序中我们让LED流水是去逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们就采用新的思路来编程。
新的编程思路如下:
我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?
的确如此!
80c51指令中没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令,ACC在指令中常写为A,累加器A数据左移指令为"RL A",累加器数据右移指令为"RR A",累加器在数据传输和数据处理过程中作用十分重要,累加器ACC为8位。
他可与片内所有单字节寄存器交换数据,实际上P1和其他端口在单片机中也是一个寄存器。
这样我们可以将需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。
3.3仿真结果
我们将程序加载到proteus中的流水灯电路中,我们就可以看到流水灯的工作,上排8个发光二极管从左往右依次循环亮和灭,然后,从右往左依次循环亮与灭,下排发光二极管从右往左依次循环亮与灭,然后,从左往右依次循环亮和灭。
如图所示
图8仿真结果
当上述程序之一编写好以后,我们需要使用编译软件对其编译,得到单片机所能识别的二进制代码,然后再用编程器将二进制代码写到AT89C51单片机中,最后连接好电路通电,我们就看到LED1~LED8的“流水”效果了。
实验总结
本次实验我选择的题目是流水灯的设计,其实流水灯就是一组灯,然后在控制系统的控制下按照一定的顺序和时间来发亮和熄灭,两者时间在一定的时间间隔下,就会形成一定的视觉效果。
本次实验主要应用的是AT89C51单片机,利用其与晶振电路和复位电路进行控制发光二极管的发光与熄灭。
通过本次的课程设计,使我了解到实践出真知的正确性,不光如此,这次实际它还让我更加扎实的掌握了有关单片机方面的知识。
在这次课程设计中我发现最主要的还是要有明确的设计思路,清晰的分析过程有很大的作用。
在设计之前,对所用AT89C51单片机的内部结构有一个系统的了解,这样才能很好地完成设计。
通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。
而安排课程设计的基本目的,是在于通过理论与实际的结合、人与人的沟通,进一步提高思想觉悟和领悟力。
实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。
这也是一次预演和准备毕业设计工作。
通过课程设计,让我找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而更好的适应毕业后的生活。
在单片机方面也是了解了一些些,我相信这次课程设计会对我以后的工作通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为自己的东西,在课程设计过程中,我们要不断地发现错误,不断改正,不断领悟,不断获取。
这次课程设计结束了,但在以后的社会发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到退缩,一定要不厌其烦的发现问题所在,然后一一解决,只有这样,才能成功的做成想做的事情通过亲手实践,体会到了收获成果的喜悦。
参考文献:
[1]徐煜明,韩雁.单片机原理及接口技术[M].北京:
电子工业出版社,2005.1
[2]万光毅,严义,邢春香.单片机实验与实践教程[M].北京:
北京航空航天大学出版社,2006.4
[3]例说51单片机(C语言版)人民邮电出版社张义和等编著
[4]单片机原理及接口技术清华大学出版社北京交通大学出版社梅丽凤等
[5]基于Proteus的51系列单片机设计与仿真电子工业出版社侯玉宝等编著
[6]51单片机应用从零开始清华大学社杨欣王玉凤刘湘黔编著
[7]51单片机应用系统开发典型实例中国电力出版社戴佳等编著
[8]51单片机应用实例详解清华大学出版社杨欣王玉凤刘湘黔编著