单片机仿真课程设计——基于单片机的实时时钟

合集下载

基于单片机的实时时钟设计

基于单片机的实时时钟设计
2.1 电路组成及工作原理............................................................................................4 2.2 硬件部分..........................................................................................................5
整个系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的 精度,将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发 出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进 制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时 计数器”采用24进制计时器,可实现对一天24小时的累计。显示电路将“时”、“分”、“秒 ”计数器的输出,通过六个七段LED显示器显示出来。校时电路是直接加一个脉冲信号 到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整 。
II
毕业设计论文
基于单片机的实时时钟
2.2.4 电压检测电路..................................................................................................9 2.2.5 备用电池功耗问题........................................................................................10 2.2.6 直流稳压电源部分........................................................................................10

基于单片机的实时时钟

基于单片机的实时时钟

目录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位单片机。

基于单片机电子时钟的设计与实现

基于单片机电子时钟的设计与实现

基于单片机电子时钟的设计与实现一、设计目标设计一个基于单片机的电子时钟,能够准确显示时间并能够进行设置和调整。

二、硬件设计1.时钟部分:采用晶振芯片提供准确的时钟信号2.数码管显示部分:使用共阴数码管进行数字显示3.按键部分:设计几个按键用于设置和调整时间4.电源部分:采用直流电源供电三、软件设计1.功能设计a.时间设置功能:通过按键可以设置当前的时间,包括小时、分钟和秒钟。

b.时间调整功能:通过按键可以调整当前的时间,包括小时、分钟和秒钟。

c.时间显示功能:通过数码管可以实时显示当前的时间。

2.代码实现以C语言为例,以下是一个基于单片机的电子时钟的代码实现示例:```c#include <reg51.h>sbit DS18B20=P1^3; // 定义18B20数据线接口sbit beep=P2^3; // 定义蜂鸣器接口unsigned char hour,min,sec; // 定义小时、分钟、秒钟变量//函数声明void Delay_1ms(unsigned int count);bit Ds18b20Init(;unsigned char Ds18b20ReadByte(;void ReadTime(;void WriteTime(;void DisplayTime(;//主函数void mainP2=0x00;WriteTime(; // 写入时间while(1)ReadTime(; // 读取时间DisplayTime(; // 显示时间Delay_1ms(1000); // 延时1秒}//毫秒延时函数void Delay_1ms(unsigned int count) unsigned int i, j;for(i=0; i<count; i++)for(j=0; j<1275; j++);//18B20初始化函数bit Ds18b20Initbit presence;DS18B20=0;Delay_1ms(100); // 延时450us~1000us DS18B20=1;Delay_1ms(10); // 延时15us~60us presence=DS18B20;Delay_1ms(30); // 延时60us~240us return presence;//18B20读取字节函数unsigned char Ds18b20ReadByte unsigned char i, dat;for(i=0; i<8; i++)DS18B20=0;//主机发起读时序_nop_(; // 延时1us_nop_(; // 延时1us_nop_(; // 延时1usDS18B20=1;//主机释放总线_nop_(; // 延时1us_nop_(; // 延时1us_nop_(; // 延时1usdat,=(DS18B20<<i); // 读取数据位,存放在dat变量中Delay_1ms(3); // 读时序完成后等待48us再接收下一位}return dat;//读取时间函数void ReadTimeunsigned char temp;temp=0x00;while(temp!=0xaa)Ds18b20Init(; // 初始化温度传感器Delay_1ms(1);DS18B20=0xcc;Delay_1ms(1);DS18B20=0xbe;Delay_1ms(1);temp=Ds18b20ReadByte(; // 读取时间数组的标志位}for(temp=0; temp<7; temp++)//写入时间函数void WriteTimeunsigned char i,j;while(1)Ds18b20Init(;Delay_1ms(1);DS18B20=0xcc;Delay_1ms(1);DS18B20=0x4e;Delay_1ms(1);for(i=0; i<7; i++)DS18B20=0x55;Delay_1ms(1);DS18B20=0xaa;Delay_1ms(1);Ds18b20Init(;Delay_1ms(1);DS18B20=0xcc;Delay_1ms(1);DS18B20=0x48;Delay_1ms(1);j=Ds18b20ReadByte(; // 判断是否写入成功if(j==0x0a)break;}//显示时间函数void DisplayTimeP1=seg[hour/10]; // 显示十位小时P2=(P2&0xf0),0x08; // 点亮第一个数码管Delay_1ms(5); // 延时一段时间P2=0x0f;//熄灭数码管P1=seg[hour%10]; // 显示个位小时P2=(P2&0xf0),0x04; // 点亮第二个数码管Delay_1ms(5); // 延时一段时间P2=0x0f;//熄灭数码管P1=seg[min/10]; // 显示十位分钟P2=(P2&0xf0),0x02; // 点亮第三个数码管Delay_1ms(5); // 延时一段时间P2=0x0f;//熄灭数码管P1=seg[min%10]; // 显示个位分钟P2=(P2&0xf0),0x01; // 点亮第四个数码管Delay_1ms(5); // 延时一段时间P2=0x0f;//熄灭数码管P1=0x00;//空显示P2=0x00;//熄灭数码管```四、总结通过以上的硬件设计和软件实现,可以实现一个基于单片机的电子时钟。

