分享
分销 收藏 举报 申诉 / 24
播放页_导航下方通栏广告

类型以ds1302实时时钟芯片和液晶显示屏cd1602为基础设计的电子钟.pdf

  • 上传人:曲****
  • 文档编号:12983149
  • 上传时间:2025-12-30
  • 格式:PDF
  • 页数:24
  • 大小:2.42MB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    ds1302 实时 时钟 芯片 液晶显示屏 cd1602 基础 设计 电子钟
    资源描述:
    目录:设计实验报告.错误!未定义书签。实验目的:.2实验仪器、仪表目录.2实验设计任务.2实验步骤.2原理、结果及分析.3一、设计方案原理与设计特点分析.31、DS1302时钟采集模块:.31.1 电路原理图:.31.2 DS1302 分析:.31.3 数据处理子程序流程图.42、按键处理模块.52.1 按键连线图.52.2 按键扫描子程序流程图:.52.3 加减键处理子程序流程图.63、L CD显示模块.73.1 LCD显示模块电路原理图.73.2 LCD1602芯片以及连线分析.73.3 LCD初始化程序流程图:.84、温度采集显示模块.84.1 温度采集显示模块的原理图:.84.2 DS18B20芯片以及连线分析.84.3 温度采集显示模块子程序流程图:.95、总原理图以及主程序流程图:.105.1 总的原理图:.105.2 主程序流程图:.10二、Proteus 仿真结果:.11三、实验数据计算处理,性能分析.111、数据计算处理:.112、性能分析:.12四、实验过程中故障分析与故障排除的描述.12五、实验结论以及体会.13实验结论:.13实验心得:.131、主程序.142、lcdl602头文件程序:.193、dsl302头文件程序.204、dsl8b20 头文件.22实验目的:1、能够以DS1302实时时钟芯片设计一款电子钟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、Keil C5K PC 机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时间 和日期可调整,按键采用3个按键;至少在Proteus上调试通过。扩展:闹钟和重要日期提 醒功能(增加蜂鸣器),闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在uOptions for Target 1”的Output 选项中,将Create HEX Fil选项勾起来。2、将编写的程序保存成的形式3、编译保存好的C文件,并根据提示修改程序中的错误,直到编译成功为止4、打开proteus软件,画出实验电路图5、在89c52中,载入原来已生成的HEX文档6、按下运行键,对Proteus进行软件仿真,观察运行结果原理、结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:各个模块电路原理分析:1、DS1302时钟采集模块:1.1 电路原理图:1.2 DS1302 分析:首先DS1302是DALLAS公司推出的涓流充电时钟芯片。内含有一个实时时钟/日历和 31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日 日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。DS1302芯片广脚介绍:XI、X2为32.768KHZ晶振管脚。GND为地。RST复位脚。I/O 数据输入/输出弓【脚。SCLK串行时钟。Vccl,Vcc2电源供电管脚。与单片机连接的信号线为:DS1302_SCLK接Pl八6;实时时钟时钟线引脚DS1302JO接P1八7;实时时钟数据线引脚DS1302_RST接Pl八5;实时时钟复位线引脚特别注意DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK信号线要有一个负跳变。即单片机对SCLK咬先送高电平,再送低电平。数据时通过 IO进行传送的。因为DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK 信号线要有一个负跳变。所以在对DS1302具体某地址进行一字节数据的写入或读取时,都 要调用实时时钟写入一字节(内部函数)DS1302InputByte和实时时钟读取一字节(内部函数)DS1302OutputByte 两个函数。2、按键处理模块2.1 按键连线图其中按键1为模式键,按键2为加1键,按键3为减1键。与单片机连线如下:mode连接P3A0;设定修改位数plus连接P3八3;/加键dec连接P3八6;/减键2.2 按键扫描子程序流程图:2.3加减键处理子程序流程图减1子程序与加1子程序区别只在于修改数值处理不一样,其他都一样。3、LCD显示模块3.1 LCD显示模块电路原理图PO.O/ADO P0.1/AD1 P0.2/AD2 P0.3/AD3 PO.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7P2.0/A8P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A1539 至亘 亘34 亘 3?212?2724262?LCD1 LM016LOCMCO-LRP2.1RESPACK-J3.2 LCD1602芯片以及连线分析液晶显示器是一种功耗极低的被动式显示器件,1602广脚介绍:D0-D7数据传送引脚,VSS为接地线,VDD为电源线,VEE为LCD驱动电压调节,由此可以调节显示亮度。RS 为寄存器选择信号,高电平选择数据寄存器,低电平选择指令寄存器。RW为读写控制信号,高电平读,低电平写。RS 连接 P2A0;RW 连接 P2A1;EN连接P2八2;EN使能信号,读状态下高电平有效,写状态下下降沿有效。寄存器选择信号读写控制信号线使能信号线,Q4t3.3LCD初始化程序流程图:在初始化过程中,要反复调用到write_com函数,此函数实现向led写入命令的功能。要特别注意写命令和写数据的RS、RW、EN时序问题4、温度采集显示模块4.1 温度采集显示模块的原理图:4.2 DS18B20芯片以及连线分析DS1820数字温度计提供9位(二进制)温度读数,指示器件的温度、信息经过单线接口 送入DS1820或从DS1820送出。因此从主机CPU到DS1820仅需一条线(和地线),DS1820 的电源可以由数据线本身提供而不需要外部电源。DS18B20广脚说明:VCC为电源线,DQ为数据线,GND为地线。数据线DQ与单片 机P1.0相连接。4.3 温度采集显示模块子程序流程图:在此程序中,要特别注意初始化,写和读取数据时的时序处理。首先,初始化中,主机 总线先发送一复位脉冲(最短为480us的低电平信号),接着刻释放总线并进入接收状态。DS18b20在检测到总线的上升沿之后,等待15-60us,接着DS18b20发出存在脉冲(低电平 持 续60-240us)。写数据时序:当主机总线先从高拉至低电平时,就产生写时间隙。读书序:主机总线先从高拉至低电平时,总线只须保持低电平17ts之后,再将总线拉高,产生读时间 隙。5、总原理图以及主程序流程图:5.1 总的原理图:.LCD1.IAJO1EL.5.2 主程序流程图:初始化ledv初始化内部定时器V初始化DS1302_7从DS1302读取日期和时间I j移动光标并显示日期移动光标并显示时间_ _7移动光标并显示温度重复进行按键扫描二、Proteus仿真结果:.LCD1.LWlGL.DS1302 Clock-U2 Time:01-19-59Date:29-06-092069/06/29 Ueek201:19;5900 C-RP2II?Siu.225_L工三、实验数据计算处理,性能分析1、数据计算处理:i.i计算星期数的算法days=(today.day+l+2*today.month+3*(today.month+l)/5+today.year+today.year/4-today.yea r/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、性能分析:首先,led能够正确的显示1302芯片上面的时间和日期。其次,可以通过三个按键:KI,K2和K3键对电子钟进行时间和日期的调整。按K1键 进行校时,可以分别对时及分进行单独校时,使其校正到标准时间,校时时需要校正哪一位哪 一位就闪烁。按K2键是对闪烁位进行加一的操作。按K3键是对闪烁位进行减一的操作。多次按K1键,当全部闪烁位全闪烁完毕时,就可以退出调整模式。但是,时间和日期显示正确,但温度显示错误。温度不能正常显示的主要原因是DS18b20 的数据传输不正确,不过到现在为止,还没改正过来。四、实验过程中故障分析与故障排除的描述故障一:因为自己的知识有限,所以坦诚的说,源代码都是从网上载的,但是我载了 2 个程序,一个是运用1602以及18b20和按键处理显示时间以及温度,另一个程序是单运用 dsl302和1602显示时间而没有按键处理,所以我做的工作就是这么把这两个程序结合起来,实现显示和调整时间的功能。这里的故障排除过程:目的是在有按键调整时间的程序中,要添加DS1302功能。首先,要 在主程序的c文件中,添加include”DS1302.h”语句,并在main主函数中,加入 Initial_DS1302();语句,进行DS1302的初始化,并且添加以下语句:Initial_DS1302();初始化 DS1302DateToStr(&CurrentTime);从 DS1302 读取日期TimeToStr(&CurrentTime);从 DS1302 读取时间显示的程序也要有所改变:display_string(CunentTime.DateString);显示日期此时参数传递过程是先将DS1302内部的时间和日期通过DS1302_GetTime函数读取出来存 放到Time中,日期通过DateToStr函数将Time中的数据传到DateString数组中,而时间通 过imeToStr函数将Ti me中的数据传到TimeString数组中,最后通过display_string函数显 示出来。故障二:通过上面两个函数的合并后,发现编译一直出错,如下图所示:clock.c(7):warning C318:canit open file DS13O2 h,后来发现,我只是在前面加入头文件”DS1302.h”,但是忘记把这个文件放在工程目录下,所 以该工程一直找不到,结果一直出错。故障三:当修改完程序后,按下按键时,发现什么反应都没有,后来又在排查了程序,感觉程序都没错,但是就是没反应。偶然之间,发现要长按按键,就可以实现按键调整时间 的功能。因为在按键扫描程序中,设置了软件防抖动功能,所以要长按按键,才能调整时间。故障四:温度显示错误。因为时间有限,前面整合两个程序就花了太多的时间,来不及 再调整温度显示模块,自己推测,应该是中间函数参数传递出现错误,在主程序的main函 数中,显示温度是display_string(OO.OC”)语句,所以温度一直显示00.0C,事后有时间会再 进行参数调整。故障五:在实验开始时,感觉不懂如何运用proteus,就连对C52进行程序烧写时,都 不知道如何才能生成Hex文档,万事开头难,只能踏踏实实一步一步学习,后来请教同学 才知道在“Options for Target 1”的Output选项中,要将Create HEX Fil选项勾起来才可以。五、实验结论以及体会实验结论:1、在该电子钟的设计中修改定时或调整时间时采用了闪烁,在编程上,首先进行了初 始化定义了程序的入口地址以及中断的入口地址,在主程序的开始定义了一组固定单元用来 存储计数的秒,分,时以及定时时间的序号等。其次,时,分,秒显示用了软件译码(查表)的 方式,再用了一段固定的程序段进行进制转化。最后,用查询方式对按键进行判断,若有键按 下,则进行软件延时消抖,避免了抖动引起的干扰,执行相应的定时,选时或调时程序段。对当前 时间或定时时间修改后又返回到最初的显示程序段,如此循环下去。2、在硬件上,选用DS1302,LCD1602相结合,首先DS1302内含有一个实时时钟/日 历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分 时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作,这样读取数据简单。其 次,选用LCD1602进行显示时,数据位串行输入,接口连线少,低功耗,显示清晰。并且 本实验的电子钟即要实现时间的现实,还要实现日期的现实,所以若是运用数码管进行显示 的话,就算运用动态显示,所占用的10 口多,并且所需的数码管个数多,硬件复杂。3、proteus是一个北常好用的仿真软件,其具有强大的电路原理图绘制功能,且可以实 现模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统仿真、键盘、LCD系统 仿真等多种功能;和keil联合使用时可以检测所编写的程序的正确与否。将keil和proteus 联合起来使用是实现电子设计制作的初步阶段,可避免在实际的硬件操作中因为电路原理图 或向单片机烧录的程序有误而造成的难以修改的为题。实验心得:1、通过本次实验,因为之前接触到的电子系统设计不多,所以一开始,感觉难以入手,就算上网载了很多程序,也看不懂。后来请求同学的帮助,了解了要对各种芯片编写程序时 首先应找到该芯片的数据手册,根据数据手册上的说明、时序要求及流程图编写对应程序。2、其次,再次巩固了 Keil C51工程文件的建立,程序编写以及编译的掌握程度。最重 要的是,因为只是水平有限,要自己编写C程序很难,但在此实验中,最大的收获莫过于 看懂别人的程序,分析之后,自己拼凑编写以实现不同的功能。并且掌握了 52c程序的编 写过程。3、掌握了 Proteus的使用方法,从实际操作中认识到Proteus在仿真方面的优越性,激 发了自己学习Proteus的兴趣;4、因为自己要修改程序,所以单单花费在程序分析的时间就很多,为了更好的理解程 序,我把每句主要程序的后面都注释了该语句的意思,详情可以见程序清单,发现注释语义 的工作量也是非常大的。写实验报告时,每个模块的流程图都是自己画的,用WORD文档 画图真的很麻烦,而且不是很美观。因为时间比较仓促,流程图写的条理性不够,不过相信 以后多多练习,就可以做得更好。5、在这次实验中我遇到了很多故障,不过通过各种渠道(比如网络,请教同学,老师 等等)解决了一些故障,虽然没有全部解决,但能在短短一周内通过此次作业,实现电子钟 的功能,还是有点成就感的。在解决这些问题的过程中发现网络确实是一个很好的学习平台,利用前人的经验可以提高自己的解决实际问题的能力。通过这一个多礼拜的学习实践,使我 对所学的知识进行了系统的复习和巩固,在以前学习中不够清晰的概念得到了更好的理解。相信通过不断的学习,能使自己扬长补短。六、程序清单1、主程序#include#includelcdl602.hn 包含头文件,直接引用显示文件#includedsl8b20.hinclude DS1302.h#define uchar unsigned char#define uint unsigned int#define TIMERO_COUNT OxEEllsbit mode=P3A0;设定修改位数sbit plus=P3A3;力口键sbit dec=P3八6;减键uchar count,s 1 num,timer0_tick,count=0;typedef struct char hour;char minute;char second;time;typedef struct uint year;uchar month;char day;date;time now=10,20,0;显示时间初始值date today=2009,1,8;char codedayofmonth=31,28,31,30,31,30,31,31,30,31,30,31;/设定月份数组,用以判定12个 月的最大值char codeweekday74=Weekln,Week2,Week3,Week4n,Week5,nWeek6n,Week7;/设定行星期显示数uchar monthday(uchar year,uchar month)(if(month=2&year%4=0)用以判定是否为润年,其2月有29天 return(29);elseretum(dayofmonth month-1);非闰年时的该月份天数void display_week()由年月日计算星期,用以显示星期数(char days;days=(today.day+1+2*today.month+3*(today.month+l)/5+today.year+today.year/4-today.ye ar/1 OO+today.year/400)%7;display_string(&weekday day s 0);)static void timerO_initialize(void)/timerO initialize(EA=0;设置不接受所有中断timerO_tick=O;TR0=0;TMOD=0X01;模式2,16位工作模式TL0=(TIMER0_COUNT&0X00FF);设置TimerO低八位数值TH0=(TIMER0_COUNT 8);/设置TimerO高八位数值PT1=1;设置TimerO的优先级为最高关闭 TimerO设置TimerO为ETO=1;设置接受TimerO的中断TRO=1;启动 TimerOEA=1;设置系统接受中断)void write_time(uchar add,uchar number)写时间(gotoxy(2,add);display_data(number);)void write_riqi(uchar add,uchar number)写日期(gotoxy(l,add);display_data(number);)void keyscan()按键扫描程序(uchar mode_num;设定 mode_num,来判断是哪一位要修改,当mode_num为零 时,为非修改模式if(mode=0)/“修改位”的选择(delay(5);延时if(mode=0)当外部按键 mode 没按下一次时,都使mode_num自加,即 mode_num表示为按键mode按下的次数 mode_num+;while(!mode);TR0=0;write_com(0 x0f);)if(mode_num=1)gotoxy(l,4);当当mode_num为1时,为年份改变位,光标移到(1,4)if(mode_num=2)gotoxy(l,7);当 mode_num 为 2 时,为月 份改变位,光标移到(1,7)if(mode_num=3)gotoxy(l,10);当 mode_num 为 3 时,为日 期改变位,光标移到(1,10)if(mode_num=4)gotoxy(2,2);当 mode_num 为 4 时,为 小时改变位,光标移到(2,2)if(mode_num=5)gotoxy(2,5);当 mode_num 为 5 时,为 分钟改变位,光标移到(2,5)if(mode_num=6)gotoxy(2,8);当mode_num为6时,为秒数改变位,光标移到(2,8)if(mode_num=7)/当mode_num为7时,退出修改模式(mode_num=0;非修改模式时,将mode_num置零,有助于判断 是否为修改模式write_com(0 x0c);TR0=l;)if(mode_num!=0)为修改模式时,加减键的处理子程序(if(plus=O)当加键为零,即外部触发一次时,进行以下处理(delay;延时if(plus=O)延时再次判断 加键,防止抖动(while(!plus);if(mode_num=1)当为年份改变时,年份自加一,并且显示 修改后的日期(today.year+;write_riqi(1,today.year/100);因为年份主要 是最后两位在改变,所以除以100来计算年 份值,除以100求得的商值为十位write_riqi(3,today,year%100);余数为个位 gotoxy(l,12);display_week();/因为改变日期都会改变周数,所以要重新显 示gotoxy(l,4);)if(mode_num=2)以下处理同上(today.month+;if(today.month=13)today.month=l;/特 别注意,月份不能超过12,当为13时,要 将月份置1write_riqi(6,today.month);gotoxy(l,12);display_week();gotoxy(l,7);)if(mode_num=3)以下处理同上(today.day+;if(today.daymonthday(today.year,today.mont h)特别要判断每个月份的最大值,不能 超过此数,超过后要将天数置一today.day=l;write_riqi(9,today.day);gotoxy(l,12);display_week();gotoxy(l,10);)if(mode_num=4)以下处理同上(now.hour+;if(now.hour=24)now.hour=0;小时不能超过24write_time(1,no w.hour);gotoxy(2,2);)if(mode_num=5)以下处理同上now.minute+;if(now.minute=60)now.minute=0;write_time(4,now.minute);gotoxy(2,5);)if(mode_num=6)以下处理同上(now.second+;if(no w.second=60)now.second=0;write_time(7,no w.second);gotoxy(2,8);)if(dec=0)减键的处理和加键处理处理相反(delay(5);if(dec=0)|while(!dec);if(mode_num=1)(today,year;write_riqi(l,today,year/100);write_riqi(3,today,year%100);gotoxy(l,12);display_week();gotoxy(l,4);)if(mode_num=2)(today.month;if(today.month=0)today.month=12;要注 意月份的最小值为1,当减为零时,要讲月 份置为12write_riqi(6,today.month);gotoxy(l,12);display_week();gotoxy(l,7);)if(mode_num=3)(today.day;if(today.day=0)当天数减为0时,要重 新赋值,为上一个月的最大值today.day=monthday(today.year,today.month);write_riqi(9,today.day);gotoxy(l,12);display_week();gotoxy(l,10);)if(mode_num=4)(now.hour;if(now.hour0)now.hour=23;当小时数小于0时,要重新 赋值,置为23write_time(l,now.hour);gotoxy(2,2);)if(mode_num=5)(now.minute;if(now.minute0)now.minute=59;注意点同上write_time(4,now.minute);gotoxy(2,5);)if(mode_num=6)(now.second;if(now.secondmonthday(today.year,today.mont h)、判断天数,当超过本月最大天数时,向月份进位,且天数置一(today.day=l;today.month+;if(today.month=13)判断月份,当月份超过12时,向年份进位,月份置一(today.month=l;today.year+;)write_riqi(6,today.month);。在位置 6 处,向led写月份gotoxy(l,12);display_week();)write_time(1,now.hour);在 位置 1处,向led写时数)write_time(4,now.minute);在位置4处,向led写分数)write_time(7,no w.second);/在位置7处,向led写秒数void main()SYSTEMTIME CurrentTime;init_lcd();/初始化 ledtimerO_initialize();初始化内部定时 器Initial_DS1302();初始化 DS1302DateToStr(&CurrentTime);/从DS1302读取日期TimeToStr(&CurrentTime);/从DS1302读取时间gotoxy(l,l);display_string(CurrentTime.DateString);显示日期display_week();显示周几gotoxy(2,l);display_string(CurrentTime.TimeString);显示时间gotoxy(2,10);display_string(00.0Cn);/显示温 度while(l)keyscanQ;write_riqi(9,today.day);在位置 9 处,向 led 写天数2、lcdl602头文件程序:#define uchar unsigned char#define uint unsigned intsbit rs=P2A0;寄存器选择信号sbitrw=P27;读写控制信号线sbit lcden=P2A2;使能信号线#define lcd_mode 0 x38#define display_cursor OxOf#define undisplay_cursor 0 x0c char code int_to_char=H0123456789n;void delay(uint x)延时程序(uint a,b;for(a=x;a0;a)for(b=10;b0;b-);)void write_com(uchar com)写命令(P0=com;写命令,记住时序问题rs=O;rs要为低电平lcden=0;/使led使能端产生一个正脉 冲delay(10);lcden=l;delay(10);lcden=0;)void write_date(uchar date)写数据(P0=date;将数据送到P0 口准备传送出rs=l;写数据时,rs要为高电平lcden=0;使led使能端产生一个正脉 冲delay(10);lcden=l;delay(10);lcden=0;)void init_lcd(void)初始化 led 1602(delay(15);write_com(lcd_mode);模式设置delay(20);write_com(undisplay_cursor);显 示光 标delay(20);write_com(0 x06);光标移动delay(20);write_com(0 x01);清屏 delay(20);)void display_string(char*p)写字符串while(*p)(write_date(*p);delay(20);P+;)void gotoxy(uchar x,uchar y)设置移动坐标(if(x=l)write_com(0 x80+y);elsewrite_com(0 xc0+y);)void display_data(char number)显 示数据uchar x,y;x=number/10;将取得的数据转换成十进制y=number%10;write_date(int_to_char x);write_date(int_to_char y);放的的秒数#define DS1302_MINUTE0 x82#define DS1302_HOUR0 x84#define DS1302_WEEK0 x8A#define DS1302_DAY0 x86#define DS1302_MONTH0 x88#define DS1302_YEAR0 x8C#define DS1302_RAM(X)(0 xC0+(X)*2)用于计算DS1302,RAM地址的宏RAM命令控制字地址:0 xC0-0 xFD3、dsl302头文件程序#ifndef_REAL_TIMER_DS 1302_2003_7_21#define_REAL_TIMER_DS 1302_2003_7_21sbit DS1302_CLK=P1A6;实时时钟时钟线引脚sbit DS1302JOP1A7;实时时钟数据线引脚sbit DS1302_RSTP1A5;实时时钟复位线引脚 sbit ACC0=ACCA0;sbit ACC7=ACC八7;typedef struct _SYSTEMTIME(unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString 9;unsigned char TimeString 9;SYSTEMTIME;定义的时间类型#define AM(X)X#define PM(X)(X+12)/转成24小时制#define DS 1302_SECOND 0 x80时钟芯片的寄存器位置,存放时间,如0 x80void DS 1302InputByte(unsigned char d)/实时时钟写入一字节(内部函数)(unsigned char i;ACC=d;for(i=8;i0;i-)(DS1302JO=ACC0;将IO线上的数据存放在ACC中DS1302_CLK=1;特别注意,DS1302写一数据时,CLK 要产生一负脉冲DS1302_CLK=0;ACC=ACC 1;每次移位一位unsigned char DS 1302OutputByte(void)/实时时钟读取一字节(内部函数)(unsigned char i;for(i=8;i0;i-)(ACC=ACC 1;将前一个下降沿读出的数据右移一位从而读出该次读出的数放入ACC7ACC7=DS1302_IO;DS1302_CLK=1;DS1302_CLK=0;SCLK下降沿读出DS1302的数return(ACC);允许写入DS1302void Write 1302(unsigned char ucAddr,unsigned char ucDa)其中 Addr 为 DS1302地址,ucData为要写的数据(DS1302_RST=0;写数据时,要注意RST产生一上升沿,CLK 为低电平DS1302_CLK=0;DS1302_RST=1;DS 1302InputByte(uc Addr);/地址,命令DS 1302InputByte(ucDa);/写 1 字节数据DS1302_CLK=1;DS1302_RST=0;unsigned char Read1302(unsigned char ucAddr)读取DS1302某地址的数据(unsigned char ucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS 1302InputByte(uc Addr 10 x01);/地址,命令ucData=DS 1302OutputByte();/读 1 字节数据 DS1302_CLK=1;DS1302_RST=0;retum(ucData);void DS1302_SetProtect(bit flag)/是否写保护(if(flag)Writel302(0 x8E,0 x80);/0 x8E 控 制字节地址,bit7=WPWP=1禁止数据写入 DS1302elseWritel302(0 x8E,0 x00);WP=0void DS 1302_SetTime(unsigned char Address,unsigned char Value)/设置时间函数(DS 1302_SetProtect(0);Writel302(Address,(Value/10)4 I(Value%10);读写数据时要特别注意数据 的处理,要写的数据要进行拼凑,将Value 数据的十位取出,放入高四位,Value的个 位放在低四位上void DS 1302_GetTime(S YSTEMTIME*Time)(unsigned char Read Value;用来传递读取1302的数据ReadValue=Readl302(DS1302_SECOND);?读 取秒 数,存放在ReadValue变量中Time-Second=(ReadValue&0 x70)4)*10+(ReadValue&OxOF);将 ReadValue 数据 的第4、5、6位取出,实际上就是秒数的十 位,但是以二进制的形式表示,所以要进行 移位,向右移四位,在乘以10,在加上 ReadValue变量中秒数的,将十六进制的数 化成十进制数表示,并放在Time-Second 中ReadValue=Readl302(DS 1302_MINUTE);Time-Minute=(ReadValue&0 x70)4)*10+(ReadValue&OxOF);同上ReadValue=Readl302(DS1302_HOUR);Time-Hour=(ReadValue&0 x70)4)*10+(ReadValue&OxOF);同上ReadValue=Readl302(DS1302_DAY);Time-Day=(ReadValue&0 x70)4)*10+(ReadValue&OxOF);同上ReadValue 二Readl302(DS1302_WEEK);Time-Week 二(ReadValue&0 x70)4)*10+(ReadValue&OxOF);同上ReadValue=Readl302(DS1302_MONTH);Time-Month=(ReadValue&0 x70)4)*10+(ReadValue&OxOF);/|WReadValue 二Readl302(DS 1302_YEAR);Time-Year=(ReadValue&0 x70)4)*10+(ReadValue&OxOF);同上void DateToStr(SYSTEMTIME*Time)/年 份转换成可供led显示的字段子程序(Time-DateStringO=Time-Year/10+O;Time-DateStringO中存放的就是要显 示年的十位Time-DateString 1 =Time-Year%10+O;Time-DateStringl中存放的就是要 显示年的个位Time-DateString=;年和
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:以ds1302实时时钟芯片和液晶显示屏cd1602为基础设计的电子钟.pdf
    链接地址:https://www.zixin.com.cn/doc/12983149.html
    页脚通栏广告

    Copyright ©2010-2025   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork