Proteus仿真设计基于单片机AT89C51的电子万年历

合集下载

基于单片机的电子万年历设计

基于单片机的电子万年历设计

基于单片机的电子万年历设计一、概述随着科技的快速发展和人们对生活品质的追求,电子设备在日常生活中扮演着越来越重要的角色。

电子万年历作为一种集日期、时间显示于一体的实用电子产品,已经深入到人们的日常生活和工作中。

传统的机械式日历已经无法满足现代人对时间精确性和功能多样性的需求,基于单片机的电子万年历设计应运而生,成为了当前研究的热点之一。

基于单片机的电子万年历设计,旨在利用单片机(如STC89CAT89C51等)的强大计算和控制能力,结合液晶显示屏(LCD)、按键输入等外设,实现时间的准确显示、日期的自动更新、闹钟提醒、温度显示等多样化功能。

该设计不仅具有高度的集成性和可靠性,而且能够通过编程实现各种定制化的功能,满足不同用户的需求。

本文将对基于单片机的电子万年历设计进行详细的介绍和分析,包括设计思路、硬件组成、软件编程等方面。

通过本文的阅读,读者可以了解电子万年历的基本原理和设计方法,掌握单片机在电子万年历设计中的应用技巧,为实际的开发工作提供有益的参考和借鉴。

1.1 研究背景与意义随着科技的不断进步,人们日常生活和工作中对于时间的精度和便捷性的要求日益提高。

传统的机械式日历和简单的电子时钟已经无法满足现代生活的需求。

电子万年历作为一种集时间显示、日历查询、定时提醒等多功能于一体的电子装置,在日常生活、工作乃至科研领域都具有广泛的应用价值。

基于单片机的电子万年历设计,不仅可以提供准确的时间显示,还能实现复杂的日期计算、农历显示、节假日提示等功能,极大地提高了时间管理的效率和便捷性。

单片机作为一种集成度高、功耗低、价格适中的微型计算机,非常适合用于小型化、智能化的电子产品设计,如电子万年历。

本研究的意义在于,通过对基于单片机的电子万年历的设计研究,可以推动微型计算机技术和电子时钟技术的融合发展,提升电子产品的智能化水平,满足人们日益增长的生活和工作需求。

同时,该研究还可以为相关领域的技术人员提供参考和借鉴,推动电子万年历产品的不断创新和优化。

基于AT89C51单片机的多功能电子万年历的设计

基于AT89C51单片机的多功能电子万年历的设计

1. 前言1.1 课题研究背景伴随着科技的快速发展,时间的流逝,从观察太阳、摆钟到现在电子钟,人类不断的研究,不断的创新纪录。

随着人们的生活水平的提高和生活节奏加快,对时间的要求也越来越高,精准数字计时的消费需求也就越来越多。

二十一世纪的今天,最具有代表性的计时产品就是电子数字万年历,它是近代世界钟表业界的第三次革命。

第一次是摆和摆轮游丝的发明,相对较稳定的机械振荡频率源使钟表的走时差从分级缩小至秒级,代表性的产品是带有摆或摆轮游丝的机械钟或者表。

第二次革命则是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,也使钟表的走时月差从分级缩小到秒级。

第三次革命就是单片机数码计时技术的应用(电子数字万年历),使计时产品的走时日差从分级缩小至1/600万秒,从原有的传统指针计时的方式发展成为人们日常更为熟悉的夜光数字显示方式,直观明了,并且增加了全自动日期、星期、温度以及其他日常附属带来了钟表计时业界跨跃性的进步。

国产的电子万年历有很多种,总体上来说以研究多功能电子数字万年历为主,使万年历除了原有的显示时间,日期等基本功能之外,还具有闹铃,报警等功能。

商家生产的电子数字万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

本设计为软硬件相结合的一组设计。

在软件设计过程中,应对硬件部分有相关了解,有助于对设计题目的更深了解和软件设计。

要了解一些主要器件的基本功能和作用。

除了采用集成化的时钟芯片之外,利用AT89系列单片机制成万年历电路,采用软硬件结合的方法,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。

AT89C51单片机是由ATMEL公司推出的一种小型单片机。

95年出现在中国市场。

主要特点为采用了Flash存贮器技术,降低了制造成本,其软硬件与MCS-51完全兼容,可以很快被中国广大用户接受。

1 / 331.2课题研究目的与意义二十一世纪是数字化技术高速发展的时期,同时单片机在数字化高速发展的时期扮演着非常重要的地位。

(完整word版)-基于AT89C51单片机的多功能电子万年历的设计

(完整word版)-基于AT89C51单片机的多功能电子万年历的设计

成都工业学院成教院毕业设计(论文)论文题目:基于AT89C51单片机的多功能电子万年历的设计教学点:重庆科创职业学院指导老师:段莉职称:讲师学生姓名:施翔文学号: 1212441420专业:机电一体化技术成都工业学院成教院制二〇一三年十二月二十五日成都工业学院成教院毕业设计(论文)任务书题目:基于AT89C51单片机的多功能电子万年历的设计任务与要求:1、用AT89C51单片机为控制器作为多功能电子万年历的硬件结构;2、以串行时钟DS1302记录日历和时间;3、采用直观的数字显示,可以显示年、月、日、时、分、秒、等功能。

时间:2013 年11月28 日至2014 年4 月17 日共20 周教学点:重庆科创职业学院学生姓名:施翔文学号:1212441420专业:机电一体化技术指导单位或教研室:重庆科创职业学院指导教师:段莉职称:讲师成都工业学院成教院制毕业设计(论文)进度计划表本表作评定学生平时成绩的依据之一。

摘要本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。

系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。

此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。

关键词:AT89C51、电子万年历、DS1302AbstractThis paper introduces the hardware structure of multi function electronic calendar AT89C51 microcontroller hardware and software design method based on. System to AT89C51 SCM as the controller, the serial clock calendar chipDS1302 calendar and time, it can be years, months, days, hours, minutes,seconds for time, also has a leap year compensation and other functions.Calendar using visual digital display, can simultaneously on the LED display year, month, day, Sunday, when, minutes and seconds, is also a time calibration functions. This calendar with easy to read, intuitive display, functional diversity,simple circuit, low cost and many other advantages, has broad market prospects.Key words:AT89C51、Electronic calendar、DS1302目录第一章绪论 0第一节课题研究的背景 0第二节课题的研究目的与意义 0第三节课题解决的主要内容 0第二章系统的总体设计 (1)第一节系统方案的构想与确定 (1)第二节器件的选用 (1)第三节单片机的选择 (1)第三章系统硬件的设计 (3)第一节系统硬件电路设计 (3)第二节AT89S51单片机 (3)第三节8位移位寄存器74LS164(串行输入,并行输出) (6)第四节DS1302 (9)第四章系统的软件设计 (12)第一节主程序图...................................................... 错误!未定义书签。

基于单片机控制的电子万年历.

基于单片机控制的电子万年历.

基于单片机控制的电子万年历摘要本设计是一个带温度显示的万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整功能,并且还包含显示温度功能。

其中显示部分采用LCD1602显示,时钟部分采用DS1302时钟芯片,温度部分采用DS18B20单线温度传感器。

软件方面我们采用C语言编程,利用Keil uVision3软件编写C语言程序并且生成HEX文件。

先将程序在Proteus 仿真,通过之后再烧录到单片机中。

该设计的优点是充分利用了LCD1602的显示功能完成了万年历应该具有的功能并且还扩展了温度;不足之处是收到LCD1602显示功能的限制没能显示农历日期。

电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。

该电路采用AT89S51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

关键词:万年历;AT89C51;液晶显示(LCD1602);温度传感器(DS18B20);时钟芯片(DS1302);proteus仿真;目录摘要 (1)目录 (1)1引言: (2)2设计方案 (3)2.2模块选择 (4)2.3方案框图 (4)3 软件实现 (5)3.1流程图 (5)3.2程序编写 (6)3.3运行程序生成hex文件 (12)4 proteus仿真 (13)4.1软件简介 (13)4.2 Proteus电路仿真与调试 (14)5 PCB制版 (21)5.1 绘制电路原理图并仿真调试 (21)5.2加载网络表及元件封装 (21)5.3规划电路板并设置相关参数 (23)5.4元件布局及调整 (24)5.5布线并调整 (25)5.6输出及制作PCB (26)总结 (27)参考文献 (28)致谢 (29)1引言:随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。