基于51单片机的实时时钟设计报告

基于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)摘要单片计算机即单片微型计算机。

单片机时钟显示课程设计

单片机时钟显示课程设计

单片机时钟显示课程设计一、课程目标知识目标:1. 学生能理解单片机的基本原理,掌握时钟显示电路的组成与功能。

2. 学生能描述时钟显示的编程方法,理解相关寄存器的作用和使用方法。

3. 学生了解实时时钟(RTC)的工作原理,能读取和设置时钟数据。

技能目标:1. 学生具备使用编程软件进行单片机程序设计的能力,能够编写简单的时钟显示程序。

2. 学生能够正确连接和调试时钟显示电路,排除基本故障。

3. 学生掌握利用单片机进行时间计算与显示的基本技巧。

情感态度价值观目标:1. 学生通过实际操作,培养对单片机编程和电路设计的兴趣,增强创新意识和实践能力。

2. 学生在团队协作中,学会相互交流、探讨,培养合作精神和问题解决能力。

3. 学生认识到单片机技术在实际应用中的重要性,增强学习责任感和社会责任感。

课程性质:本课程为实践性较强的课程,结合理论知识,注重培养学生的动手能力和实际操作技能。

学生特点:学生处于高年级阶段,具备一定的单片机基础知识,具备独立思考能力和动手操作能力。

教学要求:教师需采用任务驱动法,引导学生主动探究,注重理论与实践相结合,提高学生的实际应用能力。

通过课程目标的分解,使学生在完成具体学习成果的过程中,达到课程目标的全面实现。

二、教学内容1. 单片机基础知识回顾:主要包括单片机的基本结构、工作原理、寄存器功能等,为学生编写时钟程序打下基础。

(对应教材第1章)2. 时钟显示电路设计:详细讲解时钟电路的组成、原理,包括晶振、RTC、显示模块等,指导学生进行电路连接和调试。

(对应教材第3章)3. 编程软件使用:介绍编程软件的使用方法,指导学生进行程序编写、编译和下载,掌握单片机编程的基本技巧。

(对应教材第2章)4. 时钟显示程序设计:分析时钟显示程序的结构,讲解相关寄存器的设置和使用,引导学生编写并优化程序。

(对应教材第4章)5. 实践操作:组织学生进行实际操作,包括电路连接、程序编写、调试等,培养学生动手能力和问题解决能力。

单片机课程设计实验报告 基于单片机的数字时钟 含完整实验代码..

单片机课程设计实验报告 基于单片机的数字时钟 含完整实验代码..

单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的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的单片机实时时钟的仿真设计的毕业设计

毕业设计论文作者学号系部专业题目基于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.其他功能:根据实际需求可以添加更多的功能,如自动亮度调节、温度显示等。

四、总结基于单片机的时钟设计具有灵活、可扩展性强的特点,可以根据用户需求自定义各种功能。

通过合理的硬件设计和软件编程,可以实现实时时间显示、闹铃功能和定时器功能等。

这种设计不仅能满足人们对时钟的基本需求,还能提供更多的便利功能。

总之,基于单片机的时钟设计是一种相对成熟和常见的设计,通过合理的硬件布局和软件编程,可以实现各种功能,满足人们对时钟的需求。

