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

合集下载

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

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

目录第一章绪论 (3)第二章设计要求及设计框图 (4)2.1 设计要求 (4)2.2 设计框图 (4)第三章知识要点 (4)3.1 LMO16L液晶模块 (4)3.1.1 LM016L引脚说明 (5)3.1.2 控制指令 (5)3.1.3 基于Proteus ISIS 7的液晶模块仿真 (6)3.2 单片机A T89C51 (8)3.2.1 主要特性 (8)3.2.2 管脚说明 (9)3.2.3 振荡器特性 (11)3.2.4 芯片擦除 (11)3.3 时钟芯片DS1302 (11)3.3.1 DS1302的控制字节 (12)3.3.2 数据输入输出(I/O) (12)3.3.3 DS1302的寄存器 (12)3.4 DS18B20数字温度传感器 (13)3.4.1技术性能描述 (13)3.4.2 DS18B20主要的数据部件 (14)3.4.3 DS18B20温度处理过程 (15)3.4.4 DS18B20的主要特性 (17)3.4.5 DS18B20的外形和内部结构 (17)3.4.6 DS18B20工作原理 (18)3.4.7 DS18B20的应用电路 (21)3.4.8 DS18B20使用中注意事项 (23)第四章硬件设计 (24)4.1 Proteus软件 (24)4.1.1 Proteus软件介绍 (24)4.1.2 功能特点 (24)4.1.3 革命性的特点 (24)4.1.4 基本操作 (25)4.1.5 选择要使用的元件 (25)4.1.6 功能模块 (26)4.2 基于89C51的万年历与温度显示器的硬件设计 (28)4.2.1 设计框图 (29)4.2.2 电路原理图 (29)4.3 元件清单 (30)第五章软件设计 (30)5.1 Keil软件 (30)5.1.1 Keil软件介绍 (30)5.1.2Keil C51单片机软件开发系统的整体结构 (31)5.1.3 使用独立的Keil仿真器时的注意事项 (31)5.1.4 Keil的优点 (31)5.2 程序流程 (32)5.3 程序清单 (32)第六章系统仿真及调试 (38)第七章设计心得体会 (39)参考文献 (40)第一章绪论目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

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

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

基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。

51 单片机作为核心控制器,负责整个系统的运行和数据处理。

时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。

二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。

2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。

3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。

4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。

三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。

然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。

接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。

2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。

3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。

4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。

四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。

在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。

设置完成后,将新的时间数据保存到时钟芯片中。

五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。

通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。

六、系统调试在完成硬件和软件设计后,需要对系统进行调试。

基于51单片机的液晶显示万年历设计

基于51单片机的液晶显示万年历设计

基于51单片机的液晶显示万年历设计摘要随着社会的进步和发展,电子万年历作为日常计时工具被广泛地应用。

此电子万年历在硬件方面主要采用STC89C51单片机作为主控核心,由DS1302时钟芯片提供时钟及1602LCD液晶显示屏显示。

STC89C51单片机是由宏晶公司公司生产的,功耗小,电压可选用3.4v~5.5v电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;对于数字电子万年历采用直观的数字显示,数字显示是采用的1602LCD液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒、温度等信息。

此外,该电子万年历在软件方面主要包括日历程序、时间调整程序,显示程序等。

所有程序编写完成后,在Kei l软件中进行调试,确定没有问题后,烧写到单片机上进行测试。

本次课程设计主要由时钟芯片DS1302和温度传感器DS18B20采集数据到单片机进行处理再通过LCD1602显示出来,本设计主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较。