基于AT89C51单片机的多功能电子万年历的设计论文

基于AT89C51单片机的多功能电子万年历的设计论文

基于AT89C51单片机的多功能电子万年历的设计AT89C51 SCM-BASED ELCTRONIC DESIGN CALENDAR毕业论文学院名称泸州职业技术学院系部名称电子工程系专业名称应用电子技术2012年12月10日摘要本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。

系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,利用proteus仿真,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

万年历采用直观的数字显示,可以在1602上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。

此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。

关键字:AT89C51;电子万年历; DS1302;1602目录摘要 (01)第一章绪论 (03)1.1 课题研究的背景 (03)1.2课题解决的主要容 (03)第二章系统的总体设计 (04)2.1系统硬件电路设计 (04)2.1.1系统硬件结构 (04)2.2单片机及其附属电路 (05)2.2.1 MCS-51系列单片机 (05)2.1.2 MCS-51系列单片机的工作条件电路 (08)2.1.3 DS1302 (09)2.1.4 LCD1602显示电路 (10)2.1.5调节电路 (12)第三章系统的软件设计 (12)3.1主程序 (12)3.2 LCD1602的驱动程序 (13)3.3 DS1302的驱动程序 (14)第四章万年历的设计结论 (14)4.1 万年历工作原理 (14)4.2 万年历结构原理图 (15)致 (16)参考文献 (16)附录 (17)附录【1】仿真图片 (17)附录【2】程序代码................................. 17-25第一章绪论1.1 课题研究的背景随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

基于AT89C51单片机的多功能电子万年历的设计_毕业设计

基于AT89C51单片机的多功能电子万年历的设计_毕业设计

本科毕业设计(论文)基于AT89C51单片机的多功能电子万年历的设计AT89C51 SCM-BASED ELCTRONICDESIGN CALENDAR学生姓名学院名称信电工程学院专业名称电子信息工程技术指导教师年月日摘要本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。

系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。

此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。

关键字AT89C51;电子万年历; DS1302目录第一章引言................................................................................................. 错误!未定义书签。

1.1课题研究的背景 (1)1.2课题的研究目的与意义 (1)1.3课题解决的主要内容 (1)第二章系统的总体设计 (2)2.1系统方案的构想与确定 (2)2.2 器件的选用 (2)2.2.1单片机的选择 (2)第三章系统硬件的设计 (4)3.1系统硬件电路设计 (4)3.1.1系统硬件框图 (4)3.1.2 AT89C51单片机 (4)3.1.3 8位移位寄存器74LS164(串行输入,并行输出) (8)3.1.4 ds1302 (12)第四章系统的软件设计 (15)4.1 主程序 (15)4.2 从1302读取日期和时间程序 (16)4.3系统源代码 (16)第五章 PROTEUS使用 (29)5.1编程环境PROTEUS (29)5.2用PROTEUS ISIS对电子万年历的硬件电路设计 (29)5.3用PROTEUS ISIS进行电子万年历的仿真测试 (33)结论 (36)致谢 (37)参考文献 (38)附录............................................................................................................... 错误!未定义书签。

基于AT89C51单片机的多功能电子万年历的设计

基于AT89C51单片机的多功能电子万年历的设计

. . .. . . 单片机应用系统设计课题:基于AT89C51单片机的多功能电子万年历的设计姓名:班级:学号:指导老师:日期:.. .专目录一.绪言 (3)二.系统总体方案设计 (3)三.硬件系统设计: (4)四.系统软件设计 (5)五.设计总结 (8)六.参考文献 (8)七.附录 (9)一.绪论随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。

由其是单片机技术的应用产品已经走进了千家万户。

电子万年历的出现给人们的生活带来的诸多方便。

本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。

万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。

诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。

因此,研究万年历及扩大其应用,有着非常现实的意义。

本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。

二.系统总体方案设计1.系统设计硬件框图2.实现的基本原理在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给2.硬件原理图四.系统软件设计仿真过程1、打开PROTEUS软件,并出画单片机电子万年历具体运行电路图。

3、检查所画电路运行图,确保没有错误以后,加载源程序。

4、加载完成后,单击电路图框下的开始按钮,进行仿真,观察LED数码管现实情况,此时LED数码管开始显示数字。

基于89C51设计的电子万年历

基于89C51设计的电子万年历

第一章设计要求要求:利用89c51单片机设计万年历,通过LED显示器显示年.月.日.时.分.秒,通过键盘较正时间,能自动计算闰年等。

1.走时准确,可显示年.月.日和时.分.秒;2.可调整公历年.月.日和时.分.秒。

第二章单片机系统简介系统原理图1. 89c51工作原理89c51是一种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器,俗称单片机。

89c2051是一种带2K。

单片机的可擦除只读存储器可以反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令计划输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89c51是一种高效微控制器,89c2051是它的一种精简版本。

89c单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

(1)主要特性1.与MCS-51兼容4K字节可编程闪烁存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:OHz-24MHz三级程序存储器锁定128*8位内部RAM32可编程I/O线2个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路(2)管脚说明A T89C51AT89C51共有40个引脚,引脚的排列顺序为从靠芯片的缺口左边那列逆时针数起,依次为1、2、3、4.。

40,其中芯片的1引脚上有一个凹点。

在单片机的40个引脚中,电源引脚2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8位可编程I/O引脚32根。

1)、主电源引脚(2根)Vcc:电源输入,接+5V电源GND:接地线2)、外接晶振引脚(2根)XTAL1:片内晶振电路的输入端XTAL2:片内晶振电路的输出端3)、控制引脚(4根)RST/VPP:复位引脚,引脚上出现2个机器周期的高电频将使单片机复位ALE/PROG:地址锁存允许信号EA/VPP:程序存储器的内外部选通,接地电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令4)、可编程输入/输出引脚(32根)AT89C51单片机有4组8位可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位(8根引脚),共32根、每一根引脚都可以编程,比如用来控制电机、交通灯等,开发产品就是利用这些可编程引脚来实现我们想要的功能。

基于89C51单片机万年历设计源程序

基于89C51单片机万年历设计源程序

