基于单片机的流水灯课程设计报告书_第1页
基于单片机的流水灯课程设计报告书_第2页
基于单片机的流水灯课程设计报告书_第3页
基于单片机的流水灯课程设计报告书_第4页
基于单片机的流水灯课程设计报告书_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 *课 程 设 计 报 告 书系 别:机械与电子工程学院专 业:学 生 姓 名:学 号:课程设计题目:基于单片机的流水灯设计起 迄 日 期: 课程设计地点:指 导 教 师:下达任务书日期: 2013 年 12 月 16 日目录第一章 设计背景3第二章 硬件设计42.1硬件组成42.2 at89c51引脚功能42.3晶振62.4 复位状态72.5流水灯硬件原理图82.6 mcs-51系列单片机内部采用模块式结构92.7元件清单92.8程序流程图10第三章 软件编程113.1位控法113.2 c语言编程123.2.1 c语言程序123.2.2编程注意事项133.3仿真结果15实验总结16参考文献:

2、17第一章 设计背景单片机的应用已经广泛的渗透到国民经济的各个领域,随着在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未有的速度被单片机智能控制系统所取代,它已经成为工科大学生的必修课程之一。单片机技术含有硬软两个方面的技术。硬件是以单片机为核心,再加以其他各元器件组成的电子电路的一个实体。它既有单片机的技术,又有电子类专业所必须的模拟数字高频电子电路的综合运用。单片机的种类繁多,目前单片机应用系统开发工具也有不少,但同一系列单片机的开发工具或实验系列基本相同。51系列单片机时目前应用最广泛的一种8为单片机之一,它具有体积小功能强成本低应用面广等优点。经

3、过20多年的推广与发展,51系列单片机形成了一个规模庞大,功能齐全,资源丰富的产品群。当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。随着电子技术的迅速发展,单片机得到了越来越多的运用。本设计用单片机8951结合led制作了一种新型的led流水灯控制系统的设计,以at89c51作为主控核心,利用软件实现对led流水灯进行控制。本系统具有体积小、硬件少、电路结构简单及容易操作等优点。本文设计

4、的是基于单片机89c51的流水灯设计关键词:led at89c51单片机 控制系统 流水灯 第二章 硬件设计2.1硬件组成 按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。at89c51单片机是美国atmel公司生产的低电压、高性能cmos 8位单片机,具有丰富的内部资源:4kb闪存、128bram、32根i/o口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.255.50v的电压工作范围和024mhz工作频率,使用at89c51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即

5、为由发光二极管、晶振、复位等电路和必要的软件组成的单个单片机。2.2 at89c51引脚功能 图1 at89c51引脚图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口被外部下拉为低电平时

6、,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为低八位地址接收。p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。p3口:p3口管脚

7、是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。p3口也可作为at89c51的一些特殊功能口,如下表所示:口管脚 备选功能p3.0 rxd(串行输入口)p3.1 txd(串行输出口)p3.2 /int0(外部中断0)p3.3 /int1(外部中断1)p3.4 t0(计时器0外部输入)p3.5 t1(计时器1外部输入)p3.6 /wr(外部数据存储器写选通)p3.7 /rd(外部数据存储器读选通)p3口同时为闪烁编程和编程校验接收一些控制信号。r

8、st:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。 ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。 /psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。 /ea :当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此间内部程序存储器。 xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。 xtal2

9、:来自反向振荡器的输出2.3晶振 晶振,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,石英晶体谐振器,简称为石英晶体或晶体、晶振;而在封装内部添加ic组成振荡电路的晶体元件称为晶体振荡器。晶振是控制cpu的时钟频率的,也就是产生高低电平的周期(产生一个高电平,和一个低电平为一个周期,)一般说来次频率越高,电脑在单位时间里处理的速度越快晶振本身并不产生振荡,但它会以一个固定的频率与外电路发生谐振,前提是外电路的振荡频率必须与晶振的固有振荡频率相一致,起码也要非常接近,否则电路将停振 此次流水灯设计,我们用1mhz晶振和30pf的电容,它们组成一个稳定的自己振荡器。电容的大

