基于单片机的数字电子钟万年历课程设计

合集下载

基于单片机的万年历课程设计

基于单片机的万年历课程设计

一、前言随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。

由其是单片机技术的应用产品已经走进了千家万户。

电子万年历的出现给人们的生活带来的诸多方便。

本设计是基于51系列的单片机进行的电子万年历设计,采用八位数码管显示年月日时分秒及温度信息,具有可调整日期和时间功能。

时间、日期调整由三个按键来实现,并可对闹铃开关进行设置。

日历能显示阳历和阴历年、月、日以及星期、时、分、秒。

设计以STC89C52RC 单片机为核心,构成单片机控制电路;以DS1302时钟芯片作为万年历信号发生器;以DS18B20作为检测温度的传感器。

关键词时钟电钟;DS1302;DS18B20;数码管;单片机。

二、系统概述及总体方案2.1系统概述本电子万年历采用单片机控制技术和数码管显示方案,可以很好的完成万年历和实时温度显示。

它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。

2.2总体方案2.2.1单片机芯片:采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超低压工作;同时也与MCS-51系列单片机完全相同,该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。

所以选择采用AT89S52作为主控制系统.2.2.2 时钟芯片:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.且同组同学已从Maxim申请到了这种芯片,所以本设计采用了这种芯片。

基于单片机的电子万年历设计

基于单片机的电子万年历设计

毕业设计说明书《电子万年历》1 目录绪论------------------------------------------------------------------------------------------------------------- 一.设计要求与方案论证------------------------------------------------------------------------------------- 1.1设计要求---------------------------------------------------------------------------------------------------- 1.2 系统基本方案选择和论证------------------------------------------------------------------------------ 1.2.1 单片机芯片-------------------------------------------------------------------------------------------- 1.2.2 显示模块----------------------------------------------------------------------------------------------- 1.2.3 时钟芯片----------------------------------------------------------------------------------------------- 1.2.4 温度传感器-------------------------------------------------------------------------------------------- 1.3 电路设计最终方案决定--------------------------------------------------------------------------------- 二.电子万年历硬件设计------------------------------------------------------------------------------------- 2.1 电子万年历系统设计------------------------------------------------------------------------------------ 2.1.1系统设计框图------------------------------------------------------------------------------------------ 2.1.2 系统硬件概述----------------------------------------------------------------------------------------- 2.2系统硬件各模块作用------------------------------------------------------------------------------------ 2.2.1单片机主控制模块------------------------------------------------------------------------------------ 2.2.2时钟电路模块------------------------------------------------------------------------------------------ 2.2.3温度采集模块------------------------------------------------------------------------------------------ 2.2.4显示模块------------------------------------------------------------------------------------------------ 2.3电子万年历电路设计------------------------------------------------------------------------------------- 2.3.1系统电路图--------------------------------------------------------------------------------------------- 2.3.2 电路图分析--------------------------------------------------------------------------------------------- 三.电子万年历软件设计-------------------------------------------------------------------------------------- 3.1程序流程框图----------------------------------------------------------------------------------------------- 3.1.1总流程图------------------------------------------------------------------------------------------------- 3.1.2 阳历程序流程图--------------------------------------------------------------------------------------- 3.1.3 阴历程序流程图--------------------------------------------------------------------------------------- 3.1.4 时间调整程序流程图--------------------------------------------------------------------------------- 3.2 部分程序的设计------------------------------------------------------------------------------------------- 3.2.1 温度子程序--------------------------------------------------------------------------------------------- 3.2.2 读、写子程序------------------------------------------------------------------------------------------ 四.电子系统检测----------------------------------------------------------------------------------------------- 五.毕业设计总结----------------------------------------------------------------------------------------------- 致谢-------------------------------------------------------------------------------------------------------------- 参考文献----------------------------------------------------------------------------------------------------------- 附录一:系统程序清单----------------------------------------------------------------------------------------- 附录二:系统使用说明书-------------------------------------------------------------------------------------- 绪 论电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

基于单片机的电子时钟万年历设计

基于单片机的电子时钟万年历设计

(2)31 8 位暂存数据存储RAM(3)串行 I/O 口方式使得管脚数量最少(4)宽范围工作电压2.0 5.5V(5)工作电流 2.0V 时,小于300nA(6)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式(7)8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配(8)简单 3 线接口(9)与 TTL 兼容Vcc=5V(10)可选工业级温度范围-40~+85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。

所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。

图2 DS1302管脚图1.2显示模块选择方案一:LED数码管显示数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。

目前单片机数码管普通采用动态显示。

编程简单,但只能显示数字,不能显示中文。

方案二:LCD1602能够显示英文和数字。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

所以最终选择LCD1602。

2.项目功能模块2.1 89C51模块Mcs-51单片机管脚图图如图3所示:单片机管脚图2.2 1602液晶显示模块1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

单片机课程设计(论文)电子万年历的设计

单片机课程设计(论文)电子万年历的设计

目录1设计要求 (2)2方案论证与对比 (2)液晶显示器控制方式选择 (2)2.2并行接口动态显示电路选择 (2)2.3LCD液晶显示器的接口方法选择 (3)液晶显示器限流电阻选择 (4)3系统硬件电路的设计 (5)主控模块AT89C52 (5)3.2显示模块电路设计 (6)4系统软件设计 (7)4.1系统软件概述 (7)4.2主要子程序设计 (8)4.2.1 时钟中断服务子程序设计 (8)时间调整子程序设计 (9)4.2.3 判断闰年子程序设计 (9)4.2.4 精度分析分析与计算 (10)4.2.5 第一次初值的设置 (10)4.2.6 重载初值的方法 (10)5系统仿真与测试 (11)5.1系统仿真 (11)功能测试 (11)6总结 (12)参考文献 (13)1设计要求本课题以AT89C52单片机为核心,设计并制作出智能LCD电子钟,具有以下基本功能:能进行时间、年份、日期、星期显示;能区分是否闰年;能检测室温并显示。

扩展功能部分可以通过控制按键使时间暂停、可以调整校正时间并通过按键切换轮流显示时间、年份、日期、星期。

2方案论证与对比2.1液晶显示器控制方式选择采用LCD液晶显示,具有超精致影像画质、十足平面显示、节省空间、节省能源等优点,但按控制方式不同,LCD可分为被动矩阵式LCD及主动矩阵式LCD两种。

可根据不同需要采用不同的方式。

方案一被动矩阵式LCD被动矩阵式LCD在亮度及可视角方面受到较大的限制,反应速度也较慢。

由于画面质量方面的问题,使得这种显示设备不利于发展为桌面型显示器,但成本低廉。

方案二主动矩阵式LCD目前应用比较广泛的主动矩阵式LCD,也称TFT-LCD(Thin Film Transistor-LCD,薄膜晶体管LCD)。

TFT液晶显示器是在画面中的每个像素内建晶体管,可使亮度更明亮、色彩更丰富及更宽广的可视面积。

与CRT显示器相比,LCD显示器的平面显示技术体现为较少的零件、占据较少的桌面及耗电量较小,但CRT技术较为稳定成熟。

