基于51单片机和8279芯片的电子时钟设计报告 本文关键词:单片机,时钟,芯片,报告,设计
基于51单片机和8279芯片的电子时钟设计报告 本文简介:任务书题目基于51单片机和8279芯片的电子时钟设计时间安排目的:通过《单片机原理与应用》这门课的课程设计,学生应能对MCS-51单片机有一个全面的认识,掌握以MCS-51单片机为核心的电子电路的设计方法和应用技术。1.进一步掌握8279键盘显示电路的编程方法。2.进一步掌握定时器的使用和编程方法。
基于51单片机和8279芯片的电子时钟设计报告 本文内容:
任务书
题
目
基于51单片机和8279芯片的电子时钟设计
时
间安排
目
的:
通过《单片机原理与应用》这门课的课程设计,学生应能对MCS-51单片机有一个全面的认识,掌握以MCS-51单片机为核心的电子电路的设计方法和应用技术。
1.进一步掌握8279键盘显示电路的编程方法。
2.进一步掌握定时器的使用和编程方法。
3.进一步掌握中断处理程序的编程方法。
要
求:
(1)
利用AT89C51作为主控器组成一个电子钟并具有闹钟功能。
(2)
利用8位LED用于显示当前时间。
(3)
利用8279芯片进行键盘和LED的管理和显示。
(4)
发挥自己的创造力,实现尽可能多的功能。
总体方案实现:
用AT89C51作为主控制器,并采用8279作为辅助芯片,控制键盘、LED数码管等的操作和显示。
指导教师评语:
评分等级:(
)
指导教师签名:
目录
一、系统总体设计方案规划与选定3
二、系统硬件功能及参数简介4
2.1
AT89C51单片机简介.4
2.2
AT89C51单片机的引脚说明.5
2.3
LED简介.7
2.4
8279基本原理说明.10
2.5
DS1302介绍及基本原理说明.13
2.6
DS18B20介绍及基本工作方式说明17
三、系统硬件电路设计19
3.1
proteus仿真接线图19
3.2分块硬件电路射界.20
4、
软件设计及实现过程.25
4.1程序设计简述.25
4.2系统程序流程图设计.26
五、系统的调试过程27
5.1程序性问题及解决.27
5.2调试过程出现问题及解决.27
六、新增功能及实现方法.29
6.1新增功能.29
6.2实现方法.29
7、
小节与体会.31
参考文献.33
附录34
硬件连接图.34
程序清单.36
一、系统总体设计方案规划与选定
首先,我们对于整个系统做了总体的规划,大致列了一下我们设想中的一些附加功能。由于附加功能较多,我们最终决定,先实现基本功能,然后在基本功能的基础上,对系统进行改进,逐步加入我们设想的拓展功能。
其次,是编程语言的选择,我们学习过的编程语言有两种:C语言与汇编语言。经过比较后决定使用C51编程,因为C语言结构整齐,各个子函数可以独立来写,思路更加清晰显得简单,所以选用C语言来进行编程。同时,利用C语言进行编程也有利于我们后续对系统的改进,也就是增加辅助功能,只要利用子函数实现就行,并且可以独立于整个系统运行,可以单独对子函数进行测试。对于所设想的附加功能,我们首先进行相关资料的查询,然后可以对子函数进行编写,并进行单独的调试。可以说,使用C语言编程在软件方面增加了我们系统的可拓展性。
最后,是有关硬件的设计,为了实现基本功能,我们对8979芯片以及DS1302芯片进行了仔细的学习,从网上查阅了不少资料。对于电路图的设计,我们也是按照老师的要求,先实现按照实现基本功能进行设计,按照课本进行电路图的链接,同时查阅了关于8279芯片的使用说明书。基本电路图设计完成之后,便查阅有关资料,对我们设想的附加功能所用到的DS1302时钟芯片和DS18B20温度传感器进行学习了解硬件的连接和测试过程。而且由于一开始对软件的使用不熟练,在页面的排版布局上也没有计划,最终显得整个电路硬件仿真连接图较乱,最后有进行了重新整理和布局,并配上详细说明,是的整体看起来协调、美观。
二、系统硬件功能及参数简介
2.1
AT89C51单片机简介
AT89C51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多种功能的I/O线等一台计算机所需要的基本功能部件,AT89C51单片机内包含下列几个部件:
(1)
一个8位CPU;
(2)一个片内振荡器及时钟电路;
(3)4K字节ROM程序存储器;
(4)128字节RAM数据存储器;
(5)两个16位定时器/计数器;
(6)可寻址64K外部数据存储器和64K外部程序存储器空间的控制电路;
(7)32条可编程的I/O线(四个8位并行I/O端口);
(8)一个可编程全双工串行口;
(9)具有五个中断源、两个优先级嵌套中断结构。
其内部机构框图如图2.1所示:
图2.1
MCS-51单片机内部机构框图
2.2
AT89C51单片机的引脚说明
AT89C51单片机采用40条引脚双列直插式器件,引脚除5V(
40脚)和电源地(
20脚)外,其功能分为时钟电路、控制信号、输入/输出三大部分,逻辑框图及引脚图分别如图2.2(a)(b)所示
(a)
(b)
图2.2
AT89C51单片机逻辑图与引脚图
AT89C51单片机的管脚说明如下:
(1)VCC:供电电压
(2)GND:接地
(3)时钟电路
XTAL1(19脚)——芯片内部振荡电路(单级反相放大器)输入端。
XTAL2(18脚)——芯片内部振荡电路(单级反相放大器)输出端。
(4)控制信号
RST(9脚)复位信号:时钟电路工作后,在此引脚上将出现两个机器周期的高电平,芯片内部进行初始复位,P0口~P3口输出高电平,将初值07H写入堆栈指针。
ALE(30脚)地址锁存信号:当访问外部存储器时,P0口输出的低8位地址由ALE输出的控制信号锁存到片外地址锁存器,P0口输出地址低8位后,又能与片外存储器之间传送信息。另外,ALE可驱动4个TTL门。
(29脚)片外程序存储器读选通:低电平有效,作为程序存储器的读信号,输出负脉冲,将相应的存储单元的指令读出并送到P0口,可驱动8个TTL门。
/VPP(30脚):当为高电平且PC值小于0FFFH时,CPU执行内部程序存储器程序;当为低电平时,CPU仅执行外部程序存储器程序。
2.3
LED简介
LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。图2.3(a)是共阴和共阳极数码管的内部电路图,它们的发光原理是一样的,只是它们的电源极性不同而已。
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将“b“和“c“段接上正电源,其它端接地或悬空,那么“b“和“c“段发光,此时,数码管显示将显示数字“1”。而将“a“、“b“、“d“、“e“和“g“段都接上正电源,其它引脚悬空,此时数码管将显示“2”。其它数字的显示原理与此类同。
LED的7段数码管利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。在这次的设计中采用的均是共阴极的LED显示,当I/O口输出为高电平的时候,对应段就被点亮。LED数码管的结构图如图2.3(b)所示。
(a)
(b)
图2.3
LED分类结构图和结构图
这次设计的显示部分采用AT89C51单片机动态扫描完成,在多数的应用场合中,我们并不希望使用多I/O端口的单片机,原则上是使用尽量少引脚的器件。在没有富余端口的情况下,应通过优化设计程序和扩展电路达到预期的目的。动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。
LED显示电路:
(1)
静态显示电路
LDE显示器工作在静态显示时,其公共阳极(或阴极)
接VCC(或GND)
,一直处于显示有效状态,所以每一位的显示内容必须由锁存器加以锁存,显示各位相互独立。
(2)
动态显示电路
将所有位的段选线的同名端联在一起,由一个8位I/O口控制,形成段选线的多位复用。而各位的公共阳极或公共阴极则分别由相应的I/O口线控制,实现各位的分时选通,即同一时刻只有被选通位是能显示相应的字符,而其他所有位都是熄灭的。由于人眼有视觉暂留现象,只要每位显示间隔足够短,则会造成多位同时点亮的假象。这就需要单片机不断地对显示进行控制,CPU需要不断地进行显示刷新,动态显示电路参见图2.4,图2.4中是扩展了五位的LED数码管显示,用一个74LS04作为五个LED的段选输入,采用动态显示的方式连接。类似地,16位的LED数码管显示也可以用这种方法来实现。
图2.4
五位LED数码管的动态显示
2.4
8279基本原理说明
8279显示部分按扫描的方式工作,可以显示8或16位LED显示块。
8279电路工作原理:
1.I/O控制及数据缓冲器
数据缓冲器是双向缓冲器,连接内、外总线,用于传送CPU和8279之间的命令或数据;I/O控制线是CPU对8279进行控制的引线。CS是8279的片选信号,CS=0时,8279才被允许读出或写入信息。WR、RD为来自CPU的控制信号。A0用于区别信息特性:A0=1时,表示数据缓冲器输入为指令、输出为状态字;A=0时,输入、输出皆为数据。
2.控制与定时寄存器及定时控制
控制与定时寄存器用来寄存键盘及显示的工作方式,以及由CPU编程的其它操作方式。这些寄存器一旦接受并锁存送来的命令,就通过译码产生相应的信号,从而完成相应的控制功能。
定时控制包含基本记数键。首级计数器是一个可编程的N级计数器。N可以2~31之间由软件编程,以便从外界时钟CLK分频得到内部所需要的100KHZ时钟。然后再经过分频为键盘扫描提供适当的逐行扫描频率和显示扫描时间。
3.扫描计数器
扫描计数器有两种工作方式。按编码方式工作时,计数器作二进制记数。4位记数状态从扫描线SL0~SL3输出,经外部译码器译码后,为键盘和显示器提供扫描线;按译码方式工作时,扫描计数器的最低二位被译码后,从SL0~SL3输出。因此,SL0~SL3提供了4中取1的扫描译码。
4.回复缓冲器、键盘去抖及控制来自RL0~RL3的8根回复线的回复信号,由回复缓冲器缓冲并锁存。
在键盘工作方式中,回复线作为行列式键盘的行列输入线。在逐行列输入时,在逐行列扫描时,回复线用来搜索每一行列中闭合的键。当某一键闭合时,去抖电路被置位,延时等待10ms后,再检验该键是否继续闭和,并将该键的地址和附加的移位、控制状态一起形成键盘数据被送入8279内部FIFO(先进先出)存储器。键盘数据格式如下:
D7
D6
D5D4
D3
D2
D1
D0
控制
移位
扫描
回复
控制和移位(D6、D7)的状态由两个独立的附加开关决定,而扫描(D5、D4、D3)和回复(D2、D1、D0)则是被按键置位的数据。D5、D4、D3来自动扫描计数器,是按下键的行列编码,而(D7D7D7)则来自行/列计数器,它们是根据回复信号而确定的行/列编码。
在传感器开关状态矩阵方式中,回复线的内容直接被送往和相应的传感器RAM(即FIFO存储器)。
在选通输入方式中,回复线的内容在CNTL/STB线的脉冲上升沿被送入FIFO存储
5.FIFO/传感器及其状态寄存器
FIFO/传感器RAM是一个双重功能的8×8RAM。
在键盘或选通方式工作时,它是FIFO存储器,其输入或读出遵循先入先出的原则。FIFO状态寄存器用于存放FIFO的工作状态。例如,RAM是满还是空;其中存有多少数据;是否操作出错等。当FIFO存储器不空,状态逻辑将产生IRQ=1信号向CPU申请中断。
在传感器矩阵方式工作时,这个存储器以是传感器不是存储器。它存放着传感器矩阵中的每一个传感器状态。在此方式中,若检索出传感器的变化,IRQ信号变为高电平,向CPU申请中断。
6.显示RAM和显示地址寄存器
显示RAM用来存储显示数据。容量为16×8位。在显示过程中,存储的显示数据轮流从显示寄存器输出。显示寄存器分别为A、B两组,OUTA0~3和OUTB0~3可以单独送数,也可以组成一个8位的字。显示寄存器的输出与显示扫描配合,不断从显示RAM中读出显示数据,同时轮流驱动被选中的显示器件,以达到多路复用的目的,使显示器件呈现稳定的显示状态。
显示地址寄存器用来寄存由CPU进行读/写显示RAM的地址,它可以由命令设定,也可以设置成每次读写或写入之后自动递减。
2.5
DS1302介绍及基本原理说明
2.5.1
主要功能
DS1302
是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
特性:
●
实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数
●
用于高速数据暂存的
31×8
RAM
●
2引脚的串行
I/O
●
2.5-5.5V满度工作范围
●
用于时钟或RAM数据读写的单字节或
多字节数据传送
●
双电源引脚
●
可选慢速充电至VCC1
2.5.2
内部结构及引脚功能
DS1302内部主要包括实时时钟(real
time
clock)、输入移位寄存器(input
shift
registers)、31字节静态RAM、电源控制部分(power
control)、命令控制逻辑(command
and
control
logic)、振荡器和分频器(oscillator
and
divider)等部分。DS1302内部结构如图2-5所示。
图2-5
DS1302内部结构
2-6
DS1302引脚排列
DS1302具有8脚DIP引脚排列如图2-6所示。
VCC1:后备电源,在主电源关闭的情况下,也能保持时钟的连续运行;当VCC2大于VCC1+0.2V时,VCC2给DS1302供电。
VCC2:主电源,当VCC2小于VCC1时,DS1302由VCC1供电。
X1、X2:振荡源,外接32768Hz晶振。
GND:接地端
SCLK:串行时钟输入端
I/O:串行数据输入输出端(双向)。
RST:复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
2.5.3
工作原理
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址。命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输入数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下最多可达8+248。
2.5.4
控制字节及寄存器
DS1302的一次数据传送是从发送控制字节开始的。控制字节的最高有效位(位7)必须是逻辑1,如果该位为0,则无法把数据写入到DS1302中;位6表示要读写的数据类型,为0表示存取日历时钟数据,为1表示存取
RAM数据;位5至位1指示要操作单元的地址;最低有效位(位
0)表示命令类型,为0表示要进行写操作,为
1
表示要进行读操作。控制字节总是从最低位开始输出。其控制字节格式如图2-7所示。
图2-7
控制字节格式
2.5.5
时钟/日历存储区(时分秒)
2.5.6
数据的传送
向
DS1302
写入数据时,数据在控制字节输入后的下一个
SCLK周期的上升沿被写入,多余的
SCLK将被忽略。数据写入时从低位(位0)开始;同样,从DS1302
读取数据时,数据在紧跟控制字节后的下一个
SCLK的下降沿读出,读出数据时也是从低位(0位)到高位(7
位),只要RST保持高电平,额外的
SCLK将导致数据字节的持续读出,这个特性用于实现该芯片的突发读模式。
对DS1302
的每一次读写需
16个时钟脉冲,前
8
个脉冲输入操作地址和读写命令,后8个脉冲写入或读出数据。数据传送时序如图2-8。
图2-8
数据读写时序图
2.6
DS18B20介绍及基本工作方式说明
DS18B20总体介绍:
DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:
(1)系统的特性:测温范围为-55℃~+128℃
,测温精度为士0.5℃;温度转换精度9~12位可变,能够直接将温度转换值以16位二进制数码的方式串行输出;12位精度转换的最大时间为750ms;可以通过数据线供电,具有超低功耗工作方式。
(2)系统成本:由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右。
(3)系统复杂度:由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。
(4)系统的调试和维护:由于引线的减少,使得系统接口大为简化,给系统的调试.
DS18B20的复位时序图:
由上位机拉低总线480-960us的时间然后拉高总线,等待15-60us的时间,如果在总线上有DS18B20这个器件,并且将总线拉低60-240us的话,就证明该器件复位成功,已经准备好发送或接受数据了。
图2-9复位时序图
DS18B20的写时序图:
DS18B20的写时序分为写0时序和写1时序两个过程。DS18B20写0时序和写1时序的要求不同,当要写0时序是,单总线要被拉低至少60us,保证DS18B20能够在15us~45us之间能够正确地采样I/O总线上的低电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
图2-10写时序图
DS18B20的读时序图:
DS18B20的读时序分为读0时序和读1时序两个过程。对于DS18B20的读时序是从主机把单总线拉低之后,在15秒之内就得释放单总线,让DS18B20把数据传输到单总线上。DS18B20完成一个读时序过程,至少需要60us。
三、系统硬件电路设计
3.1
proteus仿真接线图
全图除了分块电路之外,没有明线,看起来简洁明了,并且各个电路的区域不同,也便于查找。将键盘、数码管、二极管电路整合在一块,对系统的调试可以方便很多。
3.2分块硬件电路射界
3.2.1
ds1302时钟电路
通过P1.3口将时钟芯片内部RAM的内容读到单片机内部进而进行显示,内部RAM的内容即为当前日期
3.2.2
ds18b20温度传感器电路
通过P1.0口将温度传感器内部RAM的温度读入单片机,进而进行显示。
3.2.3
8279电路
经测验,将SHIFT和CTRL/STB口接地,可以使键盘的前两位为1,进而可以方便的读出键盘位置,P0口的数据通过图中蓝色总线传入8279芯片。P2.0口通过输出0或1控制8279用法。
3.2.4
二极管电路
第一部分二极管直接与单片机中P1.4-P1.7相连,显示温度的温馨提示。第二部分的二极管电路通过38译码器与单片机中P3.0、P3.1、P3.4相连,控制灯的开关,进行节日显示。
3.2.5
数码管显示电路
段选部分直接与8279芯片中OUTA和OUTB相连,用于控制每一位的显示,而片选部分则通过38译码器与8279中SL0-SL2相连,用于控制位的选择。
3.2.6
4*5键盘电路
键盘部分的行部分通过38译码器与8279中SL0-SL2相连,用于返回行值,键盘列部分直接与RL0-RL4相连,用于返回列值。
3.2.7
闹钟及音乐播放电路
第一部分为闹钟电路,通过控制P3.2口低电平与高电平的交替输出,进行闹钟响铃和整点报时功能。第二部分为音乐电路,通过控制P3.5口高低电平输出的频率产生不同节拍的音符,进而构成音乐。
5、
软件设计及实现过程
4.1程序设计简述
主程序先进行8279初始化,输出HELLO及开机音乐后,再进行整个系统的初始化。进入如图所示的程序循环过程,并在循环过程中不断判断是否满足相应的判断语句,进行闹钟的响铃和节日以及温度的提示,并且等待中断、进行键盘扫描。当检测到键值时,进入中断,根据键值判断所需要进行的功能,转到相应的子函数中进行。
4.2系统程序流程图设计
主函数程序设计流程图
显示子函数流程图
五、系统的调试过程
5.1程序性问题及解决
1.
由于word
的编写功能较为强大,开始使用word进行编写,然后复制如keil进行调试,由于使用word的原因,导致程序中出现了很多中问字符的空格,进行了仔细查找将空格抹去之后,方可正常运行。
2.
用proteus话电路,进行程序调试时,发现提示硬件错误,出现器件重名,导致无法运行。
5.2调试过程出现问题及解决
1.
数码管输出错误,与所要输出的相反。分析原因:程序中数码管输出部分顺序不对。改进方法:为了防止对程序进行大改,将命令字改为左端输入。
2.
闹钟时明明输出高电平,但喇叭并不响。分析原因:上网查询之后发现所用喇叭需要震荡,及高低电平交替输出才行。改进方法:在程序中加入void
di()子函数,使用时进行引用。
3.
对网上找的歌曲代码进行截取时发现截取后的蜂鸣器乱响。分析原因:歌曲代码中没两位表示一个音符,截取过程中将两位拆开,出现混乱,改进方法:以两位字符为单位进行截取。
4.
节日提示的二极管不亮。分析原因:运行时,发现二极管相应的端口显示低电平,故程序没有问题,最终发现马虎大意导致二极管接反。改进方法:反接二极管。
5.
温度显示错误,正值时正常显示,负值时显示零。分析原因:温度读取子函数有错误,但无论怎么修改,扔无法解决上述问题。将0;i--);
}
//****************开机唱歌函数**********************//
void
Time0_Init()
{
TMOD
=
0x10;
IE
=
0x88;
TH1
=
0xDC;
TL1
=
0x00;
}
void
Time0_Int()
interrupt
3
{
TH1
=
0xDC;
TL1
=
0x00;
Count++;
//长度加1
}
void
Delay_xMs(uint
x)
{
uint
i,j;
for(i=0;
i0;i--)
{
DQ
=
0;
//
给脉冲信号
datt>>=1;
DQ
=
1;
//
给脉冲信号
if(DQ)
datt|=0x80;
yanshi(5);
}
return(datt);
}
void
Write1(unsigned
char
datt)//写字节
{
unsigned
char
i=0;
for
(i=8;
i>0;
i--)
{
DQ
=
0;
DQ
=
datt
yanshi(5);
DQ
=
1;
datt>>=1;
}
}
void
ReadTemperature()
{
unsigned
char
tl=0,th=0,i=100;
while(i--)
{
Init();
Write1(0xCC);
//
跳过读序号列号的操作
Write1(0x44);
//
启动温度转换
yanshi(100);
Init();
Write1(0xCC);
//跳过读序号列号的操作
Write1(0xBE);
//读取温度寄存器等
yanshi(100);
tl=Read();
//读取温度值低位
th=Read();
//读取温度值高位
temp=th>=4;
//右移4位,相当于乘0.0625,将温度化为十进制
else
{
temp=~temp;
temp+=1;
}//经测试,温度零下时,直接在此函数中除16影响显示,故在显示函数中除16
temp1=temp%100;//用于温度显示
}
}
void
wendutishi()
{
if(t=15
LED1=0;
LED3=0;
LED2=0;
}
}
else
{
LED1=1;
LED2=0;
LED3=0;
LED4=0;
}
}
/***************节日提示*************/
void
jieritishi()
{
if(ctime.month==1D=0;C=0;}
else
if(ctime.month==5D=0;C=0;}
else
if(ctime.month==6D=1;C=0;}
else
if(ctime.month==7D=1;C=0;}
else
if(ctime.month==8D=0;C=1;}
else
if(ctime.month==9D=0;C=1;}
else
if(ctime.month==10D=1;C=1;}
}
/**********闹钟响铃函数*************/
void
di()
{
uchar
i
;
for(i=0;i0;
i--)
{
di();
delay(140);
}
}
/*********时钟函数************/
void
write(uchar
addr,uchar
dat)
{
uchar
i
;
RST
=
0
;
SCK
=
0
;
RST
=
1
;
for(i=0;i>=1
;
SCK
=
1
;
}
for(i=0;i>=
1
;
SCK
=
1
;
}
RST
=
0
;
}
uchar
read(uchar
addr)
{
uchar
i,dat
;
RST
=
0
;
SCK
=
0
;
RST
=
1
;
for(i=0;i>=1
;
SCK
=
1
;
}
for(i=0;i>=1
;
if(SDA)
dat|=0x80
;
SCK=1
;
}
RST=0
;
dat=(dat/16*10)+(dat
return
dat
;
}
void
read_time()
{
ctime.second
=
read(0x81);
ctime.minute
=
read(0x83);
篇2:基于51系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告
基于51系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告 本文关键词:时钟,仿真,芯片,机及,语言
基于51系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告 本文简介:基于单片机的电子时钟姓名:班级:学号:指导教师:完成日期:目录摘要一、引言………………………………………………………………………1二、基于单片机的电子时钟硬件选择分析…………………………………22.1主要IC芯片选择……………………………………………………22.1.1微处理器选择…………………………
基于51系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告 本文内容:
基于单片机的电子时钟
姓名:
班级:
学号:
指导教师:
完成日期:
目
录
摘要
一、引言………………………………………………………………………1
二、基于单片机的电子时钟硬件选择分析…………………………………2
2.1主要IC芯片选择……………………………………………………2
2.1.1微处理器选择…………………………………………………2
2.1.2
DS1302简介
…………………………………………………4
2.1.3
DS1302引脚说明
……………………………………………4
2.2电子时钟硬件电路设计
……………………………………………5
2.2.1时钟电路设计…………………………………………………6
2.2.2整点报时功能…………………………………………………7
三、Protel软件画原理图……………………………………………………8
3.1系统工作流程图
……………………………………………………8
3.2原理图
………………………………………………………………9
四、proteus软件仿真及调试
………………………………………………9
4.1电路板的仿真
………………………………………………………9
4.2软件调试
……………………………………………………………9
五、
源程序
…………………………………………………………………10
六、课设心得…………………………………………………………………13
七、参考文献…………………………………………………………………13
基于单片机电子时钟设计
摘
要
电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。
本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。
本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。
关键词:电子时钟;多功能;AT89C52;时钟日历芯片
基于单片机的电子时钟
一、引
言
时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。
1.1
多功能电子时钟研究的背景和意义
20世纪末,电子技术获得了飞速的发展。在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂容易使人忘记当前的时间。然而遇到重大事情的时候,一旦忘记时间,就会给自己或他人造成很大麻烦。平时我们要求上班准时,约会或召开会议必然要提及时间;火车要准点到达,航班要准点起飞;工业生产中,很多环节都需要用时间来确定工序替换时刻。所以说能随时准确的知道时间并利用时间,是我们生活和工作中必不可少的[1]。
电子钟是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛应用于个人家庭,车站,
码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、0按时自动打铃、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.2
电子时钟的功能
电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时间精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。当今市场上的电子时钟品类繁多,外形小巧别致。也有体型较大的,诸如公共场所的大型电子报时器等。电子时钟首先是数字化了的时间显示或报时器,在此基础上,人们可以根据不同场合的要求,在时钟上加置其他功能,比如定时闹铃,万年历,环境温度、湿度检测,环境空气质量检测,USB扩展口功能等。
本设计电子时钟主要功能为:
1.
具有时间显示和手动校对功能,24小时制;
2.
具有年、月、日显示和手动校对功能;
3.
具有整点报时功
二、基于单片机的电子时钟硬件选择分析
考虑单片机货源充足、价格低廉,可软硬件结合使用,能够较方便的实现系统的多功能性,故采用单片机作为本设计的硬件基础。
2.1主要IC芯片选择
2.1.1微处理器选择
目前在单片机系统中,应用比较广泛的微处理器芯片主要为8XC5X系列单片机。该系列单片机均采用标准MCS-52内核,硬件资源相互兼容,品类齐全,功能完善,性能稳定,体积小,价格低廉,货源充足,调试和编程方便,所以应用极为广泛。
例如比较常用的AT89C2052单片机,带有2KB
Flash可编程、可擦除只读存储器(E2PROM)的低压、高性能8位CMOS微型计算机。拥有15条可编程I/O引脚,2个16位定时器/计数器,6个中断源,可编程串行UART通道,并能直接驱动LED输出。
仅仅是为了完成时钟设计或者是环境温度采集设计,应用AT89C2052单片机完全可以实现。但是将两种功能结合在一片单片机上,就需要更多的I/O引脚,故本设计采用具有32根I/O引脚的AT89C52单片机。
AT89C52单片机是一款低功耗,低电压,高性能CMOS
8位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-52兼容。片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域[6]。
AT89C52具有以下主要性能:
1.
4KB可改编程序Flash存储器;
2.
全静态工作:0——24Hz;
3.
128×8字节内部RAM;
4.
32个外部双向输入/输出(I/O)口;
5.
6个中断优先级;
2个16位可编程定时计数器;
6.
可编程串行通道;
7.
片内时钟振荡器。
此外,AT89C52是用静态逻辑来设计的,其工作频率可下降到0Hz,并提供两种可用软件来选择的省电方式——空闲方式(Idle
Mode)和掉电方式(Power
Down
Mode)。在空闲方式中,CPU停止工作,而RAM、定时器/计数器、串行口和中断系统都继续工作。在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片内RAM中的内容,直到下一次硬件复位为止。
图2.1
AT89C52芯片PDIP封装引脚图
AT89C51为适应不同的产品需求,采用PDIP、TQFP、PLCC三种封装形式,本系统采用双列直插PDIP封装形式。
2.1.2
DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。需要强调的是,DS1302需要使用32.768KHz的晶振。
2.1.3
DS1302引脚说明
图2.2
DS1302芯片引脚图
其的引脚功能参照表2.1。
表2.1
DS1302引脚功能说明
引脚号
名称
功能
1
VCC1
备份电源输入
2
X1
32.768KHz晶振输入
3
X2
32.768KHz晶振输出
4
GND
地
5
RST
控制移位寄存器/复位
6
I/O
数据输入/输出
7
SCLK
串行时钟
8
VCC2
主电源输入
2.2电子时钟硬件电路设计
电子闹钟至少要包括秒信号发生器、时间显示电路、按键电路、供电电源、闹铃指示电路等几部分。硬件电路框图参照图2.3。
该系统使用AT89C51单片机作为核心,通过读取时钟日历芯片DS1302数据,完成此电子时钟的主要功能——时钟。使用比较通用的8段共阳数码管,做7位显示,分别显示时、分、秒。
图2.3
多功能电子时钟硬件系统框图
键盘是为了完成时钟/日历的校对和日历/温度的显示功能。由于此电子时钟要求具有闹铃功能,所以设计有闹铃电路,进行声音响铃。
整个电路使用了两种电源,+5V电源将为整个电路供电。而+3V电源仅作为DS1302的备用电源。当+5V电源被切断后,DS1302启用+3V电源,可以保持DS1302继续工作。当+5V电源恢复供电,LED依旧显示当前时间,而不会因为断电使系统复位到初始化时间,避免了重新校时的麻烦。
2.2.1时钟电路设计
系统时钟应用了实时时钟日历芯片DS1302,其连接如图2.4。该硬件电路设计简单,抗干扰能力强。
如图,AT89C51单片机P1.7直接接DS1302的RST端,上电后,AT89C51的P1.7脚自动输出高电平。P1.5作为串行时钟接口,P1.6作为时钟数据的I/O。DS1302采用双电源供电,平时由+5V电源供电,当+5V掉电之后,由图中BT1(+3V备用电池)供电。
特别需要注意X1和X2两端连接的晶振Y1,该晶振频率为32.768KHz。
图2.4
系统时钟电路
2.2.2整点报时功能
采用蜂鸣器闹铃结构简单,控制方便,但是发出的闹铃声音单一。也可以在编程的时候编写一段音乐程序,待闹铃时间到时,调用该音乐程序给扬声器,便响起音乐。不过该方法只能做一些简单音乐,并且音乐程序会占用很多单片机存储资源。
还有一种方法是采用录音放音芯片1420做闹铃,先对录放音设备录入一段音乐,当到设定时间时,单片机控制录放音设备放音。采用录放音电路,铃声可以是预先设定的一段自己喜欢的音乐,符合电器设备人性化的要求。且1420芯片可以分段录音,还具有语音报时功能。
另外,也可以购置一块音乐集成电路,加置在单片机和蜂鸣器之间,当单片机连接闹铃电路的管脚送出高电平时,音乐集成电路会给蜂鸣器特定脉冲,使蜂鸣器发声。此类集成电路体积较小,使用方便,不足的是音乐简单、单一。
闹铃的闹钟不是本设计中的重点,故采用最简单的方法,占用单片机一根I/O口P1.7,
中间用PNP型三极管S9012连接P1.7和蜂鸣器。当P1.7引脚为低电平时,S9012的发射极和集电极导通,使蜂鸣器发声。当响铃标志位为“1”时,P1.7送一定频率脉冲,使蜂鸣器U11发出声音。如图2.5
图2.5
闹铃电路
1、
Protel软件画原理图
3.1系统工作流程图
3.2
原理图
四、proteus软件仿真及调试
4.1电路板的仿真
利用keil软件编写源程序。在protues中画好其电路图如下图4.1所示:
4.2软件调试
在硬件调试完毕的基础上,需要进一步完善程序,也就是进入软件调试阶段。在本设计中,软件调试主要分两大部分:实时时钟日历子程序调试、按键子程序调试。将这两部分调试成功,那么整个设计的软件部分也就基本完成了。
图4.1
数字钟仿真图
五、
源程序
用C语言编写:
17
#include
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
data_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
uchar
hour,min,sec;
sbit
shi=P1^0;
sbit
fen=P1^1;
sbit
miao=P1^2;
sbit
rst=P1^4;
sbit
sck=P1^5;
sbit
io=P1^6;
sbit
fm=P1^7;
/*函数声明:*/
void
write_ds1302_byte(uchar
dat);
void
write_ds1302(uchar
add,uchar
dat);
uchar
read_ds1302(uchar
add);
void
read_rtc();
void
set_rtc();
void
display();
void
delay(int
n);
void
show();
void
fmzz();
/*DS1302单字节写入:*/
void
write_ds1302_byte(uchar
dat)
{
uchar
i;
for
(i=0;i>1;
sck=1;
}
}
/*DS1302多字节写入:*/
void
write_ds1302(uchar
add,uchar
dat)
{
rst=0;_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;_nop_();
io=1;
sck=1;
}
/*DS1302读取:*/
uchar
read_ds1302(uchar
add)
{
uchar
i,value;
rst=0;_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(add);
for
(i=0;i>1;
sck=0;
if
(io)
value=value|0x80;
sck=1;
}
rst=0;_nop_();
sck=0;_nop_();
sck=1;
io=1;
return
value;
}
/*调整时间:*/
void
set_rtc()
{
if
(shi==0)
delay(100);
if
(shi==0)
{
hour=(hour>>4)*10+(hour
hour++;
if
(hour==24)
hour=0;
hour=((hour/10)>4)*10+(min
min++;
if
(min==60)
min=0;
min=((min/10)>4)*10+(sec
sec++;
if
(sec==60)
sec=0;
sec=((sec/10)<<4)+(sec%10);
write_ds1302(0x80,sec);
}
}
/*读取时间:*/
void
read_rtc()
{
hour=read_ds1302(0x85);
min=read_ds1302(0x83);
sec=read_ds1302(0x81);
}
/*显示时间:*/
void
display()
{
unsigned
int
a=1;
P2=0x01;P0=data_7seg[hour/16];delay(a);
P2=0x02;P0=data_7seg[hour%16];delay(a);
P2=0x04;P0=data_7seg[min/16];delay(a);
P2=0x08;P0=data_7seg[min%16];delay(a);
P2=0x10;P0=data_7seg[sec/16];delay(a);
P2=0x20;P0=data_7seg[sec%16];delay(a);
}
/*蜂鸣:*/
void
fmzz()
{
uint
i;
for
(i=0;i<100;i++)
{
fm=!fm;
delay(2);
}
}
/*延时程序:*/
void
delay(int
n)
{
unsigned
int
i,j;
for(i=0;i { for(j=0;j<121;j++) {;} } } /*显示学号:*/ void show() { unsigned int m; for(m=0;m<20;m++) { uint a=10; P2=0x01;P0=data_7seg[7];delay(a); P2=0x02;P0=data_7seg[2];delay(a); P2=0x04;P0=data_7seg[4];delay(a); P2=0x08;P0=data_7seg[1];delay(a); P2=0x10;P0=data_7seg[1];delay(a); P2=0x20;P0=data_7seg[8];delay(a); } } /*主程序:*/ void main() { show(); write_ds1302(0x84,0x12);//初始化 write_ds1302(0x82,0x00); write_ds1302(0x80,0x00); while (1) { set_rtc(); read_rtc(); display(); if(min==0) { if(sec==0) {fmzz();} } } } 六、课设心得 略 七、参考文献 1、倪晓军 章韵等.单片机原理与接口技术教程.北京:清华大学出版社,2009 2、DS1302中文手册 3、谭浩强等.C程序设计.北京:清华大学出版社,2005 4、王守忠 聂元铭.51单片机开发入门与典型实例.北京:人民邮电出版社,2009 篇3:单片机课程设计报告--基于单片机的交通灯控制系统 单片机课程设计报告--基于单片机的交通灯控制系统 本文关键词:单片机,交通灯,控制系统,课程设计,报告 单片机课程设计报告--基于单片机的交通灯控制系统 本文简介:单片机原理及系统课程设计报告单片机原理及系统课程设计评语:考勤(10)守纪(10)过程(40)设计报告(30)答辩(10)总成绩(100)专业:自动控制班级:姓名:学号:指导教师:兰州交通大学自动化与电气工程学院2013年3月7日9基于单片机的交通灯控制系统摘要当今时代是一个自动化时代,交通灯控制等 单片机课程设计报告--基于单片机的交通灯控制系统 本文内容: 单片机原理及系统课程设计报告 单片机原理及系统课程设计 评语: 考勤(10) 守纪(10) 过程(40) 设计报告(30) 答辩(10) 总成绩(100) 专 业: 自动控制 班 级: 姓 名: 学 号: 指导教师: 兰州交通大学自动化与电气工程学院 2013 年 3 月 7 日 9 基于单片机的交通灯控制系统 摘 要 当今时代是一个自动化时代,交通灯控制等很多行业的设备都与计算机密切相关。因此,一个好的交通灯控制系统将在道路拥挤等交通状况方面给予技术革新。本文主要介绍了一个基于89C52单片机的交通灯控制系统,详细介绍了利用89C52设计并仿真实现交通灯控制系统的过程,重点对硬件设计、软件编程、调试分析以及各模块系统流程进行了详细分析,对各部分的电路也一一进行了介绍。本电路由AT89C52单片机、按键、数码管和LED灯组成,并在Protues软件上实现仿真。 关键词:交通控制;单片机;AT89C52 Abstract The ages is an automation ages nowadays and traffic light control s waiting a lot of equipments of professions is closely related with calculator. Therefore,a good traffic light control system will hustle for road,give technique innovation. This paper describes a 89C52 microcontroller-based traffic light control system,detailed description of the use 89C52 development process of the traffic light control system. Focus on a detailed analysis of the hardware design,software programming,analysis and debugging process of the modular system,on the part of the circuit are introduced one by one. The circuit is made up of AT89C52 microcomputer,keyboard,digital tube and LED lamp display and realize simulation in the Protues software. Keywords:Traffic Control; Single Chip Microcomputer ;AT89C52 1 引言 信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力、减少交通事故有明显效果。交通灯在城市交通中起着重要的作用,它与人们日常生活密切相关,是人们出行的安全保障。因此提供一个可靠、安全、便捷的多功能交通灯控制系统有着现实的必要性。 1.1设计目的 通过应用单片机的有关知识,能够独立设计出基于单片机的交通灯控制系统,并要求在紧急情况下能运用中断方式控制指示灯的亮灭来转换道路通行方向。 1.2设计要求 本设计是单片机控制的交通灯控制系统设计。要求设计出针对一个大型十字路口设计的交通信号灯控制系统。通过单片机AT89C52控制LED灯和数码管,模拟现实生活中的交通灯工作情景。 1.3设计方法 本设计是将事先编制好的程序输入单片机,利用单片机的定时、查询、中断功能,根据十字路口两个方向上车辆动态状况给予一定的时间通行,其中利用中断方式来处理特殊情况。 2 设计方案及原理 交通灯的控制分为自动控制和人工控制两种方式,正常情况下,交通灯处于自动控制方式,此时东西方向和南北方向的交通灯轮流导通,特殊情况下,可以通过人工方式延长东西方向或南北方向交通灯的导通时间。设计两个按键K1、K2,分别为延长南北方向交通导通时间和东西方向交通导通时间。 自动控制方式:系统上电后处于自动控制方式,首先是南北方向交通导通,南北方向亮绿灯,东西方向亮红灯,数码管从20秒开始倒计时,每隔1秒减1。倒计时结束时,南北方向黄灯开始闪烁,闪烁间隔为0.5秒,共闪烁5秒。黄灯闪烁5秒倒计时结束之后,东西方向交通导通,东西方向亮绿灯,南北方向亮红灯,数码管重新开始从20秒倒计时,每隔1秒减1。 人工控制方式:交通信号灯控制系统设有手控开关。在东西方向车道放行期间,若南北方向车流量较大,按下开关K1使南北方向车道放行;在南北方向车道放行期间,若东西方向车流量较大,按下开关K2使东西方向车道放行。采用外部中断执行中断服务程序,并设置中断为低优先级中断。总体设计框图如图1所示。 图1 总体设计框图 3 硬件设计 3.1主控制系统模块 主控制器采用AT89C52单片机。AT89C52具有1个8KB的FLASH程序存储器,1个512字节的RAM,4个8位的双向可位寻址I/O端口,3个16位定时/计数器及1个串行口和6个向量二级中断结构。单片机的P1口分别用于控制东西方向车道及南北方向车道的通行灯,P0口和个别P3口用于2个2位LED计时器的控制。 3.2时钟电路模块 时钟电路由一个12MHZ晶体振荡器和两个30pF的瓷片电容组成,时钟电路用于产生单片机工作所需要的时钟信号。电路如图2所示。 图2 时钟电路模块 3.3复位电路模块 复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。因为本设计中功能中有倒计时时间的记忆功能,所以不能对单片机进行硬件复位,只能用软件复位,软件复位实际上就是当程序执行完之后,将程序通过一条跳转指令让它完成复位。电路如图3所示。 图3 复位电路模块 3.4交通灯输出控制模块 道口交通灯指示采用高亮度红、黄、绿发光二极管进行提示。通过与驱动电阻连接使发光二极管按照程序要求亮灯。电路如图4所示。 图4 交通灯输出控制电路 3.5时间显示电路模块 道口通行剩余时间倒计时采用高亮红色7段LED发光数码管显示,采用共阴极数码管。电路图如图5所示。 图5 数码管显示模块 4 软件设计 主程序采用查询方式定时,通过调用0.5S延时子程序的次数,从而获取交通灯的各种时间。子程序采用定时器1方式1查询定时,定时器定时50ms,确定50ms循环20次,从而获得1S的延时时间。 有车车道的放行的中断服务程序首先要保护现场,因而需用到延时子程序,子程序采用定时器0方式1查询式定时,定时器定时50ms,确定50ms循环20次,从而获得1S的延时时间,保护现场时还需关中断。 由软件查询外中断,判别哪一道有车。待交通灯信号出现后,保持10S的延时,然后关中断,恢复现场,再开中断返回主程序。 4.1程序流程图 图6 程序流程图 5 系统仿真及实际调试 正常情况下的南北车道绿灯20S放行仿真图如附图1所示。 当南北车道无车,东西车道有车时,切换到东西车道绿灯时的仿真图附图2所示。 6 总结 通过此次课程设计,复习巩固以前我们所学习的数字、模拟电子技术、单片机原理及接口等课程知识,加深对各门课程及相互关系的理解,并成功使用了Proteus Isis电子软件,使理论知识系统化、实用化。制作过程中遇到了很多问题,通过不断地查资料,不断地调试,一一解决。 此次课程设计巩固了我的基础知识,提高了我的应用水平,锻炼了我的动手能力,使我受益匪浅。然而,在吸取经验的同时,我也吸取了不少教训。在编写软件中,在此过程中我更为熟练得掌握汇编语言各种指令的使用方法,掌握了keil软件的使用。在编程、仿真方面都走了不少弯路。在软件调试过程中,使我又一次复习了keil和proteus联合使用的方法。在调试时曾经遇到数码管倒计时显示时间两位不能同时显示,后来经过查找资料不断调试才领悟到原来在显示的过程中要循环显示才能使得显示稳定下来。 通过这次课程设计,我掌握了用单片机设计交通灯的基体方法,增强了我寻找问题,解决问题的能力。在今后的学习和实践中,我将继续努力钻研,提高自己,争取在学术和记忆上获得更大的进步。 参考文献 [1]李华,王思明,张金敏.单片机原理及应用[M].兰州:兰州大学出版社,2001.5 [2]杨居义.单片机课程设计指导[M].北京:清华大学出版社,2009.12 [3]卢艳军.单片机原理及应用系统[M].北京:机械工业出版社,2005.2 附录 程序源代码 ORG 0000H ;初始化 AJMP BEGIN ORG 0003H LJMP ZD ORG 0013H LJMP ZD ORG 0030H BEGIN: MOV SP,#6FH ;设置中断位 SETB EA ;打开总中断 SETB EX0 ;打开外部中断0 SETB EX1 ;打开外部中断1 CLR IT0 CLR IT1 AL: MOV R7,#20 ;南北车道亮绿灯20s程序 MOV P1,#0DEH LCALL TIME1S MOV R4,#05 AH: MOV P1,#0DDH ;南北方向亮黄灯 MOV R5,#05 AAA: LCALL TIME01S ;延时0.5s DJNZ R5,AAA MOV P1,#0DFH MOV R5,#05 BBB: LCALL TIME01S ;延时0.5s DJNZ R5,BBB DJNZ R4,AH BL: MOV R7,#20 ;东西方向亮绿灯20s程序 MOV R0,#0F3H MOV P1,R0 LCALL TIME1S MOV R4,#05 BH: MOV R0,#0EBH ;东西方向亮黄灯 MOV P1,R0 MOV R5,#05 BA: LCALL TIME01S ;延时0.5s DJNZ R5,BA MOV R0,#0FBH MOV P1,R0 MOV R5,#05 BB: LCALL TIME01S ;延时0.5s DJNZ R5,BB DJNZ R4,BH JMP AL TIME1S: MOV R3,#50 ;延时1s CLR A ABC: MOV A,R7 LCALL XS DJNZ R3,ABC DJNZ R7,TIME1S RET TIME01S: MOV R7,#05 ;延时0.1s CLR A BCD: MOV A,R4 LCALL XS DJNZ R7,BCD RET TIME10MS: MOV R2,#20 ;键扫描10ms子程序 YS: MOV R6,#248 DJNZ R6,$ DJNZ R2,YS RET XS: MOV R6,A ;延时20ms并输出秒数 MOV R1,#40H MOV A,R6 MOV B,#10 DIV AB MOV @R1,A INC R1 MOV @R1,B MOV DPTR,#LIST MOV A,@R1 MOVC A,@A+DPTR MOV P0,A CLR P3.7 LCALL TIME10MS SETB P3.7 DEC R1 MOV DPTR,#LIST MOV A,@R1 MOVC A,@A+DPTR MOV P0,A CLR P3.6 LCALL TIME10MS SETB P3.6 RET LIST:DB 3FH,06H,5BH,4FH ;查表 DB 66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH DB 39H,5EH,79H,71H DB 40H,00H ZD: MOV 43H,R7 ;中断 PUSH 43H MOV 44H,R0 PUSH 44H MOV 45H,R6 PUSH 45H MOV 46H,R3 PUSH 46H JNB P3.2,S1 JNB P3.3,S2 RET S1: MOV R7,#10 ;由东西方向切换为南北方向 MOV R0,#0DEH MOV P1,R0 LCALL TIME1S AJMP FINALLY S2: MOV R7,#10 ;由南北方向切换为东西方向 MOV R0,#0F3H MOV P1,R0 LCALL TIME1S AJMP FINALLY FINALLY: POP 46H MOV R3,46H POP 45H MOV R6,45H POP 44H MOV R0,44H POP 43H MOV R7,43H RETI EDN 仿真图 附图1 正常情况下南北车道放行20S仿真图 附图2 南北车道绿灯切换为东西车道绿灯的仿真图