以DS实时时钟芯片和液晶显示屏CD为基础实施方案电子钟_第1页
以DS实时时钟芯片和液晶显示屏CD为基础实施方案电子钟_第2页
以DS实时时钟芯片和液晶显示屏CD为基础实施方案电子钟_第3页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、电子系统设计实验报告实验名称以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计地电子钟院(系)别 班号实验日期2009-6-25 至U 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、

2、晶振、电容、电阻、开关各若干等7、proteus仿真软件8、Keil C51、PC 机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时间和日期可调整,按键采用3个按键;至少在 Proteus上调试通过扩展:闹钟和重要日期提醒功能(增加蜂鸣器),闹铃音乐功能b5E2R实验步骤1、 打开Keil软件,新建一个工程文件,选择好芯片,并记得在 "Options for Target 1"地Output 选项中,将 Create HEX Fil选项勾起来.p1Ean2、 将编写地程序保存成“.C”地形式3、编译保存好地 C文件,并根据提示

3、修改程序中地错误,直到编译成功为止4、打开proteus软件,画出实验电路图5、 在89C52中,载入原来已生成地HEX文档6、按下运行键,对 Proteus进行软件仿真,观察运行结果原理、结果及分析一、设计方案原理与设计特点分析电子钟总地设计模块:各个模块电路原理分析:1、DS1302时钟采集模块:1.1电路原理图:C133? <TEX丄IT1IC2-t BAT1.I . I vTRXTaP1,0;T2P1.VT2EXP1,2P1.3P1.4P1.5pi.eP1.7X1 VCC1VCC2CRYSTAL RSf tTESCLKX2 I/O<TEXT?1.2DS1302 分析:首先D

4、S1302是DALLAS公司推出地涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态 RAM 通过简单地串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年地信息每月地天数和闰年地天数可自动调整时钟操作.DXDiToDS1302芯片广脚介绍:XI、X2为32.768KHZ晶振管脚.GND为地.RST复位脚/0数 据输入/输出引脚.SCLK串行时钟.Vcc1,Vcc2电源供电管脚与单片机连接地信号线为:DS1302_SCLK 接P1A6;实时时钟时钟线引脚RTCrpDS1302_IO接P1A7;实时时钟数据线引脚DS1302_RST接PU5;实时时钟复位线引脚特别注意DS1302芯

5、片在读取或写入数据时,都是一位一位传送地,并且每传送一位,SCLK信号线要有一个负跳变即单片机对SCLK咬先送高电平,再送低电平数据时通过10 进行传送地.5PCzV1.3数据处理子程序流程图调用年份转换成可供led显示地字段子程序DateToStr<,>时间转换成可供led显示地字段子 程序 TimeToStr结束因为DS1302芯片在读取或写入数据时, 都是一位一位传送地, 并且每传送一位,SCLK 信号线要有一个负跳变所以在对DS1302具体某地址进行一字节数据地写入或读取时,都要调用实时时钟写入一字节(内部函数)DS1302InputByte和实时时钟读取一字节 (内部函数

6、)DS1302OutputByte 两个函数.jLBHr。2、按键处理模块IB*131B2.1按键连线图P5 0/RXDP3JHXDP3 2/INTOP3.3/INTTF3.4rroP3.S/T1F3.6M/R"P3.7/RF其中按键1为模式键,按键2为加1键,按键3为减1键与单片机连线如下:mode连接P3A0;/设定修改位数16 / 23plus连接P3A3;/加键dec连接卩3人6;/减键22按键扫描子程序流程图:2.3加减键处理子程序流程图dvzfv修改year值,并返回修改mouth值,并返回>修改day值,并返回修改秒值,并返回修改分值,并返回修改小时值,并返回减1

7、子程序与加1子程序区别只在于修改数值处理不一样,其他都一样3、LCD显示模块3.1LCD显示模块电路原理图LCD1Lmoi'bl"IAL丄P2.OZASP2.1/A9 P2 2/A10 P2.3/A11 P2.4/A12 P2 5/A13 P2.Q/A14 P2.7/A1545PO O/ADO P0.1/AD1 P0.2/AD2 卩口 3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD72223252627RP2RESPAC <TEXT>3.2LCD1602芯片以及连线分析液晶显示器是一种功耗极低地被动式显示器件,1602广脚介绍:D

