基于C51的百年历文档
基于51单片机的键盘盘可调万年历

开放性实验报告题目:基于80C51的万年历设计_院系:专业班级:学号:姓名:指导老师:________________________ 时间:2014年9月8号电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。
它可以对年、月、日、周、时、分、秒进行计时,还具有闰年补偿等多种功能。
本系统选用DALLAS公司生产的日历时钟芯片DS1302来作为实时时数字万年历采用直观数字显示,可以同时显示年、月、日、周、时、分、秒等信息,还具有键盘时间校准等功能。
该电路采用AT89C52单片机作为核心,用以5V电压供电。
本系统硬件部分由AT89C52单片机、DS1302时钟芯片、LCD1602液晶显示环境下以C51语言编写,包括时间设置、时间显示、时间修正等功能。
在仿真的时候,以Proteus与Keil uVision4软件为基础,编写了MCS-51单片机对LCD1602显示控制的软件,绘制其原理图,并使用Proteus软件与Keil uVision4软件建立联合仿真。
本设计主要论述了原理图各个模块的作用,以及控制软件的各个模块的编程。
关键词:时钟芯片DS1302;单片机AT89C52;液晶显示1602;独立键盘等第1章绪论................................................ 错误!未定义书签。
1.1实时万年历的简介.................................... 错误!未定义书签。
1.2系统所实现的功能 .................................... 错误!未定义书签。
第2章开发工具软件简介.. (5)2.1K EIL U V ISION4软件简介 (5)2.2P ROTEUS软件简介 (5)2.3K EIL U V ISION4与P ROTEUS软件联合仿真 (6)第3章 LCD1602显示控制技术.............................. 错误!未定义书签。
基于C51的万年历语音温度计的设计

基于C51的万年历语音温度计的设计汪桂珍(宿迁泽达职业技术学院江苏宿迁223800)【摘要】:本文阐述了由单片机AT89C2051控制I2C按键扫描与数码管驱动芯片ZLG7290、I2C万年历芯片PCF8563、1-Wire数字温度传感器DS18B20、语音芯片ZY1420A实现万年历显示的语音温度计的方案,并给出了电路原理图。
【关键词】:单片机;I2C总线;万年历PCF8563;1-Wire总线;DS18B20;语音控制;数字温度计;自INTEL公司的MCS-51系列单片机问世以来,单片机以其体积小、集成度高、应用灵活、运行可靠、价格低廉等特点,在工业控制、工业测量、家用电器、智能仪器仪表、安全系统、信息系统、通信等诸多领域具有广泛的用途。
本文论述了一种多功能的温度计的实现方案。
1、系统功能及硬件设计万年历语音温度计具有年、月、日、小时、分钟、秒的显示和当前环境温度的显示及温度语音提示功能,成品体积小巧,可置于室内或随身携带。
当系统运行时,数码管显示时间(时/分/秒),按下K1键数码管显示日期(年/月/日),K1键负责时间和日期的显示切换,按下K2键显示当前温度,并有语音播报当前温度。
51单片机AT89C2051在工业生产控制、智能仪表、信息家电等诸多领域中都有着广泛的应用,AT89C2051引脚只有20个,适用于并不需要较多端口的场合,万年历语音温度计中单片机与外围器件都是采用串行通信,一共所需要的端口只有13个,所以选用只有20个引脚的AT89C2051单片机。
万年历语音温度计共有四大功能模块组成:温度采集模块(核心芯片DS18B20)、时钟/日期模块(核心芯片PCF8563)、按键与数码显示模块(核心芯片ZLG7290)、语音模块(核心芯片ISD1402)。
1.1温度采集模块DALLAS公司生产的1-Wire(即单总线器件)DS18B20数字温度计负责温度的采集。
DS18B20的DQ引脚连单片机的P3.3引脚。
毕业设计 基于51单片机的万年历设计1