10、小可以影响震荡频率的高低,振荡器的稳定性和起振的快速性。为单片机提供标准时钟。图2时钟电路2.4 复位状态复位是单片机的初始化操作,其主要功能是将程序计数器pc初始化为0000h,使单片机从0000h单元开始执行程序。除了进入系统的正常初始化外,当程序运行出错或操作错误使系统处于死锁状态时,也须重新启动单片机,使其复位。 单片机复位后,除p1.0p1.7的端口锁存器被设置成ffh、堆栈指针sp设置成07h和串行口的sbuf无确定值外,其它各专用寄存器包括程序计数器pc均被设置成00h。片内ram不受复位的影响,上电后ram中的内容是随机的。记住这些特殊功能寄存器的复位状态,对熟悉单片机操作,简

11、短应用程序中的初始化部分是十分必要的。 单片机的复位操作有上电自动复位和手动按键复位两种方式。上电自动复位操作要求接通电源后自动实现复位操作。如图所示。上电瞬间由于电容c上无储能,其端电压近似为零,rst获得高电平,随着电容器c的充电,rst引脚上的高电平将逐渐下降,当rst引脚上的电压小于某一数值后,单片机就脱离复位状态,进入正常工作模式。只要高电平能保持复位所需要的时间(约两个机器周期),单片机就能实现复位。图3 复位电路2.5流水灯硬件原理图其具体硬件组成如图1所示。 图4 流水灯硬件原理图从原理图中可以看出,如果要让接在p1.0口的led1亮起来,那么只要把p1.0口的电平变为低电平就

12、可以了;相反,如果要接在p1.0口的led1熄灭,就要把p1.0口的电平变为高电平;同理,接在p1.1p1.7口的其他7个led的点亮和熄灭的方法同led1。因此,要实现流水灯功能,我们只要将发光二极管led1led8依次点亮、熄灭,8只led灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。2.6 mcs-51系列单片机内部采用模块式结构其结构组成框图如图所示。图5 mcs-51系列单片机组成框图由图1可见,mcs-51系列单片机主要由以下部件通过片内总线连接而

13、成:中央处理器(cpu)、数据存储器(ram)、程序存储器(rom)、并行输入/输出口(p0口p3口)、串行口、定时器/计数器、中断控制、总线控制及时钟电路。2.7元件清单元件规格数量电容30pf/1nf2/1电阻8220/10k16/1发光二极管2v 10ma16单片机芯片at89c511晶振1mhz1 图6元件清单表 2.8程序流程图 程序中light7为多种亮灯方式结合循环延时子程序delay为100毫秒延时,延时子程序delay1为100毫秒延时端口p1.0p1.07控制的16个发光二极管亮灯方式程序中有标注开 始跳至主程序,设置外部中断0有效,电平触发主程序等待中断中断到来?继续等待

14、中断p1.0=0?p1.1=0?p1.2=0?p1.3=0?p1.4=0?p1.5=0?p1.6=0?中断?继续循环d1 d2d3d4d5d6d7相应亮灯方式图7程序流程图第三章 软件编程 单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。下面我们以最简单的流水灯控制功能即实现16个led灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。3.1位控法这是一种比较笨

15、但又最易理解的方法,采用顺序程序结构,用位指令控制p1口的每一个位输出高低电平,从而来控制相应led灯的亮灭。程序如下:org0000h ljmpmainorg0030hmain:mova,#0feh;初值11111110送入amov30h,#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次继续右移ajm

16、pmain delay:movr5,#195;延时c1:movr6,#255djnzr6,$ djnzr5,c1 ret end3.2 c语言编程3.2.1 c语言程序 在上个程序中我们是一个个控制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,完