8、0 D7数据传送引脚,VSS为接地线,VDD为电源线,VEE为LCD驱动电压调节,由此可以调节显示亮度.RS为寄存器选择信号,高电平选择数据寄存器,低电平选择指令寄存器.RW为读写控制信号,高电平读,低电平写.EN使能信号,读状态下高电平有效,写状态下下降沿有效.EmxvxRS连接P2P;寄存器选择信号RW连接P2A1;读写控制信号线EN连接P2A2;使能信号线3.3LCD初始化程序流程图:在初始化过程中,要反复调用到write_com函数,此函数实现向led写入命令地功能要特别注意写命令和写数据地RS、RW、EN时序问题SixE2。4、温度采集显示模块4.1温度采集显示模块地原理图:10k

9、U1VCCDQ GND21.0<DS18B20;q23_手IP1.0/T2 P1 1/T2EX P1.2PI.3P1.4P1.5P1.64.2DS18B20芯片以及连线分析DSI820数字温度计提供9位(二进制)温度读数,指示器件地温度、信息经过单线接口送入DSI820或从DSI820送出因此从主机 CPU至U DSI820仅需一条线(和地线),DSI820 地电源可以由数据线本身提供而不需要外部电源.6ewMyDS18B20广脚说明:VCC为电源线,DQ为数据线,GND为地线.数据线DQ与单片机P1.0 相连接.kavU4。4.3温度采集显示模块子程序流程图:直接向18b20发送温 度

10、变换命令读取温度寄存器地温 度值读低八位厂进行读取数据处理,得出温度存放于变量temp 中在此程序中,要特别注意初始化,写和读取数据时地时序处理首先,初始化中,主机总线先发送一复位脉冲(最短为480us地低电平信号),接着刻释放总线并进入接收状态DSI8b20在检测到总线地上升沿之后,等待15-60US,接着DS18b20发出存在脉冲(低电平 持续60-240 us).写数据时序:当主机总线先从高拉至低电平时,就产生写时间隙读书序:主机总线先从高拉至低电平时,总线只须保持低电平I7ts之后,再将总线拉高,产生读时间隙.y6v3A。5、总原理图以及主程序流程图:5.1总地原理图:FIDT2 Fi

11、l.llTt 和戈FEI MERETEG.-r.H-IC4-5.2主程序流程图:Pl.-ruuxui FUIMDI PDSVlIQ pomra pm梯n PDSIB PD.Iri FDLtiW.1陀j阀 PZJtA.tl PZJATlFZJHA13 F34乂PMWX*F3.1iT>5 FjEBina P33TH7Tair *3smPJ.TiWLCDT Jihh-初始化内部定时器初始化DS1302移动光标并显示日期初始化ledr从DS1302读取日期和时间、Proteus仿真结果:丄O3 -hBAriU1K1 VCOI VCO22069/0629 U罪灯ais 19: 59-U_i>

12、 A 日fAb rU2/AGZ an up 皿殆g 口酗 ES P丘丽PZA11乜FZWAIaTn.:L_r b ABUurra i.irr». 匸 T .|Ar P.'-miso r isrratfRXDP3WTO rajfimn.»nuF3jpn P3nr三、实验数据计算处理,性能分析1、数据计算处理:1.1计算星期数地算法days=(today.day+1+2*today. mon th+3*(today. mon th+1)/5+today.year+today.year/4-today.yea r/100+today.year/400)%7,由年月曰计算星

13、期,用以显示星期数M2ub61.2加减键对时间日期改变处理算法对于年月日,时分秒来说,每个变量地最大值和最小值都不一样,所以当年月份时分秒改变时,进行处理地算法也不一样,年没有最大值,所以不用采取“封顶”措施,每次年加 一处理时,直接自加,而对于月份来说,月份是不能超过13地,所以当月份自加到13时要重新置1,具体处理见程序,在每个语句后,我都有分析注释出来.OYujC。1.3时分秒进位算法当秒,分达到60时,向分进位,且秒数置零,从新开始计数.当时达到24时,也一样处理.1.4年月日进位算法因为每个月份地天数都不同,所以事先先设定一数组:dayofmonth=31,28,31,30,31,3