关键词:单片机;DS1302;DS18B20;LCD1602--ABSTRACTWith the social progress and development, Electronic calendar is widely used as a dailytiming tool. The electr oniccalendarinhardware using STC89C51microcon troller as themain controlcenter, provided by the DS1302 clock chipand 1602LCD LCD display.STC89C51mic rocontroller is produced by themacrocrystal company, small power consumption,the voltagecan bechoosen among 3.4V ~5.5V for power supply;DS1302clock chip is alowpower real-time clockchip produced by DALLAS, it canbe atimeofyears,months,days,weeks,hours,minute s,seconds, andDS1302 hasa longservicelife.The error issmall;forthe digital electronic calendarusi ngvisual digitaldisplay,1602LCDdigital display is used todisplay LCD screenthat candisplay years,mo nths, days, weeks, hours,minutes and seconds, temperat ureandother information. In addition,the electronic calendar mainly includescalendarprogram,time to adjus tprocedures,displayprogram etc insofeware. After the completionof all the procedures,in theKeil softwa redebugging, determine no problem after,and burning to themicrocontrollertest.--The curriculum design mainly bytheclock chip DS1302andtemperaturesensor DS18B20 collectingdata to the microcontrollerfor processing andthen through the LCD1602 display, thisdesign mainly studies the liquid crystal display LCD and theclockchip DS1302, thehardware connection and communication betweenthete mperature sensorDS18B20 and the MCU, a number of hardwareconnection scheme foradetailed comparison.Key words:SCM,DS1302,DS18B20,LCD1602--目录1-第一章绪论ﻩ-1.1 单片机的概述ﻩ-1-1.1.1 单片机的概念ﻩ-1-1.1.2单片机的特点 --------------------------------------------------------------------------------- -1-1.2 课题背景 ---------------------------------------------------------------------------------------------------- -1-1.3 课题内容 ----------------------------------------------------------------------------------------------- -2- 第二章设计要求和方案 ----------------------------------------------------------------------- 错误!未定义书签。

(完整版)基于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 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。

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

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

基于MCS-51单片机的万年历设计摘要】:基于MCS-51单片机的万年历设计,利用时钟芯片DS1302,单片机的I/O口外接液晶12864,通过软件模拟的方法,从而使得液晶12864显示所需的字符。

【关键词】单片机时钟芯片DS1302 液晶128641、引言单片机是一种可通过编程控制的微处理器,单片机芯片自身不能单独运用于某项工程或者产品上,它必须要依靠外围数字器件或模拟器件的协调才可以发挥其自身的强大功能,本文介绍如何使用DS1302,实现显示万年历的效果。

2、硬件组成液晶12864显示系统实际是由51单片机最小系统、液晶12864、DS1302等构成,如下图1所示。

3、程序设计#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit clk=P3^5; //7sbit io=P3^7; //6sbit rst=P3^6; //5sbit cs=P2^0; //4脚sbit sid=P2^1; //5脚sbit sclk=P2^2; //6脚void read_time()//读1302全部时间{ uchar temp;temp=read_1302(0x81);//读秒.bcd编码curr.sec=(((temp>>4)&0x07)*10+(temp&0x0f));temp=read_1302(0x83);//读分.bcd编码curr.min=((temp>>4)&0x07)*10+(temp&0x0f);//秒钟显示temp=read_1302(0x85);//读时.bcd编码24小时curr.hr=((temp>>4)&0x03)*10+ (temp&0x0f);temp=read_1302(0x87);//读日.bcd编码24小时curr.date=((temp>>4)&0x03)*10+ (temp&0x0f);temp=read_1302(0x89);//读月.bcd编码24小时curr.mon=((temp>>4)&0x01)*10+ (temp&0x0f);temp=read_1302(0x8b);//读周.bcd编码24小时curr.week= (temp&0x0f);temp=read_1302(0x8d);//读年.bcd编码24小时curr.year=((temp>>4))*10+ (temp&0x0f);}void show_time(){ uchar buf[9];LCD_drive(0,0x91); //年LCD_drive(1,(curr.year)/10+48);LCD_drive(1,(curr.year)%10+48);LCD_drive(0,0x93);//月LCD_drive(1,(curr.mon)/10+48);LCD_drive(1,(curr.mon)%10+48);LCD_drive(0,0x95); //日LCD_drive(1,(curr.date)/10+48);LCD_drive(1,(curr.date)%10+48);//LCD_drive(0,0x87); //小时,分中,秒钟buf[0]=(curr.hr)/10+48;buf[1]=(curr.hr)%10+48;buf[2]=':';buf[3]=(curr.min)/10+48;buf[4]=(curr.min)%10+48;buf[5]=':';buf[6]=(curr.sec)/10+48;buf[7]=(curr.sec)%10+48;buf[8]=0;show_string(0x88,buf); //???LCD_drive(0,0x9a);LCD_drive(1,(curr.week)+48); //星期}void show_static()//静态部分显示{ show_string(0x80,"实时时钟");show_string(0x90,"20 年月日");show_string(0x98,"星期");}void main(){ uchar temp;uchar sec;//真正的秒钟LCD_init();show_string(0x80,"DS1302时钟");spi_portinit();//端口初始化write_1302(0x8e,0);//取消DS1302的写保护write_1302(0x80,0x12);//秒钟初值show_static();while(1){ read_time();show_time();}}4、结束当上述程序编写好之后,我们需要使用编译软件对其编译,得到单片机能识别的二进制代码,然后再用编程器将二进制代码烧写到单片机中,就能看到液晶12864的显示万年历。