液晶子程序#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define DATABUS P0sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;sbit PSB = P2^3;sbit RES = P2^5;void Delay1us(uchar i);//延时i * 1usvoid Delay1ms(uint i);//延时i * 1msvoid Lcd_Writebyte(char dt,bit type);//向lcd写入一字节void Lcdinit_Str();//初始化lcd字符显示//void Lcdinit_Pic();//初始化lcd图形显示//void Lcd_XY(uchar *buf,uchar x,uchar y);//在指定的位置显示汉字void Lcd_Reset ();//LCD复位函数void Lcd_Current(uchar *buf);//在当前位置显示字符//void Lcd_Dispicture(uchar code *adder);//Lcd显示图片函数/*************************************函数名:Delay1us(uchar i)*功能:延时i * 1us*输入:i:延时参数*返回:void*************************************/void Delay1us(uchar i){while(--i);}/*************************************函数名:Delay1ms(uchar i)*功能:延时i * 1ms*输入:i:延时参数*返回:void*************************************/void Delay1ms(uint i){uchar j;while(--i){for(j=0; j<5; j++){Delay1us(200);}}}/*************************************函数名:void lcd_writbyte(char data,bit type)*功能:向lcd写入一字节*输入:data:要写入的数据type:选择方式(1为数据方式,0为命令方式) *返回:void*************************************/void Lcd_Writebyte(char dt,bit type){uchar busy;uint wait = 0;RS = 0;RW = 1;do{EN = 1;busy = DATABUS;EN = 0;if(wait++ > 2500) //超过一定时间,不等待break;}while(busy&0x80); //如果忙,一直等待if(type){RS = 1; //写数据RW = 0;}else{RS = 0; //写指令RW = 0;}DATABUS = dt;EN = 1;EN = 0;}/*************************************函数名:void lcd_init(void)*功能:初始化lcd的字符显示*输入:void*返回:void*************************************/void Lcdinit_Str(){Delay1us(40);PSB=1; //设置为8BIT并口工作模式Delay1us(1); //延时Lcd_Reset(); //复位Lcd_Writebyte(0x30,0);//设定基本指令集Delay1us(100);Lcd_Writebyte(0x0c,0);//显示开Delay1us(100);Lcd_Writebyte(0x01,0);//清除Delay1ms(20);Lcd_Writebyte(0x06,0);//设定AC+1Delay1us(100);Lcd_Writebyte(0x80,0);//设定起始地址Delay1us(100);}/*************************************函数名:void Lcdinit_Pic(void)*功能:Lcd显示图片初始化*输入:void*返回:void*************************************//*void Lcdinit_Pic(){Delay1ms(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式Delay1us(5); //延时Lcd_Reset();Lcd_Writebyte(0x34,0); //功能设定:扩充功能指令集Delay1us(100); //大于100uS的延时程序Lcd_Writebyte(0x36,0); //扩充功能设定:扩充功能指令集,绘图显示开Delay1us(100); //大于37uS的延时程序Lcd_Writebyte(0x3E,0); //EXFUNCTION(DL=8BITS,RE=1,G=1)Delay1us(100); //大于100uS的延时程序Lcd_Writebyte(0x01,0); //清屏Delay1us(100); //大于100uS的延时程序}*//*************************************函数名:void Lcd_XY(uchar *buf,uchar x,uchar y))*功能:在指定的位置显示汉字*输入:char *,uchar x,uchar y汉字:x范围0~7 y范围0~3英文:x范围0~15 y范围0~7*返回:void*************************************//*void Lcd_XY(uchar *buf,uchar x,uchar y){uchar adr;adr = (0x80+x); //计算出x坐标switch(y) //计算出y坐标{case 1:adr = adr+16;break;case 2:adr = adr+8;break;case 3:adr = adr+24;break;default:break;}Lcd_Writebyte(adr,0); //设定DDRAM位址到位址计数器Delay1us(100);while((*buf)!='\0') //字符串没结束{Lcd_Writebyte(*buf++,1);Delay1us(100);}}*//*************************************函数名:void Lcd_Current(uchar *buf)*功能:在当前的位置显示字符*输入:uchar *buf 输入字符*返回:void*************************************/void Lcd_Current(uchar *buf){while((*buf) != '\0'){Lcd_Writebyte(*buf++,1);Delay1us(100);}}/*************************************函数名:void Lcd_Reset ()*功能:Lcd复位函数*输入:void*返回:void*************************************/void Lcd_Reset(){RS=0; //复位Delay1ms(1); //延时RS=1; //复位置高Delay1ms(10);}/*************************************函数名:void Lcd_Dispicture(uchar code *adder)*功能:Lcd显示图片函数*输入:char code *adder 存图片的code*返回:void*************************************//*void Lcd_Dispicture(uchar code *adder){uint i,j;for(i=0;i<32;i++) // 上半屏32个列地址{Lcd_Writebyte(0x80 + i,0); //SET 垂直地址VERTICAL ADDLcd_Writebyte(0x80,0); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){Lcd_Writebyte(*adder,1);adder++;}}for(i=0;i<32;i++) //下半屏32个列地址{Lcd_Writebyte(0x80 + i,0); //SET 垂直地址VERTICAL ADDLcd_Writebyte(0x88,0); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){Lcd_Writebyte(*adder,1);adder++;}}} */时钟芯片子程序#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit SDA = P1^1;//DDS1302数据线sbit CLK = P1^0;//DS1302时钟线sbit RST = P1^2;//DS1302复位线void Writebyte_DS1302(uchar byte);//写一个字节到DS1302中uchar Getbyte_DS1302();//向DS1302读取一个字节中uchar Read_DS1302(uchar addr);//在DS1302中指定的地址读取数据void Write_DS1302(uchar addr,uchar dat);//向DS1302中指定的地址写数据void Init_DS1302();//DS1302初始化//void Gettime_DS1302();//从DS1302得到秒,分,时,日,月,周,年//void SET_DS1302();//设置DS1302日期与时间再保存/*************************************函数名:void Write_A_Byte_TO_DS1302(uchar x)*功能:写一个字节到DS1302中*输入:uchar x*返回:void*************************************/void Writebyte_DS1302(uchar byte){uchar i;for(i = 0; i < 8; i ++){SDA = byte & 1;CLK = 1;CLK = 0;byte >>= 1;}}/*************************************函数名:uchar Get_A_Byte_FROM_DS1302()*功能:向DS1302读取一个字节中*输入:void*返回:uchar(16进制)*************************************/uchar Getbyte_DS1302(){uchar i,b,t;for(i = 0; i < 8; i++){b >>= 1;t = SDA;b |= t << 7;CLK = 1;CLK = 0;}return b;//16 * 10 + b % 16);//十六进制转换十进制}/*************************************函数名:uchar Read_Data(uchar addr)*功能:在DS1302中指定的地址读取数据*输入:uchar addr*返回:uchar*************************************/uchar Read_DS1302(uchar addr){uchar dat;RST = 0;CLK = 0;RST = 1;Writebyte_DS1302(addr);dat = Getbyte_DS1302();CLK = 1;RST = 0;return dat;}/*************************************函数名:void Write_DS1302(uchar addr,uchar dat)*功能:向DS1302中指定的地址写数据*输入:uchar addr 地址uchar dat 数据*返回:void*************************************/void Write_DS1302(uchar addr,uchar dat){CLK = 0;RST = 1;Writebyte_DS1302(addr);Writebyte_DS1302(dat);CLK = 0;RST = 0;}/*************************************函数名:void DS1302_Init()*功能:设置1302的初始时间(2007年1月1日00时00分00秒星期一)*输入: void*返回:void*************************************/void DS1302_Init()//-设置1302的初始时间(2007年1月1日00时00分00秒星期一){uchar i;if(Read_DS1302(0xc1) != 0xaa){Write_DS1302(0x8e,0x00);//允许写操作Write_DS1302(0x8c,0x10);//年Write_DS1302(0x8a,0x01);//星期Write_DS1302(0x88,0x01);//月Write_DS1302(0x86,0x01);//日Write_DS1302(0x84,0x00);//小时Write_DS1302(0x82,0x00);//分钟Write_DS1302(0x80,0x00);//秒Write_DS1302(0x90,0xa5);//充电Write_DS1302(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)for(i=0;i<60;i=i+2){//清除闹钟RAM位为0Write_DS1302(0xc2+i,0x00);}Write_DS1302(0x8e,0x80);//禁止写操作}}/*************************************函数名:void GetTime()*功能:从DS1302得到秒,分,时,日,月,周,年*输入:void*返回:void*************************************//*void Gettime_DS1302(){Second = Read_DS1302(0x81);//秒Minute = Read_DS1302(0x83);//分Hour = Read_DS1302(0x85);//时Daytime = Read_DS1302(0x87);//日Month = Read_DS1302(0x89);//月Week = Read_DS1302(0x8b);//星期Year = Read_DS1302(0x8d);//年}*//*************************************函数名:void SET_DS1302()*功能:保存修改后的DS1302数据*输入:void*返回:void*************************************//*void SET_DS1302(){Write_DS1302(0x8E,0x00);//写控制字,取消保护Write_DS1302(address,(item / 10) * 16+item % 10);//转换成16进制写入1302 Write_DS1302(0x8E,0x80);//写控制字,加保护}*/主函数#include <reg51.h>//#include <string.h>#define uint unsigned int#define uchar unsigned charsbit KEY_1 = P1^4;//右一sbit KEY_2 = P1^5;//右二sbit KEY_3 = P1^6;//右三sbit KEY_4 = P1^7;//右四sbit Beep = P3^7;sbit Lcd_Back = P2^6;extern void Delay1ms(uint i);//延时i * 1msextern void Lcd_Writebyte(char dt,bit type);//向lcd写入一字节extern void Lcdinit_Str();//初始化lcd字符显示//extern void Lcdinit_Pic();//初始化lcd图形显示//extern void Lcd_XY(uchar *buf,uchar x,uchar y);//在指定的位置显示汉字extern void Lcd_Current(uchar *buf);//在当前位置显示字符//extern void Lcd_Dispicture(uchar code *adder);//Lcd显示图片函数extern uchar Read_DS1302(uchar addr);//在DS1302中指定的地址读取数据extern void Write_DS1302(uchar addr,uchar dat);//向DS1302中指定的地址写数据extern void DS1302_Init();//DS1302初始化void SET_DS1302(uchar sel);//保存修改后的DS1302数据void GetTime();//从DS1302得到秒,分,时,日,月,周,年void LCD_Year();//年void LCD_Month();//月void LCD_Week();//星期void LCD_Daytime();//日void LCD_Hour();//时void LCD_Minute();//分void Refresh_Data();//刷新年月日星期时分秒void LCD_Second();//秒void Festival();//节日void Beep_One();//整点报时void Beep_key();//按键音void Welcome();//欢迎词uchar Second,Minute,Hour,Daytime,Month,Week,Year;bit w = 0; //调时标志位uchar code LCD_Pic1[];/*************************************函数名:void Beep_One()*功能:蜂鸣器用来整点报时和开机声音*输入:void*返回:void*************************************/void Beep_One(){uchar a;for(a = 4;a > 0; a--)//第一个声音的长度{Beep = ~Beep;//取反扬声器驱动口,以产生音频Delay1ms(200);//音调设置延时Beep = ~Beep;Delay1ms(50);}Beep = 1;//结束后蜂鸣器停止}/*************************************函数名:void Beep_key()*功能:蜂鸣器按键发出的声音*输入:void*返回:void*************************************/void Beep_key(){Beep = 0;Delay1ms(50);Beep = 1;}/*************************************函数名:void Welcome()*功能:开机显示的欢迎词*输入:void*返回:void*************************************/void Welcome(){Lcd_Writebyte(0x82,0);Lcd_Writebyte(0x82,0);Lcd_Current("课程设计");Lcd_Writebyte(0x91,0);Lcd_Current("单片机万年历");Lcd_Writebyte(0x8B,0);Lcd_Current("2011年06月");Lcd_Writebyte(0x9C,0);Lcd_Current("电信刘仁");Beep_One();}/*************************************函数名:void Festival()*功能:公历节日与白天提示,节日提醒*输入:void*返回:void*************************************/void Festival(){Lcd_Writebyte(0x98,0);//在屏幕第四行Lcd_Writebyte(0x98,0);if ( Month == 0x01 && Daytime == 0x01 ){ Lcd_Current("Happy New Year!!"); }//1月if ( Month == 0x02 && Daytime == 0x14 ){ Lcd_Current(" 今天是情人节"); }if ( Month == 0x03 && Daytime == 0x08 ){ Lcd_Current(" 3.8妇女节"); }if ( Month == 0x03 && Daytime == 0x12 ){ Lcd_Current(" 植树节"); }if ( Month == 0x03 && Daytime == 0x15 ){ Lcd_Current(" 消费者权益日"); }if ( Month == 0x04 && Daytime == 0x01 ){ Lcd_Current("愚人节小心上当"); }//4if ( Month == 0x04 && Daytime == 0x08 ){ Lcd_Current(" 复活节"); }if ( Month == 0x04 && Daytime == 0x13 ){ Lcd_Current(" 黑色星期五"); }if ( Month == 0x05 && Daytime == 0x01 ){ Lcd_Current(" 劳动节放假"); }//5if ( Month == 0x05 && Daytime == 0x04 ){ Lcd_Current(" 青年节"); }if ( Month == 0x05 && Daytime == 0x05 ){ Lcd_Current("近日注意母亲节"); }if ( Month == 0x06 && Daytime == 0x01 ){ Lcd_Current(" 国际儿童节"); }//6if ( Month == 0x06 && Daytime == 0x05 ){ Lcd_Current(" 世界环境日"); }if ( Month == 0x06 && Daytime == 0x15 ){ Lcd_Current("近日注意父亲节"); }if ( Month == 0x07 && Daytime == 0x01 ){ Lcd_Current("香港回归记念日"); }//7if ( Month == 0x08 && Daytime == 0x01 ){ Lcd_Current(" 八一建军节"); }//8if ( Month == 0x09 && Daytime == 0x10 ){ Lcd_Current(" 中国教师节"); }//9if ( Month == 0x10 && Daytime == 0x01 ){ Lcd_Current(" 中国国庆节"); }//10if ( Month == 0x10 && Daytime == 0x13 ){ Lcd_Current(" 国际教师节"); }if ( Month == 0x12 && Daytime == 0x24 ){ Lcd_Current(" 今晚平安夜"); }if ( Month == 0x12 && Daytime == 0x25 ){ Lcd_Current(" 圣诞快乐"); }else{ Lcd_Writebyte(0x98,0);//非节日时显示时晨信息if ( Hour >= 0x04 && Hour < 0x06 ){ Lcd_Current("★★__▲▲__凌晨"); }if ( Hour >= 0x06 && Hour < 0x08 ){ Lcd_Current("☆○__▲△__早晨"); }if ( Hour >= 0x08 && Hour < 0x12 ){ Lcd_Current("__●__▲▲__上午"); }if ( Hour == 0x12) { Lcd_Current("____▲●▲__中午"); }if ( Hour >= 0x13 && Hour < 0x18 ){ Lcd_Current("__▲▲__●__下午"); }if ( Hour >= 0x18 && Hour < 0x22 ){ Lcd_Current("△▲__●☆__晚上"); }if ( Hour >= 0x22 && Hour <= 0x23 ){ Lcd_Current("△▲__★☆__夜里"); }if ( Hour >= 0x00 && Hour < 0x04 ){ Lcd_Current("__★▲▲★__深夜"); } }}/*************************************函数名:void LCD_Year()*功能:从1302读取年份并显示*输入:void*返回:void*************************************/void LCD_Year(){Year = Read_DS1302(0x8d);Lcd_Writebyte(0x83,0);Lcd_Current("20");Lcd_Writebyte(0x85,0);Lcd_Current("年");Lcd_Writebyte(0x84,0);Lcd_Writebyte((Year / 16) + 0x30,1);Lcd_Writebyte(Year % 16 + 0x30,1);}/*************************************函数名:void LCD_Month()*功能:从1302读取月份并显示,注意十位消隐*输入:void*返回:void*************************************/void LCD_Month(){Month = Read_DS1302(0x89);Lcd_Writebyte(0x90,0);if(Month/16 != 0){Lcd_Writebyte((Month / 16) + 0x30,1);} //十位消隐else{Lcd_Writebyte(0x20,1);}//同上Lcd_Writebyte(Month % 16 + 0x30,1);Lcd_Writebyte(0x91,0);Lcd_Current("月");}/*************************************函数名:void LCD_Week()*功能:从1302中读取星期并显示,注意星期三的的内码*输入:void*返回:void*************************************/void LCD_Week(){uchar sel;//选择星期Week = Read_DS1302(0x8b);sel = (Read_DS1302(0x8b))%16; //字节低4位的BCD码放入sel if(sel==7){Lcd_Writebyte(0x97,0);Lcd_Current("日");}// 星期日if(sel==6){Lcd_Writebyte(0x97,0);Lcd_Current("六");} // 星期六if(sel==5){Lcd_Writebyte(0x97,0);Lcd_Current("五");} // 星期五if(sel==4){Lcd_Writebyte(0x97,0);Lcd_Current("四");} // 星期四if(sel==3) {Lcd_Writebyte(0x97,0);Lcd_Writebyte(0xc8,1);Lcd_Writebyte(0xfd,1);} //相当于Lcd_XY("三",7,1) 星期三if(sel==2){Lcd_Writebyte(0x97,0);Lcd_Current("二");} //星期二if(sel==1){Lcd_Writebyte(0x97,0);Lcd_Current("一");} //星期一Lcd_Writebyte(0x95,0);Lcd_Current("星期");}/*************************************函数名:void LCD_Daytime()*功能:从1302中读取日并显示,注意十位消隐*输入:void*返回:void*************************************/void LCD_Daytime()//日{Daytime = Read_DS1302(0x87);Lcd_Writebyte(0x92,0);if(Daytime / 16 != 0){Lcd_Writebyte((Daytime/16)+0x30,1);} //十位消隐else{Lcd_Writebyte(0x20,1);}//同上Lcd_Writebyte(Daytime % 16 + 0x30,1);Lcd_Writebyte(0x93,0);Lcd_Current("日");}/*************************************函数名:void LCD_Hour()*功能:从1302中读取时并显示*输入:void*返回:void*************************************/void LCD_Hour(){Hour = Read_DS1302(0x85);Lcd_Writebyte(0x8a,0);Lcd_Writebyte((Hour / 16) + 0x30,1);Lcd_Writebyte(Hour % 16 + 0x30,1);}/*************************************函数名:void LCD_Minute()*功能:从1302中读取分并显示,增加整天报时与节日显示功能*输入:void*返回:void*************************************/void LCD_Minute(){Minute = Read_DS1302(0x83);if (Minute == 0x59&& Second >= 0x55 && Second <= 0x59 && w == 0) {Beep_One();}if(w == 0){Festival();}Lcd_Writebyte(0x8b,0);Lcd_Writebyte(0x3a,1); //":"Lcd_Writebyte((Minute / 16) + 0x30,1);Lcd_Writebyte(Minute % 16 + 0x30,1);Lcd_Writebyte(0x3a,1); //":"}/*************************************函数名:void LCD_Second()*功能:从1302中读取秒并显示*输入:void*返回:void*************************************/void LCD_Second(){Second = Read_DS1302(0x81);Lcd_Writebyte(0x8d,0);Lcd_Writebyte((Second / 16)+0x30,1); //写十位Lcd_Writebyte(Second % 16 + 0x30,1); //写个位/************************************ *函数名:void Refresh_Data()*功能:刷新显示年月时分星期*输入:void*返回:void*************************************/ void Refresh_Data(){LCD_Minute();//刷新分LCD_Hour();//刷新小时LCD_Daytime();//刷新日LCD_Week();//更新星期值LCD_Month();//刷新月LCD_Year();//刷新年}/************************************ *函数名:void SET_DS1302()*功能:保存修改后的DS1302数据,不管调整那项都得到一个新的值写入1302对应的地址中即可*输入:uchar sel调整项目*返回:void*************************************/ void SET_DS1302(uchar sel){uchar address,item;uchar max,mini;Lcd_Writebyte(0x9A,0);Lcd_Current("调整");if(sel == 5) //分钟6{Lcd_Writebyte(0x9C,0);Lcd_Current("分钟");address = 0x82;max = 59;mini = 0;}if(sel == 4) //小时{Lcd_Writebyte(0x9C,0);Lcd_Current("小时");address = 0x84;max = 23;mini = 0;}if(sel == 3) //星期4{Lcd_Writebyte(0x9C,0);Lcd_Current("星期");address = 0x8a;max = 7;mini = 1;}if(sel == 2) //日3{Lcd_Writebyte(0x9C,0);Lcd_Current("日期");address = 0x86;max = 31;mini = 1;}if(sel == 1) //月2{Lcd_Writebyte(0x9C,0);Lcd_Current("月");address = 0x88;max = 12;mini = 1;}if(sel == 0) //年1{Lcd_Writebyte(0x9C,0);Lcd_Current("年");address = 0x8c;max = 99;mini = 0;}//读取1302某地址上的数值转换成10进制赋给itemitem = ((Read_DS1302(address+1))/16)*10 + (Read_DS1302(address+1))%16; if(KEY_2 == 0){item++;//数加1}if(KEY_4 == 0){item--;//数减1}if(item > max)item = mini;//查看数值有效范围if(item < mini)item = max;Write_DS1302(0x8e,0x00);//允许写操作Write_DS1302(address,(item / 10) * 16+item % 10);//转换成16进制写入1302 Write_DS1302(0x8e,0x80);//写保护,禁止写操作Refresh_Data(); //刷新数据// LCD_Second();//刷新分}/*************************************函数名:void GetTime()*功能:从DS1302得到秒,分,时,日,月,周,年*输入:void*返回:void*************************************/void GetTime(){Second = Read_DS1302(0x81);//秒Minute = Read_DS1302(0x83);//分Hour = Read_DS1302(0x85);//时Daytime = Read_DS1302(0x87);//日Month = Read_DS1302(0x89);//月Week = Read_DS1302(0x8b);//星期Year = Read_DS1302(0x8d);//年}/*************************************函数名:void main()*功能:*输入: void*返回:void*************************************/void main(){uchar e = 0;//调整项目KEY_1 = 1; KEY_2 = 1;KEY_3 = 1; KEY_4 = 1;//初始键盘Second = 0xff; Minute = 0xff;Hour = 0xff; Daytime = 0xff;Month = 0xff; Week = 0xff;Year = 0xff;Lcd_Back = 0;DS1302_Init();Lcdinit_Str();//初始化液晶显示器Lcd_Writebyte(0x01,0);//清屏Welcome();//显示欢迎信息Delay1ms(300); //显示等留0.3秒Lcd_Writebyte(0x01,0);//清屏while(1){if (w == 0)//正常显示{Refresh_Data();LCD_Second();}if (KEY_3 == 0) // 调时状态{Delay1ms(15); //去抖if(KEY_3 == 0 && w == 1) //调整下一项{Beep_key();//按键音e++;if (e >= 6 ){e = 0;}SET_DS1302(e);//调整}if(KEY_3 == 0 && w == 0) //调时状态且正常显示{Beep_key();//按键音w=1; //进入调时Lcd_Writebyte(0x01,0);//清屏Refresh_Data();LCD_Second();Lcd_Writebyte(0x9E,0);Lcd_Current("[-]"); //KEY_4Lcd_Writebyte(0x80,0);Lcd_Current("[Esc]"); //KEY_1Lcd_Writebyte(0x85,0);Lcd_Current("[Next]"); // KEY_3Lcd_Writebyte(0x98,0);Lcd_Current("[+]"); //KEY_2SET_DS1302(e);//调整}}if (KEY_1 == 0) // 在调时状态退出{Delay1ms(15);if(KEY_1 == 0 && w == 0)//正常状态退出{Lcd_Writebyte(0x01,0);//清屏Welcome(); //显示欢迎信息while(KEY_1 == 0);//按键松手}if(KEY_1 == 0 && w == 1){Beep_key();//按键音w = 0; //退出调时正常显示e = 0; //“下一项”计数器清0}Lcd_Writebyte(0x01,0);//清屏Lcd_Writebyte(0x01,0);//清屏Refresh_Data(); //刷新数据while(KEY_1 == 0);//按键松手}if (KEY_2 == 0 && w == 1)//++{Delay1ms(15);if(KEY_2 == 0 && w == 1){Beep_key();//按键音SET_DS1302(e);//调整}while(KEY_2 == 0);//按键松手}if (KEY_4 == 0 && w == 1)//--{Delay1ms(15);if(KEY_4 == 0 && w == 1){Beep_key();//按键音SET_DS1302( e );//调整}}}}。

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

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

