资源描述
河海大学计算机与信息学院(常州)
课程设计报告
题 目
专业、学号
授课班号
学生姓名
指导教师
完成时间
摘要
本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。电子钟设计可采用数字电路实现,也可以采用单片机来完成。数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。
设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。也可以改蜂鸣器为继电器,通过控制继电器从而进一步扩展的来控制一些家电开关。
关键字:单片机;子时钟;键盘控制。
目录
第一章 系统设计要求 2
1.1 设计要求 2
第二章 系统的组成及工作原理 3
2.1 系统的组成 3
2.2 系统的工作原理 3
第三章 系统硬件电路方案设计 6
3.1 电子时钟方案 6
3.2 数码显示方案 6
3.3 单元电路设计 7
3.3.1 晶体振荡电路 7
3.3.2 复位电路 7
3.3.3 显示电路 7
3.3.4 键盘电路 7
3.3.5 控制电路 8
第四章 系统的软件设计 9
4.1 程序流程图 9
4.2 源程序 10
第五章 系统调试和测试结果与分析 25
5.1 实验仪器与工具 25
5.2 调试闹钟 25
5.3 调试按键子程序 25
第六章 结论 26
参考文献 27
1 概述
该电子钟是以单片机AT89C51为核心来完成的,在硬件电路中采用P0口作为6位LED数码管的驱动接口,这是由于P0口输出驱动电路工作处于开漏状态,它的驱动能力强,故只需外接上拉电阻便可以把LED数码管点亮。因为共阴的LED数码管它的驱动电流是分开的,在单片机进行动态扫描的时候不会影响彼此的电流,故该电路中的6位LED数码管均用共阴极的数码管。在6位LED显示时,为了简化电路,降低成本, 6个LED显示器共用一个8位的I/O, 6位LED数码管的位选线分别由相应的P2. 0~P2. 5控制,而将其相应的段选线并联在一起,由一个8位的I/O口控制,即P0口。在电路中还设有三个按键K1,K2和K3用来进行定时,选时和调时的选择,他们分别与单片机的P1. 0, P1. 1, P1. 2口相连接。P3. 7口与蜂鸣器相连接。
利用AT89C51单片机结合七段显示器完成的简易的定时闹铃时钟,干电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、闹钟电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。译码显示电路将“时”、“分”、“秒”计数器的输出送到七段显示译码驱动器译码驱动,通过六个七段LED显示器显示出来。闹钟电路是用比较器来比较计时系统和定时系统的输出状态,如果计时系统和定时系统的输出状态相同,则发出一个脉冲信号,再和一个高频信号混合,送到放大电路驱动扬声器发声,从而实现定时闹响的功能。通过设置现在的时间及显示闹铃设置时间,并在定时时间发出一阵声响,可以进—步扩充控制电器的启停等。
用单片机来设计数字钟,软件实现各种功能比较方便,但因软件的执行需要一定的时间,所以就会出现误差。因此我进一步努力,通过对比实际的时钟,查找出误差的来源,并作出调整,使得误差尽可能减小,达到实际数字钟系统的允许误差范围。
在程序设计中,采用模块化的程序设计思想,对整个设计划分了若干个模块,先对各个模块分别进行设计,然后整合各个模块,进行仿真模拟,对出现的错误进行分析,然后找出问题的所在,改进程序,再仿真模拟,观察结果、分析结果,直至最终结果满足设置要求。
第一章 电子时钟的设计
一、 设计要求
1、准确计时,以数字形式显示时、分、秒的时间。
2、小时以24小时计时形式,分秒计时为60进位。
3、校正时间功能(即调整时间)
4、闹钟功能。
5、整点报时。
6、总结检验电路设计结果
3、各部分功能实现
(1)单片机发送的信号通过程序控制最终在数码管上显示出来。
(2)单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。
(3)为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正LED显示器上显示的时间。
(5)单片机通过控制闹铃电路来完成定时闹钟的功能。
二、 设计方案和论证
系统工作原理
一般电子钟是一个将“ 时”,“分”,“秒”显示于人的视觉器官的计时装置。它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和报时功能。因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成。主电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。译码显示电路将“时”、“分”、“秒”计数器的输出状态用七段显示译码器译码,通过七段显示器显示出来。整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整。
而该电子时钟由89C51,BUTTON,六段数码管等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路中唯一的一个控制键却拥有多种不同的功能,按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。
本次设计时钟电路,使用了ATC89C52单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、显示屏即可满足设计要求。
电子闹钟的系统框图如下所示:
CPU
复位、时钟等电路
按钮电路
4位数码管显示电路
闹铃声指示电路
电源系统
第二章 系统组成及工作原理
2.1、系统的组成
(1) 晶体振荡器
单片机的晶振电路,如图所示。
图 单片机的晶振电路
石英晶体也连接在晶振引脚的输入和输出之间,等效为一个并联谐振回路,振荡频率应该是石英晶体的并联谐振频率。晶体旁边的两个电容接地,实际上就是电容三点式电路的分压电容, 接地点就是分压点。以接地点即分压点为参考点,振荡引脚的输入和输出是反相的,但从并联谐振回路即石英晶体两端来看, 形成一个正反馈以保证电路持续振荡。
本设计晶振电路采用11.0592Mhz的晶振。晶振的作用机器周期=10*晶振周期=12*系统时钟周期
(2) 复位电路
单片机的复位电路,如图所示。
图单片机的复位电路
当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。根据应用的要求,复位操作通常有两种基本形式:上电复位和上电或开关复位。上电复位要求接通电源后,自动实现复位操作。上电后,保持RST一段高电平时间。
(3) 数码管显示
C部分电路由4 位一体的数码管LED1、单个数码管LED2和8个独立发光二极管L1-L7
组成。这3个部分都是共阴结构,并联在一起,连接在P0口上。
LED1用于完成LED动态显示实验,各个位选线为P24-P27,段码由P0口输出;LED2
的COM端接地,完成LED 静态显示实验;L1-L7,可以方便地读出P0输出的二进制数据,
亦可做流水灯实验。
本次课程设计采用了4位数码管显示电路。在4位LED显示时,为了简化电路,降低成本,采用动态显示的方式, 4个LED显示器共用一个8位的I/O, 4位LED数码管的位选线分别由相应的P2. 0~P2. 5控制,而将其相应的段选线并联在一起,由一个8位的I/O口控制,即P0口。译码显示电路将“时”、“分””计数器的输出状态菁七段显示译码器译码,通过4位LED七段显示器显示出来。到达定时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现闹铃。校时电路时用来对“时”、“分”显示数字进行校对调整的.
7407 在此起驱动作用。
(4) 键盘控制
键盘是控制和修改时钟的重要输入模块,通过键盘可以修改时间,修改年月日,修改闹钟时间,控制显示等。
E 部分电路为行列式键盘和独立式按键输入电路。
P20-P23 为行,P24-P27 为列,构成4×4行列式键盘。按键编号规律为S2+行号+列
号。例如S226 表示P22 行和P26列跨接处的按键。
K20-K27 构成独立式按键,分别接在P20-P27 上,当按键按下时,对应的口线输入0,
同时相应的LED点亮。
D20-D27 构成P20-P27 的状态指示,当某口线输出0,相应的LED 点亮。有4 个用
途:1、当行列式键盘逐行扫描时,可做为正在被扫描的行的指示。2、当行列式键盘逐行扫
描时,可做为已按下键的指示。例:当S215键按下,扫到P21行时,D21 和D25 会被点亮。
3、可做为独立式按键被按下的指示。见上一段。4、当P2 口不做为键盘输入时,D20-D27
可做为输出器件,实现流水灯等功能。
在该模块中,采用3个按键作为电子时钟的控制输入,通过按键来实现时钟的时间设置、定时、秒表功能。电路中将3个按键的一端接公共地,而单片机的P2口默认为高电平,一旦按键被按下,则该按键对应的额管脚被拉低,通过软件扫描按键即可知道用户所要实现的功能,调用相应的按键子程序来完成该操作。按键的去抖动由软件来实现。
(5) 控制部分
B部分是单片机的最小系统部分,只有这部分电路正常,整个系统才能工作。
单片机为内含8K FLASH 程序存储器的STC89C52RC,EA接高电平;各并行口都加了
10K 的上拉电阻;晶振为11.0592M。设置了上电复位和手动复位电路。S1为手动复位按钮。
单片机芯片
4、STC89C52单片机介绍
STC89C52单片机是由深圳宏晶公司代理销售的一款MCU,是由美国设计生产的一种低电压、高性能CMOS 8位单片机,片内含8kbytes的可反复写的FlashROM和128bytes的RAM,2个16位定时计数器[5]。
STC89C52单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0~P3、定时器/计数器、串行I/O接口以及定时控制逻辑电路等。这些部件通过内部总线联接起来,构成一个完整的微型计算机。其管脚图如图所示。
VCC:电源。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写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.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口同时为闪烁编程和编程校验接收一些控制信号。
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)。
2.4 闹钟电路设计
本系统采用声音指示。关键元件是蜂鸣器。蜂鸣器有无源和有源两种,前者需要输入声音频率信号才能正常发声,后者则只需外加适当直流电源电压即可,元件内部已封装了音频振荡电路,在得电状态下即起振发声。市场上的有源蜂鸣器分为3V、5V、6V等系列,以适应不同的应用需要。闹钟电路是用比较器来比较计时系统和定时系统的输出状态,如果计时系统和定时系统的输出状态相同,则发出一个脉冲信号,再和一个高频信号混合,送到放大电路驱动扬声器发声,从而实现定时闹响的功能。
蜂鸣器采用9012 三极管驱动,其基极接到RD
端,当RD 端为低电平时,三极管导通,蜂鸣器
响。否则关断。
继电器采用9013 三极管驱动,其基极接到
WR端,当WRD 端为低电平时,三极管关断,继
电器不吸合,常闭触点闭合,常开触点打开,D1
熄灭;反之则反。
J 部分为电源部分。
当 USB供电不足时可通过J3 接入后备电源。
SW_PWR 为电源开关,闭合时电路板得电,
同时D_P1亮。
F1 为自恢复保险,防止电源反接和短路,保
护PC机USB口
4.Proteus软件仿真
本次课程设计所采用的程序调试软件为wave6000集成调试软件,所采用的仿真软件为protus 6 professional软件。
本次试验的效果图如下所示:
性能及误差分析
该电子钟有三个按键: K1, K2和K3键。按K1键进行校时,可以分别对时及分进行单独校时,使其校正到标准时间,校时时需要校正哪一位哪一位就闪烁。按K2键是对闪烁位进行加一返回的操作。按K3键调整定时时间和定时组数,需要调整哪一位哪一位就闪烁,该电子钟最多可定时20组闹钟。经测试该电子钟在一天的累计误差约为0. 1秒。该电子钟的误差主要由晶振自身的误差所造成,晶振的误差约为0. 0001~0. 000001。在软件的编程过程中所产生的误差比较小,在重装初值的过程中大概需要约8个机器周期,但在程序开始对定时器赋初值时,多加了8个机器周期,减小了这方面的误差。另外在中断的过程中,只会在第一次计时时产生时间的偏移,而它所产生累计误差很小,可以忽略。
结构化软件程序的调试一般可以将重点放在分模块调试上,统调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,可借助于软件仿真器即可;后者一般需要仿真系统的支持。本次课设,采用wave6000集成调试软件来调试程序,通过各个模块程序的单步或跟踪调试,使程序逐渐趋于正确,最后统调程序。
3 软件设计
3.1 概述
软件设计的重点在于秒脉冲信号的产生、显示的实现、以及按键的处理等方面。基于软件的秒脉冲信号通常有延时法和定时中断法。延时法一般采用查询方式,在延时子程序前后必然需要查询和处理的程序,导致误差的产生,因此其秒脉冲的精度不高;中断法的原理是,利用单片机内部的定时器溢出中断来实现。例如,设定某定时器每100ms中断1次,则10次的周期为1s。这种实现法的特点是精度高,秒脉冲的发生和其他处理可以并行进行。本系统中所使用的晶振频率为12MHZ。
3.2 主模块的设计
主模块是系统软件的主框架。结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。它的合理与否关系到程序最终的功能的多少和性能的好坏。本系统的主模块的程序框图如下图2所示:
CPU系统初始化
定时0初始化
中断初始化
串口初始化
显示待机指示符
设定闹铃时间
判设置闹铃时间否?
显示刷新
启动走时
有关变量初始化
刷新显示
判时或分变化否?
秒指示
判1秒到否?
闹铃
判是否到闹铃时间?
延时
Y
Y
Y
Y
图 2
3.3 基本显示模块设计
基本显示模块设计的重点是由显示代码取得相应的段码,显示段码数据的并行发送,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
程序流程如图3所示。
将16进制时分秒数据转化为BCD显示代码
关显示以免显示抖动
通过串口将时分秒数据传入数码管
打开显示
图 3
3.4 时间设定模块设计
时间设定模块的设计要点是按键的去抖处理与“一键多态”的处理。即只涉及4个键完成了6位时间参数的设定。软件法去抖动的实质是软件延时,即检测到某一键状态变化后延时一段时间,再检测该按键的状态是否还保持着,如是则作为按键处理,否则,视为抖动,不予理睬。去抖中的延时时间一般参考资料多描述为10ms左右,实际应用中,应大于20ms,否则,会导致按一次作多次处理,影响程序正常执行。“一键多态”即多功能键的实现思想是,根据按键时刻的系统状态,决定按键采取何种动作,即何种功能。
其流程图如下图4所示:
设置键吗?
设置模块初始化
将在编参数送显示缓冲区
闪烁标志为真?
将当前位的显示代码置暗代码
调基本显示模块刷新显示
设置键吗?
当前编辑位下移(下一位)
当前编辑的是分各位?
结束设定
+键吗?
根据当前位的性质分别进行+1处理(含上下限判断)
N
N
N
N
N
图 4
3.5 闹铃功能的实现
闹铃功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。译码显示电路将“时”、“分”、“秒”计数器的输出送到七段显示译码驱动器译码驱动,通过六个七段LED显示器显示出来。闹铃电路根据计时系统的输出状态产生一脉冲信号,然后加上一个高频或低频信号送到放大电路驱动蜂鸣器发声实现报时。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。
其流程图如下所示:
时十位、个位,分十位、个位改变了
设置闹铃标志
是否设置了闹铃
清除闹铃标志
判当前时间是设定时间
中断返回
中断返回
Y
N
Y
闹铃判别处理
图5.1
图5.2
虑到实用性,在该电子钟的设计中修改定时或调整时间时采用了闪烁,而且以定时20组闹钟。在编程上,首先进行了初始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一组固定单元用来存储计数的秒,分,时以及定时时间的序号等。
在显示程序段中主要进行了闪烁的处理,采用定时器中断置标志位,再与位选相互结合的方法来控制调时或定时中的闪烁。时,分,秒显示则是用了软件译码(查表)的方式,再用了一段固定的程序段进行进制转化。初始化之后,用中断方式对其计数,计数的同时采用了定时器比较的方法,比较当前计数时间与定时时间是否相等,若相等则将闹铃标志位置数。由于定义了定时闹钟组,在这里采用中断组次,每中断一次比较一组闹钟,避免了一次比较中断时间过长,影响下次中断时间。显示之后查询闹铃标志位是否与前面所置数相等,若相等则响铃。
为了避免响铃影响显示,采用了每显示几屏以后在显示程序中出现脉冲,驱动喇叭,不会影响显示。之后用查询方式对按键进行判断,若有键按下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。对当前时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。
5课程设计体会
近几年,单片机在各个领域得到广泛的应用。从工业到人们的日常生活,大部分的科技产品都是通过单片机来控制。在它问世之前,自动控制设备不能被广泛的应用,这是因为控制设备的体积庞大,耗电量大,价格昂贵。在第一台微处理器成功研制不久,第一个单片机就问世了。因为其小巧的体积,低功耗,以及高效的性能,单片机受到了大家的欢迎。今天,单片机成为了解决低复杂度,中等复杂度控制问题的传统选择。我们选择的方法是单片机开发设计使用的传统方法,通过本次设计,可以了解整个单片机开发的流程。
这一次的单片机课程设计,使我考虑了很多的东西,通过一个礼拜的学习和实践,使我对所学的知识进行了系统的复习和巩固,在以前的学习中不够清晰的概念得到了更好的理解。同时,通过课设,培养和锻炼了我的动手能力,这一点非常重要,不仅对我以后的学习有帮助,还可以为以后的工作打下一定的基础。这段时间的学习,使我了解到了理论和实际之间的差别,第一次真正接触到了实际中的问题,并通过和老师、同学交流,加强了自身的分析问题、解决问题的能力。同时,我也发现了自己在某些方面的不足,这是我以后要加以改进的方面。
这一次的课设对我的帮助很大,使我真正的认识到了理论与实际的区别,这将成为我的学习目标和动力,更进一步的挖掘自己的能力,使自己获得进一步的提高。
辛辛苦苦努力了一个月,终于有了成果,把理论变成了现实,出了欣喜外,还充满了成就感。
以前看别人的一个电子表卖十几块钱,心里面有点愤愤不平,现在,自己做过一个电子钟,才发现,其中的不容易,还有艰辛。其实做其他的事情也是一样,都会经过很多的困难,才能成功。突然想起一句话“不经历风雨,怎么见彩虹”。
其实想想,这一个月,也留下了很多美好的回忆。
还记得那个晚上通宵达旦仿真,不成功,誓不睡觉,很困了,都还在弄着。却当仿真成功时,没有一丝睡意,有的只是心中的喜悦
还记得那天废寝忘食打孔和焊板,还记得当数码管终于亮起来那一刻……
通过这次设计让我真正体会到了,有付出,才会有收获。
四、参考文献
[1] 谢自美.电子线路设计·实验·测试[M].武汉:华中理工大学出版社,1992.
[2] 何立民.单片机应用系统设计[M].北京:北京航空航天大学出版社,1993.
[3] 楼然笛.单片机开发[M].北京:人民邮电出版社,1994.
[4] 付家才.单片机控制工程实践技术[M].北京:化学工业出版社 2004.3.
[5] 李光才.单片机课程设计 实例指导[M]. 北京:北京航空航天大学出版社 2004.
[6] 朱定华.单片机原理及接口技术实验[M].北京:北方交通大学出版社2002.11.
[7] 刘湘涛.江世明.单片机原理与应用[M]. 北京:电子工业出版社,2006.
程序:
1 #include<reg52.h> //头文件
2 //#include<intrins.h>
3 #define uchar unsigned char//宏定义
4 #define uint unsigned int
5 sbit key1=P2^5; //位声明
6 sbit key2=P2^6;
7 sbit key3=P2^7;
8 sbit fmq=P3^7;
9 uchar code segcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, //数码管显示的数值
10 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点的数值
11 void jia(); //函数声明
12 void jian();
13 uchar time1[4]; //定义数组,数组内含有个数值
14 uchar time2[4];
15 uchar shi=23,fen=59,miao=50; //显示初始值
16 uchar shi1,fen1,miao1,shi2,fen2,miao2,shi,fen,miao;//定义全局变量
17 uchar flag,flag1,cnt,count,flag2;//定义全局变量
18 void sint()interrupt 4
19 {
20 1 flag2++;
21 1 flag2=flag2%4;
22 1 if(RI&&flag2==1)
23 1 {
24 2 shi=SBUF;
25 2 RI=0;
26 2 }
27 1 if(RI&&flag2==2)
28 1 {
29 2 fen=SBUF;
30 2 RI=0;
31 2 }
32 1 if(RI&&flag2==3)
33 1 {
34 2 shi2=SBUF;
35 2 RI=0;
36 2 }
37 1 if(RI&&flag2==0)
38 1 {
39 2 fen2=SBUF;
40 2 RI=0;
41 2 }
42 1 if(!TI);
43 1 TI=0;
44 1
45 1 }
46 void delay(uchar i) //延时函数,用于动态扫描数码管
47 {
48 1 uchar x,y;
49 1 for(x=i;x>0;x--)
50 1 for(y=110;y>0;y--);
51 1 }
52 void init() //初始化函数
53 {
54 1 TMOD=0X21; //工作方式
55 1 TL1=0xfd;
56 1 TH1=0xfd;
57 1 SCON=0x50;
58 1 PCON=0x00;
59 1 TR1=1;
60 1 EA=1; //开总中断
61 1 ES=1;
62 1 TH0=(65536-50000)/256; //定时时间为:ms
63 1 TL0=(65536-50000)%256;
64 1 ET0=1; //打开定时器
65 1
66 1 TR0=1; //启动定时器
67 1 }
68 void display() //显示子函数,用于显示时间数值
69 {
70 1 uchar i,j;
71 1
72 1 time1[0]=fen%10; //分离分的各位与十位
73 1 time1[1]=fen/10;
74 1 time1[2]=shi%10; //分离时的各位与十位
75 1 time1[3]=shi/10;
76 1 j=0x7f; //从秒到时的扫描
77 1 for(i=0;i<4;i++)
78 1 {
79 2 P2=j;
80 2 P0=segcode[time1[i]];//显示数值
81 2 delay(10);
82 2 j=j>>1;//循环右移
83 2 }
84 1 }
85 void display_1() //显示子函数,用于显示定时时间
86 {
87 1 uchar i,j;
88 1 time2[0]=fen2%10+11;
89 1 time2[1]=fen2/10;
90 1 time2[2]=shi
展开阅读全文