基于51单片机GPS自动校时的万年历设计方案

基于51单片机GPS自动校时的万年历设计方案

3 硬件设计
HARDWARE DESIGN
3.1 系统概述
本系统由51单片机、DS1302时钟芯片、1062液晶显示器、DS18B20温度测量、键盘、蜂鸣器 系统等部分构成。软件部分在keil环境下用C51语言编写,包括时间设置、时间显示、定时设置、 定时闹钟、温度显示。原理框图如下:
3.2 系统框图
蜂鸣器设置:蜂鸣器报警时,设置响100毫秒,停100毫秒,循环响应,产生滴滴的声音。
液晶显示的设置:写入指令码write_com(0x38),设置功能16*2显示,5*7点阵,8位数据接口显 示/开关及光标设置8)写入指令码write_com(0x0c),设置开显示,不显示光标,光标不闪烁。 16)写入指令码write_com(0x06),设置当读或写一个字符后地址指针加一,且光标加一。当写 一个字符,整屏显示不移动。显示清屏,写入指令码write_com(0x01)。
写入指令码函数write_com()写指令过程 :输入:rs=0,D0-D7=指令码,E=高脉冲写入数据 函数 write_date() 写指令过程: 输入:rs=1,D0-D7=数据,E=高脉冲写入指令和数据时rw 端已经接地。数据指针设置 指令码80H+地址码(0-27H)显示第一行的字符指令码80H+地址码 (40H-67H)显示的第二行字符
本时钟还具有环保、走时无噪音、低功耗等非实时时钟不具有的功能。该实时时钟不但可以作 为家用,而且更可以在公共场合使用,如车站、码头、商场等场所。
2 总体方案
GENERAL PLANNING
本方案所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容
包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功 耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。

基于51单片机的电子万年历设计毕设答辩

基于51单片机的电子万年历设计毕设答辩
基于51单片机的电子万年历设计
答 辩 人: 学 号:
CONTENTS
1 研究意义 2 研究内容 3 调试分析 4 课题总结
1 研 究 意 义 RESEARCH SIGNIFICANCE
在日新月异的21世纪里,家用电子产品得到了迅速发展。 许多家电设备都趋于人性化、智能化,这些电器设备大部分 都含有CPU控制器或者是单片机。本设计的电子万年历属于小 型智能家用电子产品。利用单片机进行控制,实时时钟芯片 进行记时,外加掉电存储电路和显示电路,可实现时间的调 整和显示。电子万年历既可广泛应用于家庭,也可应用于银行、 邮电、宾馆、医院、学校、企业、商店等相关行业的大厅, 以及单位会议室、门卫等场所。因而,此设计具有相当重要 的现实意义和实用价值。
从 1302 中读出年、 周、月、日、[小]时、 分、秒
将 BCD 码 高 低 位 分 离,送显示缓冲单元
3 调试分析
DEBUG ANALYSIS
调试分为硬件调试和软件调试。硬件调试主要是检测硬 件电路是否有短路、断路、虚焊等。DS1302的硬件电路很简 单,只通过3根线与单片机相连,很容易检测,主要是检查其 引脚,如晶振和电源等是否接好。另外可以通过软件来调试 硬件,如为了测试显示电路连接是否正确,可以编写一个简 单的显示程序来测试它。接下来可进行软件调试,可以编写 只含DS1302的计时和读写程序、显示程序,测试DS1302是否 正常工作。最后调试时间调整程序和阴历推算程序。
2 研 究 内 容 RESEARCH CONTENTS
本设计以AT89S52单片机为核心,构成单片机控制电路, 结合DS1302时钟芯片和24C02FLASH存储器,显示阳历年、月、 日、星期、时、分、秒和阴历年、月、日,在显示阴历时间 时,能标明是否闰月,同时完成对它们的自动调整和掉电保 护,全部信息用液晶显示。人机接口由三个按键来实现,用 这三个按键对时间、日期可调,并可对闹铃开关进行设置。 软件控制程序实现所有的功能。整机电路使用+5V稳压电源, 可稳定工作。系统框图如图1所示。