单片机课程设计报告万年历的设计基于51单片机的万年历摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分、秒进行计时,使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。

该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。

在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。

万年历的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由AT89C52单片机,LCD显示电路,以及调时按键电路等组成。

在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。

显示器使用了1602液晶显示,并且使用蜂鸣器实现了整点报警的功能,温度测试的功能实现使用了DS18B20,并实现了温度过高或过低时的温度报警。

软件方面主要包括日历程序、时间调整程序,显示程序等。

程序采用C语言编写。

所有程序编写完成后,在KeilC51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真,并最终实现基本要求。

综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

一、设计要求基本要求:1,8 个数码管上显示,显示时间的格式为(假如当前时间是19:32:20)“19-32-20”;2,具有日历功能;③时间可以通过按键调整。

发挥部分:④具有闹钟功能(可以设定多个)。

二:总体设计电路设计框图系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由单片机定时功能提供;温度的采集由DS18B20构成,它具有独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,使用时不需要额外的外围电路。

AT89C51控制的电子时钟和日期设计

AT89C51控制的电子时钟和日期设计

AT89C51控制的电子时钟和日期设计“电子日历+电子时钟系统”,日历与时间轮流显示,间隔1秒,系统要求实现以下功能:1、日历显示格式为“××××.××.××”,分别对应“年.月.日”;2、时钟显示格式为“××-××-××”,分别对应“时-分-秒”;3、实现日期和时间可通过键盘调整在按键模块中,按键实现年月日、时分秒的调节功能。

