您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟
1电子系统设计实验报告实验名称以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟院(系)别班号实验日期2009-6-25到28实验人姓名学号实验目的:1、能够以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计一款电子钟2、熟悉DS1302芯片的工作过程3、熟悉CD1602芯片的工作过程4、可以进行必要的扩展,如用第三DS18B20新品进行温度采集和显示5、熟悉掌握51的c程序的编写6、掌握用Proteus进行系统设计仿真验证实验仪器、仪表目录1、DS1302实时时钟芯片1片2、LCD1602液晶显示屏1个,3、80C52芯片1片5、DS18B20芯片一片6、晶振、电容、电阻、开关各若干等7、proteus仿真软件8、KeilC51、PC机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时间和日期可调整,按键采用3个按键;至少在Proteus上调试通过。扩展:闹钟和重要日期提醒功能(增加蜂鸣器),闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在“OptionsforTarget1”的Output选项中,将CreateHEXFil选项勾起来。2、将编写的程序保存成“.C”的形式3、编译保存好的C文件,并根据提示修改程序中的错误,直到编译成功为止4、打开proteus软件,画出实验电路图5、在89C52中,载入原来已生成的HEX文档26、按下运行键,对Proteus进行软件仿真,观察运行结果原理、结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:各个模块电路原理分析:1、DS1302时钟采集模块:1.1电路原理图:1.2DS1302分析:首先DS1302是DALLAS公司推出的涓流充电时钟芯片。内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。DS1302芯片广脚介绍:X1、X2为32.768KHz晶振管脚。GND为地。RST复位脚。I/O数据输入/输出引脚。SCLK串行时钟。Vcc1,Vcc2电源供电管脚。与单片机连接的信号线为:DS1302_SCLK接P1^6;实时时钟时钟线引脚DS1302_IO接P1^7;实时时钟数据线引脚DS1302_RST接P1^5;实时时钟复位线引脚特别注意DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK信号线要有一个负跳变。即单片机对SCLK咬先送高电平,再送低电平。数据时通过IO进行传送的。1.3数据处理子程序流程图温度采集模块DS1302时钟采集模块89C52CPU控制模块按键处理模块LCD显示模块3否是因为DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK信号线要有一个负跳变。所以在对DS1302具体某地址进行一字节数据的写入或读取时,都要调用实时时钟写入一字节(内部函数)DS1302InputByte和实时时钟读取一字节(内部函数)DS1302OutputByte两个函数。2、按键处理模块2.1按键连线图其中按键1为模式键,按键2为加1键,按键3为减1键。与单片机连线如下:mode连接P3^0;//设定修改位数是否调用时间获取子程序DS1302_GetTime调用Read1302函数,读取各个时间参数,并存放于ReadValue变量中对ReadValue数据进行转换,转换成十进制数,并赋给Time指针中。调用年份转换成可供lcd显示的字段子程序DateToStr时间转换成可供lcd显示的字段子程序TimeToStr结束4plus连接P3^3;//加键dec连接P3^6;//减键2.2按键扫描子程序流程图:否否否否是是是是是否否是是2.3加减键处理子程序流程图否是否是否否是是是Mode键是否按下将mode按键次数存放于变量mode_num中mode_num=1?mode_num=2?mode_num=3?mode_num=5?mode_num=4?mode_num=7?mode_num=6?移动光标,并返回判断是否为修改模式判断是否为加一键判断num=1?转减一键程序判断num=2?判断num=35否否是是是减1子程序与加1子程序区别只在于修改数值处理不一样,其他都一样。3、LCD显示模块3.1LCD显示模块电路原理图修改year值,并返回修改mouth值,并返回修改day值,并返回判断num=6?判断num=5?判断num=4?修改秒值,并返回修改分值,并返回修改小时值,并返回63.2LCD1602芯片以及连线分析液晶显示器是一种功耗极低的被动式显示器件,1602广脚介绍:D0—D7数据传送引脚,VSS为接地线,VDD为电源线,VEE为LCD驱动电压调节,由此可以调节显示亮度。RS为寄存器选择信号,高电平选择数据寄存器,低电平选择指令寄存器。RW为读写控制信号,高电平读,低电平写。EN使能信号,读状态下高电平有效,写状态下下降沿有效。RS连接P2^0;寄存器选择信号RW连接P2^1;读写控制信号线EN连接P2^2;使能信号线3.3LCD初始化程序流程图:在初始化过程中,要反复调用到write_com函数,此函数实现向lcd写入命令的功能。要特别注意写命令和写数据的RS、RW、EN时序问题4、温度采集显示模块4.1温度采集显示模块的原理图:4.2DS18B20芯片以及连线分析DSl820数字温度计提供9位(二进制)温度读数,指示器件的温度、信息经过单线接口送入DSl820或从DSl820送出。因此从主机CPU到DSl820仅需一条线(和地线),DSl820的电源可以由数据线本身提供而不需要外部电源。DS18B20广脚说明:VCC为电源线,DQ为数据线,GND为地线。数据线DQ与单片机P1.0相连接。写指令0x38,显示模式设置写指令,显示光标写指令,光标移动清屏74.3温度采集显示模块子程序流程图:在此程序中,要特别注意初始化,写和读取数据时的时序处理。首先,初始化中,主机总线先发送一复位脉冲(最短为480us的低电平信号),接着刻释放总线并进入接收状态。DSl8b20在检测到总线的上升沿之后,等待15-60us,接着DS18b20发出存在脉冲(低电平持续60-240us)。写数据时序:当主机总线先从高拉至低电平时,就产生写时间隙。读书序:主机总线先从高拉至低电平时,总线只须保持低电平l7ts之后,再将总线拉高,产生读时间隙。5、总原理图以及主程序流程图:5.1总的原理图:直接向18b20发送温度变换命令读取温度寄存器的温度值读高八位读低八位进行读取数据处理,得出温度存放于变量temp中85.2主程序流程图:二、Proteus仿真结果:初始化lcd重复进行按键扫描移动光标并显示温度移动光标并显示时间移动光标并显示日期从DS1302读取日期和时间初始化DS1302初始化内部定时器9三、实验数据计算处理,性能分析1、数据计算处理:1.1计算星期数的算法days=(today.day+1+2*today.month+3*(today.month+1)/5+today.year+today.year/4-today.year/100+today.year/400)%7,由年月日计算星期,用以显示星期数1.2加减键对时间日期改变处理算法对于年月日,时分秒来说,每个变量的最大值和最小值都不一样,所以当年月份时分秒改变时,进行处理的算法也不一样,年没有最大值,所以不用采取“封顶”措施,每次年加一处理时,直接自加,而对于月份来说,月份是不能超过13的,所以当月份自加到13时要重新置1,具体处理见程序,在每个语句后,我都有分析注释出来。1.3时分秒进位算法当秒,分达到60时,向分进位,且秒数置零,从新开始计数。当时达到24时,也一样处理。1.4年月日进位算法因为每个月份的天数都不同,所以事先先设定一数组:dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31}用以判定12个月的最大值,接着判断天数,当超过本月最大天数时,月份加一,且天数要置1。月份判断比较简单,只要超过12,年份就加1,月份置1。2、性能分析:首先,lcd能够正确的显示1302芯片上面的时间和日期。其次,可以通过三个按键:K1,K2和K3键对电子钟进行时间和日期的调整。按K1键进行校时,可以分别对时及分进行单独校时,使其校正到标准时间,校时时需要校正哪一位哪一位就闪烁。按K2键是对闪烁位进行加一的操作。按K3键是对闪烁位进行减一的操作。多次按K1键,当全部闪烁位全闪烁完毕时,就可以退出调整模式。但是,时间和日期显示正确,但温度显示错误。温度不能正常显示的主要原因是DS18b20的数据传输不正确,不过到现在为止,还没改正过来。四、实验过程中故障分析与故障排除的描述故障一:因为自己的知识有限,所以坦诚的说,源代码都是从网上载的,但是我载了2个程序,一个是运用1602以及18b20和按键处理显示时间以及温度,另一个程序是单运用ds1302和1602显示时间而没有按键处理,所以我做的工作就是这么把这两个程序结合起来,实现显示和调整时间的功能。这里的故障排除过程:目的是在有按键调整时间的程序中,要添加DS1302功能。首先,要在主程序的c文件中,添加#includeDS1302.h语句,并在main主函数中,加入Initial_DS1302();语句,进行DS1302的初始化,并且添加以下语句:Initial_DS1302();//初始化DS1302DateToStr(&CurrentTime);//从DS1302读取日期TimeToStr(&CurrentTime);//从DS1302读取时间显示的程序也要有所改变:display_string(CurrentTime.DateString);//显示日期此时参数传递过程是先将DS1302内部的时间和日期通过DS1302_GetTime函数读取出来存放到Time中,日期通过DateToStr函数将Time中的数据传到DateString数组中,而时间通过imeToStr函数将Time中的数据传到TimeString数组中,最后通过display_string函数显示出来。10故障二:通过上面两个函数的合并后,发现编译一直出错,如下图所示:后来发现,我只是在前面加入头文件DS1302.h,但是忘记把这个文件放在工程目录下,所以该工程一直找不到,结果一直出错。故障三:当修改完程序后,按下按键时,发现什么反应都没有,后来又在排查了程序,感觉程序都没错,但是就是没反应。偶然之间,发现要长按按键,就可以实现按键调整时间的功能。因为在按键扫描程序中,设置了软件防抖动功能,所以要长按按键,才能调整时间。故障四:温度显示错误。因为时间有限,前面整合两个程序就花了太多的时间,来不及再调整温度显示模块,自己推测,应该是中间函数参数传递出现错误,在主程序的main函数中,显示温度是display_string(00.0C)语句,所以温度一直显示00.0C,事后有时间会再进行参数调整。故障五:在实验开始时,感觉不懂如何运用proteus,就连对C52进行程序烧写时,都不知道如何才能生成Hex文档,万事开头难,只能踏踏实实一步一步学习,后来请教同学才知道在“OptionsforTarget1”的Output选项中,要将CreateHEXFil选项勾起来才可以。五、实验结论以及体会实验结论:1、在该电子钟的设计中修改定时或调整时间时采用了闪烁,在编程上,首先进行了初始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一组固定单元用来存储计数的秒,分,时以及定时时间的序号等。其次,时,分,秒显示用了软件译码(查表)的方式,再用了一段固定的程序段进行进制转化。最后,用查询方式对按键进行判断,若有键按下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。对
本文标题:以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟
链接地址:https://www.777doc.com/doc-355646 .html