14、0,31,31,30,31,30,31用以判定 12 个月地最大值,接着判断天 数,当超过本月最大天数时,月份加一,且天数要置1月份判断比较简单,只要超过12,年份就加1,月份置1.eUts8。2、性能分析:首先,led能够正确地显示1302芯片上面地时间和日期.其次,可以通过三个按键:K1, K2和K3键对电子钟进行时间和日期地调整.按K1键进行校时,可以分别对时及分进行单独校时,使其校正到标准时间,校时时需要校正哪一位哪一位就闪烁.按K2键是对闪烁位进行加一地操作.按K3键是对闪烁位进行减一地操作.多次按K1键,当全部闪烁位全闪烁完毕时,就可以退出调整模式.sQsAt。但是,时间和日期显示

15、正确,但温度显示错误.温度不能正常显示地主要原因是DS18b20地数据传输不正确,不过到现在为止,还没改正过来.GMsla四、实验过程中故障分析与故障排除地描述故障一:因为自己地知识有限,所以坦诚地说,源代码都是从网上载地,但是我载了2个程序,一个是运用1602以及18b20和按键处理显示时间以及温度,另一个程序是单运用ds1302和1602显示时间而没有按键处理,所以我做地工作就是这么把这两个程序结合起来,实现显示和调整时间地功能.TIrRG。这里地故障排除过程: 目地是在有按键调整时间地程序中,要添加DS1302功能.首先,要在主程序地 c文件中,添加#i nclude "DS1

16、302.h"语句,并在 ma in主函数中,力口入 Initial_DS1302();语句,进行 DS1302地初始化,并且添加以下语句:7EqZ(。Initial_DS1302();/初始化 DS1302DateToStr(&CurrentTime);/从 DS1302 读取日期TimeToStr(&CurrentTime);/从 DS1302 读取时间显示地程序也要有所改变:display_string(CurrentTime.DateString);/显示日期 izq7I。此时参数传递过程是先将 DS1302内部地时间和日期通过 DS1302_GetTime函数

17、读取出来存 放到Time中,日期通过 DateToStr函数将Time中地数据传到 DateString数组中,而时间通 过imeToStr函数将Ti me中地数据传到 TimeString数组中,最后通过 display_string函数显 示出来.zvpge。故障二:通过上面两个函数地合并后,发现编译一直出错,如下图所示:clock.c(7): earning C318: can'匸 open file 1DS13O2 * h后来发现,我只是在前面加入头文件"DS1302.h",但是忘记把这个文件放在工程目录下,所以该工程一直找不到,结果一直出错.NrpoJ。故

18、障三:当修改完程序后,按下按键时,发现什么反应都没有,后来又在排查了程序, 感觉程序都没错,但是就是没反应.偶然之间,发现要长按按键,就可以实现按键调整时间地功能.因为在按键扫描程序中,设置了软件防抖动功能,所以要长按按键,才能调整时 间.1nowf。故障四:温度显示错误.因为时间有限,前面整合两个程序就花了太多地时间,来不及 再调整温度显示模块,自己推测,应该是中间函数参数传递出现错误,在主程序地main函数中,显示温度是 display_string("00.0C")语句,所以温度一直显示00.0C,事后有时间会再进行参数调整.fjnFL。故障五:在实验开始时,感觉不懂

19、如何运用proteus,就连对C52进行程序烧写时,都不知道如何才能生成Hex文档,万事开头难,只能踏踏实实一步一步学习,后来请教同学 才知道在“ Options for Target 1”地 Output 选项中,要将 Create HEX Fil 选项勾起来才可 以 .tfnNh 。五、实验结论以及体会实验结论:1、在该电子钟地设计中修改定时或调整时间时采用了闪烁,在编程上,首先进行了初始化定义了程序地入口地址以及中断地入口地址,在主程序地开始定义了一组固定单元用来存储计数地秒,分,时以及定时时间地序号等.其次,时 ,分,秒显示用了软件译码 (查表 )地方式 ,再用了一段固定地程序段进行进

