课程设计报告---万年历++温度
万年历电子时钟温度毕业设计

摘要随着社会快速的发展,人们的生活节奏变得越来越快,人们对时间观念也愈来愈重视。
自动化、智能化技术的发展,机电产品的智能度愈来愈高,用到时间提示、定时控制的地方也会愈来愈多,因此,设计开发数字时钟具有良好的应用前景。
由于单片机价格的低成本、高性能,在自动控制产品中得到了广泛的应用。
本文以STC89C52为核心控制芯片,DS1302为时钟芯片,DS18B20为温度传感器,通过液晶显示器AMPIRE128X64实时显示时间及温度,通过按键设置年月日和星期以及定时闹钟,定时闹钟时间到自动发出警报,应用C语言进行软件编程,并用Altium Designer Summer 09软件进行演示、验证。
经过测试,系统可以正常完成预定的功能。
关键词:单片机STC89C52 电子时钟C语言AbstractWith rapid development of society, people's life rhythm becomes faster and faster, people to the concept of time is also more and more attention. Automation, intelligent technology development, the intelligence degree of mechanical and electronic products become more and more high, use time reminder, timing control will be more and more, therefore, design and develop digital clock has a good application prospect.Because of the price of low-cost, high-performance microcontroller, has been widely used in automatic control of the products. With STC89C52 as the core control chip, this paper DS1887 for the clock chip, DS18B20 as temperature sensor, through the LCD display AMPITE128X64 real-time display of time and temperature, through the button and set the date and week timing alarm clock, timer alarm clock time to alert automatically, using C language for software programming, using Altium Designer Summer 09 for demonstration, software validation. Program download by general technology of PZ - ISP software made by the company to complete. After the test, the system can accomplish the functions normally.Key words: single chip microcomputer C language STC89C52 electronic clock第一章绪论1.1电子时钟的研究背景单片机自1976年由Intel公司推出MCS-48开始,迄今已有二十多年了。
带温度计的万年历

设计课题题目: 带温度计的万年历一、设计任务与要求1. 显示准确的北京时间(时、分、秒)及公历日期显示功能(年、月、日);2. 可通过按键切换年、月、日及时、分、秒的显示状态;3. 可随时可以调校年、月、日或时、分、秒;4. 可每次增减一进行时间调节,也可快速增减进行时间调节;5.可显示环境温度。
二、系统设计方案方案一、用主芯片为AT89C51的单片机控制实现,使用单片机内部的定时计数器实现时间的设定,使用按键进行时间的调整和定时,按键有蜂鸣器提示,温度传感器使用DALLAS 公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配处理器等优点。
显示时间和温度使用数码管显示。
方案二、用主芯片为STC89C52的单片机控制实现,为了满足单片机系统的实时控制的需求,采用实时钟芯片DS1302,使用按键进行时间的调整和定时,温度传感器使用 DS18B20。
显示时间和温度使用LCD1602显示。
方案一片内定时器会导致计时节拍的时间误差,当进行年、月、日的日历计时,定时中断误差扥积累就会很大。
使用片内定时器进行计时的时候,单片机始终要处于工作状态。
才能维持计时时间,一旦停机或进入待机状态,开机后,计时时间就需要重新设定。
为了满足单片机系统的实时钟需求,本设计采用的是方案二,系统框图如图2-1所示。
图2-1三、单元电路分析与设计1. 原理分析 1.1主控制器单片机STC89C52 具有低电压供电和体积小等特点,如图3-1所示。
1.2晶振电路AT89S52引脚XTAL1和XTAL2与晶体振荡器及电容C1、C2按图3-2所示方式连接。
晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz 之间,电容C1、C2取值范围在5~30pF 之间。
根据实际情况,本设计晶振选择频率为12MHZ ,电容选择30pF 如图3-2。
多功能电子万年历课程设计报告