基于51单片机的12864液晶显示的万年历

基于51单片机的12864液晶显示的万年历

附录程序
/*****************说明*********************************** 基于 51 单片机的 12864 液晶显示的万年历
版权所有,如需转载请通知本人,不得用于商业用途 ,仅限学习交流之用
*****************************************************************/
3
图-1 主控制系统
2.3.2 时钟电路模块的设计 DS1302 是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、
时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进 行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一 个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容, 但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
//延时 1MS/次
unsigned char
{
sec,min,hour,day,month,year,cen,week,
unsigned char i;
next,aa,bb,cc,dd,mm,temp0,LunarMonth,
while(--a)
LunarDay,LunarYear;
{
int temp;
9三三系统的软件设计系统的软件设计3131程序流程框图程序流程框图图图aa主程序流程图主程序流程图10图b计算阳历程序流程图计算阳历程序流程图1112图图cc时间调整程序流程图时间调整程序流程图yynnyynnyy图图dd设置温度报警闹钟的数据保存到设置温度报警闹钟的数据保存到at24c02at24c02中中是否进入温度报警上下限温度设置设置是否进入设置闹钟时间设置报警温度上下限开始设置闹钟的时间开始报警闹钟的开关是否开起at24c02存设置的功能保蜂鸣器开启闹钟报警功能开启结束设置13五五作品功能实现作品功能实现通过硬件的焊接与程序的编写本电子万年历终于完成了实现的功能如下
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程实训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 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。

二、MCS-51单片机系统简介MCS-51系列单片机产品都是以Intel公司最早的典型产品8051为核心构成的。

MCS-51单片机由CPU 、RAM 、ROM 、I/O接口、定时器/计数器、中断系统、内部总线等部件组成。

8051单片机的基本性能有:◆8位CPU;◆布尔代数处理器,具有位寻址能力;◆128B内部RAM,21个专用寄存器;◆4KB内部掩膜ROM;◆2个16位可编程二进制加1定时器/计数器;◆32个(4×8位)双向可独立寻址的I/O口;◆1个全双工UART(异步串行通信口);◆5个中断源,两级中断结构;◆片内振荡器及时钟电路,晶振频率为1.2MHz~12MHz;◆外部程序/数据存储器寻址空间均为64KB;◆111条指令,大部分为单字节指令;◆单一+5V电源供电,双列直插40引脚DIP封装。

三、设计思想整体设计以单片机技术为核心,采用C语言进行软件设计,增加了程序的可读性和可移植性,为了便于扩展和更改,软件的设计采用模块化结构。

程序先向LCD更新时钟芯片的时间与温度传感器的时间,然后进行初始化工作。

程序由一个主函数,两个定时器中断程序,一个时钟设置子程序,一个农历设置子程序,一个温度设置子程序,一个延时子程序,一个调时子程序,一个显示子程序构成。

程序通过按键扫描程序来确定是否调用中断程序来对时间进行调整。

用一子程序完成时分的调整,通过循环扫描四个按键的电平变化来判断对应按键是否按下,并带有去抖动功能,四个按键分别有增加,减小,退出与功能选择的作用。

通过功能选择时钟设置与闹钟设置,使用加或减按键进行预置,完成后可点退出键完成操作。

可分为以下几个功能模块:1)主程序:定时器中断初始化、时钟与温度更新程序与键盘监控。

2)计时:为定时器中断服务子程序,完成刷新计时缓冲区的功能。