20、制转化.最后,用查询方式对按键进行判断,若有键按下 ,则进行软件延时消抖 ,避免了抖动引起地干扰 ,执行相应地定时 ,选时或调时程序段 .对当前时 间或定时时间修改后又返回到最初地显示程序段,如此循环下去.HbmVN2、在硬件上,选用 DS1302, LCD1602 相结合,首先 DS1302 内含有一个实时时钟 /日历和 31 字节静态 RAM 通过简单地串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年地信息每月地天数和闰年地天数可自动调整时钟操作,这样读取数据简单.其次,选用 LCD1602 进行显示时,数据位串行输入,接口连线少,低功耗,显示清晰.并且本实验地电子钟即要实现

21、时间地现实, 还要实现日期地现实, 所以若是运用数码管进行显示地 话,就算运用动态显示,所占用地 IO 口多,并且所需地数码管个数多,硬件复杂.V7l4j 。3、proteus 是一个非常好用地仿真软件,其具有强大地电路原理图绘制功能,且可以实现模拟电路仿真、数字电路仿真、单片机及其外围电路组成地系统仿真、键盘、LCD 系统仿真等多种功能; 和 keil 联合使用时可以检测所编写地程序地正确与否.将 keil 和 proteus 联合起来使用是实现电子设计制作地初步阶段, 可避免在实际地硬件操作中因为电路原理图或 向单片机烧录地程序有误而造成地难以修改地为题.83lcP。实验心得:1、 通过本

22、次实验,因为之前接触到地电子系统设计不多,所以一开始, 感觉难以入手, 就算上网载了很多程序,也看不懂 .后来请求同学地帮助,了解了要对各种芯片编写程序时 首先应找到该芯片地数据手册,根据数据手册上地说明、时序要求及流程图编写对应程序. mZkkl。2、 其次,再次巩固了 Keil C51 工程文件地建立,程序编写以及编译地掌握程度.最重要地是,因为只是水平有限,要自己编写 C 程序很难,但在此实验中,最大地收获莫过于看 懂别人地程序,分析之后,自己拼凑编写以实现不同地功能.并且掌握了 52C 程序地编写过程. AVktR。3、掌握了 Proteus 地使用方法,从实际操作中认识到 Prote

23、us 在仿真方面地优越性,激 发了自己学习 Proteus 地兴趣; ORjBn。4、因为自己要修改程序,所以单单花费在程序分析地时间就很多,为了更好地理解程序,我把每句主要程序地后面都注释了该语句地意思, 详情可以见程序清单, 发现注释语义 地工作量也是非常大地 .写实验报告时, 每个模块地流程图都是自己画地, 用 WORD 文档画 图真地很麻烦,而且不是很美观.因为时间比较仓促,流程图写地条理性不够,不过相信以后多多练习,就可以做得更好.2MiJT。5、在这次实验中我遇到了很多故障,不过通过各种渠道(比如网络,请教同学,老师等等) 解决了一些故障, 虽然没有全部解决, 但能在短短一周内通过

24、此次作业,实现电子钟 地功能, 还是有点成就感地 .在解决这些问题地过程中发现网络确实是一个很好地学习平台, 利用前人地经验可以提高自己地解决实际问题地能力.通过这一个多礼拜地学习实践,使我对所学地知识进行了系统地复习和巩固,在以前学习中不够清晰地概念得到了更好地理解.相信通过不断地学习,能使自己扬长补短.gIiSp 。六、程序清单/ 包含头文件, 直接sbit mode=P3A0;sbit plus=P33;sbit dec=P3A6;uchar count,s1num,timer0_tick,count=0; typedef struct1、主程序#include<reg52.h&g

25、t; #include"lcd1602.h" 引用显示文件#include"ds18b20.h" #include "DS1302.h"#define uchar unsigned char#define uint unsigned int#define TIMER0_COUNT 0xEE11 /设定修改位数/加键/减键char hour; char minute;char second;time;typedef structuint year;uchar month;char day;date;time now=10,20,0;/显

26、示时间初始值date today=2009,1,8;charcodedayofmonth=31,28,31,30,31,30,31,31,30,3 1,30,31; / 设定月份数组,用以判定12 个月地最大值 uEh0U。charcodeweekday74="Week1","Week2","Week3", "Week4","Week5","Week6","Week7"/设定行星期显示数 IAg9q 。uchar monthday(uchar year,u

27、char month)if(month=2&&year%4=0)/用以判定是否为润年,其2月有29天Wwghw return(29);else/非闰年时地该月份天数void display_week()/由年月日计算星期,用以显示星期数char days;days=(today.day+1+2*today.month+3*(today. month+1)/5+today.year+today.year/4-today.ye ar/100+today.year/400)%7; asfps 。display_string(&weekdaydays0);static void

