首页 单片机课程设计-电子万年历设计(含源程序)

单片机课程设计-电子万年历设计(含源程序)

举报
开通vip

单片机课程设计-电子万年历设计(含源程序)单片机课程设计-电子万年历设计(含源程序) 单片机课程设计 目录 第一章 引言„„„„„„„„„„„„„„„„„„„2 第二章 设计方案论证……………………………………..3 2.1 方案论证与设计……………………………………………3 2.1.1 控制部分的方案选择…………………………………….3 2.1.2 显示部分的方案选择…………………………………….4 2.1.3 系统基本方案选择和论证………………………….........4 2.2 单片机原理…………………………………………………5 ...

单片机课程设计-电子万年历设计(含源程序)
单片机课程设计-电子万年历设计(含源程序) 单片机课程设计 目录 第一章 引言„„„„„„„„„„„„„„„„„„„2 第二章 设计MATCH_ word word文档格式规范word作业纸小票打印word模板word简历模板免费word简历 _1714044600337_1论证……………………………………..3 2.1 方案论证与设计……………………………………………3 2.1.1 控制部分的方案选择…………………………………….3 2.1.2 显示部分的方案选择…………………………………….4 2.1.3 系统基本方案选择和论证………………………….........4 2.2 单片机原理…………………………………………………5 2.3 LED显示数码管…………………………………………..5 第三章 计算部分…………………………................................5 3.1 主要单元电路的器件……………………………………….5 3.1.1 单片机主控制模块…………………………………..........6 3.2其他模块器件………………………………………..……..10 3.2.1 74LS164………………………………………...………...10 3.2.2 其他元器件……………………………………………....10 第四章 结构设计部分………………………………………13 4.1 显示部分设计………………………………………….…..12 4.1.1 万年历优先算法………………………………………....13 4.1.2 秒表显示……………………………………………...….13 4.2 电路控制部分设计…………………………………….......13 4.3 整体设计…………………………………………………...14 4.4 系统软件设计………………………………………….…..16 4.4.1 Proteus 软件仿真…………………………………...........17 结束语……………………………………………………19 参考文献………….……………………………………...20 系统程序清单....................................................................20 1 1 单片机课程设计 第一章 引言 随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 目。因为它的有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式LED数码管显示的日历钟逐渐受到人们的欢迎。LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。 所以,电子万年历无论作为比赛题目还是 练习题 用券下载整式乘法计算练习题幼小衔接专项练习题下载拼音练习题下载凑十法练习题下载幼升小练习题下载免费 目都是很有价值。 关键字: 单片机 显示器 计时 万年历 秒表 第二章 设计方案论证 2(1方案论证与设计 2 1 单片机课程设计 2.1.1.控制部分的方案选择 a)用可编程逻辑器件设计。可采用ALTERA公司的FLEX10K系列PLD器件。设计起来结构清晰,各个模块,从硬件上设计起来相对简单,控制与显示的模块间的连接也会比较方便。但是考虑到本设计的特点,EDA在功能扩展上比较受局限,而且EDA占用的资源也相对多一些。从成本上来讲,用可编程逻辑器件来设计也没有什么优势。 b)用凌阳16位单片机设计。凌阳16位单片机有丰富的中断源和时基,方便本实验的设计。它的准确度相当高,并且C语言和汇编兼容的编程环境也很方便来实现一些递归调用。I/O口功能也比较强大,方便使用。用凌阳16位单片机做控制器最有特色的就是它的可编程音频处理,可完成语音的录制播放和识别。这些都方便对设计进行扩展,使设计更加完善。成本也相对低一些。 2.1.2显示部分的方案选择 a)液晶显示方式。液晶显示效果出众,可以运用菜单项来方便操作,但是在显示时,特别是使用秒表功能时扫描速度跟不上,屏幕会有明显的闪烁。而且由于61板的存储空间有限,液晶显示就不能与语音播抱程序同时实现。这些大大影响了电子万年历的性能。 b)相比液晶显示,采用8段数码管既经济实惠,在效果上也可以加入语音报时功能,操作比较液晶显示来说虽然略显繁琐,但总体也还可以做到比较人性化。所以,最后选择LED数码管显示方案。 2.1.3系统基本方案选择和论证 1.单片机芯片的选择方案和论证: 方案一: 采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,与51单片机相比,存储空间更大一些,处理能力更强一些,但价格昂贵。 方案二: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,虽然其存储空间和处理能力都比不上52单片机,但是51 3 1 单片机课程设计 单片机的处理能力完全能够满足我们的要求,而且价格方面非常便宜。 所以选择采用AT89C51作为主控制系统. 2. 显示模块选择方案和论证: 液晶显示屏的显示功能强大,可显方案一: 采用LED液晶显示屏, 示大量文字,图形LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用LED液晶显示屏. 方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示. 方案三:采用LED数码管动态扫描,接时,占用的单片机口线少。 所以采用了LED数码管作为显示。 3. 电路设计最终方案决定 对此次作品的方案选定: 采用AT89C51作综上各方案所述, 为主控制系统;LED数码管动态扫描作为显示。 2.2 单片机原理 单片机就是简化的微型计算机。CPU中本身自带存储器ROM和RAM。CPU片内也有总线。IC(集成电路)技术是将电路通过特殊工艺做在一块硅基片上封装成芯片,比如CPU,片外存储器等等。 将单片机CPU(比如51系列),晶振,存储器,地址锁存器,逻辑门,七段译码器(显示器),按钮(类似键盘),扩展芯片,接口等通过PCB工艺(比如SMT贴片,或者插装)做在环氧树脂板上。这样才是一个完整的单片(做在一块PCB板上)的微型计算机。 2.3 LED显示数码管 常见的LED显示具有清晰明亮的特点。是显示接口也是绝大多数单片机应用系统必备的部件之一。 发光二极管组成的显示器是单片机应用产品中最常用的廉价输出设备。它由若干个发光二极管按一定的规律排列而成。当某一个发光二极管导通时,相应的一个点或一笔画被点亮,控制不同组合的二极管导通,就能显出各种字符。 1. 显示器的结构 常用的7段显示器的结构如图所示,发光二极管的阳极连在 4 1 单片机课程设计 一起的称为共阳极显示器,阴极连在一起的成为共阴显示器。1位显示器由8个发光二极管组成,其中7个发光二极管a,g控制7个笔画的亮或暗,另一个控制一个小数点的亮和暗,这种笔画的七段显示器能显示的字符较少,字符的形状有些失真,但失控简单,使用方便。 第三章计算部分 3.1 主要单元电路的器件 3.1.1单片机主控制模块 1(内部结构 8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。 8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明: 5 1 单片机课程设计 ?中央处理器: 中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。 ?数据存储器(RAM): 8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。 ?程序存储器(ROM): 8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。 计数器(ROM): ?定时/ 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。 ?并行输入输出(I/O)口: 8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。 ?全双工串行口: 8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。 ?中断系统: 8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。 ?时钟电路: 8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。 单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯 6 1 单片机课程设计 顿结构。 2.引脚定义及功能: MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明: 1).电源及时钟引脚 Vcc:接+5V 电源 Vss:接地 XTAL1和XTAL2:时钟引脚,外接晶体引线端。当使用芯片内部时钟时,此两引脚端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。 2).控制引脚 RST/Vpq:RST是复位信号输入端,Vpd是备用电源输入端。当RST输入端保持2个机器周期以上高电平时,单片机完成复位初始化操作。 当主电源Vcc发生故障而突然下降到一定低电压或断电时,第2功能Vpd将为片内RAM提供电源以保护片内RAM中的信息不丢失。 ALE/PROG:地址锁存允许信号输入端。在存取外存储器时,用于锁存低8位地址信号。当单片机正常工作后,ALE端就周期性地以时钟振荡频率的1/6固定频率向外输出正脉冲信号。此引 7 1 单片机课程设计 脚的第2功能PROG是对片内带有4K字节EPROM的8751固外程序时,作为编程脉冲输入端。 PSEN:程序存储器允许输出端。当片外程序存储器的读选通信号,低电平有效。CPU从外部程序存储器取指令时,PSEN信号会自动产生负脉冲,作为外部程序存储器的选通信号。 EA/Vpp:程序存储器地址允许输入端。当EA为高电平时,CPU执行片内程序存储器指令,但当PC中的值超过0FFFH时,将自动转向执行片外程序存储器指令;当EA为低电平时,CPU只执行片外程序存储器指令。 3).I/O口引脚 P0.0~P0.7:P0口8位双向I/O口; P1.0~P1.7:P1口8位准双向I/O口; P2.0~P2.7:P2口8位准双向I/O口; P3.0~P3.7:P3口8位准双向I/O口。 (片外总线结构 3 分为三部分:数据总线 Data Bus(DB),地址总线 Address Bus (AB),控制总线 Control Bus(CB) 3.2其他模块器件 (1) 74HC164 芯片外观图如下: 74HC是个串入并出的8位移位寄存器,它常用于单片机系统中,其主要工作特点如下:串行输入带锁存; 时钟输入,串行输入带缓冲 ;异步清除; 最高时钟频率可高达36Mhz ;功耗:10mW/bit ;74系列工作温度: 0?C to 70?C ;Vcc最高电压:7V ;输入最高电压:7V; 高电平:,0.4mA ;低电平:8mA 其内部引脚结构图如下: 8 1 单片机课程设计 (2).电阻 本实验采用金属薄膜电阻,阻值为1K, 金属膜电位器的电阻体可 由合金膜、金属氧化膜、金属箔等分别组成。特点是分辩力高、 耐高温、温度系数小、动噪声小、平滑性好。 (3)电解电容 本实验电解电容分别有20uf和100uf,在电路中起微调作用,用 于复位与电源电路中。元件示意图如下: 9 1 单片机课程设计 (4).电容 本实验中采用C104,在电源与地之间其去耦的作用,同时用于振荡电路中。 (5).晶振 本实验采用6MHZ的晶体振荡器,XTAL1和XTAL2分别为晶振的输 入和输出。该反向放大器可以配置为片内振荡器。石晶振荡 和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2 应不接。有余输入至内部时钟信号要通过一个二分频触发器, 因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的 高低电平要求的宽度。 (6).七段数码管显示器 本实验选用元件示意图如下: 10 1 单片机课程设计 由于系统要显示的内容较简单,显示量不多,所以选用此数码管既方便又经济。LED有共阴极和共阳极两种。如下图所示。 二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。一位显示 ”的器由8个发光二极管组成,其中7个发光二极管构成字型“8各个笔划(段)a,g,另一个小数点为dp发光二极管。当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。为了保护各段LED不被损坏,需外加限流电阻。 图3 LED数码管结构原理图 LED显示数码管通常由硬件7段译码集成电路,完成从数字到显示码的译码驱动。本系统采用软件译码,以减小体积,降低成本和功耗,软件译码的另一优势还在于比硬件译码有更大的灵活性。所谓软件译码,即由单片机软件完成从数字到显示码的转换。从LED数码管结构原理可知,为了显示字符,要为LED显示数码管提供显示段码,组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED数码管的显示段码为1个字节。 11 1 单片机课程设计 各段码位与显示段的对应关系如表1。 表1 各段码位的对应关系 段码位 D7 D6 D5 D4 D3 D2 D1 D0 显示段 dp g f e d c b a 需说明的是当用数据口连接LED数码管a,dp引脚时,不同的连接方法,各段码位与显示段有不同的对应关系。通常数据口的D0位与a段连接,D1位与b段连接,„„D7位与dp段连接,如表1所示,表2为用于LED数码管显示的十六进制数和空白字符与P的显示段码。 表2 LED显示段码 字型 共阳极共阴极字型 共阳极共阴 段码 段码 段码 极段0 C0H 3FH 9 90H 6FH 码 1 F9H 06H A 88H 77H 2 A4H 5BH B 83H 7CH 3 BOH 4FH C C6H 39H 4 99H 66H D A1H 5EH 5 92H 6DH E 86H 79H 6 82H 7DH F 84H 71H 7 F8H 07H 空白 FFH 00H 8 80H 7FH P 8CH 73H 注:(1)本表所列各字符的显示段码均为小数点不亮的情况。 (2)“空白”字符即没有任何显示。 (7)、发光二极管 发光二极管也与普通二极管一样由PN结构成,也具有单向导电性。本实验选用下图钟红色的发光二极管,在电子钟电路中起闪烁计时作用,每半秒闪烁一次。 12 1 单片机课程设计 6、8位移位寄存器芯片74HC164 74HC164与89C51连接在一起实现了移位的串入并出。本实验中是利用89C51芯片的RXD(P30)和TXD(P31)两个引脚,通过串行口的缓冲寄存器SBUF将数据送入移位寄存器,然后串行输入数码管译码显示。 第四章 结构设计部分 4.1 显示部分设计 基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 同时时钟达到最大值的时候天数也增加一位,根据不同的月份显示的天数阳历有28,29,30,31天,到了12个月后,年数自动增加1,以此类推。 13 1 单片机课程设计 显示部分电路图 4.1.1万年历优化算法 每十月的总的天数相对来说是固定的。只有2月份,在闰年是29天,在非闰年是28天。每400年整一闰,或每4年且不为百年的一润。 表1 月份 1 2 3 4 5 6 7 8 9 10 11 12 闰年 31 29 31 30 31 30 31 31 30 31 30 31 非闰年 31 28 31 30 31 30 31 31 30 31 30 31 4.1.2 秒表显示 多功能秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和技术的原理,结合显示电路、电源电路、LED数码管以及键盘电路来设计定时电路。将软硬件有机的结合起来,使得系统能够实现四位的LED显示,显示时间为00-99秒。 4.2 电路控制部分设计 14 1 单片机课程设计 从左到右依次是A、B、C三个按 键,当用作电子表时间显示功能 时,键C是模式选择键,分别实 现对时、分、秒的选择功能,键 B是加1键,键A是减1键;当 用作万年历显示功能时,用C键 选择,键B是加1键,键A是减 1键;当用作秒表功能时,键B 是启动/暂停功能键,键A是复 位键。 4.3整体设计 硬件设计模块实现: 单片机晶振电路8位LED显示 AT89C51 单片机复位电路 单片机 移位寄存器 电源电路 按键电路 实现过程:单片机处理后通过串行口输出到74LS164,而74LS164将串行信号变成并行信号,每个164对应LED七段码,6个164对应6行LED数码管。 其整个过程,如原理图所示。 15 1 单片机课程设计 生成PCB版图,如下图所示: 16 1 单片机课程设计 4.4系统软件设计 4.4.1 Proteus软件仿真 单片机加载程序启动仿真后,按下开始键开始仿真,下 图是电子表功能的仿真结果图, 按下MOD键,1次可调时, 2次可调分,3次可调秒。 17 1 单片机课程设计 当按下模式C键达到四次时,这时可以按下A键进入 万年历显示的功能,此时显示10年12月25日,按下C 键可以实现模式选择分别调节年、月、日。 当按下B键进入秒表显示模式,而且可以暂停显示, 此时按下C键可以退出秒表显示模式。 由以上仿真可知,此设计程序及电路逻辑功能正确,基本完成 了实验所要求的任务,达到了预期的目的。 18 1 单片机课程设计 结束语 通过这个月的学习和调试过程,终于完成了单片机模块数字钟的工作。并且使电子钟够顺利运行,完成了预期的目标。从单片机模块数字钟的设计过程中也找到了一些单片机开发的规律:先了解所有元件的具体内容,从而画出其电路图,使数字钟从简易变成多功能的方式,虽没有做多功能数字钟,却知晓了其方法。从而让我踏入了单片机应用领域的第一步。然而在调试过程中有也有许多的不足之处:例如编写调试程序有点不足。希望能够在以后的不断深入学习中能够弥补自己的不足之处。同时更是朝着单片机应用领域迈进。 这次课程设计整体来说是成功的,但我也发现了自己许多错漏和不足之处。譬如,最简单的程序没写好就想着写更复杂的程序,做事还是缺乏耐性和细心,当有时遇到问题时,总觉得无从下手,对于课本上的知识不能很好的组织起来。在编写各功能程序时,特别是后来增添的比较复杂的程序,更是找不着思路,在以后的学习中,确实应加强这一模块的练习。 总的来说,这次课程设计的探索与完成,给我最深的体会就是 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 本上的知识和实际的应用真的存在着较大的差别,甚至脱节。平时自己感觉什么都掌握的差不多了,也似乎是明白了,但真到具体应用时,确如纸上谈兵,无从下手。所以,我们不仅要熟练掌握课本知识,更要学以致用,能让自己真正成为一个有实际操作能力的单片机应用型人才。 19 1 单片机课程设计 附录 一:参考文献 【1】《单片机微型计算机与理与应用》 西安电子科技大学出版社 张毅坤 陈善久 裘雪红 编著 【2】 51系列单片机设计实例.北京航空航天大学出版社。 【3】《单片机应用技术》.西安电子科技大学出版社。 【4】 《单片机原理及接口技术实验》.北方交通大学出版社。 二:系统程序清单 #include unsigned char DispBuf[6]; //时间显示缓冲区 unsigned char Disdate[6]; //日期显示缓冲区 unsigned char DisSec[6]; //秒表缓冲区 struct //设定时间结构体 { unsigned char Hour; unsigned char Min; unsigned char Sec; }Time; struct //设定日期结构体 { unsigned char Year; unsigned char Month; unsigned char Days; }Date; struct //设定毫秒结构体 { unsigned char Minite; unsigned char Second; unsigned char MilliSec; }Millisecond; unsigned char point=0; unsigned char point1=0; 20 1 单片机课程设计 unsigned char point2=0; unsigned char Daymount; unsigned char Daymount1; unsigned char T0_Int_Times=0; //中断次数计数变量 unsigned char Flash_flag=0; //闪烁标志,每半秒闪烁 unsigned char Flash_flag1=0; //闪烁标志,每半秒闪烁 unsigned char DisPlay_Back=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致 unsigned char DisPlay_Back1=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致 unsigned char i,j; unsigned char SetMillisecond; //启动秒表 code unsigned char LEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,0xc 1,0x00,0x80}; //数码管显示代码 code unsigned char ErrorLEDCode[]={0x01,0xe7,0x12,0x82,0xc4,0x88,0x08, 0xc1,0x00,0x80};//绘制错误图纸的数码管显示代码 void DisPlayBuf(); void ChangeToDispCode(); void ChangeToDispCode1(); void changedate(); // 调日期 void displaydate(); // 显示日期 void makedays(); //确定每个月的日期 void runSec(); void delay(unsigned int i); //函数声名 sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; //*************************************************** // Init 初始化代码 // 设定50ms中断一次,注:在Fosc=6M情况下 //**************************************************** void Init(void) { Date.Year=10; Date.Month=12; Date.Days=25; Time.Hour=12; 21 1 单片机课程设计 Time.Min=0; Time.Sec=0; TMOD=0x01; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TR0=1; ET0=1; EA=1; }/******************************延时子程序********************** ***********************/ void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); } //******************************************* // 主程序 //******************************************* main() { Init(); //初始化 for(;;) { if(DisPlay_Back!=Flash_flag) //是否显示, { DisPlay_Back=Flash_flag; //显示过后要半秒后再显示 ChangeToDispCode(); //转化时间为可显示代码 if(Flash_flag) //更新双点闪烁 { DispBuf[2]=DispBuf[2]|0x10; //双点熄灭 DispBuf[4]=DispBuf[4]|0x20; } else { DispBuf[2]=DispBuf[2]&0xef; //点亮双点 22 1 单片机课程设计 DispBuf[4]=DispBuf[4]&0xdf; }; if(Flash_flag & point==1) //更新小时 { DispBuf[0]=DispBuf[0]|0xff; //小时熄灭 DispBuf[1]=DispBuf[1]|0xff; } else { DispBuf[0]=DispBuf[0]&0xff; //小时点亮 DispBuf[1]=DispBuf[1]&0xff; }; if(Flash_flag & point==2) //更新分钟 { DispBuf[2]=DispBuf[2]|0xff; //分钟熄灭 DispBuf[3]=DispBuf[3]|0xff; } else { DispBuf[2]=DispBuf[2]&0xff; //分钟点亮 DispBuf[3]=DispBuf[3]&0xff; }; if(Flash_flag & point==3) //更新秒钟 { DispBuf[4]=DispBuf[4]|0xff; //秒钟熄灭 DispBuf[5]=DispBuf[5]|0xff; } else { DispBuf[4]=DispBuf[4]&0xff; //秒钟点亮 DispBuf[5]=DispBuf[5]&0xff; }; DisPlayBuf();//显示 } if((P1&0x07)!=0x7) //按键处理模块模块 { 23 1 单片机课程设计 delay(250); if((P1&0x07)!=0x7) { if(P1_2==0) { point=(point+1)%5; } else if (P1_1==0) { switch(point) { case 0: Millisecond.Minite=0; Millisecond.Second=0; Millisecond.MilliSec=0; SetMillisecond++; runSec(); break; case 1: Time.Hour=( Time.Hour+1)%24; break; case 2: Time.Min=( Time.Min+1)%60; break; case 3: Time.Sec=( Time.Sec+1)%60; break; }; } else if (P1_0==0) { switch(point) { case 0: ChangeToDispCode1(); 24 1 单片机课程设计 Disdate[2]=Disdate[2]&0xef; //点亮双点 Disdate[4]=Disdate[4]&0xdf; displaydate(); delay(2000); break; case 1: Time.Hour=( Time.Hour+24-1)%24; break; case 2: Time.Min=( Time.Min+60-1)%60; break; case 3: Time.Sec=( Time.Sec+60-1)%60; break; case 4: changedate(); break; }; }; }; }; makedays(); } } //***************************************************** // 把时间显示缓冲区的内容发到74HC164 //***************************************************** void DisPlayBuf(void) { unsigned char i; for(i=0;i<6;i++) 25 1 单片机课程设计 { SBUF=DispBuf[i]; while(TI==0); //等待发送完毕 TI=0; //把发送完标志清掉以备下次再用 }; } //***************************************************** // 把日期显示缓冲区的内容发到74HC164 //***************************************************** void displaydate(void) { unsigned char i; for(i=0;i<6;i++) { SBUF=Disdate[i]; while(TI==0); //等待发送完毕 TI=0; //把发送完标志清掉以备下次再用 }; } //***************************************************** // 把秒表技术显示缓冲区的内容发到74HC164 //***************************************************** void displaySec(void) { unsigned char i; for(i=0;i<6;i++) { SBUF=DisSec[i]; while(TI==0); //等待发送完毕 TI=0; //把发送完标志清掉以备下次再用 }; } //******************************************* // 把时间转换为可以显示的代码 //******************************************* void ChangeToDispCode(void) 26 1 单片机课程设计 { DispBuf[0]=LEDCode[Time.Hour/10]; DispBuf[1]=LEDCode[Time.Hour%10]; DispBuf[2]=LEDCode[Time.Min/10]; DispBuf[3]=LEDCode[Time.Min%10]; DispBuf[4]=ErrorLEDCode[Time.Sec/10]; DispBuf[5]=LEDCode[Time.Sec%10]; } //******************************************* // 把日期转化为现实的数 //******************************************* void ChangeToDispCode1(void) { Disdate[0]=LEDCode[Date.Year/10]; Disdate[1]=LEDCode[Date.Year%10]; Disdate[2]=LEDCode[Date.Month/10]; Disdate[3]=LEDCode[Date.Month%10]; Disdate[4]=ErrorLEDCode[ Date.Days/10]; Disdate[5]=LEDCode[Date.Days%10]; } //******************************************* // 秒表功能 //******************************************* void ChangeToDispCode2(void) { DisSec[0]=LEDCode[Millisecond.Minite/10]; DisSec[1]=LEDCode[Millisecond.Minite%10]; DisSec[2]=LEDCode[Millisecond.Second/10]; DisSec[3]=LEDCode[Millisecond.Second%10]; 27 1 单片机课程设计 DisSec[4]=ErrorLEDCode[ Millisecond.MilliSec/10]; DisSec[5]=LEDCode[Millisecond.MilliSec%10]; } //****************************************************** // 定时器中断 //****************************************************** void T0_Int(void) interrupt 1 using 1 { TH0=(65536-5000)/256; //定时器装填 TL0=(65536-5000)%256; if(SetMillisecond!=0) { Millisecond.MilliSec++; if(Millisecond.MilliSec>=100) { Millisecond.MilliSec=0; Millisecond.Second++; if(Millisecond.Second>=60) { Millisecond.Second=0; Millisecond.Minite++; if(Millisecond.Minite>=60) Millisecond.Minite=0; } } } T0_Int_Times++; //中断次数加 if(T0_Int_Times>=50) //每半秒更新闪烁标志 { Flash_flag =1; Flash_flag1 =1; } else { Flash_flag =0; Flash_flag1 =0; 28 1 单片机课程设计 }; if(T0_Int_Times>=100) //如果中断10次为1秒的时间开始更新时、 分、秒 { T0_Int_Times=0; Time.Sec++; if(Time.Sec>=60) { Time.Sec=0; Time.Min++; if(Time.Min>=60) { Time.Min=0; Time.Hour=(Time.Hour+1)%24; if(Time.Hour>=24) { Time.Hour=0; Date.Days++; if( Date.Days >Daymount) { Date.Days=1; Date.Month++; if(Date.Month>12) Date.Month=1; Date.Year++; }; }; }; }; } } //************************************************************** **/ /******************************调节日期***************************/ /*************************************************************** **/ 29 1 单片机课程设计 void changedate(void) { while(1) { if(DisPlay_Back1!=Flash_flag1) //是否显示, { DisPlay_Back1=Flash_flag1; //显示过后要半秒后再显示 ChangeToDispCode1(); //转化时间为可显示代码 if(Flash_flag1) //更新双点闪烁 { Disdate[2]=Disdate[2]|0x10; //双点熄灭 Disdate[4]=Disdate[4]|0x20; } else { Disdate[2]=Disdate[2]&0xef; //点亮双点 Disdate[4]=Disdate[4]&0xdf; }; if(Flash_flag1& point1==1) //更新年 { Disdate[0]=Disdate[0]|0xff; //年熄灭 Disdate[1]=Disdate[1]|0xff; } else { Disdate[0]=Disdate[0]&0xff; //年点亮 Disdate[1]=Disdate[1]&0xff; }; if(Flash_flag1 & point1==2) //更新月 { Disdate[2]=Disdate[2]|0xff; //月熄灭 Disdate[3]=Disdate[3]|0xff; } else { Disdate[2]=Disdate[2]&0xff; //月点亮 30 1 单片机课程设计 Disdate[3]=Disdate[3]&0xff; }; if(Flash_flag1 & point1==3) //更新天 { Disdate[4]=Disdate[4]|0xff; //天熄灭 Disdate[5]=Disdate[5]|0xff; } else { Disdate[4]=Disdate[4]&0xff; //天点亮 Disdate[5]=Disdate[5]&0xff; }; displaydate(); } if((P1&0x07)!=0x7) //******** **按键处理模块******* { delay(250); if((P1&0x07)!=0x7) { if(P1_2==0) { point1=(point1+1)%5; } else if (P1_1==0) { switch(point1) { case 1: Date.Year++; break; case 2: Date.Month++; if( Date.Month==13) { Date.Month=1; } 31 1 单片机课程设计 break; case 3: makedays(); Date.Days++; if(Date.Days>Daymount) { Date.Days=1; } break; }; } else if (P1_0==0) { switch(point1) { case 1: Date.Year--; break; case 2: Date.Month--; if( Date.Month<=0) { Date.Month=12; } break; case 3: makedays(); Date.Days--; if(Date.Days<=0) { Date.Days=Da ymount; }; break; }; }; } 32 1 单片机课程设计 if(point1==4) { point1=0; break; } } } } //*****************************************************/ /***************调日期加时时确定天数*******************/ /******************************************************/ void makedays() { switch (Date.Month) { case 4: case 6: case 9: case 11: Daymount=30; break; case 2: if(Date.Year%4==0) Daymount=29; else Daymount=28; break; default: Daymount=31; break; } } 33 1 单片机课程设计 void runSec() { while(1) { if(DisPlay_Back!=Flash_flag) //是否显示, { DisPlay_Back=Flash_flag; //显示过后要半秒后再显示 ChangeToDispCode2(); //转化时间为可显示代码 if(Flash_flag) //更新双点闪烁 { DisSec[2]=DisSec[2]|0x10; //双点熄灭 DisSec[4]=DisSec[4]|0x20; } else { DisSec[2]=DisSec[2]&0xef; //点亮双点 DisSec[4]=DisSec[4]&0xdf; }; displaySec(); } if((P1&0x07)!=0x7) //按键处理模块模块 { delay(250); if((P1&0x07)!=0x7) { if(P1_2==0) { break; } else if (P1_1==0) { point2=( point2+1)%3; switch( point2-1) { 34 1 单片机课程设计 case 0: SetMillisecond=0; break; case 1: point2=point2-2; SetMillisecond=1; break; } } else if(P1_0==0) { SetMillisecond=0; Millisecond.Minite=0; Millisecond.Second=0; Millisecond.MilliSec=0; SetMillisecond=1; } } } } } 35 1
本文档为【单片机课程设计-电子万年历设计(含源程序)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_511210
暂无简介~
格式:doc
大小:403KB
软件:Word
页数:45
分类:工学
上传时间:2017-09-25
浏览量:915