基于单片机的万年历课程设计.docx
- 文档编号:23795639
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:20
- 大小:431.77KB
基于单片机的万年历课程设计.docx
《基于单片机的万年历课程设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的万年历课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
基于单片机的万年历课程设计
一、前言
随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
本设计是基于51系列的单片机进行的电子万年历设计,采用八位数码管显示年月日时分秒及温度信息,具有可调整日期和时间功能。
时间、日期调整由三个按键来实现,并可对闹铃开关进行设置。
日历能显示阳历和阴历年、月、日以及星期、时、分、秒。
设计以STC89C52RC单片机为核心,构成单片机控制电路;以DS1302时钟芯片作为万年历信号发生器;以DS18B20作为检测温度的传感器。
关键词时钟电钟;DS1302;DS18B20;数码管;单片机。
二、系统概述及总体方案
2.1 系统概述
本电子万年历采用单片机控制技术和数码管显示方案,可以很好的完成万年历和实时温度显示。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
2.2总体方案
2.2.1单片机芯片:
采用AT89S52,片内ROM全都采用FlashROM;能以3V的超低压工作;同时也与MCS-51系列单片机完全相同,该芯片内部存储器为8KBROM存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
所以选择采用AT89S52作为主控制系统.
2.2.2时钟芯片:
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.且同组同学已从Maxim申请到了这种芯片,所以本设计采用了这种芯片。
2.2.3测温传感器:
测温可以采用热敏电阻加上模数转换得到电压,然后将测到的电压送到单片机,由单片机处理得到温度值。
但是这种方法实现起来复杂,且精度难以达到很高,所以本设计没有采用这种方式。
DS18B20是一种数字温度传感器,一根线就可以与单片机IO联接,将测到的温度以数字形式传送到单片机,所以使用简单;它的测温误差为+-0.5度,可以达到较好的精度,在日常的应用中足够。
这种芯片应用广泛,所以本设计也采用了这种测温方式。
三、系统硬件设计
3.1.总体方案组成框图
总体方案组成框图
3.2.时钟模块设计
DS1302通过三线接口实现与单片机的通信,因DS1302功耗很小,即使电源掉电后通过3V的纽扣电池仍能维持DS1302精确走时。
3.2.1DS1302特性介绍
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
3.2.2DS1302管脚介绍
各引脚的功能为:
1、Vcc2:
5V电源。
当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2 23、X1、X2是外接晶振脚(32.768KHZ的晶振)。 4、地(GND)。 5、CE/RST: 复位脚。 6、I/O: 数据输入输出口。 7、SCLK: 串行时钟,输入。 8、Vcc1: 备用电池端; 3.2.3DS1302与单片机接口电路图 DS1302与单片机接口电路 3.3.实时环境温度采集模块 DS18B20通过单总线实现与单片机的通信,每个DS18B20都有一个唯一的序列号,可以方便的实现组网检测。 3.3.1单总线介绍 1.单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。 2.单总线通常要求外接一个约为4.7K—10K的上拉电阻,这样,当总线闲置时其状态为高电平。 3.3.2DS18B20特性介绍 1.DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点: 2.采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。 3.测量温度范围宽,测量精度高DS18B20的测量范围为-55℃~+125℃;在-10~+85°C范围内,精度为±0.5°C。 4.在使用中不需要任何外围元件。 5.支持多点组网功能多个DS18B20可以并联在惟一的单线上,实现多点测温。 6.供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。 因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。 7.测量参数可配置DS18B20的测量分辨率可通过程序设定9~12位。 8.负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。 9.掉电保护功能DS18B20内部含有EEPROM,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。 10.DS18B20具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。 3.3.3DS18B20管脚介绍 DS18B20的管脚排列: 1.GND为电源地。 2.DQ为数字信号输入/输出端。 3.VCC为外接供电电源输入端,在寄生电源接线方式时接地。 3.3.4DS18B20与单片机连接图 3.4.显示模块设计 3.4.1数码管显示 为了符合生活实际需求,我们选用多个数码管做显示模块,利用74HC595移位特性,将要显示的数据通过单片机串口传输给74HC595移位芯片,再驱动多个数码管。 数码管显示电路 3.4.274HC595芯片介绍 74HC595是硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。 74HC595是具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。 数据在SHcp的上升沿输入到移位寄存器中,在STcp的上升沿输入到存储寄存器中去。 如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。 8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。 三态。 将串行输入的8位数字,转变为并行输出的8位数字,例如控制一个8位数码管,将不会有闪烁。 3.4.374HC595芯片的特点 8位串行输入/8位串行或并行输出存储状态寄存器,三种状态 输出寄存器(三态输出: 就是具有高电平、低电平和高阻抗三种输出状态的门电路。 )可以直接清除100MHz的移位频率。 数码管驱动电路 四、系统软件设计 软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。 因本程序涉及的模块较多,所以程序编写也采用模块化设计,C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用C51编写。 4.1.主程序流程图设计 该设计主程序流程图如下图所示。 主程序流程图 4.2显示程序流程图设计 显示程序利用单片机的串口工作方式0,TXD作为74HC595的时钟信号,RXD作移位数据信号,将数据通过串口发送到数码管显示,流程图如下图所示 五、软件仿真 5.1.软件调试过程 1、仿真: 打开KEIL2,输入所编写的源程序并对程序进行编译,在软件的帮助下检查其中的错误并进行反复修改,知道编译正确后运行,确保没有错误以后对正确的源程序进行保存,保存时给其命名,以便将来载入程序时容易找到。 2、打开PROTEUS软件,并出画单片机电子万年历具体运行电路图。 3、检查所画电路运行图,确保没有错误以后,在PROTEUS下对原理图进行加载KEIL2下的源程序。 4、加载完成后,单击电路图框下的开始按钮,进行仿真。 软件调试一般包括分块调试和联机调试两个阶段。 程序的分块调试一般在单片机开发装置上进行,可根据所调程序功能块的入口参量初值编制一个特殊的程序段,并连同被调程序功能块一起在开发装置上运行;也可配合对应硬件电路单独运行某程序功能块,然后检查是否正确,如果执行结果与预想的不一致,可以通过单步运行或设置断点的方法,查出原因并加以改正,直到运行结果正确为止。 这时该程序功能块已调试完毕,可去掉附加程序段。 其它程序功能块可按此法进行调试。 程序联机调试就是将已调试好的各程序功能块按总体结构联成一个完整程序,在所研制的硬件电路上运行。 从而试验程序整体运行的完整性、正确性和与硬件电路的配合情况。 在联调中可能会有某些支路上的程序、功能块因受条件制约而得不到相应的输入参数,这时,调试人员应创造条件进行模拟调试。 在联调中如发现硬件问题也应及时修正,直到单片机系统的软件、硬件全部调试成功为止。 系统调试完成后,还要进行一段时间的试运行,从而检验系统的稳定性和抗干扰能力,验证系统功能是否达到设计要求,是否达到预期的效果。 5.2.仿真结果 通过在KEIL2下对源程序的编译,改正了其中的很多错误,然后运行,保证源程序的正确性。 然后按原理图选择正确合理的电器元件,画出正确的电路图,加载源程序运行,顺利实现了单片机数字万年历的“年”“月”“日”、“温度”、“星期”、“小时”、“分钟”、“秒”、农历的月日的显示。 该数字万年历的显示效果图如下图所示。 数字万年历运行图 六、总结体会 数字万年历是一种在日常生活中随处可见的电子产品,随着电子技术的不断更新,数字万年历已经进入了大家小户。 它集日历、时钟、温度计于一体,成为家庭里非常实用方便的小家电。 这次专业课程设计很高兴能够分到数字万年历设计这个课题,经过查阅资料,了解了数字万年历的基本功能与原理后,便开始着手根据不同模块查找适合的芯片,基于AT89C52单片机,利用DS1320时钟芯片来运行系统,再加上一个DS18B20温度传感器芯片,便能实现万年历的基本功能了,结果用发光二极管显示。 原理并不难,但是要实现万年历的基本功能就必须得弄懂这几个模块的基本原理,还要配套上严谨的程序,这样才能真正地实现出来。 在经过一个多星期的学习,慢慢地了解了了各个模块的基本联系。 在做课程设计的过程中,有很多的知识还是通过查阅文档或请教同学来获得的,让我了解到自己的很多不足,很多知识还是有待进一步增强。 如果要学习某些知识,就必须通过实践来学习,这样才能把知识融会贯通,真正地掌握。 最后感谢刘望军老师的指导和同学们的帮助。 七、附录 源程序代码: #include"1302.h" #include"18b20.h" sbitCLT=P3^2;//74HC595数据更新控制端口 /******************DS1302实时时钟芯片的寄存器位置********************************/ #defineSECOND0x80 #defineMINUTE0x82 #defineHOUR0x84 #defineDAY0x86 #defineMONTH0x88 #defineWEEK0x8A #defineYEAR0x8C intsec,min,hour,mon,day,week,year;//counter;//秒,分,时,日期,月份,星期,年 /*******************共阴数码管驱动代码******************************/ unsignedcharcodeSEG_TAB[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,}; /*******************开机动画显示驱动代码******************************/ unsignedcharcodeF_TAB[7]={0x01,0x03,0x07,0x0f,0x1F,0x3F}; /*******************万年历初始化数据表******************************/ unsignedcharDisplay_TAB[21]={ 0x7D,0x5B,0x3F,0x06,//农历月日 0x05,//星期: ----7 0x3F,0x06,//温度: 个、十----10 0x3F,0x3F,//秒: 个、十----00 0x3F,0x3F,//分: 个、十----00 0x3F,0x06,//时: 个、十----10 0x6F,0x3F,//日: 个、十----09 0x5B,0x06,//月: 个、十----12 0x5B,0x06,0x3F,0x5B,//年: 个、十、百、千----2012 }; /******************************************************************************/ //Name: Uart_Send //Description: 串口发送万年历数据显示 //Calls: 主函数调用 //Input: p: 指向数据地址 //Output: 无 //Return: 无 /******************************************************************************/ voidUart_Send(char*p) { chari=0; CLT=0; for(i=0;i<21;i++) { SBUF=*p++; while(! TI); TI=0; } CLT=1; } /******************************************************************************/ //Name: Delay //Description: 延时子函数 //Calls: 延时调用 //Input: 无 //Output: 无 //Return: 无 /******************************************************************************/ voidDelay1(intn) { while(n--); } /******************************************************************************/ //Name: Uart_Send //Description: 串口发送万年历数据显示 //Calls: 主函数调用 //Input: 无 //Output: 无 //Return: 无 /******************************************************************************/ voidStart_Flash(char*p) { chari=0,n=0; for(n=0;n<7;n++) { CLT=0; for(i=0;i<21;i++) { SBUF=*p; while(! TI); TI=0; } CLT=1; p++; Delay1(30000); } } /******************************************************************************/ //Name: Write //Description: 把显示初值写入到DS1302的内部寄存器中 //Calls: 延时调用 //Input: 无 //Output: 无 //Return: 无 /******************************************************************************/ voidWrite_DS1302(void) { Write_1302(SECOND,0x00); Write_1302(MINUTE,0x37); Write_1302(HOUR,0x18); Write_1302(DAY,0x24); Write_1302(MONTH,0x12); //Write_1302(WEEK,0x07); Write_1302(YEAR,0x12); } /******************************************************************************/ //Name: Read_DS1302 //Description: 把要显示初值从DS1302的内部寄存器中读取出来 //Calls: 延时调用 //Input: 无 //Output: 无 //Return: 无 /******************************************************************************/ voidRead_DS1302(void) { sec=Read_1302(SECOND); Display_TAB[7]=SEG_TAB[sec%16]; Display_TAB[8]=SEG_TAB[sec/16]; Delay(100); min=Read_1302(MINUTE); Display_TAB[9]=SEG_TAB[min%16]; Display_TAB[10]=SEG_TAB[min/16]; Delay(100); hour=Read_1302(HOUR); Display_TAB[11]=SEG_TAB[hour%16]; Display_TAB[12]=SEG_TAB[hour/16]; Delay(100); day=Read_1302(DAY); Display_TAB[13]=SEG_TAB[day%16]; Display_TAB[14]=SEG_TAB[day/16]; Delay(100); mon=Read_1302(MONTH); Display_TAB[15]=SEG_TAB[mon%16]; Display_TAB[16]=SEG_TAB[mon/16]; Delay(100); //week=Read_1302(WEEK); Display_TAB[4]=SEG_TAB[week%10]; Delay(100); year=Read_1302(YEAR); Display_TAB[17]=SEG_TAB[year%16]; Display_TAB[18]=SEG_TAB[year/16]; Delay(100); } voidmain(void) { ReadTemperature(); Write_DS1302(); Read_DS1302(); Conversion(); Start_Flash(F_TAB); while (1) { Uart_Send(Display_TAB); ReadTemperature(); Read_DS1302(); Conversion(); } 八、参考文献 [1]许立梓.微型计算机原理及应用[M].机械工业出版社.2002 [2]刘乐善.微型计算机接口技术及应用[M].华中理工大学出版社.2000 [3]邹逢兴.计算机硬件技术基础试验教程[M].高等教育出版社.2000 [4]周佩玲.16位微型计算机原理接口及其应用[M].中国科学技术大学出版社.2000 [5]吴秀清.微型计算机原理与接口技术[M].中国科学技术出版社.2001 [6]邓亚平.微型计算机接口技术[M].清华大学出版社.2001 [7]王迎旭.单片机原理与应用[M].机械工业出版社.2001 [8]周航慈.单片机应用程序设计技术[M].北京航空航天大学出版社.2002 [9]谢宜仁.单片机实用技术问答[M].人民邮电出版社.2002 九、电路原理图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 万年历 课程设计