(完整版)基于51单片机的万年历的设计

(完整版)基于51单片机的万年历的设计

单片机课程实训SCM PRACTICAL TRAINING目录第一部分课程设计任务书 (1)一、课程设计题目 (1)二、课程设计时间 (1)三、实训提交方式 (1)四、设计要求 (1)第二部分课程设计报告 (2)一、单片机发展概况 (2)二、MCS-51单片机系统简介 (2)三、设计思想 (3)四、硬件电路设计 (3)1. 总体设计 (3)2. 晶振电路 (4)3. 复位电路 (4)4. DS1302时钟电路 (5)5. 温度采集系统电路 (5)6. 按键调整电路 (6)7. 闹钟提示电路 (6)五、软件设计框图 (7)六、程序源代码 (8)1. 主程序 (8)2. 温度控制程序 (11)3. 日历设置程序 (13)4. 时钟控制程序 (18)5. 显示设置程序 (20)七、结束语 (23)八、课程设计小组分工 (23)九、参考文献 (23)第一部分课程设计任务书一、课程设计题目用中小规模集成芯片设计制作万年历。

二、课程设计时间五天三、实训提交方式提交实训设计报告电子版与纸质版四、设计要求(1)显示年、月、日、时、分、秒和星期,并有相应的农历显示。

(2)可通过键盘自动调整时间。

(3)具有闹钟功能。

(4)能够显示环境温度,误差小于±1℃(5)计时精度:月误差小于20秒。

第二部分课程设计报告一、单片机发展概况单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段:第一阶段(1976-1978):初级单片机微处理阶段。

该时期的单片机具有 8 位CPU,并行 I/O 端口、8 位时序同步计数器,寻址范围 4KB,但是没有串行口。

第二阶段(1978-1982):高性能单片机微机处理阶段,该时期的单片机具有I/O 串行端口,有多级中断处理系统,15 位时序同步技术器,RAM、ROM 容量加大,寻址范围可达 64KB。

第三阶段(1982-至今)位单片机微处理改良型及 16 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。

单片机课程设计之万年历、闹钟与温度显示设计

单片机课程设计之万年历、闹钟与温度显示设计
根据方案的选择,数码管时钟温度系统由51单片机、时钟芯片DS1302、测温芯片DS1802、数码管显示电路、键盘电路组成,如图3-1所示。
本系统采用C语言编写,控制器采用单片机STC89C52,温度检测部分采用DS18B20温度传感器,时钟系统用时钟芯片DS1302,用八位数码管作为显示器。单片机通过时钟芯片DS1302获取时间数据;通过温度传感器DS18B20采集温度信号送给单片机处理,并在数码管中显示出来,键盘可以切换界面,调时和温度查询与设置闹钟的功能。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。电路图如图3-4所示。
6、数码管显示电路设计
数码管内部是由7个条形发光二极管与一个小圆点发光二极管组成,根据这八个二极管的亮暗组成不同的字符。本系统采用八位数码管作为显示模块,数码管相对其他LCD类的显示器来说,成本比较低廉,省电。两个四位共阴0.56英寸的数码管作为显示屏。如图3-6所示。
7、按键控制电路设计
本系统采用四个按键作为键盘控制实现界面切换的功能,如图3-7所示。能够实现界面切换、时间校正、闹钟设置等功能。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图3-8所示。抖动时间的长短与开关的机械特性有关,一般为5-10 ms。故软件编程时需要注意消除抖动。

基于单片机万年历设计

基于单片机万年历设计

基于单片机万年历设计基于单片机的万年历设计二、实验要求设计一个万年历,将时钟显示在LCD1602的显示屏上并且可以进行年、月、日以及时、分、秒的设置。

此外还可以通过按键进行闹钟设置以及事件提醒功能,用蜂鸣器进行闹铃提醒。

最后附加一个温湿度检测的功能,用温湿度传感器检测室内的温湿度并将温湿度数据在显示屏上显示出来。

三、实验设备和仪器1.用STC89C52芯片作为系统板的主控芯片2.DHT11温湿度传感器3.DS1302时钟芯片4.LCD1602显示屏四、实验各模块原理介绍4.1STC89C52单片机STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flah存储器。

STC89C52使用经典的MCS-51内核,具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flah,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

2.工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机) 3.工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz4.用户应用程序空间为8K字节5.片上集成512字节RAM6.通用I/O口(32个),复位后为:P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

8.具有EEPROM功能9.共3个16位定时器/计数器。

即定时器T0、T1、T2。

10.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒。

11.通用异步串行口(UART),还可用定时器软件实现多个UART。

12.工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)13.PDIP封装1、STC89C52单片机引脚图图4.1STC89C52单片机引脚图①主电源引脚(2根) VCC(Pin40):电源输入,接+5V电源GND(Pin20):接地线②外接晶振引脚(2根) 某TAL1(Pin19):片内振荡电路的输入端某TAL2(Pin20):片内振荡电路的输出端③控制引脚(4根) RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。

单片机万年历课程设计

单片机万年历课程设计

单片机万年历课程设计一、课程目标知识目标:1. 让学生理解单片机的基本原理和万年历的功能需求。

2. 使学生掌握单片机编程的基本语法和逻辑结构。

3. 帮助学生掌握如何在单片机上实现日期、时间的计算与显示。

技能目标:1. 培养学生运用单片机进行项目设计的能力,特别是万年历的实际应用。

2. 培养学生独立编程和调试程序的能力,解决实际项目中遇到的问题。

3. 提高学生团队协作能力和项目管理的意识。

情感态度价值观目标:1. 培养学生对单片机及电子制作的兴趣,激发学生的创新意识和探索精神。

2. 增强学生面对困难的勇气和毅力,培养他们积极解决问题的态度。

3. 通过团队合作,培养学生的集体荣誉感和责任感。

课程性质:本课程为实践性强的设计与制作课程,以单片机技术为核心,结合编程和电子技术,实现万年历的制作。

学生特点:学生为高年级学生,已具备一定的单片机基础知识,有编程基础,具备独立思考和解决问题的能力。

教学要求:注重理论与实践相结合,强调动手操作和实际应用。

教学过程中要关注学生的个体差异,提供适当的指导与帮助,确保每个学生都能在原有基础上得到提升。

通过课程学习,使学生能够将所学知识应用于实际项目中,达到学以致用的目的。

二、教学内容1. 单片机基础回顾:复习单片机的硬件结构、工作原理及I/O口编程。

- 教材章节:第三章单片机硬件结构与工作原理;第四章I/O口编程。

2. 定时器与中断:学习单片机定时器的工作原理,掌握中断编程方法。

- 教材章节:第五章定时器与中断;第六章中断编程。

3. 日期时间计算:讲解日期时间的计算方法,如何在单片机中进行实现。

- 教材章节:第七章日期时间计算;第八章单片机实现日期时间计算。

4. 显示技术:学习LED显示技术,掌握动态扫描显示方法。

- 教材章节:第九章LED显示技术;第十章动态扫描显示。

5. 万年历设计与实现:结合所学知识,设计并实现单片机万年历。