重庆三峡学院课程设计报告书题目:基于可调的电子万年历与温度显示学院(系):年级专业:学号:学生姓名:指导教师:教师职称:完成日期年月日目录摘要 (3)第一章引言 (4)1.1 设计任务 (4)1.2 设计目的 (4)1.3 设计思路 (4)1.3.1 方案论证 (4)1.3.2 芯片的选择 (5)1.3.3 显示模块选择方案和论证 (5)1.3.4 时钟信号的选择方案和论证 (5)1.3.5 最终方案 (6)第二章硬件系统的设计2.1原理图设计 (6)2.2温度感应电路 (7)2.3 复位电路部分 (7)2.4液晶显示电路 (7)2.5时钟信号电路 (8)2.6 AT89C52原理及说明 (8)2.6.1引脚功能 (9)第三章软件系统的设计.3.1系统程序流程图 (9)3.2系统具体程序代码 (10)第四章系统调试 (23)4.1 软件调试 (23)4.2 硬件调试 (23)第五章设计心得 (23)元件清单表 (24)致谢 (24)参考文献 (24)基于可调式电子万年历与温度显示的设计重庆三峡学院应用技术学院 5人摘要:本文介绍了一种基于单片机的可调的电子万年历和温度显示。
该设计主要由五个模块组成:微处理器(单片机),温度传感器,控制调节按键,实时时钟模块及显示模块。
温传感器器主要由DS18B20来完成,它负责把采集到的温度传给单片机。
实时时钟模块主要由DS1302构成,它负责产生始终数据送给单片机,微处理器芯片AT89C52来完成DS18B20,DS1302,按键传来的数据进行处理,并送与显示模块(LCD1602)进行显示。
该系统的电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。
可以测量-55°到+125°的温度和显示年,月,日,星期,时,分,秒,并且可通过按键调节时间。
关键词单片机;万年历;温度;AT89C52;LCD1602,DS1302,DS18B20第一章引言1.1 设计任务(1)根据具体题目要求,设计以单片机为控制核心的测量系统或控制系统,完成对指定目标或对象的测量及控制。
电信12综合设计-万年历测温报警系统设计报告

万年历温度实时显示及报警器设计1、系统方案设计本次设计的万年历温度实时显示及报警系统以STC89C52单片机为核心,设计并自行焊制一个带有万年历、温度实时显示和温度报警的应用系统。
主要元件包括:温度采集模块DS18B20,电源模块,时钟模块DS1302,模拟开关模块,显示模块LCD1602,蜂鸣器等。
可实现功能:1:实时测量当前环境下的温度并进行显示。
2:万年历显示功能,可显示年、月、日、星期、时、分、秒。
3:温度报警,当温度高于某设定值(通过键盘设定)时,系统会进行报警(蜂鸣器发出声音)4、保护电路:当温度高于某设定值时,会自动断开外设电路开关,达到保护目的。
应用:我们本次设计的系统功能多样,可以作为特定场合的温度报警器,不仅实现了温度显示与报警,保护了电路,而且带有万年历功能,方便实用。
系统设计框图如图1-1所示。
图1-1 系统设计框图2、系统硬件设计硬件设计电路图1-2所示。
通过单片机P1口向LM1602液晶传输数据,通过单片机的P2.0、P2.1、P2.2控制液晶时序;P1.0、P1.1、P1.2作为时钟芯片DS1302的控制和数据传输接口;通过P3.3作为DS18B20温度传感器的单总线接口;同时利用与单片机P3.4、P3.5、P1.7分别连接的UP 键,DOWN 键和返回键控制报警温度;单片机P3.6控制模拟开关的通断。
图1-2 系统硬件设计图89C52 单片机DS1302时钟DS18B20温度采集 按键设定值调整LM1602显示温度和时间蜂鸣器报警电路通断开关3、系统软件设计3.1系统主程序流程图YNYNYN图1-3主程序流程图周边温度的实时显示可以精确到小数点后1位,温度高于设定值会报警,并会切断外围电路,设定值由键盘给出,万年历显示精确到秒。
图1-3为主程序流程图。
单片机上电以后,各个芯片进行初始化,显示温度和万年历。
DS18B20,常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
万年历的课程设计报告及程序

第一部分:正文一,课程设计名称:1.万年历2.(a) (b)* **** *** ***** ***** ************** ***** ***** *** **** * ********* **** **** *** *** ** ** * * ** ** *** *** **** **** *********二,使用工具软件:Microsoft Visual Basic 6.0 中文版。
三,课程设计内容简介:(1)万年历的课程设计的基本结构流程:从main函数开始,比如输入2001年,调用函数yearshow,它是控制总循环次数12个月的,在yearshow里有调用了以个函数是monthshow,是控制每个月如何输出显示的,在这个函数里有调用了getmonthweekday函数,它是获得每个月一号是星期几的函数,此函数分为两部分,以2000年1月1号是星期六为准;做十一次运算便可得知2月到12月各个月的1号为星期几。
而在这个函数又调用了getyearday这个函数,是返回天数的函数,它有调用了isleap函数,计算时平年还是闰年是,时闰年返回366,平年返回355。
到这步开始就返回值了,首先isleap告诉getyeardays2000是闰年和平年,于是getyeardays得到366getyearweekday,getyearweekday 就计算sum=366且返回(366+6)%7=2给getmonthweekday,w=2,getmonthweekday中若计算1月1号则为星期二,2月-12月中如3月则要加上以月和二月的天数载加上2对7取余数,这个数返回给monthshow,若这个数是w=0;不输出空格,不等于0就输出w-1个空格,以便日期和星期对应,如此循环十二个月就计算完了,一边计算一遍显示。
(2)(a)图形的课程设计的基本结构流程(3)(b)图形的课程设计的基本结构流程(4)运行环境:Win32 Console Application四,得意之处.1把程序分解成多个小函数,那么问题就分解成几个小问题。
温度万年历的单片机实现实验报告

目录一、温度万年历设计的目的和意义 (1)二、电路设计方案 (1)三、原理设计 (1)四、方案结构图 (3)五、温度万年历1602驱动及显示的详细设计 (6)六、心得与总结 (14)一、温度万年历设计的目的和意义随着社会的发展,信息量的不断提升以前对信息交换的要求提高,温度万年历的发展以及投入市场变得非常有必要。
本设计是基于51单片机并模拟日常所用的日历,而51系列单片机是各单片机中最为典型和最有代表性的一种。
通过本次设计,学习和巩固了单片机指令编程的相关知识,熟悉单片机各部件的组成及其功能。
本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电子万年历。
传统的电子日历大都体积大,功耗大,显示不准确等特点。
为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。
另外本设计具有显示实时温度的功能。
传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。
本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。
最后,温度和时间都将通过LCD1602液晶显示器进行显示。
测试表明系统达到了设计要求的各项功能,各部分工作正常。
二、电路设计方案采用AT89S52作为主控制系统; 直接采用单片机定时计数器提供秒信号;LCD 液晶显示屏作为显示。
三、原理设计1.基本原理:本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路直接采用单片机定时计数器提供秒信号;温度的采集由DS18B20构成;显示部份由LCD液晶显示屏显示。
同时还添加了提醒功能,通过蜂鸣器实现。
2.总体框图图13. 单元电路设计◆ 单片机主控制模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O 口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O 口(P0、P1、P2、P3),每一条I/O 线都能独立地作输出或输入。
万年历课程设计报告

万年历课程设计报告课程设计报告课程名称程序设计基础专周题目年历显示姓名XX班级XXXXXX学号XX指导教师XXX设计时间2022-03-02至2022-03-06XX学院计算机工程系XX学院课程设计(论文)任务书一、课程设计题目年历显示二、课程设计工作自2022年03月02日至2022年03月06日。
三、课程设计地点:XXXX四、课程设计内容要求:1.本课程设计的目的1)增进对C语言各理论知识的熟练程度,2)加强算法设计的能力,为以后的程序设计与编写打下良好基础。
3)增加对C语言的熟练程度,提高程序设计的能力,并初步接触实用程序的编写。
2.课程设计的任务及要求题目:年历显示要求:(1)输入一个年份,输出是在屏幕上显示该年的日历。
假定输入的年份在1940-2040年之间。
(2)输入年月,输出该月的日历。
(3)输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
3)课程设计编写要求1)详细清晰地描述个人的课程设计工作;2)要按照本模板的规格打印誊写课程报告;3)课程报告包括目录、内容提要、正文、课程设计体会、参考文献、附录等;4)课程报告装订按学校的统一要求完成4)评分标准:1)完成原理分析:20分;2)完成设计过程:40分;3)完成代码分析:20分。
4)个人创新工作:20分。
学生签名:XX2022年3月8日目录目录-1-正文-2-一、需求分析-2-二、个人工作-2-三、概要设计-2-流程图……………………………………………………………….-2-程序……………………………………………………………….-4-四、程序结果-7-课程设计体会-9-正文一、需求分析我选择课程设计题目:年历显示日常生活当中,我们查询日期很大程度上需要用到日历。
而手动去翻纸质日历查询速度慢,而且会让人看的眼花缭乱。
因此,我们可以编写一个程序来显示某一年的日历。
①程序要能够准确输出某一年的日历;②程序要能够准确的输出某一年的某一月的月历;③程序能够详细查询某一年某一天的日期;④程序能够循环输出。
万年历课程设计报告

