基于单片机的数字万年历的设计_第1页
基于单片机的数字万年历的设计_第2页
基于单片机的数字万年历的设计_第3页
基于单片机的数字万年历的设计_第4页
基于单片机的数字万年历的设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I第一章绪论在二十一世纪的现在,功能型万年历在我们日常生活中比较常见,不仅仅在车站,医院等公共区域,在人们的家中也经常可以看到。随着技术的发展,各种电子产品也蓬勃更新,人们对于万年历已经不仅仅满足于单纯的时间需求。现实生活中人们对于万年历的扩大需求刺激着万年历不断创新。同时,集成电路的迅速发展,先进的石英技术,电子表的报时较以往来说更加准确和稳定,电子钟也因为各种时钟芯片的发展,体积越来越小,十分便于携带,不光如此,耗能还低,既可以用于一般的时间显示功能,同时也满足各种拓展功能。本次设计中,我们围绕单片机,来做出一个完整的,可供正常使用的电子数字万年历,在熟悉各种万年历部件的同时,我也会在各种方案中选择一个更加适合我的,更加适合本课程设计的一个万年历。第二章方案的选择2.1计时方案的选择单片机的选择对于万年历的系统性能有着重要的影响,以下有两种方案可供选择:方案一:利用89C51的芯片来作为万年历设计的硬件核心,它是美利坚合众国ATMEL公司的产品,是一种电压低但是性能高的CMOS8位单片机。利用FlashROM,它能在3V的超级低压环境下正常工作,并且同MCS-51系列的单片机兼容性良好,拥有三级机密程序的存储器,它的RAM是128×8字节,拥有六个中断源,拥有1000次撰写周期,甚至拥有低功耗空闲和掉电模式,但是它应用在电路设计时,不具备在线编程的功能,反复拔插对于芯片会造成损坏,此方案不可行。方案二:在设计中采用的控制芯片为低价且不影响使用的STC89C52,使用简单,这款单片机显然不是性能最好或者说是最适合做万年历产品的单片机,但是针对本课题,和我们所学知识连接更为紧密,所以于我而言入手更简单。STC89C52是一个低功耗但高性能的51内核的CMOS8位单片机,8K字节的程序存储空间,512字节的数据存储空间。另外它可以降至0HZ静态逻辑操作,空闲模式的时候,cpu就会停止工作,允许RAM。串口、中断以及计数器继续工作,在掉电方式的保护下,RAM的内容将会被保存,震荡机的工作被强制性停止,单片机的所有的工作也就会停止。具有在线编程的功能,不需要上一种那样的12V的VPP编程高压,使用也很简单并且价格更容易被人们结束,拥有8K字节FLASH和812字节的RAM,内带4K字节EEPROM存储空间,可以直接使用串口下载。时钟芯片为DS1302款,芯片获得精准的时钟数据,具有较高的精确度,整体出现的差是小于10ms/年,时间数据较为容易读取,可直接知晓,模块化程度比较高,对于编程来说相对较容易实现,甚至在断电条件下,仍可以保证时钟正常运作,倘若在外接一个3v的纽扣电池,甚至可以运行一年的时间,规格小巧且价格亲民。2.2显示方案选择方案一:液晶LCD1602显示方案,它是一种工业字符型的液晶,显示的原理是利用液晶本身的物理上地特质,借助电压V对它的显示板块进行管控,它能够在同一时间内显示32个字符,接口是标准的16脚接口,由5×7或者5×11的点阵字符组成,每个点阵字符符位都可展示一个字符,位与位之间均有一个点阵的间隔,市面上的字符液晶大部分是利用HD44780液晶芯片来工作的,LCD1602也不例外,控制原理是完全相同的,1602液晶不光能显示出来时钟而且还能显示汉字,满足了数字电子万年历对功能方面的附加需求。并且,它有很明显的有点就是自身是一种小耗电量,小体积,轻重量的液晶显示,并且自身的显示界面和显示信息的种类都很多,该方案值得选择。但也不是最完美的选择,因为1602屏存在一个问题就是不能把万年历的全部功能一一展示出来,倘若执意安排在一屏尽数显示出来,就会显得文字和数字挤在一起。倘若是把信息分两屏显示或者设置专门的按键来进行切换,显示又使得万年历的操作又略微复杂。方案二:数码管显示。数码管显示的原理是:一个数码管有八段,从A到H,通俗点来说就是由八个发光的二极管组成的,二极管的方向是固定的,一般的电压取1.7V,公共端也仅仅只有两个,分别可以接+5V或者接地。在现实里,最常用的是七段式和八段式的LED数码管,两种相对比也只是差了一个小数点,其他基本相同。所谓的段就是数码管里含有的小LED发光二极管,它是通过控制不同的LED的明灭来进行显示。电子时钟的设计中,最先被安排考虑的就应该是数码管。但在本次多功能万年历的制作来说,数码管虽然比较节省I/O端口,静态显示比较简单,有个很大的缺点就是它自身不具备显示天干地支等时间的功能,我们的成果是要显示出来汉字的,并且当有较多的显示位数的情况下,cpu要一次一次地轮着进行扫描,被占用的时间要很长很长,由此看来,数码管方案并不是最适合的。方案三:液晶LCD12864显示方案。带中文字库的12864是一种4位或者8位并行,2线或者3线串行的多接口方式的显示模块,显示方式有正显、STN、半透,其内置8192个16*16点汉字(有简体有繁体)和128个16*8点的ASCII字符,显示分辨率为128*64,显示效果的解读是利用二进制,1表示着亮,0表示着灭。内置DC-DC转换电路,外无需加负压,并且不借助片选信号,简化软件设计。该模块的接口方式非常灵活并且操作起来也很容易,操作指令也比较容易,可以更加简单地构造人机交互的界面,并且是全中文。不光如此,还有一个特点就是可以完成图形显示低电压和低功耗,相对于1602来说,12864不光有它自身的优点,比如说低功耗,友好的价格,更为丰富的信息展示,并且12864是一种带字库的液晶显示,这无疑就可以更加方便得显示汉字,编程操作简单。与1602还有一个不同是,12864可以用一屏将本设计需要用到的功能来进行完美地呈现,因此,12864显示是最佳最优的选择毋庸置疑。2.3温度传感器方案选择方案一:热敏电阻方案。它是一种传感器电阻,其阻值随着温度的变化而变化,温度系数分为正温度系数热敏电阻和负温度系数热敏电阻,当遇到正温度,电阻就会随着温度的升高而增大,当碰到负温度时,电阻随温度的升高而减小,是属于半导体器件的一种。热敏电阻的成本很低,但热敏电阻在输出电压时,必须将数据进行分析,然后再转变为温度,并且其测量结果精确度不高。另外,热敏电阻的外围电路复杂,编程也有困难,显示温度范围受热敏电阻本身特性影响,误差较大。方案二:数字测温芯片DS18B20。就目前而言,该芯片在温度传感器这个板块里应用十分广,其良好且可靠的性能得到业内公认。目前为止,性价比方面可以与它媲美的温度传感器并不多见。DS18B20抗干扰能力强;精度可变,从0.0625到0.5摄氏度不等,且测温范围由-55℃到125℃;并且它还具有一个温度预警的功能。该芯片所用的通信协议是总线协议,并与单片机通信,这种方式的优点是在一条线上可连接多个芯片,有很好的扩展性。并且由于DS18B20属于一种数字芯片,编程起来难度也比较低。由此,我们本次设计就选用DS18B20作为温度传感器。2.4键盘方案选择方案一:矩阵键盘。它是单片机外部中常用的一种类似矩阵的键盘组,它的使用和识别会比直接法均要复杂一些。它的列线通过电阻,接的是正电源,将单片机的I/O端来作为输出端,列线所接的i/o则作为输入端,作用是切换中控式矩阵信号源。在矩阵键盘中,每条水平和垂直的线在交叉处不会直接连通而是通过一个按键来进行连接,并且线的数量越多,数量就越多,区别就越明显。倘若在电子万年历中,一个单独的按键只用作一个调节位,这样算来,需要的按键的数量总体将近13个,甚至超过这个数量。并且单片机被要求去不间断地扫描端口才能让这个键盘发挥作用,无疑,这个键盘方案将占用较多的资源。况且,这样设计出来的万年历表面有太多的按键,操作不便且不符合人类的审美。方案二:独立按键。相对于上一个键盘来说,独立按键虽然整体上资源占用较少,但是对功能复用这一板块要求较高。独立按键配置灵活,并且互不干扰,结构也较为简单,虽然在按键数量多的时候,独立按键会存在线程浪费大,占用时间久的弊端。在本设计中,我们需要的按键并不是很多,相比较而言,独立按键更适合。这种类型的复用设计大学生也可以完成,并且实现复用后,就代表着硬件电路可以简单化,使得交互键盘外观更加简洁大方。因而,本设计采用独立键盘,具体有换调节位键、增键、减键、确认键。2.5时钟芯片的选择方案一:从简单的角度来考虑,直接选择单片机定时计数器,采用其来获得信号,使用一些代码,来实现年月日时分秒和星期的计数。采用这个方案可以在一定程度上减少成本,因为不采用芯片。但是这种方案使得在时间上,误差会很明显,所以我们不采用这个方案。方案二:这里我们考虑使用DS1302的时钟芯片,这是DALLAS公司推出的一款时钟芯片,被广泛应用在电话等产品,可以提供年月日时分秒的信息,还可以自动调整闰年,并且借助配置AM/PM来决定是采用24小时制还是12小时制。芯片本身采用串行I/O的通信方式,相比较而言,串行比并行更节省I/O接口,拥有31字节数据存储RAM,工作的电域很宽,大抵是2.0V-5.5V都不会影响它的正常使用。采用的是三线接口与COU进行同步通信。不仅如此,它的功耗一般都很低,电压为2V时,电流通常情况下小于300nA,这款时钟芯片共有八个引脚,有两种封装形式,一种是SOP-8封装,一种是DIP-8封装,下图2.1为其八个引脚具体的功能,其中,第8个引脚VCC1为后备电源,第1种引脚VCC2为主电源,该时钟芯片是相比较VCC1和VCC2两种的电压来挑选依靠谁来进行工作,会选取较大值。第二种和第三种引脚分别是X1和X2,这两个引脚是震荡源,外接32.768kHz晶振。图2.2是DS1302的控制字格式,第七位必须是1,如果为0就不能写数据进入DS1302中,位6如果0,就表示存取日历时钟数据,如果为1,就表示存取RAM。DS1302用于数据记录,尤其是在一些有特殊含义的数据上,能实现数据和数据出现的时间点同时予以记录,相比较而言,我们自然而然选择DS1302芯片。引脚编号引脚名称引脚功能1Vcc2主电源引脚,当Vcc2比Vcc1高0.2V以上时,DS1302由Vcc2供电,当Vcc2低于Vcc1时,由Vcc1供电2X1这两个引脚需要接一个32768K的晶振给DS1302提供一个基准。特别注意,要求这个晶振的引脚负载电容必须时6pF,而不是要加6pF的电容。如果使用有源晶振的话,接X2到X1上即可,X2悬空3X24GND接地5CEDS1302的输入引脚。当读写DS1302的数据的时候,这个引脚必须时高电平,DS1302这个引脚I/O内部含有一个40K的下拉电阻,该引脚有两个功能,第一:CE开始控制字访问移位寄存器的控制逻辑。第二:CE提供结束单字节或者多字节数据传输的方法6I/O这个引脚是一个双向通信引脚,即三线接口时的双向数据线7SCLK输入引脚,SCLK时用来作为通信的时钟信号DS1302这个引脚的内部含有一个40K的下拉电阻8Vcc1备用电源引脚图2.1八个引脚的具体作用图2.2DS1302的控制字格式2.6报时方案选择方案一:扬声器。市场上的扬声器依据振膜形式可以大体分为两类,分别是:球顶扬声器以及锥形扬声器,前者往往作为高音单元来使用,后者主要为中音低音或者宽频扬声器的主要形态。两种相比较而言,锥形扬声器的优点是结构比较简单,转换的效率比较高,但是正是由于这种结构,它的指向性并不能很好地满足人们对于这款扬声器的期待,对于球顶扬声器来说,它是一个呈半球状凸起的振动板,使得球顶扬声器的指向性比前一种大大地提高了,比传统地锥形扬声器具有更好地瞬态,失真较小。它的工作原理是使用金属细线,绕圈形成导线线圈,通电之后就会形成电磁体,和永磁体产生作用力,这个力就会影响到振膜,使得振膜发声。在一开始,我们有考虑是不是用扬声器能使万年历更向商用产品靠拢,并且使用起来也更加人性化。但经过再三实验,发现扬声器方案存在一些缺点,这将会导致整个程序无法正常运作。因此扬声器方案在本设计中是不可行的。方案二:蜂鸣器。蜂鸣器式一体化结构的电子设备,被广泛应用于计算器等电子产品中作为发生的部件,采用的式直流电压供电的模式。目前在市场上蜂鸣器共有两种,分别是有源和无源,这里的源并不是电源的意思,而是蜂鸣器的震荡源。无源蜂鸣器本身不带有震荡源,直接用直流信号无法使其发出声音,只能需要一定频率的方波驱动,比如说2K到5K,而有源蜂鸣器在连同电路以后就会发声,并且有源蜂鸣器还会有区别,分为连续声和间断声的区别。显然有源蜂鸣器能让这个设计的编程更加简单,其内部有电路,只要给一个可以供起工作的电压就可以出声,在main程序的循环中只要设置好时间的标志就可以完成定时的功能,并且发出报警声。因此本课题采用了有源蜂鸣器方案。下图2.3为单片机的系统功能框图图2.3单片机系统功能款图第三章系统设计3.1模块化程序设计学习完C,我学习到了一种新的编程技巧,名字是模块化编程。较传统的逐条程序输入或者是把所有程序整体放进一个文件的编程方法,模块化程序设计具有更稳定的性能,将不同功能分成一个个独立的小个体,互相引用和借鉴,降低了程序整体的复杂度,编程的难度大大降低,使得程序整体具有很高的可移植性。模块化编程就是把一整个程序分成主程序和各个子程序,主程序的作用是来串起整个流程,子程序是负责封装好系统的各个功能,然后让主程序来调用,并且子程序对外仅提供全局变量、要被调用的函数名称和必要的接口信息,并且也只有这些信息对主程序可见。相对于白盒,这种黑盒模式的编程便于分工合作,极大的提高了编程的效率和安全性。3.2主程序流程描述首先是将单片机复位,然后系统的main函数开始执行。并且对12864和DS1302进行初始化。接下来是大循环,在循环内部中,先从DS1302中读取时间数据(包括年月日时分秒)和从DS18B20中读取温度数据。将年月日的数据通过阴阳历转换函数来知晓出阴历数据,送到12864显示RAM相应位置,利用星期子函数得出星期的数据也发给相应的位置,利用干支纪年法计算公式,即年干=N-3(N﹥3)或N-3+10(N≤3),N=年号/10的余数=年号个位数。年支=N-3(N﹥3)或N-3+12(N≤3),N=年号/12的余数。将得到的数据送到相应位置。在这之后是扫描按键。在扫描过程中,若按键被按下,那么调整变量并将调整后的数据读入DS1302,同时将数据也发送给12864。这个循环不断进行,以此保持时钟的正常显示。这里有一点,大循环每完成一次的时间应<1s,这样秒数的变化才能正常显示,如果一个循环中cpu过于繁忙,以至于超出1s,秒就会发生跳变。Main函数的流开始程图如3.1所示开始读取时间温度读取时间温度阳历转阴历、干支阳历转阴历、干支扫描按键扫描按键按键修改变量按键修改变量报时功能报时功能显示输出显示输出结束结束图3.1主程序流程图3.3各子程序的分块设计在3.3我将重点介绍每个子程序的调试过程,包括调试过程中发现的问题以及与之相对应的解决办法,按照模块化编程的思想,这就要求先写出子程序已经预定义函数,主函数只要包含系统里所有要用到的子程序的头文件,即实现主函数对子函数的调用功能。并且为了防止编译出错,通常是子程序的编译在主函数的上面。3.3.1DS1302时钟子程序时钟程序我将按照数据手册的步骤来对DS1302进行操作,该时钟子程序共有两种模式的读写,分别是突发模式以及字节模式。在本毕设中,我们采用singlebytetransfer的模式来传输这些数据,命令指令均以1bit为单位,每次的读写操作之前,都要先定义一次控制命令。该时钟共包含有12个寄存器,其中有7个寄存器与时间相关,它存放的数据位为BCD码形式,但美中不足的是,BCD码只有转为十进制才能直接使用,倘若出现二进制,系统就会报错。下图是与时间相关的7个寄存器的数据范围:图3.2主要的寄存器以及读写命令从表上的数据可以知晓这7个寄存器的操作命令,其数据范围由右侧可知,其中的年份为00到99。在此基础上,在本设计中,将电子万年历可显示的年份定为2000年2099年。在年份这里也可以用跨世纪来显示,即溢出操作。这里需要留意的是,星期的数据不可以通过读取DS1302来知晓,数据结果需要用某种算法得出。本次软件设计中,将年月日时分秒这六位写到数组time_buf[]中,该数组还具有初始化时钟的功能,就是用设置time_buf[]的2到6位来定义上电复位后显示的年月日时分秒。实时时钟英文描述为Real_TimeClock,可以采用它的缩写RTC,存储的顺序是从秒开始,为秒分时日月星期年,存储的格式用BCD码。代码类似下面ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x87,0x89,0x8b,0x8d};ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};UchaeTIME[7]={0,0,0x12,0x02,0x08,0x03,0x22};//将该时钟芯片的时间初始化为2022年3月8号星期二12点0分0秒。3.3.212864液晶显示子程序12864液晶一共有两种类型,分为带字库型以及不带字库型。其中不带字库在本质上和点阵的概念是一样的,借助“点阵”中的点来表现出这个汉字。需要用到多少种汉字就“画”多少种。与前一种不同的是,带字库的点阵是有自己的库的,常用的8000多个汉字构成一个汉字表,并放在液晶显示的存储器中,若需要用到某字时,采用查表法就可以找到这个字。同时,带字库12864也具有前一种的功能,即可以自己绘制“汉字”。简而言之,带字库液晶更方便。带字库的12864每个汉字占16x16点阵,能显示4x8个汉字。它在操作上,有2种:串行和并行。在这里我们选择并行方法。按照数据手册里的时序图一步步地进行,然后写入命令和数据,就可显示出所需要的东西到12864操作时序。图3.3即为时序图图3.312864的时序图它可写入的资料数据有两类,分别是:数据,命令。写命令和写数据有一些区别,需严格按照规定的方式来进行实践。需多加注意的一点是,如果将带字库的每一行分成16个位置,在每个特定位置都展示一个符号,那么汉字只能出现在偶奇位置,而不能出现在奇偶位置。同样查表法读ASCII码时,虽然某个符号如阿拉伯数字“1”占用1/16个位置,但是依然服从汉字的规则,只能出现在偶奇位置,其中奇数位置什么也不显示。这是由于带字库对显示RAM的地址分配引起的。下表3-2即为RAM地址分配:表3-1带字库12864显示RAM地址汉字显示£E标X坐标Linel80H81H82H83H84H85H86H87HLine?90H9IH92H93H94H95H96H97HLine)88H89H8AH8BH8CH8DH8EH8FHLinel98H99H9AH9BH9CH9DH9EH9FH通过上面的表格可以知晓,用查表法来进行单汉字的查询。它往往是出现在RAM任一地址。倘若试图实现将任意汉字显示在随意的一到两个字符位置,这个方法就无法实现,需要另作打算。本次设计我们用的方法是整行赋值,它的含义是哪怕一行只改动了一个字符,也要重新扫描一整行,然后得到一个字符的变化,它的缺点就是扫描时间被很大程度得加长了,并且这个缺点不可以避免。关于12864的控制器接口信号,我们这里提一下RS和R/W的配合选择的四种模式:RSR/W功能说明LLMPU写指令到指令暂存器(IR)LH读出忙标志(BF)及地址计数器(AC)的状态HLMPU写入数据到数据暂存器(DR)HHMPU从数据暂存器(DR)中读出数据E信号:E状态执行动作结果高到低I/O缓冲➡DR配合R/W进行写数据/指令高DR➡I/O缓冲配合R进行读数据/指令低或者低到高无动作本课题选用的主要函数是单行扫描函数,举例就像下述函数实现第一行的扫描:voiddplayl(void){inti;12864Writecommand(0x80,l);for(i=0;i<16;i++){12864WriteData(strl[i]);}}执行代码时,首先输入字符应该在哪个位置显示,从0x80开始,显示在第一行,然后进行16次的循环,将strl[]数组中的值按顺序输出在相应位置,连续两个字符宽度显示一个汉字。这样一来,每次只改变strl[]数组的值(注意此值是相应的ASCII型的字符),赋值方法可以是strl[]=“2022年1月7日2度”,而要改变的数字则给某个数组元素赋值再把数组放在特定行扫描即可。了解了12864的原理,就基本上完成了电子万年历的显示部分。3.3.3DS18B20温度子传感器DS18B20的内部里有两种振荡器,具体是低温系数晶体振荡器和高温系数晶体振荡器。操作也是参考手册。系统会把其值给两个计数器,然后将处理后的数值给温度寄存器。温度传感器通过DQ数据端来对输入输出进行控制。在这里我们只用到一个DS18B20,数值保留四位小数就可以,每个小数位表示0.0625℃,每一次温度转换需要时间750mso,默认精度由十二位数据格式表示,字节是占用两位,两字节中高4位表示为符号位。倘若出现负数,就用补码形式来表示,要记得在数据输出处理时,需要把补码进行转变。图3-4温度传感器数据字节市面上的电子万年历的显示精度往往到1摄氏度,因此温度传感器子程序将后四位小数部分进行了四位右移,由于不考虑四舍五入以及加减的进位,因此最终程序可能会存在1左右的误差,是正常的。温度传感器主要函数如下:unsignedintReadwendu(void){unsignedchara=0;unsignedintb=0,m=0;Init_DS18B20();Writeonechar(OxCC);//跳过读取序号列号Writeonechar(0x44);//开始进行转换温度DelayMs(lO);Init_DS18B2O();Writeonechar(OxCC);//跳过读取序号列号Writeonechar(OxBE);//读取前两个温度寄存器a=Readonechar();//先对低位进行读取b=Readonechar();//再读高位B<<=8;m=a+b; //合为一个数据return(m);}需要提一下的是,此函数将被主函数反复调用,用来获得此时的室内温度。3.3.4独立按键子程序在本次设计种我们采用的是4个独立按键,四个按键都是轻触型开关,具体的功能分别为加一K2、减一K3、选择调整位K1以及确认K4。需要调整的位包括当前的日期和时间和闹钟开关,闹钟的吋、分、秒共10位。这就表示某个计数值是调整为判断的依据,通俗点来说就是按1下,计数为1。按2下,计数为2,以此类推。计数值程序如下:voidkey_count()State_Set=l;if(State_Set==O)DelayMs(2);while(State_Set=O){if(count==11)count=0;elsecount++;break;}while(State_Set==O);//松手检测逻辑}考虑到单片机准双向口的要读先写特性,选择调整位K1定义为State_Set,首句"State_Set=l表示要读取该位先写入1。并且每按下K1,都会检测一下K1的值,结果若为零,则增加计数。有关按键部分,需要说明的关键问题是按键的消抖方法,消抖有2种方法:第一种为先对键值进行一波判断,延时几毫秒后再判断键值,两次判断一致就认为已消除抖动,但是这不仅是因为延吋吋间难以把握,更致命的是,我们的程序循环时间较长,时间太久就有可能发生按键按下了但主程序没到此处的情况,这样按键就必须一直处于按下状态,但是如果一直处于按下状态又可能会发生重复计数而不能走到正确的调整位的问题。另一种方法是松手检测方法,即没有松手时程序停止等待,松手后程序跳出按键程序,0状态等待,1状态跳出,这样就解决了重复计数和忽视计数的问题。需要在每个按键程序中都加入松手检测语句。按键加减和确认与此函数相似,不再赘述。时钟芯片读取数据,然后将改变后的年份数据传给DS1302,并显示即可。为了得到更好的显示效果。在调整某位时,如果想要让某位闪烁,就需要改变显示str[]的值,并进行持续得扫描,直到调整程序退出时不再闪烁。即上述程序中strlfuzhi();完成赋值,dplayl();第一行显示ok之后,然后通过strlfzkongy();以及dpalyl();显示出来第一行年数据的位置,这个循环将继续执行,这样一来,年位就可以闪烁起来。因为调整这一过程并不用三个时间来进行实时的不断变化,因此当按键在按下的状态时,除了需亮灯的相关位置变化外,其他均不变。闹钟和整点报时功能此时也是无法生效的。3.4实验板仿真程序仿真一般情况下采用英国的protues软件,但当protues软件中缺乏特定型号元件的仿真模型时,protues仿真就很难实现了。Protues支持自建封装和原理图模型,但是建立仿真模型与前者不同,自建封装或者原理图只不过是“画”一个像某个元件的元件,而仿真模型简历要求输入输出程序,往往涉及到高级语言编程。而本课题设计中釆用了带中文字库12864,带字库12864仿真模型在protues官网和12864厂商网站均不提供,因此无法用protues仿真,本课题的仿真应用的是单片机实验板。实验板更接近硬件仿真,可以说在实验板上程序通过了,将来焊接成品就有了一定的保证。实验仿真效果在之后几章会有图示。第四章硬件设计部分4.1硬件设计整体框架由于电子万年历比较成熟,设计的难度也是适中,焊接也比较简单,相对来说易于操作。因此我们选用9x15万用板焊接,在设计的过程总,既锻炼了动手操作的实践能力,也避免了一些不必要的过程。图4-1为本设计的整体框架图:图4-1数字万年历整体框架4.2外围电路设计4.2.1时钟电路DS1302时钟芯片是双列直插8引脚,它的引脚必须外接晶振32768hz,双电源来保证供电,图4.2时其内部结构图。同时,备用3v电源接VCC2,为单片机断电后时钟继续运行提供能源。它在进行读写操作的时候最少读写两个字节,第一个字符是一个控制字节,负责命令的内容,具体就是决定是读操作还是写操作,第二个用来承载数据。除此之外,一般单片机的I/O端口相连时,要加上拉电阻,这样才能提高接口的驱动能力,并且信号也比较稳定,,计时比较准。功耗很低,外接工作电压2V时,电流是小于300nA的。其外部电路图如4.3所示:图4.2时钟芯片的内部结构图图4.3时钟电路图4.2.2温度传感器电路DS18B20是一种常见的温度传感,体积小,硬件本身价格低,高性能,并且抗干扰能力强,其还具有很高的精度。与DS1820比较类似,有一点不同即为DS18B20会因为分辨率不同,导致得到的温度值的位数不同,它拥有独特的单线接口方式,在与微处理器连接时仅需要一条口线就可以实现双向通讯,在使用中,即使没有外接任何外围元件也可以正常使用,它适用于DN15-25,DN40-DN250的各种工业管道和狭小空间的设备测温,使用的是直径为Φ6的不锈钢保护管。它共有六条控制指令,它的配置寄存器结构为图4.4所示TMR1R011111图4.4DS18B20的配置寄存器结构温度分辨率设置表如图4.5所示R1R0分辨率温度最大转换时间009位93.75ms0110位187.5ms1011位375ms1112位750ms图4.5DS18B20的温度分辨率设置表DS18B20暂存寄存器分布如图4.6所示寄存器内容字节地址温度值低位(LSByte)0温度值高位(MSByte)1高温限值(TH)2低温限值(TL)3配置寄存器4保留5保留6保留7CEC校验值8图4.6DS18B20的暂存寄存器信息DS18B20的ROM指令表如图4.7所示指令约定代码功能读ROM33H读DS18B20温度传感器ROM中的编码,通俗来说就是64位地址符合RMO55H发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS18B20使之做读写准备搜索ROMFOH用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址跳过ROMCCH忽略64位ROM地址,适用于单片工作搜索命令ECH执行后只有当温度超过设定值上限或者下限的片子才做出响应图4.7DS18B20的ROM指令表DS18B20的传感器的接线如下图4.8:图4.8传感器电路图4.2.3按键电路和蜂鸣器电路按键板块的电路如下图4.9:图4.9独立按键电路由于单片机的驱动能量不足以直接驱动蜂鸣器,因此我们可以把三极管与蜂鸣器配合起来,就可以实现目的。4.10就是电路示意图图4.10蜂鸣器电路4.2.412864的显示电路在学校的学习课程中我们已经学到过,12864与P0口连接,由于P0口为准双向口,所以外部接上拉排阻,然后接到12864。下图4.11位位12864的3A接口说明表管脚号管脚电平说明1CSAH/L片选择信号,低电平时选择前64列2CSBH片选择信号,低电平时选择后64列3GNDOV逻辑电源地4VCC5V逻辑电源5VEE-10VLCD驱动电源6D/IH/L数据/指令选择,高电平时,数据D0-D7将送入显示RAM,低电平时,数据D0-D7将送入指令寄存7R/WH/L读/写选择,高电平时读取数据,低电平时写入数据8EH.H./L读写时能,高电平有效,下降沿锁定数据9DB0H/L数据输入输出引脚10DB1H/L数据输入输出引脚11DB2H/L数据输入输出引脚12DB3H/L数据输入输出引脚13DB4H/L数据输入输出引脚14DB5H/L数据输入输出引脚15DB6H/L数据输入输出引脚16DB7H/L数据输入输出引脚图4.1112864的接口说明表在指令描述中,下图4.12为12864显示开或者关的设置下图4.12为12864显示开/关设置C0DE:R/WD/IDB7DB6DB5DB4DB3DB1DB0LLLLHHHHHH/L功能:决定屏幕的开关问题,DB0=H时,此时为开的状态;DB0=L时,此时为关的状态。这个不会干涉到RAM。12864的时序参数表如下图4.13所示图名称符号最小值典型值最大值单位E周期时间Tcyc1000nsE高电平宽度Pweh450nsE低电平宽度Pwel450nsE上升时间Tr25nsE下降时间Tf25ns地址建立时间Tas140ns地址保持时间Taw10ns数据建立时间Tdsw200ns数据延迟时间Tddr320ns写数据保持时间Tdhw10ns读数据保持时间Tdhr20ns图4.1312864的时序参数表4.3硬件的焊接本设计中是需要做出来实体的物品的,因此焊接方面不可轻视,在电路系统中若出现一细小问题,结果就可能会导致电路无法正常的工作,在实际操作中,我发现有以下几个问题:误把DS1302晶振连接错误电路焊接错误电源电路设计不当,应该在电池盒接口接一个5V的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论