单片机仿真课程设计——基于51单片机的实时时钟

单片机仿真课程设计——基于51单片机的实时时钟

基于51系列单片机及DS1302时钟芯片的实时时钟仿真设计一、课程设计目的意义通过本次课程设计可以灵活运用单片机的基础知识,依据课程设计内容,能够完成从硬件电路图设计,到软件编程及系统调试实现系统功能,完成课程设计,加深对单片机基础知识的理解并灵活运用。

二、实现目标本设计主要为实现一款可正常显示时钟/日历的实时电子时钟。

对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现电子时钟。

本设计应用AT89C52芯片作为核心,LCD显示屏,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。

这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。

三、硬件设计本设计采用具有32根I/O引脚的AT89C52单片机。

AT89C52单片机是一款低功耗,低电压,高性能CMOS 8位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-52兼容。

片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。

因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域。

AT89C52具有以下主要性能:1.4KB可改编程序Flash存储器;2.全静态工作:0——24Hz;3.128×8字节内部RAM;4.32个外部双向输入/输出(I/O)口;5.6个中断优先级; 2个16位可编程定时计数器;6.可编程串行通道;7.片内时钟振荡器。

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。

基于单片机AT89C51的实时时钟设计

基于单片机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控制的电子时钟课程设计报告

基于单片机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液晶显示模块 红外接收ห้องสมุดไป่ตู้块 按键模块 蜂鸣器模块
谢谢观看
单片机实时时钟课程设计
单片机课程设计
总体设计 电路模块设计 软件设计
总体设计
实时时钟是我们日常生活中常用的电 子计时器之一,但其中存在着很多我们想 要而没有的功能,我的时钟的总体设计有 以下功能:
计时功能 定时功能 声音功能 按键设置功能 遥控设置功能 测温功能(未实现)
总体电路

基于MSP430单片机的实时时钟设计

基于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. 学生能了解仿真软件的使用,并运用其完成单片机秒表的模拟。

技能目标:1. 学生能运用已学知识,独立完成单片机秒表的编程;2. 学生能通过仿真软件对编写好的程序进行测试,并优化程序;3. 学生能培养实际操作能力,将理论知识应用于实践。

情感态度价值观目标:1. 学生培养对单片机编程的兴趣,激发创新意识和探索精神;2. 学生在团队协作中,提高沟通能力,培养合作精神;3. 学生通过课程学习,认识到科技发展对社会的重要性,增强社会责任感。

课程性质:本课程为实践性较强的课程,结合理论知识,培养学生的实际操作能力和创新思维。

学生特点:学生具备一定的单片机基础知识,对编程有初步了解,对实际操作有较高的兴趣。

教学要求:教师需结合学生特点,以引导为主,注重培养学生的动手能力和团队协作能力,将理论知识与实践相结合,提高学生的综合素养。

通过课程目标的分解,使学生在课程结束后能够达到预定的学习成果。

二、教学内容1. 单片机基础原理回顾:复习单片机的内部结构、工作原理及指令系统,重点掌握定时器/计数器的工作机制。

相关教材章节:第一章单片机概述,第二章单片机内部结构及工作原理,第三章指令系统及编程。

2. 秒表功能分析:详细讲解秒表的原理,包括秒、分、时的计数关系,以及如何通过单片机的定时器实现计时功能。

相关教材章节:第四章定时器/计数器,第六章单片机应用实例。

3. 单片机编程实现:教授如何使用汇编语言或C语言编写单片机程序,实现秒表的基本功能。

相关教材章节:第五章编程语言及编程技巧。

4. 仿真软件操作:介绍仿真软件的使用方法,使学生能够利用仿真软件对编写好的程序进行调试和优化。

相关教材章节:第七章仿真软件的使用。

5. 实践操作:指导学生进行实际操作,分组完成单片机秒表的编程、仿真和调试,培养学生的动手能力和团队协作精神。

基于单片机的实时日历时钟显示系统

基于单片机的实时日历时钟显示系统

基于单片机的实时时钟显示系统设计摘要20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。

对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。

数码管显示的时间简单明了而且读数快、时间准确显示到秒。

而机械式的依赖于晶体震荡器,可能会导致误差。

数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。