17、成流水灯的循环工作。#include #include #define uchar unsigned char void delay_ms(uchar ms); /延时毫秒12m,ms最大值255void main() uchar led; /为p1口赋值的变量 uchar i; /循环控制变量 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+

18、) p1 = led; /led值送入p1口 delay_ms(100); /延时100ms led = _cror_(led, 1); /led值循环左移1位 void delay_ms(uchar ms) /延时毫秒12m,ms最大值255 uchar i; while(ms-) for(i = 0 ;i124; i+); 3.2.2编程注意事项 这里需要说明的是,按从语言编写的要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则: 每行的格式应为:标号: 命令 参数 ;注释 。即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白

19、行。需要使用标号时标号后面必须有“:”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。 标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。在宏汇编asm51中标号的长度不受限制,但标号中不能包含:或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。当标号作参数

20、用(如标号作转移地址),在命令后面出现时,必须舍去:(如上面程序中的 ajmp start中的start是不能再有:)。每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。在源程序中的字母不区分大小写,也就是说 start 和 start 是一样的,请不要用大小写方式去区分不同的标号。 我们知道了汇编语言程序的规则,现在就动手编辑源程序吧。马上启动keil单片机集成开发环境,建立新工程liu01.uv2,将上面的源程序liu01.asm导入到工程中,设置好keil工程的编译参数

21、,编译得到hex格式的目标文件liu01.hex,用 isp编程器 将目标文件liu01.hex烧写到at89s51单片机中,接下来就是将写好的at89s51从编程器上取下,放到“ s51增强型单片机实验板 ”上通电,我们就看到了led1led8的流水效果了。到此,我们做的流水灯已成功,工作原理也清楚了,我们将发光二极管的顺序改变一下,可以同时将流水灯从左向右流改为从右向左流,也可以改为两边向内流、内部向外流.,在前面学习的程序中我们让led流水是去逐个控制p1端口的每个位来实现的,因此程序显得有点复杂,下面我们就采用新的思路来编程。新的编程思路如下:我们在程序一开始就给p1口送一个数,这个数

22、本身就让p1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?的确如此!80c51指令中没有让p1数据移动的指令,但有对累加器acc中数据左移或右移的指令,acc在指令中常写为a,累加器a数据左移指令为rla,累加器数据右移指令为rra,累加器在数据传输和数据处理过程中作用十分重要,累加器acc为8位。他可与片内所有单字节寄存器交换数据,实际上p1和其他端口在单片机中也是一个寄存器。这样我们可以将需移动的数据先放到acc中,让其移动,然后将acc移动后的数据再转送到p1口,这样同样可以实现“流水”效果。3.3仿真结果我们将程序加载到proteus中的流水灯电路中,我们就可以

23、看到流水灯的工作,上排8个发光二极管从左往右依次循环亮和灭,然后,从右往左依次循环亮与灭,下排发光二极管从右往左依次循环亮与灭,然后,从左往右依次循环亮和灭。如图所示 图8仿真结果当上述程序之一编写好以后,我们需要使用编译软件对其编译,得到单片机所能识别的二进制代码,然后再用编程器将二进制代码写到at89c51单片机中,最后连接好电路通电,我们就看到led1led8的“流水”效果了。实验总结本次实验我选择的题目是流水灯的设计,其实流水灯就是一组灯,然后在控制系统的控制下按照一定的顺序和时间来发亮和熄灭,两者时间在一定的时间间隔下,就会形成一定的视觉效果。本次实验主要应用的是at89c51单片机,利用其与晶振电路和复位电路进行控制发光二极管的发光与熄灭。通过本次的课程设计,使我了解到实践出真知的正确性,不光如此,这次实际它还让我更加扎实的掌握了有关单片机方面的知识。在这次课程设计中我发现最主要的还是要有明确的设计思路,清晰的分析过程有很大的作用。在设计之前,对所用at89c51单片机的内部结构有一个系统的了解,这样才能很好地完成设计。通过这次课程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论