k==1,修改时加1的功能;k==2,修改分加1的功能;k==3,修改秒加1的功能k==5,修改时减1的功能;k==6,修改分减1的功能;k==7,修改秒减1的功能k==9,修改年加1的功能;k==10,修改月加1的功能;k==11,修改日加1的功能k==13,修改年减1的功能;k==14,修改月减1的功能;k==15,修改日减1的功能当显示时分秒时按下k==0键,此时只显示时分秒,此时可以修改时分秒,当再次按下k==8时返回交替显示当显示年月日时按下k==4键,此时只显示年月日,此时可以修改年月日,当再次按下k==8时返回交替显示在交替显示时,同样可以修改年月日、时分秒#include<reg52.h>unsigned char k,a;unsigned int nian=2012,yue=05,ri=25,shi=10,fen=30,miao=20;//电子日历和电子时钟系统显示的初始化unsigned char flag;void shuma_xianshi();//年月日显示函数声明void shuma_xianshi1(); //时分秒显示函数声明void tiaoshi();//调节年月日、时分秒函数声明void delay();//延时函数声明unsigned char getkey1();//扫描键盘值函数声明void nianyuetiaozheng();//年月的调整函数声明void main()//主函数程序{TMOD=0X01;//定时器T0模式1TH0=0X4C;//设置定时器初值TL0=0X00;EA=1;//开总中断ET0=1;TR0=1;while(1){tiaoshi();//"调节年月日、时分秒函数"的调用nianyuetiaozheng();//"年月的调整函数"的调用if(miao%2) //判断年月日、时分秒的交替轮流显示;当秒为奇数时显示时分秒,当秒为偶数时显示年月日{if(k==0){ EA=0;//在显示时分秒时,若按键0按下时停止计数,此时只显示时分秒while(1){shuma_xianshi1(); //时分秒显示函数tiaoshi();//"调节年月日、时分秒函数"的调用if(k==9)nian=(--nian);;//在显示时分秒时,假如说有按键9按下,年++不起作用if(k==10)yue=(--yue); //在显示时分秒时,假如说有按键10按下,月++不起作用if(k==11)ri=(--ri); //在显示时分秒时,假如说有按键11按下,日++不起作用if(k==13)nian=(++nian); //在显示时分秒时,假如说有按键13按下,年--不起作用if(k==14)yue=(++yue);//在显示时分秒时,假如说有按键14按下,月--不起作用if(k==15)ri=(++ri); //在显示时分秒时,假如说有按键15按下,日--不起作用if(k==8)break; //在显示时分秒时,假如说有按键8按下,此时返回到年月日、时分秒的交替显示nianyuetiaozheng();//"年月的调整函数"的调用} EA=1; //开启总中断}shuma_xianshi1();//显示时分秒}else{if(k==4){ EA=0;//在显示年月日时,若按键4按下时停止计数,此时只显示年月日while(1){shuma_xianshi();//年月日显示函数tiaoshi();if(k==1)shi=(--shi);//在显示年月日时,假如说有按键1按下,时++不起作用if(k==2)fen=(--fen);//在显示年月日时,假如说有按键2按下,分++不起作用if(k==3)miao=(--miao);//在显示年月日时,假如说有按键3按下,秒++不起作用if(k==5)shi=(++shi);//在显示年月日时,假如说有按键5按下,时--不起作用if(k==6)fen=(++fen);//在显示年月日时,假如说有按键6按下,分--不起作用if(k==7)miao=(++miao);//在显示年月日时,假如说有按键7按下,秒--不起作用if(k==8)break;//在显示年月日时,假如说有按键8按下,此时返回到年月日、时分秒的交替显示nianyuetiaozheng();//"年月的调整函数"的调用} EA=1; //开启总中断}shuma_xianshi();//显示年月日}}}void shuma_xianshi()//年月日显示函数{P0=0X80|(nian/1000); //年的千位数字delay();P0=0X90|(nian%1000/100);//年的百位数字delay();P0=0Xa0|(nian%100/10);//年的十位数字delay();P0=0Xb0|(nian%10); //年的个位数字delay();P0=0Xc0|(yue/10);delay();P0=0Xd0|(yue%10);delay();P0=0Xe0|(ri/10);delay();P0=0Xf0|(ri%10);delay();}void shuma_xianshi1()//时分秒显示函数{P0=0X80|(shi/10);delay();P0=0X90|(shi%10);delay();P0=0Xb0|(fen/10);delay();P0=0Xc0|(fen%10);delay();P0=0Xe0|(miao/10);delay();P0=0Xf0|(miao%10);delay();}void tiaoshi()//调节年月日、时分秒函数{k=getkey1();//当有键按下时,取键盘的值if(k==1)//按键1按下时,实现小时的++{TR0=0;shi++ ;if(shi==24)shi=0;TR0=1;}if(k==2)//按键2按下时,实现分钟的++{TR0=0;fen++;if(fen==60)fen=0;TR0=1;}if(k==3)//按键3按下时,实现秒的++ {TR0=0;miao++;if(miao==60)miao=0;TR0=1;}if(k==5)//按键5按下时,实现小时的-- {TR0=0;shi--;if(shi==-1)shi=23;TR0=1;}if(k==6)//按键6按下时,实现分钟的-- {TR0=0;fen--;if(fen==-1)fen=59;TR0=1;}if(k==7)//按键7按下时,实现秒的-- {TR0=0;miao--;if(miao==-1)miao=29;TR0=1;}if(k==9)//按键9按下时,实现年的++ {TR0=0;nian++;if(nian==2051)nian=2012;TR0=1;}if(k==10)//按键10按下时,实现月的++{TR0=0;yue++;if(yue==13)yue=1;TR0=1;}if(k==11)//按键11按下时,实现日的++{TR0=0;ri++;if(ri==a)ri=1;TR0=1;}if(k==13)//按键13按下时,实现年的--{TR0=0;nian--;if(nian==2011)nian=2050;TR0=1;}if(k==14) //按键14按下时,实现月的--{TR0=0;yue--;if(yue==0)yue=12;TR0=1;}if(k==15)//按键15按下时,实现日的--{TR0=0;ri--;if(ri==0)ri=(a-1);TR0=1;}}void delay()//延时函数{unsigned char m,n;for(m=0;m<20;m++)for(n=0;n<100;n++);}void time0() interrupt 1 //定时器中断函数{flag++;TH0=0X4C;//重新置入初值TL0=0X00;if(flag==20)//当flag==20时,此时定时时间1秒到{flag=0;miao++;if(miao==60)//当miao==60时,实现fen++{miao=0;fen++;if(fen==60)//当fen==60时,实现shi++{fen=0;shi++;if(shi==24)//当shi==24时,实现ri++{shi=0;ri++;if(ri==31)//当ri==31时,实现yue++{ri=1;yue++;if(yue==13)//当yue==13时,实现nian++{yue=1;nian++;}}}}}}}unsigned char getkey1(void)//扫描键盘值函数{unsigned char temp,k;P2=0xfe; //判断按键0、1、2、3temp=P2;temp=temp&0xf0;if(temp!=0xf0){delay();temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xee:k=0;break;case 0xde:k=1;break;case 0xbe:k=2;break;case 0x7e:k=3;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}return k;}P2=0xfd;//判断按键4、5、6、7 temp=P2;temp=temp&0xf0;if(temp!=0xf0){delay();temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xed:k=4;break;case 0xdd:k=5;break;case 0xbd:k=6;break;case 0x7d:k=7;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}return k;}P2=0xfb;//判断按键8、9、10、11 temp=P2;temp=temp&0xf0;if(temp!=0xf0){delay();temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xeb:k=8;break;case 0xdb:k=9;break;case 0xbb:k=10;break;case 0x7b:k=11;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}return k;}P2=0xf7;//判断按键12、13、14、15 temp=P2;temp=temp&0xf0;if(temp!=0xf0){delay();temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xe7:k=12;break;case 0xd7:k=13;break;case 0xb7:k=14;break;case 0x77:k=15;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}return k;}}void nianyuetiaozheng()//年月的调整函数{if(yue==2)//当月份显示为2月份时{if(nian%4==0 && nian%100!=0)//判断是否为闰年{a=30;//当是闰年时,a=30}else{a=29;//当不是闰年时,a=29}}elseif(yue==1|yue==3|yue==5|yue==7|yue==8|yue==10|yue==12){a=32;//当月份显示为1、3、5、7、8、10、12时,a=32 }elseif(yue==4|yue==6|yue==9|yue==11){a=31;//当月份显示为4、6、9、11时,a=31}}。

