单片机仿真课程设计——基于单片机的实时时钟
基于单片机的实时时钟设计
整个系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的 精度,将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发 出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进 制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时 计数器”采用24进制计时器,可实现对一天24小时的累计。显示电路将“时”、“分”、“秒 ”计数器的输出,通过六个七段LED显示器显示出来。校时电路是直接加一个脉冲信号 到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整 。
II
毕业设计论文
基于单片机的实时时钟
2.2.4 电压检测电路..................................................................................................9 2.2.5 备用电池功耗问题........................................................................................10 2.2.6 直流稳压电源部分........................................................................................10
数字钟-论文基于单片机的数字实时时钟的设计
目录摘要 (1)第1章设计方案 (2)1.1方案论证与比较 (2)1.2方案确定 (3)第2章硬件设计 (4)2.1单片机最小系统 (4)2.2时钟模块 (5)2.2.1 DS1307的引脚功能 (5)2.2.2 DS1307的内部结构 (6)2.2.3 DS1307的读写操作 (7)2.2.4 DS1307硬件电路设计 (8)2.3闹铃模块 (9)2.4键盘模块 (9)2.5LCD显示模块 (10)2.5.1 LCD1602的引脚功能 (10)2.5.2 LCD1602的显示操作 (11)2.6电源模块 (15)第3章软件设计 (16)3.1系统流程图 (16)3.2液晶显示模块流程图 (16)3.3键盘处理模块流程图 (17)第4章软件设计 (22)4.1 软件系统方框图 (22)4.2中断延时程序 (22)4.3 仿真环境Professional仿真软件 (23)第4章系统测试 (24)总结 (26)致谢 (27)参考文献 (28)附录1系统仿真电路图 (29)附录2PCB板底图 (30)附录3主要源程序 (31)摘要本设计以AT89C51单片机为核心,以实时时钟芯片DS1307和液晶显示LCD1602为主体设计了一款简易数字时钟。
该时钟系统主要由单片机最小系统、时钟模块、闹钟模块、液晶显示模块、键盘控制模块组成。
系统具有简单清晰的操作界面,能够准确显示时间(显示格式为时时:分分:秒秒,24小时制),可随时进行时间调整,具有闹钟时间设置、闹钟开/关。
设计以硬件软件化为指导思想,充分发挥单片机功能,大部分功能通过软件编程来实现,电路简单明了,系统稳定性高。
同时,该时钟系统还具有功耗小、成本低的特点,具有很强的实用性。
由于系统所用元器件较少,单片机所被占用的I/O口不多,因此系统具有一定的可扩展性。
软件程序采用均采用C语言编写,便于移植与升级。
报告详细介绍了整个系统的硬件组成结构、工作原理和系统的软件程序设计。
基于单片机实时钟设计(毕业设计)
苏州信息职业技术学院毕业设计报告(论文)系别:电气与电子工程系专业:楼宇智能化工程技术班级:09楼宇1班***名:**学生学号:G********设计(论文)题目:基于单片机实时钟设计指导教师:起讫日期:2011.9.5—2011.11.11 \苏州信息职业技术学院毕业设计(论文)成绩评定表苏州信息职业技术学院毕业设计(论文)任务书学生(签名)年月日指导教师(签名)年月日教研室主任(签名)年月日系主任(签名)年月日苏州信息职业技术学院毕业设计(论文)开题报告苏州信息职业技术学院毕业设计(论文)中期检查表毕业设计报告(论文)摘要目录一、引言 10二、系统原理与器件选择112.1设计要求 (11)2.2设计背景条件 (11)2.3系统基本方案的选择 (11)2.3.1电路设计框图112.3.2单片机芯片的选择方案122.3.3显示模块的选择方案122.3.4时钟芯片的选择方案122.4系统设计的具体实现 (12)2.4. 1单片机主控制模块的设计132.4. 2时钟电路模块的设计132.4. 3显示模块的设计142.4. 4 DS1302电路原理及说明152.4. 5动态扫描芯片ZLG7290的工作原理19三、软件设计 223.1程序流程框图 (22)3.2ZLG7290如何与单片机进行通信 (22)3.3DS1302如何与单片机进行通信 (29)四、系统调试 324.1硬件测试 (32)4.2软件测试 (32)4.3测试结果分析与结论 (32)4.3.1测试结果分析324.3.2测试结论33五、总结35六、致谢词36七、参考文献 37附录一:系统电路图附录二:系统程序清单一、引言20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
基于单片机的电子时钟课程设计报告
目录一、引言········二、设计课题·········三、系统总体方案·········四、系统硬件设计······1.硬件电路原理图2.元件清单五、系统软件设计·········1.软件流程图2.程序清单六、系统实物图········七、课程设计体会········八、参考文献及网站·········九、附录·········一.引言单片机因将其主要组成部分集成在一个芯片上而得名,就是把中央处理器、随机存储器、只读存储器、中断系统、定时器/计数器以及I/O接口电路等部件集成在一个芯片上。
基于单片机设计的数字钟精确度较高,因为在程序的执行过程中,任何指令都不影响定时器的正常计数,即便程序很长也不会影响中断的时间。
数字钟是采用数字电路实现对日期、时、分、秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。
数字钟已成为人们日常生活中的必需品,广泛应用于家庭、车站、码头、剧院、办公室等场所,给人们的生活、学习、工作带来极大的方便。
基于单片机的实时时钟
目录1. 设计要求与方法论证 (3)1.1 设计要求 (3)1.2 系统基本方案选择和论证 (3)1.2.1 单片机芯片的选择方案和论证 (3)1.2.2 显示模块选择方案和论证 (4)1.3 电路设计最终方案决定 (4)2. 系统的硬件设计与实现 (4)2.1 电路设计框图 (4)2.2 系统硬件概述 (5)2.3 系统硬件模块 (5)2.3.1 AT89C51 (5)2.3.2 DS1302 (6)2.3.3点阵式LCD (7)3.系统的软件设计 (7)4. 硬件电路调试 (7)5. 结论 (9)6. 致谢 (9)参考文献 (10)附录 (11)实时时钟摘要:二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。
实时时钟的开发与研究在信息化时代的今天亦是当务之急,因为它有极广阔的应用市场,可以说遍及人们生活的每一个角落。
本文设计的实时时钟属于小型智能家用电子产品。
利用单片机进行控制,实时时钟芯片DS1302时钟芯片进行记时,本文设计的实时时钟具有读数方便,操作简单,适用范围宽等特点。
关键字:实时时钟,Proteus,51单片机,DS13021.设计要求与方案论证1.1设计要求(1)采用DS1302作为实时时钟芯片进行计时(2)读出DS1302中的时间数据(3)能显示时间数据,包括年月日,时分秒(4)显示方式不限1.2系统基本方案选择和论证1.2.1 单片机芯片的选择方案和论证方案一:用中小规模集成电路74/54系列和CC4000系列及555集成电路构建秒脉冲源,再利用分频器、计数器、缓存器等得到分、时、日、月、年的计时信号,最后用译码器驱动数码管显示,得到时钟功能。
方案二:采用AT89C51单片机,完全兼容MCS-51系列单片机的所有功能,并且本身带有2K的内存储器,可以在编程器上实现闪烁式的电擦写达几万次以上,比以往惯用的8031CPU外加EPROM为核心的单片机系统在硬件上具有更加简单方便等优点,具体如下:1)AT89C51单片机是最早期也最典型的产品,低功耗、高性能、采用CHMOS 工艺的8位单片机。
基于51单片机的实时时钟设计报告
课程设计(论文)任务书信息工程学院信息工程专业(2)班一、课程设计(论文)题目嵌入式课程设计二、课程设计(论文)工作自 2014 年 6 月 9 日起至2014年 6月15日止。
三、课程设计(论文) 地点: 5-402 单片机实验室四、课程设计(论文)内容要求:1.本课程设计的目的(1)使学生掌握单片机各功能模块的基本工作原理;(2)培养学生单片机应用系统的设计能力;(3)使学生能够较熟练地使用proteus工具完成单片机系统仿真。
(4)培养学生分析、解决问题的能力;(5)提高学生的科技论文写作能力。
2.课程设计的任务及要求1)基本要求:(1)分析所设计系统中各功能模块的工作原理;(2)选用合适的器件(芯片);(3)提出系统的设计方案(要有系统电路原理图);(4)对所设计系统进行调试。
2)创新要求:在基本要求达到后,可进行创新设计,如改善单片机应用系统的性能。
3)课程设计论文编写要求(1)要按照书稿的规格打印撰写论文。
(2)论文包括目录(自动生成)、摘要、正文、小结、参考文献、附录等。
(3)论文装订按学校的统一要求完成。
4)答辩与评分标准:(1)完成原理分析:20分;(2)完成设计过程:30分;(3)完成调试:20分;(4)回答问题:20分;(5)格式规范性(10分)。
5)参考文献:(1)张齐.《单片机原理与嵌入式系统设计》电子工业出版社(2)周润景.《PROTUES入门实用教程》机械工业出版社(3)任向民.《微机接口技术实用教程》清华大学出版社(4)/view/a5a9ceebf8c75fbfc77db2be.html6)课程设计进度安排内容天数地点构思及收集资料1图书馆系统设计与调试 4 实验室撰写论文2图书馆、实验室学生签名:2014 年6 月9日课程设计(论文)评审意见(1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(30分):优()、良()、中()、一般()、差();(3)完成调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良()、中()、一般()、差();(5)格式规范性(10分):优()、良()、中()、一般()、差();评阅人:职称:2014 年6 月15 日目录摘要 (4)第1章设计要求 (5)1.1设计要求 (5)1.2设计内容 (5)1.3设计基本环境 (5)第2章设计方案和论证 (6)2.1总设计原理框图 (6)2.2设计方案选择 (7)第3章硬件电路 (8)3.1单片机的选择 (8)3.1.1 单片机内部原理分析 (8)3.1.2单片机的引脚及封装 (9)3.1.3单片机最小系统 (11)3.2 数码管显示工作原理 (11)3.3 8255A模块 (12)3.4时间调节模块 (13)3.4.1 时间设置 (13)3.4.2整点报时 (13)第4章软件调试 (14)4.1时间调节程序流程图 (14)4.2主程序流程图 (18)第5章仿真调试 (22)第6章总结与体会 (23)第7章参考文献 (23)摘要单片计算机即单片微型计算机。
单片机课程设计实验报告 基于单片机的数字时钟 含完整实验代码..
单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。
功能要求:a)计时并显示(LED)。
由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。
b)时间调整功能。
利用4个独立按钮,实现时钟调整功能。
这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。
c)定闹功能。
利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。
d)秒表功能。
最小时间单位0.01秒。
二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。
a)外电源供电,采用2.1电源座,可接入电源DC5V,经单向保护D1接入开关S1。
b)USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。
注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。
S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。
电路采用两个滤波电容,给板子一个更加稳定的工作电源。
LED为电源的指示灯,通电后LED灯亮。
2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。
有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。
如上图:单片机P15输出高低电平经R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。
低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。
电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。
数码管的阴级由P0口经过电阻限流连接。
例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。
基于Proteus的单片机实时时钟的仿真设计的毕业设计
毕业设计论文作者学号系部专业题目基于Proteus的单片机实时时钟的仿真设计指导教师评阅教师完成时间:毕业设计论文中文摘要毕业设计论文外文摘要目录1引言 (1)2设计思路和功能描述 (1)3硬件原理分析 (1)4Proteus简介 (2)4.1该软件的特点: (2)4.2 如何进入Proteus ISIS (3)4.3工作界面 (3)Keilc与Proteus连接调试 (4)5基本原理 (4)5.1 ISIS软件的主要特性有 (5)6硬件电路设计与实现 (5)7主要芯片、元器件简介 (6)7.1 DS1302 (6)7.1.1 DS1302的主要特性 (7)7.1.2 主要功能 (8)7.2 AT89C51单片机 (8)7.2.1.主要特性 (9)7.2.2.管脚说明 (9)7.2.3.振荡器特性 (11)7.2.4.芯片擦除 (11)7.3 LCD1602液晶屏显示电路 (12)8软件设计设计 (14)9系统仿真分析 (38)结论 (41)致谢 (42)参考文献: (43)1引言单片微型计算机,简称单片机,又称微控制器。
单片机作为微型计算机家族的一员,以独特的结构和优点,越来越深受各个应用领域的关注和重视,应用十分广泛,发展极快。
单片机技术应用于各行各业,是一种实用的智能型控制技术,单片机技术的发展极大地推动了电子、通信、计算机、机电一体化等行业的快速发展,成为当前教学和科研的热门技术。
单片机电子时钟系统可以用多种技术手段实现。
本文借助于Proteus仿真系统进行系统虚拟开发成功之后再进行实际操作,可以节约开发时间,降低开发成本,具有很大的灵活性和可扩展性。
在国外有包括斯坦福、剑桥等在内的几千家高校将Proteus作为电子工程学位的教学和实验平台;在国内也有众多大学正在体验Proteus的独一无二的功能并申报大学计划。
该方法具有普遍意义。
通过实际应用发现,采用该方法可以大大简化硬件电路测试和系统调试过程中电路板制作、元器件安装、焊接等过程。
毕业设计(论文)-基于单片机的实时电子钟设计
毕业设计姓名:陆春专业:电气03-4班学号:03010094指导老师:基于单片机的实时电子钟设计目录摘要英文摘要第1章绪论1.1选题的目的和意义1.2国内外研究综述第2章单片机系统概述2.1单片机的简介2.2单片机的发展概述2.3单片机的组成结构及性能特点2.4单片机的应用现状2.5单片机的发展趋势第3章基于单片机的电子钟的硬件设计3.1使用单片机作为控制核心的依据3.2 单片机型号的选择3.3 AT89C51单片机的性能特点3.4设计的记时方案和键盘/显示方案3.5 硬件设计及原理图第4章基于单片机的电子钟的软件设计4.1软件设计的主程序4.2记时器中断子程序4.3压缩BCD拆分子程序4.4显示子程序4.5键盘子程序第5章总结参考文献摘要该电子钟使用单片机AT89C51作为中心控制,通过软件编程的方法实现了以24小时为一个周期同时显示小时,分钟和秒的要求,并在计时过程中具有报时功能,当时间到达整点进行报时。
该电子钟还可以随时进行时间校对。
ABSTRACTThis electron clock use monolithic integrated circuit AT89C51 took the center control, the method which programmed through software has realized as a cycle simultaneously demonstrates take 24 hours the hour, minute and a second request, and had in the time process reports time the function, at that time arrived the integral point to carry on reports time. This electron clock also may carry on time proofreading as necessary.第1章绪论1.1选题的目的和意义随着计算机技术的发展和在控制系统中的广泛应用,以及设备向小型化、智能化发展,作为高新技术之一的单片机以其体积小、功能强、价格低廉、使用灵活等优势,显示出很强的生命力。
基于单片机的时钟设计
基于单片机的时钟设计时钟是现代社会不可或缺的电子产品,它不仅能方便地显示时间,还可以提供闹铃、定时器等功能。
基于单片机的时钟设计通过集成电路的形式实现各种功能,具有节省空间、功耗低和设计灵活的优势。
一、设计需求设计一个基于单片机的时钟,具有以下功能:1.实时时间显示:通过液晶显示屏显示当前的小时、分钟和秒钟,并能够自动更新时间。
2.闹铃功能:设定闹铃时间后,在设定时间时会自动响铃。
3.定时器功能:设定一个时间段后,经过设定时间后会弹出提醒。
二、硬件设计1.单片机选择:选择一款适合时钟设计的单片机,具有较高的计算能力和丰富的接口资源。
2.时钟模块:通过连接实时时钟模块,获取准确的时间数据。
实时时钟模块通常采用DS1302或DS3231芯片。
3.液晶显示屏:通过连接液晶显示屏模块,将时间数据显示出来。
液晶显示屏通常采用16x2字符型液晶显示屏。
4.按键开关:通过连接按键开关模块,实现对时钟功能的设置和切换。
5.喇叭:通过连接喇叭模块,实现闹铃功能。
6.其他辅助电路:例如稳压电路、外部晶振等。
三、软件设计1.时钟显示:通过读取实时时钟模块中的时间数据,将其显示在液晶显示屏上。
可以设置定时器中断来实现每秒钟更新一次时间。
2.闹铃功能:用户可以通过按键设置闹铃时间,当实时时钟模块的时间与设定的闹铃时间相同时,触发闹铃,通过喇叭发出声音。
3.定时器功能:用户可以通过按键设置定时时间,当设定的时间到达时,弹出提醒提示。
4.按键处理:通过检测按键的状态进行相应的操作,如切换功能、设置闹铃时间、定时时间等。
5.其他功能:根据实际需求可以添加更多的功能,如自动亮度调节、温度显示等。
四、总结基于单片机的时钟设计具有灵活、可扩展性强的特点,可以根据用户需求自定义各种功能。
通过合理的硬件设计和软件编程,可以实现实时时间显示、闹铃功能和定时器功能等。
这种设计不仅能满足人们对时钟的基本需求,还能提供更多的便利功能。
总之,基于单片机的时钟设计是一种相对成熟和常见的设计,通过合理的硬件布局和软件编程,可以实现各种功能,满足人们对时钟的需求。
单片机仿真课程设计——基于单片机的实时时钟
sbit DS1302_CLK = P1^6; //实时时钟时钟线引脚
sbit DS1302_IO = P1^7; //实时时钟数据线引脚
sbit DS1302_RST = P1^5; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
四、原理图
五、程序源代码
#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
AT89C52具有以下主要性能:
1.4KB可改编程序Flash存储器;
2.全静态工作:0—入/输出(I/O)口;
5.6个中断优先级; 2个16位可编程定时计数器;
6.可编程串行通道;
7.片内时钟振荡器。
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。需要强调的是,DS1302需要使用32.768KHz的晶振。
基于单片机AT89C51的实时时钟设计
一.系统分析本电路是由AT89C51单片机为控制核心,具有在线编程功能,低功耗,能在4.5V超低压工作;显示部分用LCD1602实现,能够同时显示16x02即32个字符;闹钟部分由蜂鸣器构成,蜂鸣器是一种一体化结构的电子讯响器;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V.采用三线接口与单片机进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM 寄存器。
可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能,本设计中为DS1302增加了备用电池,当主电源掉电时,备用电池自动为其供电;温度的采集由DS18B20构成;当闹铃时间到时,通过蜂鸣器播放闹铃铃声。
二.系统功能框图的设计电阻RES 排阻RESPACK-8按键BUTTON四.系统软件设计(流程图和软件设计)主程序流程图C程序:#include <reg52.h>#include "intrins.h"#include "24c02.h"#define uchar unsigned char#define uint unsigned int//闹钟显示缓冲区code uchar alarm_one[]=" Hello,L.W Hou";code uchar alarm_two[]="GOOD MORNING HLW";code uchar w1[]={0x01,0x03,0x1D,0x11,0x1D,0x03,0x01,0x00};code uint cyc[]={1800,1600,1440,1351,1200,1079,960};//音阶1-7的半周期数code uchar tone[]={13,15,16,16,15,16,13,12,12,13,15,16,16,15,16,13,13, 13,15,16, 16,15,16,13,12,12,15,13,12,13,12,11,12,6,6,12,15,13,12,6,6,15,13,12,13,12,11,12,6,5,6,0xff};// 乐曲《康定情歌》的简谱表code uchar time[]={8,8,8,4,4,8,8,12,4,8,8,8,4,4,8,16,8,8,8,8,4,4,8,8,12,4,8,8,4,4,4,4,8,24,8,24,8,24,8,16,8,8,8,4,4,4,4,8,16,8,32};// 节拍表uchar H0,L0,cnt;uchar code tabe1[]="20 - - "; //液晶一直显示的字符uchar code tabe2[]=" : : ";uchar code tabe3[]="Alarm set:";ucharmiao,fen,shi,nian,yue,ri,week,wendu_shi,wendu_ge,wendu_shu,variate,alarm_shi,alar m_fen,alarm_miao;ucharflag=1,count=0,flag_up=0,flag_down=0,flag_alarm=0,alarm_on,alarm_count=0,done =0;uint wendu;//定义IOsbit DQ = P1^0; //ds18b20温度传送数据IO口sbit ds1302_rst = P1^1; //1302复位sbit ds1302_io = P1^2; //数据输入输出sbit ds1302_sclk= P1^3; //串行时钟sbit alarm_out = P3^6;sbit lcd1602_rs = P2^0; // 1602命令、数据选择sbit lcd1602_rw = P2^1; // 1602写sbit lcd1602_e = P2^2; // 1602使能sbit set = P2^4; //选择按键sbit up = P2^5; //加sbit down= P2^6; //减sbit nao = P2^7;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit MODE=P3^2;//延时void delay(uchar x){uchar y,z;for(z=x;z>0;z--)for(y=110;y>0;y--);}void delay1(){_nop_();_nop_();}void delay2(uint ms){uint i,j;for (j=0;j<ms;j++)for (i=0;i<120;i++);}ds18b20_delay(uchar xus) //延时xus{while(xus--);return 0;}/**********************ds18b20***********************/ void ds18b20_init() //DS18B20初始化{uchar x=0;DQ=1;ds18b20_delay(8);DQ=0;ds18b20_delay(80);DQ=1;ds18b20_delay(14);x=DQ;ds18b20_delay(20);}void write_onechar(uchar dat) //写一字节{uchar i;for(i=8;i>0;i--){DQ=0;if(dat&0x01==0x01)DQ=1;elseDQ=0;ds18b20_delay(5);DQ=1;ds18b20_delay(1);dat>>=1;}}uchar read_onechar() //读一字节{uchar value=0,i;for(i=8;i>0;i--){value>>=1;DQ=0;ds18b20_delay(1);DQ=1;if(DQ==1)value|=0x80;elsevalue&=0x7f;ds18b20_delay(4);}return value;}uint read_wendu() //DS18B20读温度{uchar a=0,b=0;uint wen=0x0000;ds18b20_init(); //初始化write_onechar(0xcc); // 跳过读序号列号的操作write_onechar(0x44); // 启动温度转换ds18b20_delay(150);ds18b20_init(); //初始化write_onechar(0xcc); //跳过读序号列号的操作write_onechar(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度ds18b20_delay(150);b=read_onechar(); //读取温度值低位a=read_onechar(); //读取温度值高位wen=a;wen=(wen<<8)|b;return wen;}/**********************ds1302***************************/void write_byte(uchar dat) //写一字节{uchar k;ACC=dat;for(k=8;k>0;k--){ds1302_io=ACC0;ds1302_sclk=0; //拉低sclkds1302_sclk=1; //拉高sclkACC>>=1;}}uchar read_byte(){uchar k;for(k=8;k>0;k--){ACC7=ds1302_io;ds1302_sclk=1; //拉高sclkds1302_sclk=0; //拉低sclkACC>>=1;}return ACC;}void ds1302_write(uchar add,uchar date){ds1302_rst=0;ds1302_sclk=0; //在rst没拉高之前先把sclk置0ds1302_rst=1;write_byte(add);write_byte(date);ds1302_sclk=1;ds1302_rst=0;}uchar ds1302_read(uchar add){uchar temp;ds1302_rst=0;ds1302_sclk=0; //在rst没拉高之前先把sclk置0ds1302_rst=1;write_byte(add);temp=read_byte();ds1302_sclk=1;ds1302_rst=0;return temp;}void ds1302_init() //ds1302初始化{ds1302_rst=0;ds1302_sclk=1;ds1302_write(0x8e,0x00); //写允许ds1302_write(0x80,0x58);ds1302_write(0x82,0x56);ds1302_write(0x84,0x09);ds1302_write(0x86,0x12);ds1302_write(0x88,0x05);ds1302_write(0x8a,0x05);ds1302_write(0x8c,0x12);ds1302_write(0x8e,0x80); //写保护}/***************************lcd1602***************************/ void lcd_write_com(uchar com) //命令字写入lcd单元中{lcd1602_rw=0;delay1();lcd1602_rs=0; // RW=1,RS=0,写LCD命令字delay1();P0=com; //将com中的命令字写入LCD数据口delay1();lcd1602_e=1; //E端时序delay1();lcd1602_e=0;delay1();lcd1602_rw=1;delay(5);}void lcd_write_date(uchar date) //数据写入lcd单元中{lcd1602_rw=0;delay1();lcd1602_rs=1; // RW=0,RS=1,写LCD命令字delay1();lcd1602_e=1; // E端时序delay1();P0=date; // 将dat中的显示数据写入LCD数据口delay1();lcd1602_e=0;delay1();lcd1602_rw=1;delay(5);}void lcd1602_init() //LCD初始化函数{uchar lcdnum;P3=0xdf;lcd_write_com(0x38);lcd_write_com(0x0c);lcd_write_com(0x06);lcd_write_com(0x01);lcd_write_com(0x80);for(lcdnum=0;lcdnum<8;lcdnum++) //写第一行数据{lcd_write_date(tabe1[lcdnum]);delay(2);}lcd_write_com(0x80+0x40); //写入第二行数据for(lcdnum=0;lcdnum<13;lcdnum++){lcd_write_date(tabe2[lcdnum]);delay(2);}}/****************************显示部分*****************************/void write_time1(uchar add,uchar date) //日期送显示{uchar shi,ge;shi=date/10;ge=date%10;lcd_write_com(0x80+add);lcd_write_date(0x30+shi);lcd_write_date(0x30+ge);}void write_time2(uchar add,uchar date) //时间送显示{uchar shi,ge;shi=date/10;ge=date%10;lcd_write_com(0x80+0x40+add);lcd_write_date(0x30+shi);lcd_write_date(0x30+ge);}uchar bcd_decimal(uchar bcd) //bcd转换十进制{uchar decimal;decimal=bcd>>4;decimal=decimal*10+(bcd&=0x0f);return decimal;}void wendu_decimal(uint dat) //温度转换后送显示{float temp;temp=dat*0.625; //dat*0.0625*10wendu_shi=temp/100; //取十位temp除不用定义类型wendu_ge =((uint)temp)%100/10; //取个位temp求模要定义类型,为//16位,故定义uintwendu_shu=((uint)temp)%100%10; //取小数lcd_write_com(0x80+0x40+10); //送显示lcd_write_date(0x30+wendu_shi);lcd_write_date(0x30+wendu_ge);lcd_write_date(0x2e);lcd_write_date(0x30+wendu_shu);lcd_write_date(0xdf); //温度符号lcd_write_date(0x43);}void write_week(uchar we) //星期送显示{lcd_write_com(0x80+0x0d);switch(we){case 1: lcd_write_date('M');lcd_write_date('O');lcd_write_date('N');break;case 2: lcd_write_date('T');lcd_write_date('U');lcd_write_date('E');break;case 3: lcd_write_date('W');lcd_write_date('E');lcd_write_date('D');break;case 4: lcd_write_date('T');lcd_write_date('H');lcd_write_date('U');break;case 5: lcd_write_date('F');lcd_write_date('R');lcd_write_date('I');break;case 6: lcd_write_date('S');lcd_write_date('A');lcd_write_date('T');break;case 7: lcd_write_date('S');lcd_write_date('U');lcd_write_date('N');break;}}void lcd_write_com1(uchar com,bit rs) //命令字写入lcd单元中{lcd1602_rs=rs;lcd1602_rw=0; // RW=1,RS=0,写LCD命令字P0=com;delay1();delay1(); //将com中的命令字写入LCD数据口lcd1602_e=0;delay1();delay1();lcd1602_e=1; //E端时序delay1();delay1();lcd1602_e=0;delay1();delay1();}/***************LCD1602闹钟显示函数******************/void display_1602_alarm(){uchar i,j,k;P3=0xdf;lcd_write_com(0x38);lcd_write_com(0x0c);lcd_write_com(0x06);lcd_write_com(0x01);lcd_write_com(0x80); //液晶显示位置delay2(5);for (i=0;i<sizeof(alarm_one)-1;i++){lcd_write_date(alarm_one[i]);delay2(5);}lcd_write_com1(0x40,0);lcd_write_com1(0x40,0);for(j=0;j<8;j++)lcd_write_com1(w1[j],1);lcd_write_com1(0x80+0x0f,0);lcd_write_com1(0x00,1);lcd_write_com(0x80+0x40); //液晶显示位置delay2(5);for (k=0;k<sizeof(alarm_two)-1;k++){lcd_write_date(alarm_two[k]);delay2(5);}}/***********************按键处理***************************/ uchar key_bcd(uchar key_decimal) //转成ds1302所需的BCD码{uchar temp;temp=(((key_decimal/10)&0x0f)<<4)|(key_decimal%10);return temp;}void key_up_down() //加减键处理{if(up==0){delay(2);flag_up=1; //加更新标志while(!up);switch(count){case 1:miao++;if(miao>59) miao=0; break; case 2:fen++;if(fen>59) fen=0; break; case 3:shi++;if(shi>23) shi=0; break; case 4: week++;if(week>7) week=1; break; case 5:ri++;if(ri>31)ri=1; break; case 6:yue++;if(yue>12) yue=1; break; case 7: nian++;if(nian>99) nian=0; break;}}if(down==0) //减键处理{delay(2);flag_down=1; //减更新标志while(!down);switch(count){case 1:miao--;if(miao==255)miao=59;break;case 2:fen--;if(fen==255)fen=59;break;case 3:shi--;if(shi==255)shi=23;break;case 4:week--;if(week<1)week=7;break;case 5:ri--;if(ri<1)ri=31;break;case 6:yue--;if(yue<1)yue=12;break;case 7:nian--;if(nian==255)nian=99;break;}}}void c02_init(){c_init();alarm_shi=c02_read_add(1); //读取闹钟时delay(200);alarm_fen=c02_read_add(2); //分delay(200);alarm_miao=c02_read_add(3); //秒delay(200);alarm_on =c02_read_add(4); //读取闹钟开关值,为0关,为1开delay(200);}void alarm_huan() //按下闹钟键后,切换界面{uchar num;lcd_write_com(0x01);lcd_write_com(0x80);for(num=0;num<10;num++) //写第一行数据{lcd_write_date(tabe3[num]);delay(2);}lcd_write_com(0x0f);write_time2(4,alarm_shi);lcd_write_date(0x3a);write_time2(7,alarm_fen);lcd_write_date(0x3a);write_time2(10,alarm_miao);if(alarm_on==0){lcd_write_com(0x80+0x40+13);lcd_write_date('O');lcd_write_date('F');lcd_write_date('F');}if(alarm_on==1){lcd_write_com(0x80+0x40+13);lcd_write_date(' ');lcd_write_date('O');lcd_write_date('N');}}void key_set_alarm(){if(set==0 && alarm_count==0 && flag_alarm==0){delay(2);if(set==0){while(!set); //等待set释放count++; //按set一下,count加1if(flag==1){done=1;flag=0;ds1302_write(0x8e,0x00); //写允许ds1302_write(0x80,key_bcd(miao)|0x80); //BIT7为1,晶振停止工作ds1302_write(0x8e,0x80); //写保护}}}if(nao==0 && count==0 && flag_alarm==0){delay(2);if(nao==0){while(!nao);alarm_count++;if(flag==1){done=1;flag=0;alarm_huan(); //切换界面}}}}void keyjpress() //按键处理{key_set_alarm();if(count!=0) //count不为0,进入时间调整扫描{switch(count){case 1:do{lcd_write_com(0x0F); //显示光标,不闪烁lcd_write_com(0x80+0x40+7);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x80,key_bcd(miao) | 0x80);ds1302_write(0x8e,0x80);write_time2(6,miao);lcd_write_com(0x80+0x40+7); //液晶写字符后光标自动向右移动//一位,把光标左移一位}}while(count==2);break;case 2:do{lcd_write_com(0x80+0x40+4);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x82,key_bcd(fen));ds1302_write(0x8e,0x80);write_time2(3,fen);lcd_write_com(0x80+0x40+4);}}while(count==3);break;case 3:do{lcd_write_com(0x80+0x40+1);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x84,key_bcd(shi));ds1302_write(0x8e,0x80);write_time2(0,shi);lcd_write_com(0x80+0x40+1);}}while(count==4);break;case 4: do{lcd_write_com(0x80+0x0e);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x8a,key_bcd(week));ds1302_write(0x8e,0x80);write_week(week);lcd_write_com(0x80+0x0e);}}while(count==5);break;case 5:do{lcd_write_com(0x80+9);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x86,key_bcd(ri));ds1302_write(0x8e,0x80);write_time1(8,ri);lcd_write_com(0x80+9);}}while(count==6);break;case 6:do{lcd_write_com(0x80+6);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x88,key_bcd(yue));ds1302_write(0x8e,0x80);write_time1(5,yue);lcd_write_com(0x80+6);}}while(count==7);break;case 7:lcd_write_com(0x80+3);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x8c,key_bcd(nian));ds1302_write(0x8e,0x80);write_time1(2,nian);lcd_write_com(0x80+3);}break;case 8:lcd_write_com(0x0c); //调整结束,关闭显示光标flag=1;done=0;count=0;ds1302_write(0x8e,0x00);ds1302_write(0x80,key_bcd(miao)&0x7f); //BIT7为0,晶振开始工作ds1302_write(0x8e,0x80);break;default:break;}}if(alarm_count!=0) //闹钟按键扫描{switch(alarm_count){case 1:lcd_write_com(0x80+0x40+15);if(up==0){delay(2);if(up==0){while(!up);alarm_on=1;lcd_write_com(0x80+0x40+13);lcd_write_date(' ');lcd_write_date('O');lcd_write_date('N');c02_write_add(4,alarm_on);delay(200);lcd_write_com(0x80+0x40+15);}}if(down==0){if(down==0);{while(!down);alarm_on=0;lcd_write_com(0x80+0x40+13);lcd_write_date('O');lcd_write_date('F');lcd_write_date('F');c02_write_add(4,alarm_on);delay(200);lcd_write_com(0x80+0x40+15);}}break;case 2:lcd_write_com(0x80+0x40+11);if(up==0 || down==0){delay(2);if(up==0){while(!up);alarm_miao++;if(alarm_miao>59)alarm_miao=0;}if(down==0){while(!down);alarm_miao--;if(alarm_miao==255)alarm_miao=59;}write_time2(10,alarm_miao);lcd_write_com(0x80+0x40+11);c02_write_add(3,alarm_miao);delay(200);}break;case 3:lcd_write_com(0x80+0x40+8);if(up==0 || down==0){delay(2);if(up==0){while(!up);alarm_fen++;if(alarm_fen>59)alarm_fen=0;}if(down==0){while(!down);alarm_fen--;if(alarm_fen==255)alarm_fen=59;}write_time2(7,alarm_fen);lcd_write_com(0x80+0x40+8);c02_write_add(2,alarm_fen);delay(200);}break;case 4:lcd_write_com(0x80+0x40+5);if(up==0 || down==0){delay(2);if(up==0){while(!up);alarm_shi++;if(alarm_shi>23)alarm_shi=0;}if(down==0){while(!down);alarm_shi--;if(alarm_shi==255)alarm_shi=23;}write_time2(4,alarm_shi);lcd_write_com(0x80+0x40+5);c02_write_add(1,alarm_shi);delay(200);}break;case 5:alarm_count=0;lcd1602_init();flag=1;done=0;break;}}}void xianshi(){//读秒分时,日月年,星期miao=bcd_decimal(ds1302_read(0x81));fen =bcd_decimal(ds1302_read(0x83));shi =bcd_decimal(ds1302_read(0x85));ri =bcd_decimal(ds1302_read(0x87));yue =bcd_decimal(ds1302_read(0x89));nian=bcd_decimal(ds1302_read(0x8d));week=bcd_decimal(ds1302_read(0x8b));//送液晶显示write_time2(6,miao);write_time2(3,fen);write_time2(0,shi);write_time1(8,ri);write_time1(5,yue);write_time1(2,nian);write_week(week);//读温度wendu=read_wendu();//温度显示wendu_decimal(wendu);}/**********定时器0中断用于产生音阶方波***********/void cntint0(void) interrupt 1{TH0=H0;TL0=L0;alarm_out=~alarm_out; // alarm_out是音乐信号输出脚,alarm_out反相,产生//方波}/**********定时器1中断用于产生节拍延时***********/void cntint1(void) interrupt 3{cnt++; // 计数初值为0,所以不用赋值}/**************************24c02********************************/void alarm_ring(){uchar i,j,a,t;uint b;if(alarm_on==1) //alarm_on=1 为闹钟有效{if(shi==alarm_shi && fen==alarm_fen && miao==alarm_miao) flag_alarm=1;} //闹钟时间到,闹钟标志位置1 if(flag_alarm==1){alarm_out=~alarm_out;{TMOD=0x11;EA=1; //开总中断ET0=1;ET1=1;cnt=0;TR1=1;i = 0;display_1602_alarm();while(1){//扫描按键如有按键按下退出闹钟if(up==0||down==0){delay2(1);if(up==0||down==0){break;}while(!up);while(!down);}t=tone[i]; //读音调if(t==0xff) break; //0xff是结束符if(t!=0) //0是休止符{b=cyc[t%10-1]; //根据基本音阶,求出半周期数if(t<10) b=b*2; //若是低八度音阶,半周期数加倍if(t>20) b=b/2; //若是高八度音阶,半周期数减半H0=(65536-b)/256; //根据半周期数,计算T0初值的高字节和低字节L0=(65536-b)%256;TR0=1; //启动定时器0发音}cnt=0;a=time[i]; //读节拍while(a>cnt){//扫描按键如有按键按下退出闹钟if(up==0||down==0){delay2(1);if(up==0||down==0){break;}while(!up);while(!down);}}TR0=0;i++;for(b=0;b<1000;b++); //稍加延时,增强节奏感}EA=0;}flag_alarm=0;alarm_out=1; //关闭喇叭lcd1602_init();if(flag_alarm==0||alarm_out!=0){key_set_alarm();}}void Delayms(int ms) //延时函数{while(ms){unsigned char i;for (i=0; i<120; i++);ms--;}}void voice()//发声函数{uchar i,j,t;t=8000;if((fen==59)&&(miao==51))//判断时间符合低音条件{ for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<200;j++);}Delayms(2000);}if((fen==59)&&(miao==53))//判断时间符合低音条件{for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<200;j++);}Delayms(2000);if((fen==59)&&(miao==55))//判断时间符合低音条件{for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<200;j++);}Delayms(2000);}if((fen==59)&&(miao==57))//判断时间符合低音条件{for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<200;j++);}Delayms(2000);}if((fen==59)&&(miao==59))//判断时间符合高音条件{for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<t;j++);}Delayms(2000);}}main(){lcd1602_init();ds18b20_init();ds1302_init();c02_init();while(1){if(done==1){keyjpress();}if(done==0){ //取得并显示日历和时间key_set_alarm();xianshi();alarm_ring();voice();}}}/****************************24C02C.h*****************************/ #ifndef _24c02#define _24c02#endif/*******************************************************************/ #define uchar unsigned char#define uint unsigned int/*************************DS18B20管脚配置***********************/ sbit sda = P1^4; //24c02数据输入输出sbit scl = P1^5; //24c02时钟void c02_delay(){ ;; }void start() //开始信号{sda=1;c02_delay();scl=1;c02_delay();sda=0;c02_delay();}void stop() //停止{sda=0;c02_delay();scl=1;c02_delay();sda=1;c02_delay();}void respons() //应答{uchar i;scl=1;c02_delay();while((sda==1)&&(i<250))i++; //如sda=0或i>250,,跳出scl=0;c02_delay();}void c_init(){sda=1;c02_delay();scl=1;c02_delay();}void c02_write_byte(uchar date) //写一字节{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;c02_delay();sda=CY;c02_delay();scl=1;c02_delay();}scl=0;c02_delay();sda=1;c02_delay();}uchar c02_read_byte() //读一字节{uchar i,k;scl=0;c02_delay();sda=1;c02_delay();for(i=0;i<8;i++){scl=1;c02_delay();k=(k<<1)|sda;scl=0;c02_delay();}return k;}void c02_write_add(uchar address,uchar date) //写{start();c02_write_byte(0xa0);respons();c02_write_byte(address);respons();c02_write_byte(date);respons();stop();}uchar c02_read_add(uchar address) //读{uchar date;start();c02_write_byte(0xa0);respons();c02_write_byte(address);respons();start();c02_write_byte(0xa1);respons();date=c02_read_byte();stop();return date;}六.调试与仿真系统的刚开始时的运行结果如图所示闹铃设置时的结果:闹铃开始时的结果:七.收获与存在的问题收获:存在的问题:八.期望成绩:我的期望成绩是:A+。
基于单片机AT89C51控制的电子时钟课程设计报告
单片机电子时钟设计报告实现功能:显示时、分、秒,刚打开电源时,显示的数据为12:00:00,然后电路会自动开始计时。
电路中有时、分、秒各自单独的调整按钮,时间调整按钮每按一次,相应的显示时间加1。
所需材料:89C51单片机,多位数码管,数码管显示译码器74LS48,3线8线译码器74LS138,3个按钮,100Ω、22KΩ电阻若干,12MHZ晶振一个,30pf无极电容2个,10uf 有极电容一个,敷铜板。
电路设计:用P1端口的P1.0~P1.3来作为数码管显示数据的输出引脚,用P1.4~P1.6引脚作为3线8线译码器的控制输入引脚,用P0端口的P0.0~P0.2来分别作为时、分、秒的时间调整按钮。
当按下按钮时,相应的输入引脚上就会有低电平输入单片机。
3线8线译码器的控制端,Y0、Y1、Y2、Y3、Y4、Y5分别控制了数码管的显示控制线。
电路如下图1-1图1-1流程图:程序设计:ORG 00H 主程序起始地址JMP START 主程序STARTORG 0BH 定时器T0中断起始地址JMP TIM0 定时器T0中断子程序TIM0 START:MOV SP,#70H 设置堆栈指针MOV 28H,#00 设置显示位数扫描指针初值为0 MOV 2AH,#12H 设置时钟显示寄存器初值为12H MOV 2BH,#00 设置分钟显示寄存器初值为00H MOV 2CH,#00 设置秒钟显示寄存器初值为00H MOV TMOD,#01H 设置定时器T0工作在方式1 MOV TH0,#0F0H 定时4ms的初值,即0F060H MOV TL0,#60H 初值的低位MOV IE,#82H 定时器T0中断允许MOV R4,#250 保证后面实现中断250次,即1秒的延时SETB TR0 启动定时器T0LOOP:JB P0.0,N2 若没有按键,就转去下一步检查分CALL DELAY 延时5ms,消除抖动MOV A,2CH 将秒寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2CH,A A的值存入秒寄存器CJNE A,#60H,N1 看是否已经是60秒,若不是就继续检查MOV 2CH,#00 已经是60秒,就清空秒寄存器的值N1:JNB P0.0,$ 秒按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动N2:JB P0.1,N4 若分没有按键,就转去下一步检查分CALL DELAY 延时5ms,消除抖动MOV A,2BH 将分寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2BH,A A的值存入寄存器CJNE A,#60H,N3 看是否已经是60分,若不是就继续检查MOV 2BH,#00H 已经是60分,就清空寄存器的值N3:JNB P0.1,$ 分按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动N4:JB P0.2,LOOP 若时没有按键,就转回去继续检查看是否有按键CALL DELAY 延时5ms,消除抖动MOV A,2AH 将时寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2AH,A A的值存入时寄存器CJNE A,#24H,N5 看是否已经是24时,若不是就继续检查MOV 2AH,#00H 已经是24时,就清空是寄存器的值N5:JNB P0.2,$ 时钟按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动JMP LOOP 返回重新检查看是否有按键******定时器T0中断子程序*******TIM0:MOV TH0,#0F0H 定时初值重设MOV TL0,#60HPUSH ACC 将累加器A的值暂存于堆栈PUSH PSW 将PSW的值暂存于堆栈DJNZ R4,X2 计时中断不满1s就退出继续中断MOV R4,#250 计时1sCALL CLOCK 调用计时器子程序CLOCKCALL DISP 调用显示子程序DISPX2:CALL SCAN 调用扫描子程序SCANPOP PSW 到堆栈取回PSW的值POP ACC 到堆栈取回累加器ACC的值RETI 返回主程序******扫描子程序*******SCAN:MOV R0,#28HINC @R0 显示位数扫描值加1CJNE @R0,#6,X3 扫描位数不为6就准备控制输出MOV @R0,#0 扫描位数为6,就令其置为0X3:MOV A,@R0 扫描位数载入AADD A,#20H A加上20H(显示寄存器地址)=各时间显示区地址MOV R1,A 各时间显示区地址存入AMOV A,@R0 扫描位数存入ASWAP A 将A的高低4位交换(其高4位为扫描的位数,低4位为显示数值)ORL A,@R1 将扫描值与显示数据组合MOV P1,A 显示输出RET******计时子程序*******CLOCK:MOV A,2CH 秒寄存器值载入AADD A,#1 加1sDA A 十进制调整MOV 2CH,A A的值存入秒寄存器CJNE A,#60H,X4 A不等于60秒,就跳出程序去显示MOV 2CH,#00H 已经是60秒,就清0MOV A,2BH 分寄存器值载入AADD A,#1 加1分DA A 十进制调整MOV 2BH,A A的值存入分寄存器CJNE A,#60H,X4 A不等于60分,就跳出程序去显示MOV 2BH,#00H 已经是60分,就清0MOV A,2AH 时寄存器值载入AADD A,#1 加1小时DA A 十进制调整MOV 2AH,A A的值存入时寄存器CJNE A,#24H,X4 A不等于24时,就跳出程序去显示MOV 2AH,#00H 已经是24时,就清0X4:RET******显示子程序*******DISP:MOV R1,#20H 20H为显示寄存器单元MOV A,2CH 将秒寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入20H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入21H显示寄存器单元INC R1MOV A,2BH 将分寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入22H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入23H显示寄存器单元INC R1MOV A,2AH 将时寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入24H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入25H显示寄存器单元RET******延时5ms消除抖动*******DELAY:MOV R6,#60D1:MOV R7,#248DJNZ R7,$DJNZ R6,D1RETEND原理图:PCB图:。
单片机实时时钟课程设计
电路模块设计
最小系统
电路模块设计
时钟电路模块
电路模块设计
显示和声音模块
电路模块设计
红外和按键模块
软件设计
DS1302时钟芯片模块 LCD1602液晶显示模块 红外接收ห้องสมุดไป่ตู้块 按键模块 蜂鸣器模块
谢谢观看
单片机实时时钟课程设计
单片机课程设计
总体设计 电路模块设计 软件设计
总体设计
实时时钟是我们日常生活中常用的电 子计时器之一,但其中存在着很多我们想 要而没有的功能,我的时钟的总体设计有 以下功能:
计时功能 定时功能 声音功能 按键设置功能 遥控设置功能 测温功能(未实现)
总体电路
【精品】毕业设计-基于51系列的单片机进行的实时日历和时钟显示设计
XXXXXXX毕业论文摘要本设计是基于51系列的单片机进行的实时日历和时钟显示设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。
在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。
实时日历和时钟显示的设计过程在硬件与软件方面进行同步设计。
硬件部分主要由AT89S52单片机,LED显示电路,以及调时按键电路等组成,系统通过LED显示数据,所以具有人性化的操作和直观的显示效果。
软件方面主要包括时钟程序、键盘程序,显示程序等。
本系统以单片机的汇编语言进行软件设计,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了,以便更简单地实现调整时间及日期显示功能。
所有程序编写完成后,在wave软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。
关键词:AT89S52; DS1302; LEDAbstractThis design is based on 51 series monolithic integrated circuits of a real-time calendar and the clock shows the design, you can show how and when a week, has may adjust the date and time functions. in the design for monolithic integrated circuits, and peripheral to expand the basic theories of knowledge was fairly comprehensive preparation.Real-time calendar and the clock shows the design in hardware and software design of hardware that is synchronized. the led display at89s52 monolithic integrated circuits, and when should the electrical circuits, the system through the led display data so be humanized operate and intuitive that effect. including the software application programs, the keyboard, the program, etc. This system to monolithic integrated circuits of the assembly language for easily developing software design, and changes, software design to use modular design, the programming logical relationship with more and more so as to realize the time and date display the functions. all procedures in writing after wave of debugging the software and make no question of the proteus software embedded monolithic integrated circuits.Key Words:AT89S52; DS1302; LED目录1概述 (1)2设计方案论证 (2)2.1功能要求 (2)2.2方案确定 (2)2.2.1单片机芯片的选择方案和论证 (2)2.2.2显示模块选择方案和论证 (3)2.2.3时钟芯片的选择方案和论证 (3)2.2.4电路设计最终方案确定 (3)3主控制器和外围器件 (4)3.1AT89S52单片机 (4)3.2DS1302时钟芯片 (4)3.2.1DS1302芯片介绍 (4)3.2.2DS1302的应用 (8)3.3数码管LED (8)3.4译码器74HC138 (9)3.5锁存器74LS244 (9)4硬件设计 (10)4.1电路设计框图 (10)4.2系统概述 (10)4.3电源设计 (10)4.4单片机的复位电路 (11)4.5单片机系统的晶振电路 (11)4.6主电路设计 (12)5软件设计 (13)5.1主程序设计 (13)5.2键盘子程序设计 (14)5.3日历时钟子程序设计 (16)5.4显示子程序设计 (18)6系统调试 (18)6.1软件调试 (18)6.2硬件调试 (19)7结论 (20)致谢 (22)参考文献 (23)附录 (24)附录Ⅰ硬件电路图 (24)附录Ⅱ主程序源代码 (25)附录Ⅲ外文翻译原文.......................................................... 错误!未定义书签。
基于MSP430单片机的实时时钟设计
基于MSP430单片机的实时时钟设计基于MSP430单片机的实时时钟设计是一个简单而有趣的项目,可以将当前的时间以数码管的形式显示出来。
本文将介绍如何使用MSP430单片机和数码管来实现实时时钟,包括时钟芯片、显示部分的接线和编程等方面。
首先,我们需要准备的材料和工具有:1. MSP430单片机开发板(例如MSP-EXP430G2 LaunchPad)2.DS1302实时时钟芯片3.4位共阳数码管(例如TM1640)4.杜邦线若干5.面包板6.12MHz晶振7.调试器和编程软件(例如MSP-FET430UIF和MSP430-GCC)接下来,我们开始进行实时时钟的设计。
1.硬件连接:a.将MSP430单片机开发板连接到计算机,并打开编程软件。
b.将DS1302实时时钟芯片插入面包板,并根据其引脚定义连接到MSP430单片机的端口。
c.将4位共阳数码管插入面包板,并根据其引脚定义连接到MSP430单片机的端口。
2.编程设计:a.在编程软件中创建一个新的项目,选择MSP430单片机的适当型号,并设置时钟频率为12MHz。
b.导入DS1302和TM1640的相关库文件,并进行必要的初始化设置。
c.配置MSP430单片机的端口,使其与DS1302和TM1640的引脚连接匹配。
d.编写程序代码,实现实时时钟的功能,包括获取当前时间、将时间转换为数码管的显示格式以及控制数码管进行显示。
3.调试和测试:a.将MSP430单片机从计算机中断开,并将其与电源连接,确保其正常运行。
b.观察数码管是否正确显示当前时间,包括小时、分钟和秒数。
c.如果有错误或不完善的地方,重新调试和修改程序代码,直到实时时钟正常工作。
通过上述步骤,我们可以成功地设计一个基于MSP430单片机的实时时钟(数码管显示)。
这个项目可以作为学习和实践嵌入式系统和单片机编程的绝佳机会,同时也可以作为一个有用和有趣的作品展示给别人。
这个设计还可以进一步扩展和改进,例如添加日期显示功能、设置闹钟功能等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31
字节静态RAM采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字
节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日星期、月和年,一个月
小于31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5〜5.5V。采用双
LCD_Initial();
Initial_DS1302();
GotoXY(0,0);
Print("Date:");
GotoXY(0,1);
Print("Time:");
while(1)
{
DS1302_GetTime(&CurrentTime);
DateToStr(&CurrentTime);
TimeToStr(&CurrentTime);
电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓 细电流充电的能力。有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)
来替代。需要强调的是,DS1302需要使用32.768KHZ的晶振。
pDE
五、程序源代码
#i nclude <REGX52.H>
#i nclude "LCD1602.h"
{
unsigned char ucData;
DS1302_RST= 0;
DS1302_CLK= 0;
DS1302_RST= 1;
DS1302InputByte(ucAddr|0x01);
//地址,命令
ucData=DS1302OutputByte();
//读1Byte数据
DS1302_CLK= 1;
unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[9];
设置时间函数
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)<<4|(Value%10)));}
DS1302_RST= 0;
}
return(ucData);
//是否写保护
void DS1302_SetProtect(bit flag){
if(flag)
Write1302(0x8E,0x10); else
Write1302(0x8E,0x00);
}
void DS1302_SetTime(unsigned char Address, unsigned char Value)//
要写的数据
DS1302_RST= 0;
DS1302_CLK= 0;
DS1302_RST= 1;
DS1302InputByte(ucAddr);
DS1302InputByte(ucDa);
DS1302_CLK= 1;
DS1302_RST= 0;
}
//地址,命令//写1Byte数据
unsigned char Read1302(unsigned char ucAddr)//读取DS1302某地址的数据
进行了比较和分析,最终确定了采用单片机技术实现电子时钟。本设计应用AT89C52芯片
作为核心,LCD显示屏,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种 实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,I/O引脚的AT89C52单片机。AT89C52单片机是一款低功耗,低
一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域。
AT89C52具有以下主要性能:
1.4KB可改编程序Flash存储器;
2.全静态工作:0——24Hz;
3.128X8字节内部RAM
4.32个外部双向输入/输出(I/O) 口;
5.6个中断优先级;2个16位可编程定时计数器;
6.可编程串行通道;
#i nclude "DS1302.h"
void Delay1ms( un sig ned int count) {
un sig ned int i,j;
for(i=0;i<co un t;i++)
for(j=0;j<120;j++);
} mai n()
{
SYSTEMTIME CurrentTime;
GotoXY(6,0);
Print(CurrentTime.DateString);
GotoXY(6,1);
Print(CurrentTime.TimeString);
Delay1ms(300);
}
}
#ifndef _REAL_TIMER_DS1302
#define _REAL_TIMER_DS1302 typedef struct__SYSTEMTIME__{
unsigned char TimeString[9]; }SYSTEMTIME/;/定义的时间类型
{
ACC=ACC>>1; //相当于汇编中的RRC ACC7=DS1302_IO;
DS1302_CLK= 1;
DS1302_CLK= 0;
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302地址,ucData:
基于51系列单片机及DS1302时钟芯片的实时时钟仿真设计
一、课程设计目的意义
通过本次课程设计可以灵活运用单片机的基础知识,依据课程设计内容,能够完成从硬
件电路图设计,到软件编程及系统调试实现系统功能, 完成课程设计,加深对单片机基 础知识的理解并灵活运用。
二、实现目标
本设计主要为实现一款可正常显示时钟/日历的实时电子时钟。对当前电子钟开发手段
电压,高性能CMO$位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可
反复擦写的只读程序存储器(EPROM,器件采用CMO工艺和ATMEI公司的高密度、非易失
性存储器(NURAM技术制造,其输出引脚和指令系统都与MCS-52兼容。片内的FLASH存储
器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。因此,AT89C52是