基于51单片机的万年历设计单片机经过几十年的发展,已经广泛应用于生活中的各个领域。
单片机以其体积小、功能全、性价比高等诸多优点,在许多行业都得到了广泛应用。
在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。
基于单片机的万年历作为设计的课题,因为它有很好的开放性和可发挥性,对作者的要求比较高,不仅考察了对单片机的掌握能力而且强调了对单片机扩展的应用。
另外液晶显示的万年历已经越来越流行,特别适合在家庭居室、办公室、大厅、会议室、车站和广场等地方使用,它具有显示清晰直观、走时准确、可以进行夜视等功能,并且还可以扩展出其它多种功能。
所以,电子万年历作为设计课题很有价值。
现在对于电子万年历的设计大多运用51单片机。
主要是因为51单片机种类齐全、结构体系完整、指令系统功能完善、性能优越、具有较高可靠性和高性价比等特点。
本篇论文主要介绍了运用单片机实现电子万年历的设计,万年历系统拟用STC89C51单片机控制,以DS1302时钟芯片计时、1602液晶屏显示。
系统主要由单片机控制电路,显示电路以及校正电路三个模块组成。
本文阐述了系统的硬件工作原理,所应用的各个接口模块的功能以及其工作过程,论证了设计方案理论的可行性。
目录第一章绪论 (1)1.1本课题主要的研究工作 (1)第二章系统的硬件设计与实现 (2)2.1电路设计框图 (2)2.2系统硬件概述 (2)2.3主要单元电路的设计 (2)2.3.1 单片机主控制模块的设计 (2)2.3.2时钟电路模块的设计 (3)2.3.3独立式键盘设计 (4)2.3.4显示模块的设计 (4)第三章系统的软件设计 (6)3.1程序流程图 (6)3.1.1 系统总流程图 (6)3.1.2 DS1302时钟程序流程图 (7)3.1.3 LCD显示程序流程图 (8)3.2程序的设计 (9)3.2.1 DS1302读写程序 (9)3.2.2 液晶显示程序 (11)第四章仿真与调试 (13)4.1K EIL软件调试流程 (13)4.2P ROTEUS软件运行流程 (13)4.3万年历的功能仿真 (13)致谢 (15)参考文献 (16)附录:主程序 (17)第一章绪论1.1 本课题主要的研究工作本项目是一种基于AT89C51片机的万年历设计,本方案以AT89C51片机作为主控核心,与时钟芯片DS1302、按键、LCD1602液晶显示器组成硬件系统。
基于单片机C51的万年历课程设计报告

课程设计说明书课程名称:《单片机技术》设计题目:基于单片机的万年历设计院(部):电子信息与电气工程学院学生:学号:专业班级:电子信息工程10-1指导教师:2013年 05 月 17 日课程设计任务书万年历设计摘要:以AT89S52为主控芯片设计了一个带温度显示的万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整,并且还能显示温度和按键提示音、整点鸣叫、定时闹钟鸣叫等功能。
本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。
温度采集选用DS18B20芯片,数据显示采用1602A液晶显示模块,主芯片利用定时中断产生时间,控制着液晶的显示更新、温度的实时变化以及按键的读取处理,而对于闹钟,实际上就是时间里的一个嵌套程序。
时间和闹钟的值由按键调整设置,采用通用的二十四小时制。
关键词:单片机;液晶显示屏;温度传感器;时钟芯片目录1. 设计背景 (1)1.1 概述 (1)1.2 万年历设计目的 (1)2.设计方案 (2)2.1 按键控制模块设计与论证 (2)2.2 时钟模块设计与论证 (2)2.3 显示模块模块设计与论证 (3)3. 方案实施 (4)3.1系统整体框图 (4)3.2原理图设计 (4)3.2.1 单片机最小系统模块 (4)3.2.2 电源模块 (5)3.2.3 时钟芯片DS1302模块 (6)3.2.4温度采集DS18B20模块 (6)3.2.5 闹钟模块 (7)3.2.6 LCD1602显示模块 (8)3.2.7 按键模块 (9)3.3 软件设计 (9)3.4 系统仿真 (10)3.5系统制作 (11)4. 结果与结论 (12)4.1 结果 (12)4.2 结论 (12)5. 收获与致 (13)6. 参考文献 (14)7. 附件 (15)7.1 原理图 (15)系统电路图如图7.1所示: (15)7.2 元器件清单 (15)7.3 实物图 (16)7.3.1 正常工作 (16)7.3.2 调试状态 (17)7.3.3 闹钟设置状态 (18)1. 设计背景1.1 概述如今万年历已经在人们生活中广泛的使用,它不仅是记录日期和时间的工具,而且也成为了一种装饰品。
基于C51单片机的简单万年历设计