51单片机电子万年历设计带有proteus仿真

51单片机电子万年历设计带有proteus仿真

湖南文理学院课程设计课程名称:单片机课程设计设计题目:电子万年历教学院部:电气与信息工程学院专业班级:自动化09101班指导教师:张晓虎(学生姓名:邵泽学号: 0120完成时间: 2012 年6月12日报告成绩:{摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。

该电路采用AT89C52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。

万年历的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由AT89C52单片机,液晶显示电路,复位电路,时钟电路,稳压电路电路以及串口下载电路等组成。

在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。

显示器使用液晶LCD1602。

软件方面主要包括日历程序、液晶驱动程序,显示程序等。

程序采用汇编语言编写。

所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。

关键词时钟电钟,DS1302,液晶LCD1602,单片机Abstract:…Electronic calendar is a very extensive daily timing tool for modern society is more and more popular. It can be to year, month, day, Sunday, when, minutes, and seconds for the time, also has a leap year compensation and other functions, and the DS1302 long service life and small error. For digital electronic calendar using intuitive digital display, can also shows that year, month, day, Sunday, when the information such as, minutes and seconds, still have time calibration etc. Function. The AT89C52 single chip microcomputer as circuit adopts core, power consumption is small, can be in 3 V of low-pressure work, voltage can choose 3 to 5 V voltage power supply. The design process of the calendar in the hardware and software design of synchronization. Mainly by AT89C52 single chip microcomputer hardware part, liquid crystal display circuit, reset circuit, clocking circuit on the circuit circuit and serial download circuit etc. The processor on the choice of the single chip microcomputer AT89C52 use, the single chip microcomputer suitable for many more complex control applications. Use of liquid crystal display LCD1602. Software is mainly including calendar program, liquid crystal driver, show program, etc. Program using assembly language. All programming, after the completion of Keil C51 software in commissioning, make sure no, after Proteus software embedded in within the singlechip microcomputer simulation.Key words DianZhong clock, DS1302, liquid crystal LCD1602, microcontroller目录1设计要求与方案论证 (3)设计要求 (3)系统基本方案选择和论证 (3)单片机芯片的选择方案和论证 (3)"时钟芯片的选择方案和论证: (4)电路设计最终方案决定 (5)2系统的硬件设计与实现 (5)电路设计框图 (5)系统硬件概述 (5)主要单元电路的设计 (5)单片机主控制模块的设计 (6)时钟电路模块的设计 (6)}显示模块电路 (7)串口下载电路 (8)复位电路 (9)稳压电路 (10)3系统的软件设计 (11)程序流程框图 (11)子程序的设计 (11)读写DS1302子程序 (11)】读写LCD1602子程序 (12)4软件测试及分析 (14)分析与结论 (14)调试分析 (14)调试和结论 (15)5总结 (15)1设计要求与方案论证设计要求—①能够显示年、月、日、时、分。

基于AT89C51多功能电子万年历的设计_毕业设计

基于AT89C51多功能电子万年历的设计_毕业设计

合肥学院《单片机原理与应用》课程论文课程论文题目基于AT89C51多功能电子万年历的设计院系名称计算机科学与技术系专业(班级)计算机科学与技术(09计本2班)姓名(学号)指导教师2012 年 6 月 10 日摘要:随着单片机应用技术的飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些大部分都是以单片机为控制核心的。

单片机是集CPU 、RAM 、ROM 、定时、计数器和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于工业自动化和消费电子,因此具有非常现实的研究意义。

本文通过对一个基于单片机实现的电子万年历设计,让我们加深了对单片机、C语言编程、Keil 调试、Proteus仿真的理解。

此系统由主控制器AT89C51、时钟电路模块DS1302、显示电路模块、温度采集模块DS18B20等部分构成,能实现实时年、月、日、时、分、秒、星期、温度等显示。

关键词:DS1302;DS18B20;单片机;多功能万年历引言:万年历是采用数字电路实现对年、月、日、时、分、秒、星期、温度等数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中的必需品。

由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的功能。

诸如能显示周围温度,能动态显示需要的文字信息,而且配上优美的画质,动听的音乐,更有美化环境的功能。

因此,研究万年历及扩大其应用,有着非常现实的意义。

1 方案论证1.1 单片机芯片的选择在单片机控制中,常用的ATMEL公司单片机种类有AT89C51、AT89C52、AT89S51、AT89S52,都兼容MCS-51单片机。

毕业设计(论文)-基于at89c51单片机万年历的设计[管理资料]

毕业设计(论文)-基于at89c51单片机万年历的设计[管理资料]

四川省高等教育自学考试电子工程专业毕业论文论文题目_基于AT89C51单片机万年历的设计专业________电子工程_______________ 学生姓名________________________准考证号__________________指导老师_______________________2011年08 月23 日摘要自古人们就懂得了怎么样算时间,打草结、挂麻絏、划笔画等。

现在社会的日益进步时间变得更加的珍贵。

传统的钟表误差大、使用寿命不长、要经常的更改时间。

显示不直观,给人们带来了许多的不便。

科技的快速发展,很好的解决的问题。

而多功能电子万年历能很好的解决这些问题,万年历采用软、硬件结合,误差小、使用寿命长,采用直观的数字显示,简捷明了。

本文介绍了基于AT89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法。

系统以AT89C52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

运用单片机实现公历农历之间的转换,电子闹钟,计时器和对指定日期的查询等功能。

万年历采用液晶显示LCD-12864显示,可以同时显示年、月、日、周几、时、分、秒,农历。

综上所述此电子晚年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景关键字:AT89C51;电子万年历;DS1302 ;公农历转换;电子闹钟;计时器;日期查询目录1 绪论 (5) (5) (5) (5)2 系统的总体设计 (6) (6)器件的选用 (7)单片机的选用 (7)LCD 液晶显示器12864 选用及工作原理 (8)LCD液晶显示概述 (8)LCD模块接口说明 (9)LCD 模块主要硬件构成说明 (9)LCD 指令说明 (11)LCD 读写时序图 (11)LCD 软件初始化 (13)应用举例 (15)公农历转换 (17)3 系统硬件的设计 (20) (20) (20)AT89C51单片机 (20)3. AT89C51单片机与MCS-51完全兼容 (23)实时时钟芯片 DS1302 (25)4 系统的软件设 (29)程序流程图 (30)主程序 (31)读取日期和时间程序 (32)显示子程序 (33) (34)5 PROTEUS使用 (34) (34)ISIS对电子万年历的硬件电路设计 (35)ISIS进行电子万年历的仿真测试 (38)结论 (39)致谢 (40)参考文献 (41)程序 (42)一绪论课题研究的背景随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

基于AT89C51单片机的多功能电子万年历的设计

基于AT89C51单片机的多功能电子万年历的设计

1. 前言1.1 课题研究背景伴随着科技的快速发展,时间的流逝,从观察太阳、摆钟到现在电子钟,人类不断的研究,不断的创新纪录。

随着人们的生活水平的提高和生活节奏加快,对时间的要求也越来越高,精准数字计时的消费需求也就越来越多。

二十一世纪的今天,最具有代表性的计时产品就是电子数字万年历,它是近代世界钟表业界的第三次革命。

第一次是摆和摆轮游丝的发明,相对较稳定的机械振荡频率源使钟表的走时差从分级缩小至秒级,代表性的产品是带有摆或摆轮游丝的机械钟或者表。

第二次革命则是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,也使钟表的走时月差从分级缩小到秒级。

第三次革命就是单片机数码计时技术的应用(电子数字万年历),使计时产品的走时日差从分级缩小至1/600万秒,从原有的传统指针计时的方式发展成为人们日常更为熟悉的夜光数字显示方式,直观明了,并且增加了全自动日期、星期、温度以及其他日常附属带来了钟表计时业界跨跃性的进步。

国产的电子万年历有很多种,总体上来说以研究多功能电子数字万年历为主,使万年历除了原有的显示时间,日期等基本功能之外,还具有闹铃,报警等功能。

商家生产的电子数字万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

本设计为软硬件相结合的一组设计。

在软件设计过程中,应对硬件部分有相关了解,有助于对设计题目的更深了解和软件设计。

要了解一些主要器件的基本功能和作用。

除了采用集成化的时钟芯片之外,利用AT89系列单片机制成万年历电路,采用软硬件结合的方法,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。

AT89C51单片机是由ATMEL公司推出的一种小型单片机。

95年出现在中国市场。

主要特点为采用了Flash存贮器技术,降低了制造成本,其软硬件与MCS-51完全兼容,可以很快被中国广大用户接受。

1 / 331.2课题研究目的与意义二十一世纪是数字化技术高速发展的时期,同时单片机在数字化高速发展的时期扮演着非常重要的地位。

基于AT89C51单片机的万年历

基于AT89C51单片机的万年历

扬州工业职业技术学院2010 —2011学年第一学期毕业设计课题名称:基于AT89C51单片机的万年历设计时间:—系部:电子信息工程系班级:0901机电一体化姓名:丁杨指导教师:周杰总目录第一部分任务书第二部分开题报告第三部分毕业设计正文第一部分任务书扬州工业职业技术学院毕业设计任务书第二部分开题报告扬州工业职业技术学院电子信息工程系11届毕业设计(论文)开题报告书(表1)第三部分毕业设计正文基于AT89C51单片机的万年历丁杨0901机电一体化[摘要] 随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。

为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

该电子万年历主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、DS18B20温度传感芯片提供温度数据、LCD液晶显示屏显示。

A T89C51单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS 公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;DS18B20温度芯片是一种测量精度高的数字温度传感器,具有只需要一个数据电缆传输数据,电路连接简单的特点;数字显示是采用的LCD液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。

此外,该电子万年历还具有时间校准等功能。

一(五号,宋体,“摘要”两字为黑体)[关键词]时钟电路;时钟芯片DS1302; DS18B20温度传感芯片;LCD液晶显示;单片机AT89C51;The calendar based on AT89C51Ding yang0901 Electromechanical integrationAbstract:With the society, science and technology, mankind learned that time, from the view of the sun, to the present electronic clock pendulum clock, continuousresearch and innovation. Observation time inthe same time, be able to understand other human beings is closely related to information, such as temperature, week, date and so on, the birth of the electronic calendar, and it set the time, date, week and temperature-in-one, with easy to read, intuitive display functional diversity, and many other advantages of simple circuit with the electronic instrumentation of the development trend of the market prospects are broadThe main use of the electronic calendar AT89C51 single-chip microcomputer as the main core, provided by the DS1302 clock chip clock, DS18B20 the temperature chip acquisition transition temperature, LED display shows the dynamic scan. AT89C51 single-chip microcomputer is introduced by Atmel Corporation, a small power consumption, voltage can be selected 4 ~ 6V power supply voltage; DS1302 clock chip is introduced DALLAS fine with trickle charge function of current low-power real-time clock chip, which can of the year, month, day, week, hour, minute, second for time, also has multiple functions, such as a leap year compensation, and long life of the DS1302, a small error; DS18B20 temperature chip is a digital temperature sensor with a measurement accuracy high, a simple circuit to connect the characteristics of such sensors only need a data cable for data transmission; digital LCD display is used to display LCD screen, can display year, month, day, week, hour, minute, second and temperature, etc. information. In addition, the electronic calendar is also a time-calibration functions.Key words:Clock circuit; Clock chip DS1302;LCD dispaly;DS18B20temperature sensor chip;Single-chipAT89C51;目录第一章概论 (1)第二章设计要求与方案论证 (2)引言 (2)功能与要求 (2)方案论证 (2)技术可行性 (2)单片机的选择 (3)显示系统的方案选择 (3)温度系统方案选择 (4)键盘模块的选择 (4)总体方案论证与选择 (4)第三章系统硬件电路的设计 (5)电路设计 (6)系统硬件概述 (6)主控制器AT89C51 (6)时钟电路DS1302 (7)温度模块DS18B20 (8)液晶屏显示模块12864 (9)主要单元电路的设计 (10)按键系统电路 (10)键盘接口 (10)时钟系统电路 (12)温度模块电路 (18)单片机最小系统 (21)第四章系统的软件设计与调试 (22)程序设计 (22)程序设计及软件仿真调试 (24)用PROTEUS ISIS进行电子万年历的仿真测试 (27)结论 (30)致谢 (31)参考文献 (32)附录1电子万年历程序 (33)第一章概论随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

科技广场2008.10
是同一台电脑,在这里添上另一台电脑的I P地址(另一台电脑安装P r ot eus);
⑤打开P r ot eus I S I S,在菜单栏中选择“D e bug→U s e r e- m ot e de bug m oni t or”,选中该项。

注意:一定要把K e il的工程和P r ot eus的文件放到同一个目录下(这里所说的K e il的工程是指工程目录,即P r ot eus 的工程文件要和K e il的工程文件夹放在同一层目录下)。

2 基于AT89C51 的电子万年历系统构成
采用单片机设计应用系统时,应考虑到在满足设计要求的情况下,硬件电路尽可能精简,最大限度地用程序设计完成系统的各项功能。

这样做的目的有二:一是节省硬件成本;二是缩短设计周期,便于系统今后的维护与升级。

鉴于此,该电子万年历主要采用单片机A T89C51、实时时钟芯片D S1302及LCD 液晶显示屏设计实现,系统原理组成如图一所示。

其功能说明如下:
图一基于单片机A T89C51的电子万年历系统框图
①D S1302为系统提供精准的秒、分、时、日、月、年等实时时间信息,星期则由编程计算得到;
②设置了3个按键,功能分别为状态调整(确认)、加一、减一。

调整键可对万年历时间设置进行移位和确认,加一键是对相应调整位进行加一操作(每按键一次加一),减一键则是对调整位进行减一操作(每按键一次减一);
③存储器主要是对LCD 点阵字库等数据进行存储;
④显示采用LCD 点阵(128×64)显示屏。

3 Proteus 仿真设计过程
首先,用P r ot eus I S I S绘制电子万年历系统的电路原理图(如图二所示);
其次,用K e il C51编写程序,编译无误后生成HEX 文件;
再次,在P r ot eus I S I S中将HEX 文件“下载”到A T89C51
芯片中,其方法是鼠标右击A T89C51,然后左击,出现相应
图二P r ot eus I S I S绘制的电子万年历的电路原理图
元件属性对话框,在该对话框“P r og r a m F il e”一项中选择要加
入的HEX 文件;
最后,点击P r ot eus I S I S窗口下方的P l a y键可以观察到电路仿真结果。

当然,系统也可采用P r ot eus和K e il C51在线联接进行调试运行,方法如前所述。

4 仿真分析及结论
在电子万年历的仿真过程中,实时时钟芯片D S1302的时间信息自动与P C机同步。

仿真界面友好,操作方便,与现实极为接近。

P r ot eus应用于单片机应用系统的仿真设计后,改变了单片机应用系统的传统的学习和研发过程,降低了单片机原理及应用学习的门槛,并开辟了一条“提出设计方案→仿真设计→实物设计→检测调试→最终产品”的产品研发途径,大大缩短了开发周期,提高了产品开发的成功率。

参考文献
[1]张毅刚.单片机原理及应用[M].北京:高等教育出版社,2004,1.
[2]周航慈.单片机应用程序设计技术(修订版)[M].北京:北京航空航天大学出版社,2002,11.
作者简介
王怀平(1974—),男,东华理工大学2006级硕士研究生,主要从事嵌入式系统设计与应用研究。

198。

相关文档
最新文档