数字钟的精度、稳定度远远超过老式机械钟。

在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,定时器计数。

在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。

数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。

关键字:数字电子钟单片机AbstractThe late 20th century, electronic technology has been rapid development in its promotion,penetration of modern electronic products will almost Fields, a strong impetus to the development of social productive forces and social improvement in the level of information, while also further improve the performance of modern electronic products, replacement products have become increasingly fast pace.Growing emphasis on modern life from the time the concept of time and money can be said to draw the equal sign. For those who are very strict and accurate grasp of time and things, time will not exactly bring a very big trouble, so as to control the display of digital clock than the clock pointer showed a big advantage. Digital display of time reading simple and fast, accurate display of time to seconds. The mechanical oscillator depends on the crystal may lead to errors.Digital Clock is a digital circuit implementation of the "when", "sub", "seconds" The figures show the timing device. Digital clock precision, stability, far more than the old mechanical clock. In this design, we use LED digital display hours, minutes, seconds, to 24-hour time mode, according to digital control theory to dynamic display to display, use the 12MHz crystal oscillation pulse, the timer count. In this design, the circuit has a display time of the this function, you can also realize the time adjustment. Digital clock is its compact, low cost, travel time and high precision, easy to use, features and more, easy integration and loved by the general consumer, so widely used.Keywords: digital electronic clock SCM前言本例的功能是在51单片机系统中设置,获取,记录实时的日历时钟信息并通过数码管显示,要求能够进行长时间的记录,并且存储的时间信息在掉电情况下至少保存10年以上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define _REAL_TIMER_DS1302
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的晶振。
void DS1302InputByte(unsigned char d)//实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0;//相当于汇编中的RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
unsigned char DateString[9];
unsigned char TimeString[9];
}SYSTEMTIME;//定义的时间类型
#define AM(X)X
#define PM(X)(X+12)//转成24小时制
#define DS1302_SECOND0x80
#define DS1302_MINUTE0x82
DS1302_CLK = 0;
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302地址, ucData:要写的数据
typedef struct __SYSTEMTIME__
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
#define DS1302_HOUR0x84
#define DS1302_WEEK0x8A
#define DS1302_DAY0x86
#define DS1302_MONTH0x88
#define DS1302_YEAR0x8C
#define DS1302_RAM(X)(0xC0+(X)*2)//用于计算DS1302_RAM地址的宏
}
main()
{
SYSTEMTIME CurrentTime;
LCD_Initial();
Initial_DS1302();
GotoXY(0,0);
Print("Date: ");
GotoXY(0,1);
Print("Time: ");
while(1)
{
DS1302_GetTime(&CurrentTime);
DateToStr(&CurrentTime);
TimeToStr(&CurrentTime);
GotoXY(6,0);
Print(CurrentTime.DateString);
GotoXY(6,1);
Print(CurrentTime.TimeString);
Delay1ms(300);
}
}
#ifndef _REAL_TIMER_DS1302
三、硬件设计
本设计采用具有32根I/O引脚的AT89C52单片机。AT89C52单片机是一款低功耗,低电压,高性能CMOS 8位单片机,片内含4KB(可经受1000次擦写周期)的FLASH可编程可反复擦写的只读程序存储器(EPROM),器件采用CMOS工艺和ATMEI公司的高密度、非易失性存储器(NURAM)技术制造,其输出引脚和指令系统都与MCS-52兼容。片内的FLASH存储器允许在系统内可改编程序或用常规的非易失性存储器编程器来编程。因此,AT89C52是一种功能强,灵活性高且价格合理的单片机,可方便的应用在各个控制领域。
ACC = ACC >> 1;
}
}
unsigned char DS1302OutputByte(void)//实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;//相当于汇编中的RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
基于51系列单片机及DS1302时钟芯片的实时时钟仿真设计
一、课程设计目的意义
通过本次课程设计可以灵活运用单片机的基础知识,依据课程设计内容,能够完成从硬件电路图设计,到软件编程及系统调试实现系统功能,完成课程设计,加深对单片机基础知识的理解并灵活运用。
二、实现目标
本设计主要为实现一款可正常显示时钟/日历的实时电子时钟。对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现电子时钟。本设计应用AT89C52芯片作为核心,LCD显示屏,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
相关文档
最新文档