万年历课程设计报告一、课程目标知识目标:1. 学生能够理解万年历的基本概念,掌握年、月、日的关系及其换算方法。
2. 学生能够运用所学知识,独立制作并使用简易的万年历。
3. 学生了解我国农历与公历的区别及相互转换方法。
技能目标:1. 培养学生运用数学知识解决实际问题的能力,提高逻辑思维和推理能力。
2. 培养学生动手操作和团队协作能力,通过制作万年历的过程,锻炼实践操作技能。
情感态度价值观目标:1. 培养学生对时间管理的重视,树立珍惜时间的观念。
2. 增强学生对传统文化的认识,激发对中国古代天文历法的兴趣。
3. 培养学生积极探究、合作交流的良好学习态度,提高学习自信心。
课程性质分析:万年历课程属于数学与生活相结合的综合性课程,旨在让学生在实际问题中运用数学知识,提高解决实际问题的能力。
学生特点分析:考虑到学生所在年级的特点,课程内容应以直观、生动、有趣的方式进行设计,注重培养学生的动手操作能力和团队协作精神。
教学要求:1. 教师应充分准备教学资源,提供丰富的实例,引导学生主动参与学习过程。
2. 教学过程中,教师要以学生为主体,关注学生的个体差异,给予个性化指导。
3. 教师要关注学生的学习反馈,及时调整教学策略,确保课程目标的达成。
二、教学内容1. 年、月、日的关系及其换算方法- 公历与农历的基本概念- 年、月、日的定义及其相互关系- 闰年和平年的判断方法2. 简易万年历的制作- 万年历的基本结构- 制作步骤及注意事项- 万年历的使用方法3. 我国农历与公历的转换方法- 农历与公历的对应关系- 农历日期的推算方法- 二十四节气的计算与应用教学大纲安排:第一课时:导入万年历的概念,介绍年、月、日的关系及其换算方法,讲解闰年和平年的判断方法。
第二课时:指导学生动手制作简易万年历,掌握万年历的基本结构和使用方法。
第三课时:学习我国农历与公历的转换方法,了解二十四节气的计算与应用。
教材章节:《数学》教科书:第四章 时间与测量,第四节 万年历的制作与应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
天津职业技术师范大学电子工程学院电子信息工程课程设计报告课程设计题目:基于单片机的电子万年历设计同组学生姓名(学号):王珂0990*******、王飞龙0990*******班级:电信12技术1班任务分工:王珂:编写程序、软件调试、整理报告王飞龙:查找资料、硬件连接、整理报告设计时间: 2013年1月7 日—— 2013 年 1月18日指导教师:姜德宁、王天慧目录题目:基于单片机的电子万年历设计目录 (1)一、课程设计的目的与要求(含设计指标) (1)二、方案论证及选择 (1)1. 单片机芯片的选择方案和论证 (1)2. 显示模块选择方案和论证 (1)3. 时钟芯片的选择方案和论证 (1)4. 电路设计最终方案决定 (2)三、原理设计(或基本原理) (2)1. 基本原理: (2)2. 总体框图 (2)3. 单元电路设计 (2)4. 元件列表 (4)四、方案实现与测试(或调试) (5)五、总结 (6)六、个人总结 (6)七、参考书目: (6)附录:C程序一、课程设计的目的与要求(含设计指标)1.要有完整的设计过程及设计图2.最终的设计结果。
3.个人总结不少于1000字。
二、方案论证及选择1.单片机芯片的选择方案和论证方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏,所以选择采用AT89S52作为主控制系统。
2.显示模块选择方案和论证方案一:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。
方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。
方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,并且我做的最小系统上带一个TS1620-1,和A T89S52已经接好,省了很多麻烦,所以在此设计中采用LCD液晶显示屏。
3.时钟芯片的选择方案和论证方案一:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA。
方案二:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本。
虽然实现的时间误差较大,但是,考虑到需要采购芯片,综合考虑,对于课程设计来说能用较省事的方法达到目的最好。
4. 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用AT89S52作为主控制系统; 直接采用单片机定时计数器提供秒信号;LCD 液晶显示屏作为显示。
三、 原理设计(或基本原理)1. 基本原理:本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V 超低压工作;时钟电路直接采用单片机定时计数器提供秒信号;温度的采集由DS18B20构成;显示部份由LCD 液晶显示屏显示。
同时还添加了提醒功能,通过蜂鸣器实现。
2. 总体框图图13. 单元电路设计◆ 单片机主控制模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O 口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O 口(P0、P1、P2、P3),每一条I/O 线都能独立地作输出或输入。
单片机的最小系统如下图2所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。
第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。
◆ 显示模块的设计如图3为LCD 显示模块: 此模块需要注意上拉电阻。
图2图3温度模块考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。
另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。
DS18B20性能●独特的单线接口仅需一个端口引脚进行通信●简单的多点分布应用●无需外部器件●可通过数据线供电●零待机功耗●测温范围-55~+125℃,以0.5℃递增●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃●温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字●应用包括温度控制、工业系统、消费品、温度计和任何热感测系统●负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作●GND:地●DQ:单线运用的数据输入/输出引脚●VD:可选的电源引脚4.元件列表四、方案实现与测试(或调试)此方案由于只用到51单片机芯片,因此各个功能都是由编程来实现。
大体程序流程框图如下在本成电子万年历的设计调试中遇到了很多的问题。
回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:1)烧入程序后,LCD液晶显示屏显示亮度不好。
解决:一边旋转KT1滑动变阻器,一边观看LCD显示屏,知道看到合适的亮度为止。
2)蜂鸣器声音过小或没声。
解决:在相应管脚接上拉电阻。
3)液晶屏显示乱码,显示字符错行。
解决:程序在合并时起冲突,调试程序,重新定义变量等;仔细检查程序错误。
五、总结经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。
同时在软件的编程方面得到更多的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。
六、个人总结另附七、参考书目:[1]柴诚敬,刘国维,李阿娜,《化工原理课程设计》,天津,天津科学技术出版社,1994年[2]网络参考文献资料附录:程序源代码:#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define DS18B20#ifdef DS18B20#define READROM (0x33)#define MATCHROM (0x55)#define SKIPROM (0xCC)#define SEARCHROM (0xF0)#define ALARMSEARCH (0xEC)#define WIRTESCRATCHPAD (0x4E)#define READSCRATCHPAD (0xBE)#define COPYSCRATCHPAD (0x48)#define CONVETT (0x44)#define RECALLE2 (0xB8)#define READPOWERSUPPLY (0xB4)sbit DS18B20_Port = P2^6;unsigned char T;unsigned char flag_t = 0;unsigned char Buffer_DS18B20[9];unsigned long Temperature_DS18B20_LONG;unsigned char Temperature_DS18B20_STRING[9] = {0x00};unsigned char flag_temp = 0;unsigned char Board_InputOutput_DS18B20(unsigned char _mode);//模式选择:Read_Temp(读取温度),Updata_Info(更新所有信息)#endifsbit rs=P2^2;sbit rw=P2^1;sbit lcden=P2^0;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;uchar count,s1num;char nian_1,nian_0,yue,ri,week,miao,shi,fen,b,a,c;uchar code table[]=" - - week ";uchar code table1[]=" : : ";void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){uchar num;lcden=0;rw=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<16;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void write_sfm(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void write_sfm1(uchar add,uchar date) {write_com(0x80+add);write_date(0x30+date);}void write_sfm2(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void keyscan(){if(s1==0){delay(5);if(s1==0){ s1num++;while(!s1);if(s1num==1){a=0;TR1=0;TR0=0;write_com(0x80);write_com(0x0f);}}if(s1num==2){write_com(0x80+2);}if(s1num==3){write_com(0x80+5);}if(s1num==4){write_com(0x80+8);}if(s1num==5){write_com(0x80+15);}if(s1num==6){write_com(0x80+0x40+0);}if(s1num==7){write_com(0x80+0x40+3);}if(s1num==8){write_com(0x80+0x40+6);}if(s1num==9){s1num=0;write_com(0x0c);TR0=1;TR1=1;a=1;}}if(s1num!=0){if(s2==0){delay(5);if(s2==0){while(!s2);if(s1num==1){nian_1++;while(nian_1==99)nian_1=0;write_sfm2(0,nian_1);write_com(0x80+0);}if(s1num==2){nian_0++;while(nian_0==100)nian_0=0;write_sfm2(2,nian_0);write_com(0x80+2);}if(s1num==3){yue++;if(yue==13)yue=1;write_sfm2(5,yue);write_com(0x80+5);}if(s1num==4){ri++;if(ri==32)ri=1;write_sfm2(8,ri);write_com(0x80+8);}if(s1num==5){week++;if(week==8)week=1;write_sfm1(15,week);write_com(0x80+15);}if(s1num==6){shi++;if(shi==24)shi=0;write_sfm(0,shi);write_com(0x80+0x40+0);}if(s1num==7){fen++;if(fen==60)fen=0;write_sfm(3,fen);write_com(0x80+0x40+3);}if(s1num==8){miao++;if(miao==60)miao=0;write_sfm(6,miao);write_com(0x80+0x40+6);}}}if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1){nian_1--;if(nian_0==-1)nian_0=99;write_sfm2(0,nian_1);write_com(0x80+0);}if(s1num==2){nian_0--;if(nian_0==-1)nian_0=99;write_sfm2(2,nian_0);write_com(0x80+2);}if(s1num==3){yue--;if(yue==0)yue=12;write_sfm2(5,yue);write_com(0x80+5);}if(s1num==4){ri--;if(ri==0)ri=31;write_sfm2(8,ri);write_com(0x80+8);}if(s1num==5){week--;if(week==0)week=7;write_sfm1(15,week);write_com(0x80+15);}if(s1num==6){shi--;if(shi==-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40+0);}if(s1num==7){fen--;if(fen==-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+3);}if(s1num==8){miao--;if(miao==-1)miao=59;write_sfm(6,miao);write_com(0x80+0x40+6);}}}}}void main(){init();nian_1=20;nian_0=14;yue=12;ri=30;week=2;shi=23;fen=59;miao=55;write_sfm2(0,nian_1);write_sfm2(2,nian_0);write_sfm2(5,yue);write_sfm2(8,ri);write_sfm1(15,week);write_sfm(0,shi);write_sfm(3,fen);write_sfm(6,miao);a=1;while(1){if(a==1){#ifdef DS18B20flag_t = 1;while(flag_t){EA = 0;TR1 = 0;write_com(0x80+0x40+9);Board_InputOutput_DS18B20(0x01);write_date(Temperature_DS18B20_STRING[1]);write_date(Temperature_DS18B20_STRING[2]);write_date(Temperature_DS18B20_STRING[3]);write_date(Temperature_DS18B20_STRING[4]);write_date(Temperature_DS18B20_STRING[5]);write_date(Temperature_DS18B20_STRING[6]);write_date(Temperature_DS18B20_STRING[7]);T = (Temperature_DS18B20_STRING[1]-0x30)*10 + (Temperature_DS18B20_STRING[2]-0x30);if(T>=26||T<19)////////////////////////{flag_t = 1;SPK = 1;}else{flag_t = 0;SPK = 0;}}EA = 1;TR1 = 1;#endif}keyscan();if(b==0){bee();b++;}if(c==0){bee1();c++;}}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==15){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;week++;if(week==8){week=1;}write_sfm1(15,week);ri++;if(ri>28){if(nian_0%4==0){switch(yue){ case 1: if(ri==32){ri=1;yue++;}break;case 2: if(ri==30){ri=1;yue++;}break;case 3: if(ri==32){ri=1;yue++;}break;case 4: if(ri==31){ri=1;yue++;}break;case 5: if(ri==32){ri=1;yue++;}break;case 6: if(ri==31){ri=1;yue++;}break;case 7: if(ri==32){ri=1;yue++;}break;case 8: if(ri==32){ri=1;yue++;}break;case 9: if(ri==31){ri=1;yue++;}break;case 10: if(ri==32){ri=1;yue++;}break;case 11: if(ri==31){ri=1;yue++;}break;case 12: if(ri==32){ri=1;yue++;}break;} }else{switch(yue){case 1: if(ri==32){ri=1;yue++;}break;case 2: if(ri==29){ri=1;yue++;}break;case 3: if(ri==32){ri=1;yue++;}break;case 4: if(ri==31){ri=1;yue++;}break;case 5: if(ri==32){ri=1;yue++;}break;case 6: if(ri==31){ri=1;yue++;}break;case 7: if(ri==32){ri=1;yue++;}break;case 8: if(ri==32){ri=1;yue++;}break;case 9: if(ri==31){ri=1;yue++;}break;case 10: if(ri==32){ri=1;yue++;}break;case 11: if(ri==31){ri=1;yue++;}break;case 12: if(ri==32){ri=1;yue++;}break;}}if(yue==13){yue=1;nian_0++;if(nian_0==100){nian_0=0;nian_1++;if(nian_1==99){nian_1=0;}}}write_sfm2(0,nian_1);write_sfm2(2,nian_0);write_sfm2(5,yue);}write_sfm2(8,ri);}write_sfm(0,shi);}write_sfm(3,fen);}write_sfm(6,miao);}}#ifdef DS18B20void Delay_DS18B20_us(unsigned char _t){while(--_t);}void Delay_DS18B20_ms(unsigned char _t){while(_t--){Delay_DS18B20_us(245);Delay_DS18B20_us(245);}}void DS18B20_WriteByte(unsigned char _byte){unsigned char i = 0;for(i = 0; i < 8; i++){DS18B20_Port = 0;DS18B20_Port = _byte & 0x01;Delay_DS18B20_us(25);DS18B20_Port = 1;_byte >>= 1;}Delay_DS18B20_us(25);}unsigned char DS18B20_ReadByte(void){unsigned char dat;unsigned char i = 0;for(i = 0; i < 8; i++){DS18B20_Port = 0;dat >>= 1;DS18B20_Port = 1;_nop_();_nop_();_nop_();_nop_();_nop_();if(DS18B20_Port){dat |= 0x80;}Delay_DS18B20_us(25);}return dat;}unsigned char DS18B20_Initialization(void){unsigned char flag = 0;DS18B20_Port = 1;Delay_DS18B20_us(5);DS18B20_Port = 0;Delay_DS18B20_us(200);Delay_DS18B20_us(200);DS18B20_Port = 1;Delay_DS18B20_us(50);flag = DS18B20_Port;Delay_DS18B20_us(25);return flag;}void DS18B20_Updata_Info(void){unsigned char i = 0;DS18B20_Initialization();DS18B20_WriteByte(SKIPROM);DS18B20_WriteByte(CONVETT);Delay_DS18B20_ms(10);DS18B20_Initialization();DS18B20_WriteByte(SKIPROM);DS18B20_WriteByte(READSCRATCHPAD);for(i=0; i<9; i++){Buffer_DS18B20[i] = DS18B20_ReadByte();}}void DS18B20_Read_Temp(void){unsigned int temperature_ds18b20 = 0;DS18B20_Updata_Info();temperature_ds18b20 = (unsigned int)Buffer_DS18B20[1] * 0x0100 + (unsigned int)Buffer_DS18B20[0];Temperature_DS18B20_LONG = (unsigned long)temperature_ds18b20 * 625 ;Temperature_DS18B20_STRING[8] = '\0';Temperature_DS18B20_STRING[7] = 0x30+(Temperature_DS18B20_LONG%10) /1;Temperature_DS18B20_STRING[6] = 0x30+(Temperature_DS18B20_LONG%100) /10;Temperature_DS18B20_STRING[5] = 0x30+(Temperature_DS18B20_LONG%1000) /100;Temperature_DS18B20_STRING[4] = 0x30+(Temperature_DS18B20_LONG%10000) /1000;Temperature_DS18B20_STRING[3] = '.';Temperature_DS18B20_STRING[2] = 0x30+(Temperature_DS18B20_LONG%100000)/10000;Temperature_DS18B20_STRING[1] = 0x30+(Temperature_DS18B20_LONG%1000000)/100000;Temperature_DS18B20_STRING[0] =0x30+(Temperature_DS18B20_LONG%10000000)/1000000;}unsigned char Board_InputOutput_DS18B20(unsigned char _mode){switch(_mode){case 0x01:DS18B20_Read_Temp(); break;case 0x02:DS18B20_Updata_Info(); break;default :return 1; break;}return 0;}#endif第19 页。