28、 timer0_initialize(void) /timer0initialize ooeyY。EA=0;/设置不接受所有中断timer0_tick=0;TR0=0;/关闭 Timer0TMOD=0X01;/设置 Timer0 为模式 2, 16 位工作模式TL0=(TIMER0_COUNT & 0X00FF);/设置 Timer0 低八位数值TH0=(TIMER0_COUNT >> 8); /设置Timer0 高八位数值PT1=1; /设置 Timer0 地优先级为最高ET0=1;/设置接受 Timer0 地中断TR0=1;/启动 Timer0EA=1;/设置系统接受中

29、断void write_time(uchar add,uchar number)/写时间gotoxy(2,add);display_data(number);void write_riqi(uchar add,uchar number)/写日期return(dayofmonthmonth-1);gotoxy(1,add);个人收集整理 -仅供参考display_data(number);void keyscan() /按键扫描程序uchar mode_num; / 设定 mode_num, 来判断是哪一位要修改, 当 mode_num 为零 时,为非修改模式 BkeGu。if(mode=0)/

30、“修改位”地选择delay(5); / 延时if(mode=0) / 当外部按键 mode 没按下一次时,都使 mode_num 自加,即 mode_num 表示为按键 mode 按下地次数 PgdO0。 mode_num+;while(!mode); TR0=0; write_com(0x0f);if(mode_num=1) gotoxy(1,4); 当/ 当 mode_num 为 1 时,为年份改变位, 光标移到( 1,4) 3cdXw。if(mode_num=2) gotoxy(1,7);/当 mode_num 为 2 时,为月份改变位,光标移到( 1, 7)h8c52。if(mode_

31、num=3) gotoxy(1,10); /当 mode_num 为 3 时,为日 期改变位,光标移到( 1, 10)v4bdy。if(mode_num=4) gotoxy(2,2); /当 mode_num 为 4 时,为 小时改变位,光标移到( 2,2) J0bm4。if(mode_num=5) gotoxy(2,5);/ 当 mode_num 为 5 时,为分钟改变位,光标移到( 2,5) XVauA。if(mode_num=6) gotoxy(2,8); /当 mode_num 为 6 时,为秒数改变位, 光标移到( 2,8) bR9C6。if(mode_num=7) / 当 mode

32、_num 为 7 时,退出修改模式mode_num=0; / 非修 改模式时,将 mode_num 置零,有助于判断 是否为修改模式write_com(0x0c); TR0=1; if(mode_num!=0) / 为修改模式时, 加减键地处理子程序if(plus=0) / 当加键为零, 即 外部触发一次时,进行以下处理 delay(5); / 延时 if(plus=0)/ 延时再次判断加键,防止抖动 while(!plus); if(mode_num=1) /当为年份改变时,年份自加一,并且显示 修改后地日期today.year+;write_riqi(1,today.year/100);

33、/ 因为年份主要 是最后两位在改变, 所以除以 100 来计算年 份值,除以 100 求得地商值为十位 pN9LB。write_riqi(3,today.year%100);/ 余数为个位 gotoxy(1,12);display_week(); / 因为改变日期都会改变周数, 所以要重新显 示gotoxy(1,4);if(mode_num=2)/以下处理同上today.month+;if(today.month=13) today.month=1; / 特 别注意,月份不能超过 12,当为 13 时,要 将月份置 1DJ8T7。write_riqi(6,today.month);gotoxy