3)农历:由阴历换算对照表得出阳历并显示。

4)闹钟:采用定时器中断方式实现闹钟与整点报时。

5) 温度:由温度传感器将温度传送到LCD显示。

6)设置:由按键设置闹钟时间或时钟时间。

7)键盘扫描:判断是否有键按下,并确定键号。

8)LCD显示:完成8位动态显示。

四、硬件电路设计1. 总体设计系统包括单片机主控模块,温度传感器采集模块,日历时钟模块,按键调整模块,蜂鸣器模块,闹钟模块。

如图1所示为系统设计图。

图1 系统设计图如图2所示为系统仿真图。

图2 系统仿真图2. 晶振电路如图3所示,51单片机的内部有一个用于构成振荡器的高增益反相放大器,它的输入端为XTAL1引脚,输出端为XTAL2引脚,两个跨接石英晶体及两个电容就可以构成稳定的自激振荡器。

电容器通常取30pF左右。

图3 晶振电路图4 复位电路3. 复位电路往单片机的复位引脚上输入24个时钟周期以上的高电平,即执行复位操作。

按键复位是指系统在运行时,按下一个开关,就能在RST引脚产生一段时间的高电平,使系统复位,常见的按键复位电路如图4所示。

对12MHz晶振频率而言,电路中C取10pF,R取1KΩ。

4. DS1302时钟电路DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

图5示出DS1302的引脚排列,其中Vcc1为后备电源,Vcc2为主电源。

在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302由Vcc1或Vcc2两者中的较大者供电。

当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。

当Vcc2小于Vcc1时,DS1302由Vcc1供电。

X1和X2是振荡源,外接32.768KHz晶振。

RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST 输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中RSTS 置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电动行时,在Vcc 大于等于2.5V之前,RST必须保持低电平。

中有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。

SCLK始终是输入端。

图5 DS1302时钟芯片图6 温度采集系统电路5. 温度采集系统电路在本万年历当中温度的采集采用数字温度传感器DS18B20。

它属于单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

具有如下的经济特点:(1)只要求一个端口即可实现通信。

(2)在DS18B20中的每个器件上都有独一无二的序列号。

(3)实际应用中不需要外部任何元器件即可实现测温。

(4)测量温度范围在-55。

C到+125。

C之间。

(5)数字温度计的分辨率用户可以从9位到12位选择。

(6)内部有温度上、下限告警设置。

如图6所示。

6. 按键调整电路按键采用4个独立的按键,一个功能键、一个退出键、一个加按键、一个减按键通过这四个按键可以来合理的设置时钟的调整和闹铃的设置等。

如图7所示与51单片机的P0.0~P0.3的连接示意图。

图7 按键调整电路7. 闹钟提示电路当到达整点时或者当前的时间等于51单片机中设置闹钟时间时蜂鸣器便会发出声音进行提示。

与单片机P0.5引脚的连接电路如图8所示。

图8 闹钟提示电路图9 LCD显示电路8. LCD显示电路在本万年历当中12864液晶显示当前的实时时间重要的阴阳历节日等功能。

12864液晶具有如下的特性:1)提供8位,4位并行接口及串行接口可选2)并行接口适配M6800时序3)自动电源启动复位功能4)内部自建振荡源64×16位字符显示RAM(DDRAM最多16字符×4行,LCD显示范围16×2行)(改为半角输入) 2M位中文字型ROM(CGROM),总共提供8192个中文字型(16×16点阵)16K位半宽字型ROM(HCGROM),总共提供126个西文字型(16×8点阵)64×16位字符产生RAM(CGRAM)15×16位总共240点的ICONRAM(ICONRAM)其与单片机的连接电路如图9所示。