- 教材章节:第十一章项目设计与实现;第十二章万年历设计与制作。

基于单片机的电子万年历设计报告

基于单片机的电子万年历设计报告

基于单片机的万年历设计报告一、研究意义随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活当中。

日历是人们不可或缺的日常用品。

但一般日历都为纸制用品,使用不便,寿命不长。

电子万年历采用智能电子控制和显示技术,改善了纸制日历的缺陷。

本设计以AT89S52单片机为核心,构成单片机控制电路,AT89C52是一种带8K字节闪速可编程可擦除只读存储器(PEROM)的低电压、高性能CMOS 8位为控制器。

该器件采用ATMEL 非易失存储器制造技术制造,与工业标准的80C51和80C52指令集和输出管脚相兼容。

结合DS1302时钟芯片和24C02 FLASH存储器,完成时间的自动调整和掉电保护,全部信息用液晶显示。

时间、日期调整由三个按键来实现,并可对闹铃开关进行设置。

日历能显示阳历和阴历年、月、日以及星期、时、分、秒。

在显示阴历月份时,能标明是否闰月。

二、总体方案设计本设计以AT89S52单片机为核心,构成单片机控制电路,结合DS1302时钟芯片和24C02 FLASH存储器,显示阳历的年、月、日、星期、时、分、秒和阴历的年、月、日,在显示阴历时间时,能标明是否闰月,同时完成对它们的自动调整和掉电保护,全部信息用液晶显示出来。

输入接口由三个按键来实现,用这三个按键可以对日期和时间进行调整,并可以对闹铃的开关和闹铃的时间进行设置。

闹铃功能通过蜂鸣器来实现。

软件控制程序实现所有的功能。

整机电路使用+5V稳压电源,可稳定工作。

系统框图如图2-1所示,其软硬件设计简单,时间记录准确,可广泛应用于长时间连续显示的系统中。

三、系统硬件设计按照系统设计功能的要求,初步确定设计系统由主控模块、时钟模块、存储模块、键盘接口模块、显示模块和闹铃模块共6个模块组成,电路系统构成框图如图3-1所示。

主控芯片使用52系列AT89S52单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302,存储模块采用美国ATMEL公司生产的低功耗CMOS串行EEPROM存储芯片AT24C02。

单片机万年历课程设计说明书

单片机万年历课程设计说明书

单片机万年历课程设计说明书第一章设计原理功能:电子时钟能够显示时、分、秒显示时间的功能,还可以进行时和分的校对,而且其片选的灵活性强。

并且是以单片机为核心来设计的。

28BYJ48步进电机主要技术参数如表1-1所示。

表1-1 28BYJ48步进电机主要技术参数第二章硬件电路设计总体硬件原理图如图2-1所示。

AT89C51因为其含一个可擦除的ROM,以及其存储数据的时间长度可达10年之久所以选其作为该设计的核心控制部件。

图2-1 系统电路原理图2.1键盘电路设计该设计只用了一个键盘,但实现的功能却是比较完善,减少了硬件资源的损耗,该键盘可以实现小时和分钟的调节以及控制是否进入省电模式。

当按键按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。

达到时间调节的目的。

选择的多功能按键如图2-2所示。

图2-2 多功能控制键2.2主控模块89C5189C51是一个8位单片机,片ROM全部采用FLASH ROM技术,晶振时钟为12MHz。

89C51是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。

第31引脚需要接高电位使单片机选用部程序存储器;第40脚为电源端VCC,接+5V电源,第20引脚为接地端VSS,通常在VCC和VSS引脚之间接0.1μF高频滤波电容。

第三章软件设计在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。

在主程序中,对不同的按键进行扫描,实现秒表,时间调整。

系统总体流程图如图4-1所示。

图3-1 总体流程图第四章系统测试本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整程序、延时程序四大模块。

在程序设计过程中,加强了部分软件抗干扰措施,下面对部分模块作介绍。

系统开始仿真的仿真图如图4-1系统仿真图所示。

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。

万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。

本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。

二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。

2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。

3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。

4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。

(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。

然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。

2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。

3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。

三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。

(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。

数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。

(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。

单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。

基于单片机电子万年历课程设计

基于单片机电子万年历课程设计

目录摘要一、单片机原理及应用简介 (2)二、系统硬件设计 (2)三、系统总体方案 (5)3.1.1微处理器 (5)3.1.2显示电路 (6)四、硬件电路的总体框图设计 (8)五、硬件电路原理图设计 (8)六、主程序流程图设计 (10)七、仿真过程 (11)八、仿真结果 (11)附一源程序代码 (13)附二参考文献 (36)摘要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。

单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

而51系列单片机是各单片机中最为典型和最有代表性的一种。

这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器AT89C52、显示电路、按键电路、和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

关键词: 单片机, 万年历一、单片机原理及应用简介随着国内超大规模集成电路的出现,微处理器及其外围芯片有了迅速的发展。

集成技术的最新发展之一是将CPU和外围芯片,如程序存储器、数据存储器、并行、串行I/O口、定时/计数器、中断控制器及其他控制部件集成在一个芯片之中,制成单片计算机(Single-Chip Microcomputer)。

而近年来推出的一些高档单片机还包括有许多特殊功能单元,如A/D、D/A转换器、调制解调器、通信控制器、锁相环、DMA、浮点运算单元等。

因此,只要外加一些扩展电路及必要的通道接口就可以构成各种计算机应用系统,如工业控制系统、数据采集系统、自动测试系统、万年历电子表等。

基于51单片机的电子万年历系统的设计

基于51单片机的电子万年历系统的设计

参考内容
一、引言
单片机是现代电子设备中的重要组成部分,广泛应用于各种嵌入式系统设计。 51单片机作为一种经典的微控制器,因其结构简单、易于编程、可靠性高等优点, 被广泛用于各种领域,如智能家居、工业控制、物联网等。万年历作为一种日常 生活中常见的计时工具,具有显示日期、时间、星期、月份等功能,对于人们的 日常生活和工作有着重要的作用。本次演示将介绍一种基于51单片机的万年历设 计。
二、系统设计
1、硬件设计
基于51单片机的万年历设计需要硬件和软件的配合实现。硬件部分主要包括 51单片机、显示模块、按键输入模块和时钟芯片等。其中,51单片机作为主控制 器,负责处理各种数据和控制信号;显示模块用于显示日期、时间等信息;按键 输入模块用于用户输入操作;时钟芯片则为系统提供实时时间。
基于51单片机的电子万年历系 统的设计
目录
01 一、概述
03 三、软件设计
02 二、硬件设计 04 四、系统调试与优化
目录
05 五、应用场景及前景
07 参考内容
06 六、结论
随着科技的不断发展,单片机已经成为现代于51单片机的电子万年历系统设计具有广泛的实际应用价值。 本次演示将详细介绍这种系统的设计过程和实现方法。
感谢观看
首先需要进行硬件搭建,包括选择合适的单片机、显示模块、按键输入模块 和时钟芯片等,并将其连接起来。需要注意的是,在搭建硬件时需要考虑各个模 块之间的接口和连接方式,以确保系统能够正常工作。
2、软件编程
在硬件搭建完成后,需要进行软件编程。首先需要进行系统初始化,包括对 单片机进行初始化和对显示进行清屏处理。然后需要进行按键处理和时钟数据处 理,以实现用户输入和实时时间的读取。最后需要进行显示处理,将处理后的数 据显示到显示模块上。

单片机课程设计-万年历

单片机课程设计-万年历

单片机课程设计题目名称:姓名:学号:系别:班级:指导老师:完成时间:华南理工大学广州学院课程设计任务书一、实现功能利用51单片机芯片和DS1302芯片设计电子万年历功能图如下通过四个按键输入调整,在LCD液晶模块上能显示阳历年、月、日、星期、时、分、秒和阴历月、日,在显示农历时间时,能标明是否为闰年。

当切断主5V电源时,由3.3V 备用电池供电,1302内时钟仍然工作。

当重新接上5V电源后,则可以实时显示当前时间。

二、开发环境操作系统:windows XP开发芯片:89C52RC+编译器:keil51三、硬件实现1、整体仿真图如下2、12864LCD12864采用8位并行数据传送方式,占用单片机的P0口。

由于P0口用作普通I/O口时为开漏输出,所以为了输出高电平,增大负载能力,需在每个P0位接一个上拉电阻,本设计中采用10K的排阻接线。

图中的RV1为LCD背光调节电位器,可调节屏幕的亮度。

3、DS13021脚接+5V电源;8脚接3.3V备份电源;2、3脚接晶振;4脚接地;5脚接P2.6;6脚接P2.4;7脚接P2.5;+5V工作时,DS1302的7脚时钟信号由单片机的P2.5口提供,当以3.3V工作时时钟由其2、3脚外接的晶振提供时钟,晶振的震荡频率为32.768KHz。

4、按键选择按键一端接P2.0,另一端接地;加按键一端接P2.1,另一端接地;减按键一端接P3.1,另一端接地;确定按键一端接P3.2,另一端接地;四、软件实现程序流程图如下1、农历为复杂的历法,因此适宜采用查表法进行编程;2、编程中接按键的四个管脚皆为查询方式,单片机上电默认为高电平,当按键按下去的时候变为低电平,输入有效,并执行相应的事件处理程序;3、12864采用8位并行数据传送方式,占用单片机的P0口;4、DS1302位一线串行方式,所以在编程中对时序的要求非常严格,应认真注意时序的先后;主要程序源代码uchar Read1302(uchar ADDRorCOMM){uchar dat;DS1302_RST=0; //禁止数据传输DS1302_SCLK=0; //确保写写之前SCLK被拉低DS1302_RST=1; //启动数据传输DS1302InputByte(ADDRorCOMM); //写入命令或地址dat=DS1302OutputByte(); // 读出数据DS1302_SCLK=1; //将时钟电平置于高电平状态置高是为了让下次写的时候能准确的被拉低保证电平状态的正确性//DS1302_RST=0; //禁止数据传输return(dat);}void Init_1302(void) //(2008年7月12日12时00分00秒星期六){uchar flag;flag=Read1302(0x81); //读秒寄存器if(flag&0x80) //CH为0(flag最高位是0),时钟走动,不用初始化。

基于51单片机电子闹钟或万年历的设计课程设计(精)

基于51单片机电子闹钟或万年历的设计课程设计(精)

目录目录 (1)1.项目背景 (3)1.1 项目研究的目的和意义 (3)1.2课题研究的内容 (3)2.方案的选择和和论证 (4)2.1 单片机型号的选择 (4)2.2 按键的选择 (4)2.3 显示器的选择 (4)2.4 计时部分的选择 (5)2.5 发音部分的设计 (5)2.6电路设计最终方案 (5)3. AT89C52单片机简介 (6)3.1单片机基本特性 (6)3.2单片机内部结构图 (6)3.3 单片机I/O引脚结构 (6)3.3.1 P0口 (6)3.3.2 P1口 (7)3.3.3 P2口 (7)3.3.4 P3口 (7)3.4单片机最小系统板 (8)4. 数字电子钟的设计原理和方法 (9)4.1 设计原理 (9)4.2 硬件电路的设计 (9)4.2.1 DS1302时钟芯片 (9)4.2.2 1602 液晶简介 (11)4.2.3 蜂鸣器驱动电路 (12)4.2.4 独立键盘电路 (13)5.软件部分的设计 (14)5.1程序流程图 (14)5.1.1 系统总流程图 (14)5.1.2 DS1302时钟程序流程图 (15)5.1.3 LCD显示程序流程图 (16)5.2程序的设计 (17)5.2.1 DS1302读写程序 (17)5.2.2液晶显示程序 (17)7.心得体会 (20)参考文献 (21)附录一系统原理图 (22)附录二系统程序 (23)1.项目背景1.1 项目研究的目的和意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。

忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。

但是,一旦重要事情,一时的耽误可能酿成大祸。

例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成的。

基于51单片机汇编语言的数字钟课程设计报告(含有闹钟万年历)

基于51单片机汇编语言的数字钟课程设计报告(含有闹钟万年历)

单片微型计算机课程设计报告多功能电子数字钟姓名学号班级指导教师许伟敏4电气二班林卫2009-06-25目录一:概述 (1)二:设计基本原理简介 (2)三:设计要求及说明 (3)四:整体设计方案 (4)系统硬件电路设计 4系统软件总流程设计模块划分及分析5 6五:单模块流程设计 (8)各模块设计概述、流程图模块源程序集合及注释8 13六:单模块软件测试 (23)七:系统检测调试 (24)硬件电路调试软件部分烧写调试八:系统优化及拓展 (26)九:心得体会 (28)单片微型计算机课程设计一、概述基于汇编语言的电子数字钟概述课程设计题目:电子数字钟应用知识简介:● 51 单片机单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。

作为嵌入式系统控制核心的单片机具有其体积小、功能全、性价比高等诸多优点。

51 系列单片机是国内目前应用最广泛的单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用,51 系列单片机的发展又进入了一个新的阶段。

在今后很长一段时间内51 系列单片机仍将占据嵌入式系统产品的中低端市场。

●汇编语言汇编语言是一种面向机器的计算机低级编程语言,通常是为特定的计算机或系列计算机专门设计的。

汇编语言保持了机器语言的优点,具有直接和简捷的特点,其代码具有效率高实时性强等优点。

但是对于复杂的运算或大型程序,用汇编语言编写将非常耗时。

汇编语言可以与高级语言配合使用,应用十分广泛。

● ISPISP(In-System Programming)在系统可编程,是当今流行的单片机编程模式,指电路板上的空白元器件可以编程写入最终用户代码,而不需要从电路板上取下元器件。

已经编程的器件也可以用ISP方式擦除或再编程。

本次课程设计便使用ISP方式,直接将编写好的程序下载到连接好的单片机中进行调试。

选题系统功能分析硬件电路设计整体流程设计及模块划分模块流程设计模块编码测试系统合成调试编译下载调试(含硬件电路调试及软件烧写调试)验收完成总结报告课程设计流程图↑选题目的及设计思想简介:课程设计是一次难得的对所学的知识进行实践的机会,我希望通过课程设计独立设计一个简单的系统从而达到强化课本知识并灵活运用的目的。

基于单片机的电子万年历设计

基于单片机的电子万年历设计

具体实现功能:(1) 显示年月日时分秒及星期信息(2) 具有可调整日期和时间功能(3) 与即时时间同步1.4 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用AT89S52作为主控制系统; DS1302提供时钟;LCD 液晶显示屏作为显示。

2 系统的硬件设计与实现2.1 电路设计框图图1系统原理图图2 主控制系统AT89S52 主控制模 块DS1302时钟模块 LCD 液晶显示屏显示模块 键盘模块图3 DS1302的引脚图图4 LCD液晶显示屏显示模块3 系统的软件设计3.1 程序流程框图图5主程序流程图图6 时间调整程序流程图附录一:系统电路图附录二:系统程序#include <REG51.H>#include <intrins.h>//#include "LCD1602.h"//#include "DS1302.h"#define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P1^7; //实时时钟时钟线引脚sbit DS1302_IO = P1^6; //实时时钟数据线引脚sbit DS1302_RST = P1^5; //实时时钟复位线引脚sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数sbit Set = P2^0; //模式切换键sbit Up = P2^1; //加法按钮sbit Down = P2^2; //减法按钮sbit out = P2^3; //立刻跳出调整模式按钮char done,count,temp,flag,up_flag,down_flag;uchar TempBuffer[5],week_value[2];void show_time(); //液晶显示程序1602液晶显示部分子程序//Port Definitionssbit LcdRs = P2^5;sbit LcdRw = P2^6;sbit LcdEn = P2^7;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数unsigned char LCD_Wait(void){ LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();LcdEn=0;return DBPort;}//向LCD写入命令或数据#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();//注意顺序LcdEn=1;_nop_();//注意顺序LcdEn=0;_nop_();LCD_Wait();}//设置显示模式#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }//设置输入模式#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCDvoid LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动} //液晶字符输入的位置void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}//DS1302时钟部分子程序typedef struct __SYSTEMTIME__{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString[11];unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型SYSTEMTIME CurrentTime;#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8Cvoid DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数){ unsigned char i;ACC = d; for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } }unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数){ unsigned char i; for(i=8; i>0; i--){ ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO; DS1302_CLK = 1;DS1302_CLK = 0; }return(ACC); }void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据{ DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;} unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{ unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组{unsigned char ReadV alue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadV alue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F); }void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22{ Time->DateString[0] = '2';Time->DateString[1] = '0';Time->DateString[2] = Time->Year/10 + '0';Time->DateString[3] = Time->Year%10 + '0';}else{ Time->DateString[0] = ' '; Time->DateString[1] = ' ';Time->DateString[2] = ' '; Time->DateString[3] = ' ';}Time->DateString[4] = '/';if(hide_month<2){Time->DateString[5] = Time->Month/10 + '0';Time->DateString[6] = Time->Month%10 + '0';}else{ Time->DateString[5] = ' '; Time->DateString[6] = ' ';}Time->DateString[7] = '/';if(hide_day<2){Time->DateString[8] = Time->Day/10 + '0';Time->DateString[9] = Time->Day%10 + '0';}else{Time->DateString[8] = ' ';Time->DateString[9] = ' '; }if(hide_week<2){week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示}else { week_value[0] = ' ';}week_value[1] = '\0';Time->DateString[10] = '\0'; //字符串末尾加'\0' ,判断结束字符}void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组TimeString[];{ if(hide_hour<2){ Time->TimeString[0] = Time->Hour/10 + '0';Time->TimeString[1] = Time->Hour%10 + '0';}else{ Time->TimeString[0] = ' ';Time->TimeString[1] = ' ';}Time->TimeString[2] = ':';if(hide_min<2){ Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';}else {Time->TimeString[3] = ' ';Time->TimeString[4] = ' '; }Time->TimeString[5] = ':';if(hide_sec<2){Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';}else{Time->TimeString[6] = ' ';Time->TimeString[7] = ' '; }Time->DateString[8] = '\0';}void Initial_DS1302(void) //时钟芯片初始化{ unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) //判断时钟芯片是否关闭{Write1302(0x8e,0x00); //写入允许Write1302(0x8c,0x07); //以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:55 Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止写入}}void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}/*延时子程序*/void mdelay(uint delay){ uint i;for(;delay>0;delay--)for(i=0;i<62;i++) //1ms延时.}void outkey() //跳出调整模式,返回默认显示{uchar Second;if(out==0){ mdelay(8);count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_y ear=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;while(out==0);}}void Upkey()//升序按键{Up=1;if(Up==0)mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp+1; //秒数加1up_flag=1; //数据调整后更新标志if((temp&0x7f)>0x59) //超过59秒,清零temp=0;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp+1; //分数加1up_flag=1;if(temp>0x59) //超过59分,清零temp=0;break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp+1; //小时数加1up_flag=1;if(temp>0x23) //超过23小时,清零temp=0;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp+1; //星期数加1up_flag=1;if(temp>0x7)temp=1;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp+1; //日数加1up_flag=1;if(temp>0x31)temp=1;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp+1; //月数加1up_flag=1;if(temp>0x12)temp=1;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp+1; //年数加1up_flag=1;if(temp>0x85)temp=0;break;default:break;}while(Up==0); }}void Downkey()//降序按键{Down=1;if(Down==0){mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp-1; //秒数减1down_flag=1; //数据调整后更新标志if(temp==0x7f) //小于0秒,返回59秒temp=0x59;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp-1; //分数减1down_flag=1;if(temp==-1)temp=0x59; //小于0秒,返回59秒break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp-1; //小时数减1down_flag=1;if(temp==-1)temp=0x23;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp-1; //星期数减1down_flag=1;if(temp==0)temp=0x7;;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp-1; //日数减1down_flag=1;if(temp==0)temp=31;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp-1; //月数减1down_flag=1;if(temp==0)temp=12;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp-1; //年数减1down_flag=1;if(temp==-1)temp=0x85;break;default:break;}while(Down==0);}}void Setkey()//模式选择按键{Set=1;if(Set==0){ mdelay(8);count=count+1; //Setkey按一次,count就加1done=1; //进入调整模式while(Set==0);}}void keydone()//按键功能执行{ uchar Second;if(flag==0) //关闭时钟,停止计时{Write1302(0x8e,0x00); //写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);Write1302(0x8e,0x80); //禁止写入flag=1;}Setkey(); //扫描模式切换按键switch(count){case 1:do //count=1,调整秒{outkey(); //扫描跳出按钮Upkey(); //扫描加按钮Downkey(); //扫描减按钮if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据{Write1302(0x8e,0x00); //写入允许Write1302(0x80,temp|0x80); //写入新的秒数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_sec++; //位闪计数if(hide_sec>3)hide_sec=0;show_time(); //液晶显示数据}while(count==2);break;case 2:do //count=2,调整分{hide_sec=0;outkey();Upkey();Downkey();if(temp>0x60)temp=0;if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x82,temp); //写入新的分数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_min++;if(hide_min>3)hide_min=0;show_time();}while(count==3);break;case 3:do //count=3,调整小时{outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x84,temp); //写入新的小时数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_hour++;if(hide_hour>3)hide_hour=0;show_time();}while(count==4);break;case 4:do //count=4,调整星期{hide_hour=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x8a,temp); //写入新的星期数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_week++;if(hide_week>3)hide_week=0;show_time();}while(count==5);break;case 5:do //count=5,调整日{outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x86,temp); //写入新的日数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_day++;if(hide_day>3)hide_day=0;show_time();}while(count==6);break;case 6:do //count=6,调整月{hide_day=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x88,temp); //写入新的月数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_month++;if(hide_month>3)hide_month=0;show_time();}while(count==7);break;case 7:do //count=7,调整年{outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x8c,temp); //写入新的年数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_year++;if(hide_year>3)hide_year=0;show_time();}while(count==8);break;case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;break; //count=7,开启中断,标志位置0并退出default:break;}}void show_time() //液晶显示程序{DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据TimeToStr(&CurrentTime); //时间数据转换液晶字符DateToStr(&CurrentTime); //日期数据转换液晶字符GotoXY(0,1);Print(CurrentTime.TimeString); //显示时间GotoXY(0,0);Print(CurrentTime.DateString); //显示日期GotoXY(15,0);Print(week_value); //显示星期GotoXY(11,0);Print("Week"); //在液晶上显示字母 weekDelay1ms(400); //扫描延时}main(){flag=1; //时钟停止标志LCD_Initial(); //液晶初始化Initial_DS1302(); //时钟芯片初始化up_flag=0;down_flag=0;done=0; //进入默认液晶显示while(1){while(done==1) keydone(); //进入调整模式while(done==0){show_time(); //液晶显示数据 flag=0;Setkey(); //扫描各功能键}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编语言课程设计报告书一.课程设计的题目和内容用汇编语言编写一个万年历程序系统,该系统要有进入系统的封面,要有验证用户名和密码的功能,能正确显示万年历,在推出系统的时候,要有封底。

二.系统设计及功能要求1.系统封面设计内容:题目名称,设计日期,设计者姓名。

要求:具有动感,如题目名称移动;字体具有立体感。

可插入一些图画,如学校的校徽图。

2.输入画面设计内容及要求:①密码及口令:输入,核查及修改功能。

②年份:输入及判断功能。

如:年份值是否为4位整数,不为4位,提示用户重输。

3.日历计算功能设计①求某年某月某日是星期几的子功能。

(要求编成子程序)算法:s=(y-1)+(y-1)/4-(y-1)/100+(y-1)/400+c(其中:y为年份;c为某月某日是这一年的第几天,由②求出;s为总天数。

“/”为整除。

)n=s%7 (其中:n为星期数;“%”为求余数)②求某月某日是这一年的第几天的子功能。

(要求编成子程序)二月份是否为平年(28天)或闰年(29天)的算法:y/400=0∨y/4=0∧y/100≠0 (y为年份;“/”整除),则y为以闰年;否则,y为平年。

根据①②可求出一年中的日历。

4.日历输出功能设计。

①格式及显示设计显示要求:设置显示滚动区;在该区中每次显示4个月的日历(并列排列)。

②日历打印设计:将日历按年存入磁盘不同的文件中保存,供打印或再次显示使用。

1.程序系统总体功能模块调用图及模块功能说明封面程序的功能是显示欢迎信息,并且显示制作人的信息的;验证用户名和密码的程序是验证用户是否是合法的用户的,该程序要有容错的功能;万年历程序是主程序,该程序的功能是通过用户输入年和月,来查询日历的,并且该程序还可以判断输入的年份是平年还是闰年。

封底程序是用来显示用户退出万年历系统的时候,一个感谢用户使用万年历的界面的。

2.程序系统详细的程序框图(每个子程序的流程图)①封面子程序,封底子程序的框图注:以封面程序为例,封底程序与封面程序类似②用户名和密码子程序框图注:以用户名程序为例,密码程序和用户名程序类似③求某年某月某日是星期几的子程序④..求某月某日是这一年的第几天的⑤判断是平年还是闰年的子程序⑥年份月份转化为真值的子程序四. 程序运行结果五.系统源程序.386DATA SEGMENT USE16A0 DB ' _____◆____◆____◆____◆____◆____◆_____◆_____ $' DB '※※$' DB '| |$' DB '◆◆$' DB '| ┏☆━━━━━━━━━━━━━━☆┓|$' DB '◆☆^ǒ^*☆*^ǒ^*★*^ǒ^*☆*^ǒ^*★*^ǒ^*☆◆$' DB '| ┃欢迎进入万年历系统┃|$' DB '◆☆^ǒ^*★*^ǒ^*☆*^ǒ^*★*^ǒ^*☆*^ǒ^*☆◆$' DB '| ┗☆━━━━━━━━━━━━━━☆┛|$' DB '◆◆$' DB '| |$' DB '◆制作人:某某某◆$' DB '| |$' DB '◆班级:2班◆$' DB '| |$' DB '◆学号:123456789012 ◆$' DB '| |$' DB '◆日期:08.1.15 ◆$' DB '| |$' DB '◆◆$' DB '| |$' DB '◆◆$' DB '| 版权所有,请勿仿冒|$' DB '※____◆____◆____◆____◆____◆____◆____◆____※$'A1 DB ' ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆$' DB '◇◇$' DB '◆◆$' DB '◇◇$' DB '◆┏━☆━━━━━━★━━━━━━☆━┓◆$' DB '◇┃◆◇┃◇$' DB '◆┃请输入用户名和密码┃◆$' DB '◇┃◇↑↑↑↑↑↑↑↑↑↑↑↑↑◆┃◇$' DB '◆┗━☆━━━━━━★━━━━━━☆━┛◆$' DB '◇◇$' DB '◆◆$' DB '◇◇$' DB '◆◆$' DB '◇用户名:◇$' DB '◆◆$' DB '◇◇$' DB '◆密码: ◆$' DB '◇◇$' DB '◆◆$' DB '◇◇$' DB '◆◆$' DB '◇◇$' DB '◆◆$' DB ' ◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇$'A2 DB '******★******☆******★*******☆*******★********$' DB '☆☆$' DB '| |$' DB '★★$' DB '| *********************************** |$' DB '☆* 欢迎再次使用万年历系统* ☆$' DB '| *********************************** |$' DB '★★$' DB '| |$' DB '☆☆$' DB '| |$' DB '★☆☆★★$' DB '| 如有不足之处,请联系我☆☆|$' DB '☆☆$' DB '| ★★☆|$' DB '★我们会不断的完善的★$' DB '| |$' DB '☆^_^ ☆$' DB '| |$' DB '★ISBN 7-300-00528-9 ★$' DB '| |$' DB '☆********★******☆********★********★*********☆$'A3 DB '******************万年历*******************$' DB '** ** ** **$' DB '======================================$' DB '| S UN | MON | T UE | WED | T HU | F A I | S A T |$' DB '|=====|=====|=====|=====|=====|=====|=====|$' DB '| | | | | | | |$' DB '|=====|=====|=====|=====|=====|=====|=====|$' DB '| | | | | | | |$' DB '|=====|=====|=====|=====|=====|=====|=====|$' DB '| | | | | | | |$' DB '|=====|=====|=====|=====|=====|=====|=====|$' DB '| | | | | | | |$' DB '|=====|=====|=====|=====|=====|=====|=====|$' DB '| | | | | | | |$' DB '|=====|=====|=====|=====|=====|=====|=====|$' DB '| | | | | | | |$' DB '|=====|=====|=====|=====|=====|=====|=====|$'YEAR DW ?MONTH DB ?B DW ?C1 DW 0D1 DW 0E DW 0G DB 0T DW 0S DB 0P DW ?N DW 0Y DW 0M DW 0BUF1 DB 31,?,31,30,31,30,31,31,30,31,30,31BUF2 DB 1,2,3,4,5,6,7,8,9,10,11,12INPUT1 DB '请输入要查询的年份:$'INPUT2 DB '请输入要查询的月份:$'INPUT3 DB '该年是平年$'INPUT4 DB '该年是闰年$'INPUT5 DB '要继续查询? 1.继续查询 2.退出万年历系统$'STR5 DB 5DB 0DB 5 DUP(0)STR6 DB 3DB 0DB 3 DUP(0)BUF3 DB ' 1',0AH,0DH,'$'DB ' 2',0AH,0DH,'$'DB ' 3',0AH,0DH,'$'DB ' 4',0AH,0DH,'$'DB ' 5',0AH,0DH,'$'DB ' 6',0AH,0DH,'$'DB ' 7',0AH,0DH,'$'DB ' 8',0AH,0DH,'$'DB ' 9',0AH,0DH,'$'DB '10',0AH,0DH,'$'DB '11',0AH,0DH,'$'DB '12',0AH,0DH,'$'DB '13',0AH,0DH,'$'DB '14',0AH,0DH,'$'DB '15',0AH,0DH,'$'DB '16',0AH,0DH,'$'DB '17',0AH,0DH,'$'DB '18',0AH,0DH,'$'DB '19',0AH,0DH,'$'DB '20',0AH,0DH,'$'DB '21',0AH,0DH,'$'DB '22',0AH,0DH,'$'DB '23',0AH,0DH,'$'DB '24',0AH,0DH,'$'DB '25',0AH,0DH,'$'DB '26',0AH,0DH,'$'DB '27',0AH,0DH,'$'DB '28',0AH,0DH,'$'DB '29',0AH,0DH,'$'DB '30',0AH,0DH,'$'DB '31',0AH,0DH,'$'C DB ?D DB ?STR1 DB 20DB 0DB 20 DUP(0)STR2 DB 20DB 0DB 20 DUP(0)STR3 DB 'admin' ; 用户名COUNT1 EQU $-STR3STR4 DB 'admin' ;密码COUNT2 EQU $-STR4BUF4 DB '用户名不正确,请重新输入!$'BUF5 DB '密码不正确,请重新输入!$'DATA ENDSSTACK SEGMENT USE16 STACKDB 200 DUP(0)STACK ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV AH,0 ;设置显示方式MOV AL,3 ;彩色文本方式INT 10H;************************封面程序************************************ MOV AH,6MOV AL,0MOV CL,0 ;清整个屏幕MOV DH,24MOV DL,79MOV BH,26INT 10HMOV CX,24MOV SI,OFFSET A0MOV B,000EHLOPA0: MOV AH,2MOV BX,0MOV DX,BINT 10HADD DX,0100HMOV B,DXMOV DX,SIMOV AH,9INT 21HADD SI,52DEC CXJNZ LOPA0MOV AH,1INT 21H;*************************用户名,密码程序****************************MOV AL,0MOV CH,0MOV CL,0 ;清整个屏幕MOV DH,24MOV DL,79MOV BH,30INT 10HMOV CX,24 ;显示用户名的密码页面,共24行,循环输出24次MOV SI,OFFSET A1MOV B,000EHLOPA1: MOV AH,2 ;定光标位置MOV BX,1MOV DX,BINT 10HADD DX,0100HMOV B,DXMOV DX,SI ; 显示字符串MOV AH,9INT 21HADD SI,52DEC CXJNZ LOPA1MOV C,3 ;容错三次LOPA2: MOV AH,2 ;设置用户名光标位置MOV BH,0 ; 页号为1(帧屏号)MOV DX,0D21HINT 10HLEA DX,STR1 ;输入用户名,保存在缓冲区STR1中MOV AH,10INT 21HMOV AL,STR1+1 ;用户名的长度送到AL中CMP AL,COUNT1 ;比较输入的用户名是否和指定的用户名长度一样JNE R ;长度不一样,跳转到PLEA SI,STR1+2LEA DI,STR3MOV CX,COUNT1REPZ CMPSB ;逐一比较两串的对应字符是否相等JNE R ;不相等,跳转到P 否则程序往下执行,输入密码MOV D,3LOPA3: MOV AH,2 ;设置密码光标位置MOV BH,0 ; 页号为1(帧屏号)MOV DX,1021HINT 10HLEA DX,STR2 ;输入密码,保存在缓冲区STR2中MOV AH,10INT 21HMOV AL,STR2+1 ;密码的长度送到AL中CMP AL,COUNT2 ;比较输入的密码是否和指定的密码长度一样JNE Q ;长度不一样,跳转到QLEA SI,STR2+2LEA DI,STR4MOV CX,COUNT2REPZ CMPSB ;逐一比较两串的对应字符是否相等JNE Q ;不相等,转QJMP T1 ;相等,转LOPA4R: MOV AH,2 ;设置显示用户名错误信息光标位置MOV BH,0 ; 页号为1(帧屏号)MOV DX,1521HINT 10HLEA DX,BUF4 ;输出用户名错误信息MOV AH,9INT 21HMOV AH,6MOV AL,1MOV CH,13MOV CL,33 ;清用户名输入行的屏幕MOV DH,13MOV DL,53MOV BH,30INT 10HINT 21HMOV AH,6MOV AL,1MOV CH,21MOV CL,33 ;清用户名出错行的屏幕MOV DH,21MOV DL,60MOV BH,20INT 10HDEC C ;循环次数减1JNZ LOPA2 ;跳转到LOPA2,重新输入用户名JE EXITQ: MOV AH,2 ;设置显示密码错误信息光标位置MOV BH,0 ; 页号为1(帧屏号)MOV DX,1521HINT 10HLEA DX,BUF5 ;输出密码错误信息MOV AH,9INT 21HMOV AH,6MOV AL,1MOV CH,16MOV CL,33 ;清密码输入行的屏幕MOV DL,53MOV BH,30INT 10HMOV AH,1INT 21HMOV AH,6MOV AL,1MOV CH,21MOV CL,33 ;清密码出错行的屏幕MOV DH,21MOV DL,60MOV BH,20INT 10HDEC D ;循环次数减1JNZ LOPA3 ;跳转到LOPA3,重新输入密码JE EXITMOV AH,1INT 21H;***********************显示万年历程序*******************************T1: MOV T,0MOV AH,6MOV AL,0MOV CL,0 ;清整个屏幕MOV DH,24MOV DL,79MOV BH,27INT 10HMOV CX,17MOV SI,OFFSET A3MOV B,0411HLOPA4: MOV AH,2MOV BX,0MOV DX,BINT 10HADD DX,0100HMOV B,DXMOV DX,SIMOV AH,9INT 21HADD SI,44DEC CXJNZ LOPA4MOV AH,2 ;定输入年份提示信息的光标MOV BX,0MOV DH,1MOV DL,17INT 10HLEA DX,INPUT1 ;提示信息,请输入要查询的年份MOV AH,9INT 21HMOV AH,2 ;定输入年份的光标MOV BX,0MOV DH,5MOV DL,19INT 10HLEA DX,STR5 ;输入年份,保存在缓冲区STR1中MOV AH,10INT 21HLEA DI,STR5+2 ; DI指向年份输入串的首地址MOV CL,STR5+1 ;输入年份字符串的长度送到CLMOV AX,0 ;年份转化为真值P1: MOV BL,[DI] ; 取字符送到BLSUB BL,30H ;字符减去30H,转化为真值MOV BH,0MOV P,10MUL PADD AX,BXINC DI ;DI指向下一个字符DEC CX ;长度减一JNZ P1MOV YEAR,AX ;把年送到YEAR中CALL PR ;调用判断平年还是闰年的程序JC L1 ;有进位,借位,跳转到L1,输出闰年,否则顺序执行,是平年MOV AH,2 ;输出平年信息的光标MOV BX,0MOV DH,1MOV DL,36INT 10HLEA DX,INPUT3 ;输出平年MOV AH,9INT 21HLEA DI,BUF1MOV [DI+1],BYTE PTR 28 ;平年把28送入BUF1中JMP J0L1: MOV AH,2 ;输出闰年信息的光标MOV BX,0MOV DH,1MOV DL,36INT 10HLEA DX,INPUT4 ; 输出闰年MOV AH,9INT 21HLEA DI,BUF1MOV [DI+1],BYTE PTR 29 ;闰年把29送入BUF1中J0: MOV AH,2 ;定输入月份提示信息的光标MOV BX,0MOV DH,2MOV DL,17INT 10HLEA DX,INPUT2 ;提示信息,请输入要查询的月份MOV AH,9INT 21HMOV AH,2 ;定输入月份的光标MOV BX,0MOV DH,5MOV DL,56INT 10HLEA DX,STR6 ;输入月份,保存在缓冲区STR2中MOV AH,10INT 21HLEA DI,STR6+2 ;DI指向月份输入串的首地址MOV CL,STR6+1 ;月份输入串的长度送到CL中MOV AX,0P2: MOV BL,[DI] ;取字符送到BL中SUB BL,30H ;字符减去30HMOV BH,0MOV S,10MUL SADD AX,BXINC DI ;DI指向下一个字符DEC CX ;长度减一JNZ P2MOV WORD PTR MONTH,AX ;月份值送到MONTH中CALL DTOB1 ;显示日历,调用DTOB1子程序返回N侄MOV DI,OFFSET BUF1DEC MONTHADD DI,WORD PTR MONTH ;取出每个月的天数MOV CL,[DI]MOV G,CLMOV SI,OFFSET BUF3MOV AL,6MUL NADD AX,19MOV B,AXMOV C1,9J1: MOV AH,2 ;确定每个月的一号的光标位置,即确定初始输入位置MOV BX, 0MOV DH,BYTE PTR C1MOV DL,BYTE PTR BINT 10HCMP DL,55JBE J2 ;DL<33,跳转到J2,否则行加1列从3开始ADD C1,2MOV B,19JMP J1J2: MOV DX,SIMOV AH,9 ;在当前光标位置显示数字INT 21HADD SI,5ADD B,6DEC GJNZ J1MOV AH,2 ;定输入月份的光标MOV BX,0MOV DH,22MOV DL,17INT 10HLEA DX,INPUT5MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,31HJE T1JMP T2DTOB1 PROC NEAR ;求某年某月某日是星期几子程序PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIMOV CX,0DEC YEARMOV AX,YEAR ;YEAR-1送入AX中MOV CX,YEARMOV DX,0MOV BL,4DIV BXMOV C1,AX ;(YEAR-1)/4送入C1中ADD CX,C1MOV AX,YEARMOV DX,0MOV BL,100DIV BXMOV D1,AX ;(YEAR-1)/100送入D中SUB CX,D1MOV AX,YEARMOV DX,0MOV BX,400DIV BXMOV E,AX ;(YEAR-1)/400 送入E中ADD CX,EMOV DX,0 ;DX清零MOV BX,0 ;BX清零MOV DL,MONTH ;求每个月的第一天是本年的第几天SUB DL,1MOV DI,OFFSET BUF2MOV SI,OFFSET BUF1R1: CMP [DI],DLJA R2 ;一月份的时候,跳转到R2MOV BL,[SI] ; 其它月份的时候,进行累加,计算每个月的第一天是该年的第几天ADD T,BXADD SI,1ADD DI,1JMP R1R2: ADD T,1ADD CX,T ;s=(y-1)+(y-1)/4-(y-1)/100+(y-1)/400+TMOV AX,CXMOV DX,0MOV BX,7 ;S%7,计算每个月的第一天是星期几DIV BXMOV N,DXPOP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETDTOB1 ENDPPR PROC NEAR ;判断是平年还是闰年PUSH AXPUSH BXPUSH CXPUSH DXMOV AX,YEARMOV CX,AXMOV DX,0MOV BX,4DIV BXJNZ B1MOV AX,CXMOV BX,100DIV BXCMP DX,0JNZ B2MOV AX,CXMOV BX,400DIV BXCMP DX,0JZ B2B1: CLCJMP B3B2: STCB3: POP DXPOP CXPOP BXPOP AXRETPR ENDP;***********************底封程序*************************************T2: MOV AH,6MOV AL,0MOV CH,0MOV CL,0 ;清整个屏幕MOV DL,79MOV BH,26INT 10HMOV CX,22MOV SI,OFFSET A2MOV B,010EH LOPA5: MOV AH,2MOV BX,0MOV DX,BINT 10HADD DX,0100HMOV B,DXMOV DX,SIMOV AH,9INT 21HADD SI,52DEC CXJNZ LOPA5EXIT: MOV AH,4CHINT 21HCODE ENDSEND START六.系统设计及实现的技术特点,不足及改进的建议设计封面,封底的时候,我先开始不会用循环的方法显示封面,所以用了许多9号功能调用来显示封面,但用这样的方法,显示的封面不能太大,所以我改用了循环的方法来显示封面,这样封面就可以做的很大了,这是我的一个技术特点在编写验证用户名和密码的程序时,我原先没有弄容错的功能,但是后来经过我的思考,我加了一个循环,让输入错了再返回到原输入位置,并且用循环判断是不是到了最大的输入次数,超过最大次数就退出系统,否则继续输入。

相关文档
最新文档