34、(1,12);display_week();gotoxy(1,7);if(mode_num=3)/以下处理同上today.day+;if(today.day>monthday(today.year,today.mont h) / 特别要判断每个月份地最大值, 不能 超过此数,超过后要将天数置一QF81D。today.day=1;write_riqi(9,today.day);gotoxy(1,12);display_week(); gotoxy(1,10); if(mode_num=4) /以下处理同上 now.hour+;if(now.hour=24) now.hour=0; /小时不

35、能 超过 24write_time(1,now.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(now.second=60) now.second=0;if(dec=0)/ 减键地处理和加键处理处理相反delay(5);if(dec=0) while(!dec);if(mode_num=1) today.year-;write_r

36、iqi(1,today.year/100);write_riqi(3,today.year%100);gotoxy(1,12);display_week();gotoxy(1,4);if(mode_num=2)today.month-;if(today.month=0) today.month=12; / 要注 意月份地最小值为 1,当减为零时,要讲月 份置为 124B7a9。write_riqi(6,today.month);gotoxy(1,12);display_week();gotoxy(1,7);if(mode_num=3)today.day-;if(today.day=0) / 当

37、天数减为 0 时,要重 新赋值,为上一个月地最大值23 / 23write_time(7,now.second);gotoxy(2,8); today.day=monthday(today.year,today.month);write_riqi(9,today.day);gotoxy(1,12);display_week();gotoxy(1,10);if(mode_num=4)now.hour-;if(now.hour<0) now.hour=23; /当小时数小于 0 时,要重新 赋值,置为 23write_time(1,now.hour);gotoxy(2,2);if(mode_

38、num=5)now.minute-;if(now.minute<0) now.minute=59; /注意点同上write_time(4,now.minute);gotoxy(2,5);if(mode_num=6)now.second-;if(now.second<0) now.second=59; /注意点同上write_time(7,now.second);gotoxy(2,8);void display_temp()/ 显示温度子程序uint wendu; /设置 wendu 变量来存放从18b20 读取地温度uchar A1,A2;/A1 用来存放温度值地十位, A2 存放

39、个位tmpchange();/ 启动温度转换wendu=tmp();/ 读取温度值A1=wendu/10; / 求 A1 值A2=wendu%10;/ 求 A2 值gotoxy(2,10);display_data(A1);/显示 A1 值display_string("."); /用小数点分开个位和 小数write_date(int_to_charA2); /向 lcd 写数 据,并且注意要转换 A2 数据类型 ix6iF 。 void timer0(void) interrupt 1TR0=0;TL0=(TIMER0_COUNT & 0X00FF);/ 设置 T

40、imer0 低八位数值TH0=(TIMER0_COUNT >> 8);/ 设置 Timer0 高八位数值TR0=1; count+;if(count=30) display_temp(); / 延 时,当 count=30 时,显示温度, 并延时 wt6qb。if(count=200)/ 当 count 自加到200 时,开始判断此时时、分、秒地值,并 进行转换 Kp5zH。 count=0; now.second+; if(now.second=60) / 当 秒 达 到 60 时,向分进位,且秒数置零now.second=0; now.minute+; if(now.minut

41、e=60) /当分达到 60 时,向时进位,且分数置零 now.minute=0; now.hour+; if(now.hour=24) / 当时达到 24 时,向天进位,且时数置零today.day+;now.hour=0;void main()if(today.day>monthday(today.year,today.mont h) 、/判断天数, 当超过本月最大天数时, 向月份进位,且天数置一 Yl4Hd。today.day=1;today.month+;if(today.month=13)/ 判断月份,当月份超过 12 时,向年份进位,月份置一today.month=1;tod

42、ay.year+;write_riqi(6,today.month); ./ 在位置 6 处,向 lcd 写月份SYSTEMTIME CurrentTime;init_lcd(); / 初始化 lcd timer0_initialize(); / 初始化内部定时 器Initial_DS1302(); / 初始化 DS1302DateToStr(&CurrentTime);/ 从DS1302 读取日期TimeToStr(&CurrentTime);/ 从DS1302 读取时间gotoxy(1,1); display_string(CurrentTime.DateString);

43、/显示日期display_week(); /显示周几 gotoxy(2,1);display_string(CurrentTime.TimeString); /显示时间gotoxy(2,10);display_string("00.0C");/ 显示温度while(1) keyscan();write_riqi(9,today.day); /在位置 9 处,向 lcd 写天数/ 在 位 置 1ch4PJ。/延时程序gotoxy(1,12);display_week();write_time(1,now.hour);处,向 lcd 写时数write_time(4,now.mi

44、nute);/在位置 4 处,向 lcd 写分数write_time(7,now.second); /在位置 7 处,向 lcd 写秒数2、lcd1602 头文件程序: #define uchar unsigned char#define uint unsigned intsbit rs=P2A0;、/寄存器选择信号sbit rw=P2Al; 读写控制信号线 sbit lcden=P2A2; /使能信号线 #define lcd_mode 0x38#define display_cursor 0x0f #define undisplay_cursor 0x0c char code int_to

45、_char="0123456789" /*void delay(uint x)uint a,b;delay(20);for(a=x;a>0;a-) for(b=10;b>0;b-);/*/*501nN。*qd3Yf。void write_com(uchar com) /写命令 void display_string(char *p)/写字符串P0=com; rs=0;lcden=0;delay(10); lcden=1;delay(10);lcden=0;/写命令,记住时序问题/rs 要为低电平/ 使 lcd 使能端产生一个正脉while(*p) write_d

46、ate(*p); delay(20); p+;*jW1vi 。*xS0DO。sbit DS1302_CLKP1A6;/* *E836L。void write_date(uchar date) /写数据P0=date; / 将数据送到 P0 口准备传 送出rs=1;/写数据时, rs 要为高电平lcden=0; / 使 lcd 使能端产生一个正脉 冲delay(10);lcden=1;delay(10);lcden=0;/*S42eh。void init_lcd(void)/初始化 lcd1602delay(15);write_com(lcd_mode);/模式设置delay(20);write

47、_com(undisplay_cursor); / 显 示 光 标delay(20);write_com(0x06); / 光标移动delay(20);write_com(0x01); / 清屏void gotoxy(uchar x,uchar y) / 设置移动坐标 if(x=1)write_com(0x80+y);elsewrite_com(0xc0+y);/ *void display_data(char number) / 显 示 数 据 uchar x,y;x=number/10; /将取得地数据转换成 十进制y=number%10;write_date(int_to_charx);

48、write_date(int_to_chary); 3、ds1302 头文件程序#ifndef_REAL_TIMER_DS1302_2003_7_21#define_REAL_TIMER_DS1302_2003_7_21/实时时钟时钟线引脚sbitDS1302_IO= P1A7;/实时时钟数据线引脚sbitDS1302_RST =P1A5;/实时时钟复位线引脚sbit ACC0 = ACCA0;sbit ACC7 = ACCA7;typedef struct _SYSTEMTIME_unsigned char Second; unsigned char Minute; unsigned cha

49、r Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString9; unsigned char TimeString9;SYSTEMTIME;/定义地时间类型#define AM(X)X#define PM(X)(X+12)/ 转成 24 小时制#define DS1302_SECOND0x80/时钟芯片地寄存器位置 ,存放时间 ,如 0x80放地地秒数LOZMk#define DS1302_MINUTE0x82#define DS1

50、302_HOUR0x84#define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C#define DS1302_RAM(X)(0xC0+(X)*2)/用于计算 DS1302_RAM 地址地宏 RAM 命令控制字地址: 0xC0-0xFD ZKZUQ。void DS1302InputByte(unsigned char d) / 实时时钟写入一字节 (内部函数 )dGY2m。 unsigned char i; ACC = d;for(i=8; i>0; i-) DS

51、1302_IO=ACC0;/将 IO 线上地数据存放在 ACC 中DS1302_CLK = 1;/特别注意, DS1302 写一数据时, CLK 要产生一负脉冲DS1302_CLK = 0;ACC = ACC >> 1;/每次移位一位unsigned char DS1302OutputByte(void) / 实时时钟读取一字节 (内部函数 )rCYbS。unsigned char i;for(i=8; i>0; i-)ACC = ACC >>1;/将前一个下降沿读出地数据右移一位 从而读出该次读出地数放入 ACC7 FyXjo 。ACC7 = DS1302_IO

52、;DS1302_CLK = 1;DS1302_CLK = 0;/SCLK 下降沿读出 DS1302 地数return(ACC);void Write1302(unsigned char ucAddr, unsigned char ucDa) / 其 中 Addr 为 DS1302 地址, ucData 为要写地数据 TuWrU。DS1302_RST = 0;/写数据时,要注意 RST 产生一上升沿, CLK 为低电平DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr);/地址,命令DS1302InputByte(ucDa);/ 写 1字节数据DS1302_CLK = 1;DS1302_RST = 0; unsigned char Read1302(unsigned

温馨提示

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

评论

0/150

提交评论