五、软件设计框图1. 主程序流程图:2. 阴阳历转换流程图:六、程序源代码1. 主程序#include < reg52.h >#include < nongli.h >#include < lcd.h >#include < shezhi.h >#include < time.h>#include < wendu.h >#include < key.h >#define uchar unsigned char#define uint unsigned int/******************************************************************** sbit bell = P2 ^ 0; //定义蜂鸣器端口/******************************************************************** 定时器设置整点报时********************************************************************/ void Timer0_Service() interrupt 1{static uchar count = 0;static uchar flag = 0; //记录鸣叫的次数count = 0;TR0 = 0; //关闭Timer0TH0 = 0x3c;TL0 = 0XB0; //延时 50 msTR0 = 1 ; //启动Timer0count ++;if( count == 20 ) //鸣叫 1 秒{bell = ~ bell;count = 0;flag ++;}if( flag == 6 ){flag = 0;TR0 = 0; //关闭Timer0}}/******************************************************************** 中断服务程序整点报时一分钟********************************************************************/ uchar HexNum_Convert(uchar HexNum)//将16进制数转换成十进制数{uchar Numtemp;Numtemp=(HexNum>>4)*10+(HexNum&0X0F);return Numtemp;}/******************************************************************** * 函数名称:main()* 功能:* 入口参数:* 出口参数:********************************************************************/ void main( void ){uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定义时间变量秒分时日月年uchar alarm_time[2] = { 10, 06}; //闹钟设置alarm_time[0]: 分钟 alarm_time[1] :小时uchar temperature[2]; //定义温度变量 temperature[0] 低8位temperature[1] 高8位Lcd_Initial(); //LCD初始化Clock_Fresh( clock_time ); //时间刷新Clock_Initial( clock_time ); //时钟初试化/***********************中断初始化***************************/EA = 1; //开总中断ET0 = 1; //Timer0 开中断ET2 = 1; //Timer2 开中断TMOD = 0x01 ; //Timer0 工作方式 1RCAP2H = 0x3c;RCAP2L = 0xb0; //Timer2 延时 50 mswhile( 1 ){switch( Key_Scan() ) //按键扫描{case up_array:{Key_Idle(); //检测按键松开}break;case down_array:{Key_Idle(); //检测按键松开}break;case clear_array:{Key_Idle(); //检测按键松开}break;case function_array:{Key_Function( clock_time, alarm_time );}case null:{Clock_Fresh( clock_time ); //时间刷新Lcd_Clock( clock_time ); //时间显示Sensor_Fresh( temperature ); //温度更新Lcd_Temperture( temperature ); //温度显示Calendar_Convert( 0 , clock_time );Week_Convert( 0, clock_time );//整点报时if( ( * clock_time == 0x59 ) && ( * ( clock_time + 1 ) == 0x59 ) ){bell = 0;TR2 = 1; //启动Timer2}//闹钟报警if( * alarm_time == HexNum_Convert(* ( clock_time + 1 ) ))//分钟相吻if( * ( alarm_time + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小时相吻合{bell = 0;TR2 = 1; //启动Timer2}}break;}}}2. 温度控制程序#ifndef _SENSOR#define _SENSOR#define uchar unsigned char#define uint unsigned int/***************DS18B20管脚配置*******/sbit dq = P2 ^ 1;/******************************************************************** DS18B20软件延时专用********************************************************************/ void Sensor_Delay(uchar count)//延时函数{while(count--);}/********************************************************************从DS18B20读一个字节********************************************************************/ uchar Sensor_Read_Byte(void){uchar i = 0;uchar temp = 0;for(i=8;i>0;i--){dq = 0; // 给脉冲信号temp >>= 1;dq = 1; // 给脉冲信号if(dq)temp |= 0x80;Sensor_Delay(20);}return (temp);}/********************************************************************向DS18B20写一个字节********************************************************************/ void Sensor_Write_Byte(uchar temp){uchar i = 0;for(i=8;i>0;i--){dq = 0;dq = temp&0x01;Sensor_Delay(20);dq = 1;temp>>=1;}}/******************************************************************** DS18B20初始化********************************************************************/ uchar Sensor_Initial(void){uchar i = 0;dq = 1; // DQ复位Sensor_Delay(1); // 稍做延时dq = 0; // 单片机将DQ拉低Sensor_Delay(100); // 精确延时,大于480usdq = 1; // 拉高总线Sensor_Delay(6); // 稍做延时后i = dq; // 若x=0则初始化成功,若x=1则初始化失败Sensor_Delay(130);return (~i);}/******************************************************************** 读取并显示温度********************************************************************/ void Sensor_Fresh(uchar * temperature ){Sensor_Initial();Sensor_Write_Byte( 0xCC ); // 跳过读序号列号的操作 Sensor_Write_Byte( 0x44 ); // 启动温度转换Sensor_Initial();Sensor_Write_Byte( 0xCC ); // 跳过读序号列号的操作 Sensor_Write_Byte( 0xBE ); // 读取温度寄存器temperature [0] = Sensor_Read_Byte(); //低位temperature [1] = Sensor_Read_Byte(); //高位}#endif3. 日历设置程序#ifndef _SUN_MOON#define _SUN_MOON/******************************************************************** *****/#define uchar unsigned char#define uint unsigned int#include < shezhi.h >#include < lcd.h >/******************************************************************** * 功能: 读取数据表中农历的大月或小月,如果大月返回1, 小月返回0********************************************************************/ bit get_moon_day( uchar month_p,uint calendar_address ){uchar temp,temp1;temp1=(month_p+3)/8;temp=0x80>>((month_p+3)%8);temp=year_code[calendar_address+temp1]&temp;if(temp==0){return(0);}else{return(1);}}/******************************************************************** * 功能: 输入BCD的阳历数据,输出BCD阴历数据( 1901 - 2099 )c_flag:阳历的世纪标志 clock_time: 时钟地址* 说明: c_flag = 0 :21世纪 c_flag = 1 :19世纪********************************************************************/ void Calendar_Convert( uchar c_flag, uchar * clock_time ){bit flag_month, flag_year;uchar year, month, day, month_point; //定义年月天uchar temp1, temp2, temp3;uint calendar_address; //定义农历地址uint day_number;uchar clock_moon[3]; //定义阴历clock_time += 3; //指向日day = ( * clock_time >> 4 ) * 10 + ( *clock_time & 0x0f ); //BCD转换十进制clock_time ++; //指向月month = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f ); //BCD 转换十进制clock_time ++; //指向年year = ( * clock_time >> 4 ) * 10 + ( * clock_time & 0x0f ); //BCD 转换十进制//定位日历地址if( c_flag == 0 )calendar_address = ( year + 99 ) * 3;elsecalendar_address = ( year - 1 ) * 3;//春节(正月初一)所在的阳历月份temp1 = year_code[ calendar_address + 2 ] & 0x60; //Bit6~~Bit5:春节所在的阳历月份temp1 >>= 5 ;//春节(正月初一)所在的阳历日期temp2 = year_code[ calendar_address + 2 ] & 0x1f; //Bit4~~Bit0:春节所在的阳历日期//计算春节(正月初一)离当年元旦{ 1月1日(阳历) }的天数;春节只会在阳历的1月或 2月/*if( temp1 == 1 )temp3 = temp2 - 1;elsetemp3 = temp2 + 31 - 1;*/temp3=temp2-1;if(temp1!=1) temp3+=0x1f;//计算阳历月离当年元旦{ 1月1日(阳历) }的天数if( month < 10 ){day_number = day_code1[ month - 1 ] + day ;}else{day_number = day_code2[ month - 10 ] + day ;}//如果阳历的月大于2 且该年的2月为闰月,天数加1//闰年指的就是阳历有闰日或阴历有闰月的一年;//阳历四年一闰,在二月加一天,这一天叫做闰日://农历三年一闰,五年两闰,十九年七闰,每逢闰年所加的一个月叫做闰月。

相关文档
最新文档