四、各模块功能及工作原理2
4.1.单片机主控制模块的设计2
4.2. LCD1602显示模块3
4.3.键盘模块6
五、实现结果9
六、系统的实用性及创新性9
七、调节中遇到的问题及心得体会10
八、程序设计11
8. 1.流程图11
8.2.源代码12
九、总结及感谢24
众所周知单片机是一种集成在电路芯片,是釆用超大规模集成电路技 术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱 动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一 块硅片上构成的一个小而完善的计算机系统。本设计要制作的就是单片机 于生活中最为常见的几种应用一一万年历。本设计以AT89S52单片机作为 核心,可以显示当前的日历和时间,时间也可以人为设定,显示格式为年 (四位),月(两位),日(两位),时(两位),分(两位),秒(两 位)。设置时间的位切换、设定数值、启动定时器、切换日历通过外部中 断來实现。万年历显示电路由LCD1602组成,制作该装置的材料需要有 软硬件的支持,硬件方面AT89C51单片机,晶振,电源,液晶屏LCD1602o
4.2. LCD1602
4.2.1LCD1602引脚介绍
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,引脚图
如图图4. 2.1:
各引脚接口说明如表4.2.2所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
毕业设计(论文)-基于MCS-51的万年历设计

毕业设计(论文)-基于MCS-51的万年历设计1 引言1.1 万年历的背景与意义万年历作为一种常见的时间计数工具,被广泛应用于日常生活和工业生产中。
随着电子技术的飞速发展,电子万年历以其准确、方便、易操作等特点逐渐取代了传统的机械万年历。
基于MCS-51单片机的万年历设计,不仅满足了人们对时间精确计量的需求,同时也为单片机技术在时间测量领域的应用提供了新的思路。
1.2 MCS-51单片机的介绍MCS-51单片机是美国Intel公司推出的一种高性能的8位单片机,具有较高的性价比、丰富的指令集和灵活的I/O端口。
由于其结构简单、易于编程和扩展,MCS-51单片机被广泛应用于工业控制、家用电器、智能仪表等领域。
1.3 论文结构及内容安排本文主要分为七个章节,首先介绍万年历的背景与意义以及MCS-51单片机的基本情况;其次,阐述万年历的原理与设计要求,并提出基于MCS-51单片机的万年历设计方案;接着,详细介绍MCS-51单片机的硬件设计和软件设计;然后,进行系统调试与性能测试;在此基础上,探讨万年历的实际应用与拓展;最后,总结全文并指出创新与不足之处,展望未来的研究方向。
2. 万年历的原理与设计2.1 万年历的基本原理万年历是一种可以显示公历日期、时间,并且可以自动调整闰年和平年的日历。
它的核心是通过算法处理时间的流逝,计算出当前的日期。
基本原理涉及以下几个核心概念:•时间单位:秒、分、时、日、月、年•时间算法:通过累计秒数,进行时、日、月、年的进位处理•闰年规则:四年一闰,百年不闰,四百年再闰2.2 万年历的设计要求在设计万年历时,需要遵循以下要求:•准确性:确保时间显示准确无误•可靠性:系统稳定运行,适应不同的环境条件•易用性:用户界面友好,操作简便•经济性:在满足功能要求的前提下,尽可能降低成本2.3 基于MCS-51单片机的万年历设计方案基于MCS-51单片机的万年历设计主要包括以下几个部分:2.3.1 时间计算模块利用单片机内部的定时器,以秒为单位递增计数,通过编写中断服务程序来处理时间进位,实现时、分、秒的计算。
基于单片机的电子万年历的设计与实现毕业论文模版
10
时钟芯片连接图
11
4.温度传感器的选择方案
采用数字式温度传感器DS18B20,此类 传感器为数字式传感器而且仅需要一条数据 线进行数据传输,易于与单片机连接,可以 避免A/D模数转换模块,降低硬件成本,简 化系统电路。另外,数字式温度传感器还具 有测量精度高、测量范围广等优点。
19
19
ቤተ መጻሕፍቲ ባይዱ
谢 谢!
20
7
2显示器的选择
采用LCD液晶显示屏,液晶显示屏的显示功 能强大,可显示大量文字,图形,显示多样,清晰 可见,对于电子万年历而言,一个1602的液 晶屏即可,价格也还能接受,需要的接口线较 多,但会给调试带来诸多方便,所以此设计中 采用LCD1602液晶显示屏作为显示模块.
8
液晶显示器连接图
9
3.时钟芯片的选择方案
3
研究目标
设计一种功能全面、计时准确、成本低廉的 基于51单片机的万年历。
4
主要研究内容
论文立足于一个具体的制作实例,即以单 片机为控制核心的电子万年历的设计与制作。 具体做法是以单片机及其最小系统为核心C51 作为主控制系统,集时钟芯片,液晶显示, 按键电路,复位电路等为一体,通过对单片 机进行C语言设计,设计一个电子万年历。
5
分析、设计与实现(1/9)
程序流程图
开始 初始化 读、写日期、时间和温度 分离日期\时间\温度显示值 显示子程序 日期、时间修改子程序 子程序 返回
1单片机芯片的选择:
基于51单片机的万年历_毕业设计
基于51单片机的万年历中文摘要本设计万年历以AT89C51为控制中心,与温度传感器DS18B20,时钟芯片DS1302综合应用为一体,不仅能够准确显示时间、日期,闹钟设置,环境温度测量及温度高低温报警等功能。
单片机是一种集CPU、RAM、ROM、I/O接口和中断系统等于一体的器件,只需要外加电源和晶振就可实现对数字信息的处理和控制。
单片机与数字万年历相结合,用于时间显示,温度测试等不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被检测数值的技术指标,从而能够大大提高产品的质量和数量。
关键词:单片机,温度传感器,C语言,液晶显示ABSTRACTThis design USES AT89C51 as calendar control center, and the temperature sensor DS18B20, the clock DS1302 chip integrated application as a whole, and not only be able to accurately display the time, date, alarm, the environment temperature measurement and high temperature, low temperature alarm functions.SCM is a collection of CPU, RAM, ROM, I/O interface and interrupt system is one of the devices, only require additional power can be used for vibration and grain is the process of digital information and control. Single-chip microcomputer and digital calendar, combining for time to show, temperature testing has not only control convenient, simple and flexible configuration advantages, and which could increase the technical index of the tested value, which can greatly improve the quality of the products and quantity.Key words:Single-chip microcomputer, Temperature Sensor,C language,Liquid crystal displ目录第一章前言 (4)1.1系统开发背景及现状 (4)1.2 系统开发的目的 (4)第二章总体设计 (5)2.1 本设计实现的功能和要求 (5)2.2 设计的选择方案和论证 (5)2.2.1单片机芯片的选择方案和论证 (5)2.2.2显示模块选择方案和论证 (5)2.2.3 时钟芯片的选择方案和论证 (6)2.3.4 温度传感器的选择方案与论证 (6)2.3总体设计框图 (6)第三章硬件设计 (8)3.1 主要元器件介绍 (8)3.1.1 单片机简介 (8)3.1.2 传感器DS18B20介绍 (9)3.1.3 LCD1602液晶显示介绍 (10)3.2 各模块设计 (11)3.2.1 主控制电路 (11)3.2.2 LCD1602显示模块设计 (12)3.2.3 DS18B20温度传感器模块 (13)3.2.4 键盘输入模块设计 (13)3.2.5 蜂鸣器模块设计 (13)3.2.6 DS1302时钟电路模块 (14)第四章软件设计 (16)第五章安装与调试 (18)5.1 安装制作 (18)5.2 硬件调试 (18)5.2.1布线的原则与焊接 (18)5.2.2 硬件调试与测试 (19)5.3 软件调试 (19)5.3.1 软件测试仪器 (19)5.3.2 软件调试与测试 (19)5.4 联调 (20)5.5测试结果分析与结论 (21)第六章总结 (22)参考文献 (23)附录A (24)附录B (26)致谢 (28)第一章前言1.1系统开发背景及现状当今世界,知识更新的速度越来越快。
万年历掉电记忆C51程序
uchar value;
SCLK = 0;
CE = 1;
write_byte(add);
value = read_byte();
SCLK = 1;
CE = 0;
return value;
}
uchar _10_bcd(uchar date)
{
return(date/10)*16+(date%10);
{
case 0x45:break;
case 0x46:flag=1;n=0;break;
case 0x47:break;
case 0x44:m--;if(m<1)m=7;break;
case 0x40:m++;if(m>7)m=1;break;
case 0x43:n=0,m=1;break;
case 0x07:n--;break;
irprook = 0;
}
if(flag)
{
temp = atoi(co);
if(temp!=0)
{
value = temp;
tiaoshi(value);
for(i=0;i<3;i++)
co[i]=0;
}
flag = 0;
}
sec = _bcd_10(read_add(0X81));
min = _bcd_10(read_add(0X83));
case 5:write_add(0x88,_10_bcd(date));break; //写月数据
case 6:write_add(0x8A,_10_bcd(date));break; //写周数据
case 7:write_add(0x8C,_10_bcd(date));break; //写年数据
基于51,52单片机的电子万年历设计(经典)
(1)封面(2)开题报告(3)中文摘要及关键词(4)英(外)文摘要及关键词(5)正文(6)(附录)(7)参考文献(8)致谢摘要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。
单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。
系统由主控制器AT89C51、时钟电路DS1302、显示电路、按键电路、和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。
关键词: 单片机, 农历查询, 万年历目录第一章引言 (3)第二章设计方案论证 (4)2.1 方案论证与设计……………………………………………………………………….错误!未定义书签。
2.1.1 控制部分的方案选择 (4)2.1.2显示部分的方案选择 (4)2.1.3系统基本方案选择和论证 (4)2.2单片机原理 (5)2.3LED显示数码管 (5)第三章计算部分 (6)3.1 主要单元电路的器件 (6)3.1.1 单片机主控制模块 (6)3.1.2 时钟电路模块 (7)3.2 其他模块器件 (8)3.2.1 74LS164 (8)3.2.2 CON8…………………………….……………………………………………… .93.2.3其他元器件 (9)第四章结构设计部分 (10)4.1显示部分设计 (10)4.1.1万年历优化算法……………….………………………………………………错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于DS1302、DS18B20、LCD12864百年日历的使用说明作者:广西小宝(EHAO)日期:2011年8月25日星期四一、电路结构1、总电路图单片机型号:AT89C52~晶振:12MHZ液晶型号:AMPIRE12864,无字库,分左后显示2功能说明进入设置菜单按键P0^0进入下级菜单键P0^1数据加键P0^2数据减键P0^3退回上级菜单键P0^4设置总退出键P0^5可扩展按键P0^6可扩展按键P0^7 按键用于设置报警温度的范围,设置当前时间和日期3、DS18B20:用于测量当时的温度(天气)Dq接P2^5;sbit DQ = P2^4;4、DS1302:用于系统的日期和时间sbit Ds1302_RST =P3^0;sbit Ds1302_SCLK =P3^1;sbit Ds1302_IO =P3^2;5、声光报警当温度超过设置的范围时,系统发出声光报警控制口接:sbit feng= P2^1;二、使用说明在打开电源后,系统显示默认的时间、日期、温度值,星期如下:需要设置时间和日期,如果你不想设置时间和日期,你可以按下“设置总退出键”,当然在这种情况下是错误的。
如果你想要设置按下“进入设置菜单键”,进入如下见面:系统默认的是首先选中温度上限:这是你可以按下“数据加键”或者“数据减键”进行设置温度上限值;当你设置好温度上限值后,再按下“进入下级菜单键”则选中下面的温度下限值:如下图:同样:按下“数据加键”或者“数据减键”进行设置温度下限值了;(注意:这里需要说明下,因为本系统是针对用于家庭,办公室等场所设计的,故上限温度在0°以上,下限值在0°以下!!)接下来就是设置日期和时间了:同样按下“进入下级菜单键”,一次选中每一项,按下“数据加键”或者“数据减键”进行设置值。
选中某一项时,设置的地方会反白,在设置过程中,如想重新设置,只需按下“退回上级菜单键”,就可以重新设置,设置图解依次如下:设置温度上限:设置温度下限:设置年:设置月:设置日:设置时:设置分:设置秒:到此设置完成啦!你在按下“设置总退出键”就可以走了,当然你在设置的过程中随时按下“设置总退出键”系统就按你设置的当前时间走,星期是不需要设置的~当你设置好日期后,系统会自动根据你的日期算出星期,并在走的界面显示出来:图如下:2011年8月25日就是星期四!!气温27°!当然温度值是仿真的!硬件则可以实现!以上就是使用说明。
三、软件实现:1、开发环境:KEIL 4版本。
2、程序:我用的是模块化编程方式,分为几个.C文件!!第一部分:主函数(m.c)//=========================================================================================== ==========//程序名称:基于DS1302、DS18B20、LCD12864的从2000年到2099年的日历//程序功能:读取时间,转换星期,测量天气温度,温度过高或者过低报警//程序晶振:12MHZ无源//程序作者:广西小宝(EHAO)//完成日期:2011年8月25日//===================================================================================/*********头函数部分****************************************************************///===================================================================================#include<I_O.h> //头文件包含常用头文件,函数声明,数组定义,宏定义等#include<ds1302.c> //日期时间函数#include<ds18b20.c> //测量温度函数#include<lcd12864.c> //显示函数#include<weeksconv.c> //星期转换函数#include<set.c> //设置温度上下限值和设置时间函数//=================================================================================== /****************主函数*************************************************************/ //=================================================================================== void main(){Delayms(10);while(1){feng=0;LCD12864_init();Delay_us(100);Set_T_D();Delay_us(100);Ds1302_init();Delay_us(10);Init_DS18B20();Delay_us(100);tt=1;while(tt){// 处理ds1302数据SHUJU=Read_1302(0x81);second=((SHUJU&0x70)>>4)*10 + (SHUJU&0x0F);SHUJU=Read_1302(0x83);minute=((SHUJU&0x70)>>4)*10 + (SHUJU&0x0F);SHUJU=Read_1302(0x85);hour =((SHUJU&0x70)>>4)*10 + (SHUJU&0x0F);SHUJU=Read_1302(0x87);day =((SHUJU&0x70)>>4)*10 + (SHUJU&0x0F);SHUJU=Read_1302(0x89);month=((SHUJU&0x70)>>4)*10 + (SHUJU&0x0F);SHUJU=Read_1302(0x8d);year =((SHUJU&0xf0)>>4)*10 + (SHUJU&0x0F);// 处理ds18b20温度值T = ReadTemperature();Feng_led(T,negativeflag); //温度超过范围报警// 星期转换W=Weeks(year,month,day);/*********** 显示数据函数***************************************/// 显示日期show8(0,0,1,0,num[2]); //年千位show8(0,8,1,0,num[0]); //年百位show8(0,16,1,0,num[year/10]); //年十位show8(0,24,1,0,num[year%10]); //年各位show16(0,32,1,0,hanzi[0]); // “年”show8(0,48,1,0,num[month/10]); //月十位show8(0,56,1,0,num[month%10]); //月各位show16(0,0,2,0,hanzi[1]); // “月”show8(0,16,2,0,num[day/10]); //日十位show8(0,24,2,0,num[day%10]); //日个位show16(0,32,2,0,hanzi[2]); // "日"// 显示时间show8(2,32,1,0,num[hour/10]); //时十位show8(2,40,1,0,num[hour%10]); //时各位show16(2,48,1,0,hanzi[12]); // "时"show8(2,0,2,0,num[minute/10]); //分十位show8(2,8,2,0,num[minute%10]); //分各位show16(2,16,2,0,hanzi[13]); // “分”show8(2,32,2,0,num[second/10]); //秒十位show8(2,40,2,0,num[second%10]); //秒个位show16(2,48,2,0,hanzi[14]); // "秒"// 显示ds18b20温度值show16(4,0,1,0,hanzi[3]); // “温”show16(4,16,1,0,hanzi[4]); // “度”show8(4,32,1,0,sign[1]); // “:”show8(4,40,1,0,num[ZF]);show8(4,48,1,0,num[T/1000]); //show8(4,56,1,0,num[T%1000/100]);show8(4,0,2,0,num[T%100/10]); //show8(4,8,2,0,sign[2]); // "."show8(4,16,2,0,num[T%10]);show8(4,24,2,0,sign[3]); // "°"show8(4,32,2,0,sign*4+); // “C”// 显示星期show16(6,0,1,0,hanzi[15]); // “星”show16(6,16,1,0,hanzi[16]); // “期”show16(6,32,1,0,numhz[W]);show16(6,0,2,1,hanzi[8]); // "广"show16(6,16,2,1,hanzi[9]); // "西"show16(6,32,2,1,hanzi[10]); // "小"show16(6,48,2,1,hanzi[11]); // "宝"if(CLOSE==0){tt=0;clear(0);}}}}第二部分:时间、日期函数:(DS1302.C)#include <I_O.H>//=========================================================================================== /*************************DS1302部分***************************************************///=========================================================================================== sbit Ds1302_RST =P3^0;sbit Ds1302_SCLK=P3^1;sbit Ds1302_IO =P3^2;/************微秒延时函数*************/void Delay_us(uchar x){while(--x);}/***********写一字节数据函数*************/void Write_bity(uchar x){uchar i;Ds1302_SCLK=0;Delay_us(3); //稍稍等待,确保在数据前沿为低电平for(i=0;i<8;i++) //循环8次,从低位到高位一次写入数据{Ds1302_IO=x&0x01;Ds1302_SCLK=1; //上升沿写入数据Delay_us(3);Ds1302_SCLK=0;x=x>>1;}}/*********向DS1302写入一字节数据,包括命令(地址)和数据******/void Write_1302(uchar com,uchar date){Ds1302_RST=0;//按时序,最前沿的低电平,确保正确写入数据Ds1302_SCLK=0;Delay_us(3);Ds1302_RST=1;//开始传递数据Write_bity(com);Write_bity(date);Delay_us(1);Ds1302_SCLK=1;Ds1302_RST=0;}/**************读一字节数据函数************/uchar Read_bity(){uchar i,x;Delay_us(3);//稍稍等待for(i=0;i<8;i++){x=x>>1;if(Ds1302_IO==1){x=x|0x80;}Ds1302_SCLK=1; //拉高是为了后面的下降沿Delay_us(3);Ds1302_SCLK=0; // 上升沿读取数据Delay_us(3);}return x;}/********向DS1302读取一字节数据,要写入读取地址******************/uchar Read_1302(uchar com){uchar date;Ds1302_RST=0;Ds1302_SCLK=0;Ds1302_RST=1;Write_bity(com);date=Read_bity();Delay_us(1);Ds1302_SCLK=1;Ds1302_RST=0;return date;}/***************Ds1302初始化*****************************/void Ds1302_init(){Write_1302(0x8e,0x00);Write_1302(0x80,((CHUZHI[0]/10)<<4|(CHUZHI[0]%10))); //根据写秒寄存器命令字,写入秒的初始值 Write_1302(0x82,((CHUZHI[1]/10)<<4|(CHUZHI[1]%10))); //根据写分寄存器命令字,写入分的初始值 Write_1302(0x84,((CHUZHI[2]/10)<<4|(CHUZHI[2]%10))); //根据写小时寄存器命令字,写入小时的初始值 Write_1302(0x86,((CHUZHI[3]/10)<<4|(CHUZHI[3]%10))); //根据写日寄存器命令字,写入日的初始值Write_1302(0x88,((CHUZHI[4]/10)<<4|(CHUZHI[4]%10))); //根据写月寄存器命令字,写入月的初始值Write_1302(0x8c,((CHUZHI[5]/10)<<4|(CHUZHI[5]%10))); //根据写年寄存器命令字,写入年的初始值Write_1302(0x90,0xa5); //打开充电功能选择2K电阻充电方式Write_1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令}第三部分:温度函数(ds18b20.c)#include<I_O.h>//=========================================================================================== /*************************DS18B20部分*****************************************************/ //=========================================================================================== sbit DQ = P2^4;sbit feng= P2^1;uint negativeflag;uchar tempH,tempL; //设置上下限温度,18b20上下限温度(-55°C~125°C)可调uchar ZF; //正负温度标志void Delayms(uint ms){uchar i;while(--ms){for(i=0;i<120;i++);}}//晶振12MHzvoid delay_18B20(uint i){while(i--);}//初始化函数void Init_DS18B20(void){ uchar x=0;feng=0;// tempH=40;// tempL=10;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}//读一个字节uchar ReadOneChar(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);}return(dat);}//写一个字节void WriteOneChar(uchar dat){DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;}}//读取温度uint ReadTemperature(void){uchar a=0;uchar b=0;uint t=0,temp,result;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度 a=ReadOneChar();b=ReadOneChar();temp=b;temp=(temp<<8)+a;negativeflag=(b&0xf8);//检查负标志if(negativeflag==0){ZF=10;//“+”显示位result=temp*0.625;}else{ZF=11;//负号显示位temp=~temp+1;result=temp*0.625+0.5;}return( result );}/****************蜂鸣器及LED报警**************************/void Feng_led(uint t,uint n){if((t>(tempH*10))&&(n==0)){feng=1;Delayms(10);else if((t>(tempL*10))&&(n!=0)){feng=1;Delayms(10);feng=0;Delayms(5);}}第四部分:显示函数(lcd12864.c)#include<I_O.H>//=========================================================================================== /*************************12864部分********************************************************/ //=========================================================================================== #define port P1 //DB0~DB7数据口sbit e=P2^5;//使能sbit rw=P2^6;//读写sbit rs=P2^7;//数据/命令sbit cs2=P2^2;//片选sbit cs1=P2^3;sbit busy=P1^7;//检测忙//uchar code word[]="data:time:temperature:week:"//延时void delay(uint n){uint i;for(;n>0;n--)for(i=200;i>0;i--);}//判断是否忙void check(){rs=0;rw=1; //读e=1;port=0x00;e=1;while(busy);e=0;}//写指令void sendcommand(uchar command){check();rs=0; //指令e=0; //写入指令}//写数据void writedata(uchar dat){check();rs=1; //数据rw=0;port=dat;e=1;e=0;}//选屏幕0--全屏,1--左屏,2--右屏;void select(uint n){switch(n){case 0:cs1=0;cs2=0;break; //低电平选中case 1:cs1=0;cs2=1;break; //cs1左屏case 2:cs1=1;cs2=0;break; //cs2右屏 }}//页void setpage(uchar page){page=page&0x07;page=page|0xb8;sendcommand(page); //写指令,}//列void setcolumn(uchar column){column=column&0x3f;column=column|0x40;sendcommand(column);}//起始行void setline(uchar line){line=line&0x3f;line=line|0xc0;sendcommand(line);}//屏幕开关显示0--关,1--开;void seton(uint n){}//清屏0--全屏,1--左屏,2--右屏;void clear(uint n){uchar i,j;select(n);for(i=0;i<8;i++){setpage(i);setcolumn(0);for(j=0;j<64;j++)writedata(0); //置0清空}}//初始化void LCD12864_init(){check(); //判断是否忙,忙时等待,不忙开始初始化seton(1); //1屏幕开,0屏幕关clear(0); //清屏0--全屏,1--左屏,2--右屏;setline(0); //设置起始行第0行}//显示汉字16*16显示:页列屏幕显示反白与否显示的数组void show16(uchar page,uchar column,uchar screen,uchar method,uchar *str){uchar i,j;select(screen);//选屏幕0--全屏,1--左屏,2--右屏;j=0;setpage(page);setcolumn(column);for(i=0;i<16;i++){ if(method==1) writedata(~str[j++]); //method为显示方式。