基于利用时钟芯片DS实现万年历LCD显示电子表_第1页
基于利用时钟芯片DS实现万年历LCD显示电子表_第2页
基于利用时钟芯片DS实现万年历LCD显示电子表_第3页
基于利用时钟芯片DS实现万年历LCD显示电子表_第4页
基于利用时钟芯片DS实现万年历LCD显示电子表_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1、基于利用时钟芯片DS实现万年历LCD显示电子表电子设计大赛培训第二阶段第组报告基于利用时钟芯片DS1302实 现万年历,1602LCD显示电子 表成员姓名:槿学号:*成员姓名:HG*学号:*成员姓名:槿学号:一、主要功能1 v在1602液晶上显不年月、日星期 时、分 秒以及实时 温度,并且实时更新显示;2、通过按键随时调节各显示参数,分别实现光标定位、数值增大、数值减小、闹钟和温度上下限查看的功能;3在时间出现乱码的情况下,具有一键初始化时间的功能。路图三、实物图1 开关模块2、显ZE模块3、at89c52 模块4、总体连接图四、心得体会本次设计是我们遇到过的较大的设计,所以遇到的问题也比较的

2、 多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软 硬件设计和调试中遇到了不少的困难,在同学的帮助才逐一克服了难 题,学习到了不少的专业知识。在整个设计过程之前,我已经在网上找了相关方面的资料,万事开 始难,一开始不知道从哪里下手。后来慢慢学会分析系统,将系统模块 化,各个模块可以在软件或者硬件上实现。在确保各个模块的硬件电路 和与之相搭配的程序能够正常工作后在把它们组成一个系统。在今后的 日子里,我会进一步加强自己的动手能力,丰富自己的知识 面。总之,这次设计给我的最大感触就是,在以后的学习中勤动脑,多动手。附录:1、元件清单AT89C52 块LCD 个排阻3个DS1302 个D

3、S18B20 一个开关5个晶振2个 瓷片电容2个,30PF电解电容一个,33Uf插针若干杜邦线若干2、程序 #include #include /#includeHLCD1602.h/#includeMDS1302.hn#defi neuint unsignedint #defi neuchar unsign edcharsbitDS1302_CLK=PM7; sbitDS1302 J 0=PM6; sbitDS1302_RST=PM5; sbitwireless_ 仁 P3A0;实时时钟时钟线 引脚sbitwireless_2=P3A1;实时时钟数据线引sbitwireless_3=P3A2

4、;sbitwireless_4=P3A3;sbitACC0=ACC9 sbitACC7=ACf,7;charhide_sec5hide_mi n,hide_hour,hide_day,hide_week,hide_month,hide_year;/秒,分,时到日月,年位闪的计数模式切换键加法按钮sbitSet=P2A0;/减法按钮立刻跳出调整模式按钮温度传送数据sbitUp=P2M; 10 口sbitDowchard on e,co un t,temp,flag,up_flag,down_flag;n=P2A2; uchartemp_value;/ 温度值sbitout=P2A3;/uchar

5、T empBuffer5,week_value2;voidshow_time();/ 液晶显ZF程序/PortDefinitions*/*1602 液晶显示部分子程序*/sbitLcdRs=P2A5;sbitLcdRw=P2A6;数据端口sbitLcdEn=P2A7;sfrDBPort=0x80;/P0=0x805P1=0x90,P2=0xA0,P3=0xB0.内部等待函* unsig nedcharLCD_Wait(void) _LcdRs=0;LcdRw=1 ;_nop_();LcdEn=1 ;_nop_();LcdEn=O;returnDBPort;向LCD写入命令或数it*#defin

6、eLCD_COMMANDO/Command#defineLCD_DATA1/Data#defineLCD_CLEAR_SCREEN0x01/ 清屏#defineLCD_HOMING0x02/ 光标返回原点 voidLCD_Write(bitstyle,u nsign edchari nput)LcdE n=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/ 注意顺序LcdEn=1 ;_nop_();/ 注意顺序LcdEn=0;_ nop_();LCD_Wait();设置显示#defineLCD_SHOW0x04/ 显示开#defineLCD

7、_HIDEOxOO/ 显示关#defineLCD_CURSOR0x02/ 显示光标#defineLCD_NO_CURSOROxOO/ 无光标#defineLCD_FLASHOxO1/ 光标闪动#defineLCD_NO_FLASHOxOO/ 光标不闪动voidLCD_SetDisplay(unsignedcharDisplayMode)(LCD_Write(LCD_COMMAND,0x08|DisplayMode);设置输入*模式模式#defineLCD_AC_UP0x02#defineLCD_AC_DOWNOxOO/default#defineLCD_MOVE0x01/ 画面可平移#defi

8、neLCD_NO_MOVEOxOO/default voidLCD_Setl nput(un signedcharl nputMode)LCD_Write(LCD_COMMAND,0x04|lnputMode);/D *LcdEn=0;LCD_Write(LCD_COMMAND,Ox38);/8 位数据端口LCD_Write(LCD_COMMAND5Ox38);,2行显示月7点LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);/阵LCD_Write(LCD_COMMAND 丄 CD_CLEAR_SCREEN);LCD_Setlnput(LCD_AC_UP|LCD_N

9、O_MOVE);/AC开启显示,无光voidPri nt(un signedchar*str)标清屏液晶字符输入的位晝一voidGotoX Y(un signedcharx,u nsignedchary)if(y=O)LCD_Write(LCD_COMMAND50x80|x);if(y=i)LCD_Write(LCD_COMMAND,0x80|(x-0x40);将字符输出到液晶显示while(*str!=,O,)LCD_Write(LCD_DATA,*str);str+;/*DS1302时钟咅E分子稈库typedefstruct_SYSTEMTIME_unsignedcharSecond; u

10、nsignedcharMinute; unsignedcharHour; unsignedcharWeek;unsignedcharDay; unsignedcharMonth; unsignedcharYear;unsignedcharDateString11; unsignedcharTimeString9;SYSTEMTIME;/定义的时间类型SY STEMTIMECurrentTime;#defineAM(X)X #definePM(X)(X+12)/ 转成 24 小时制#defineDS1302_SECOND0x80/时钟芯片的寄存器位置,存放时间#defineDS1302_MINU

11、TE0x82#defineDS1302_HOUR0x84#defineDS1302_WEEK0x8A#defineDS1302_DAY0x86#defineDS1302_MONTH0x88#defineDS1302_YEAR0x8CvoidDS1302lnputByte(unsignedchard)/ 实时时钟写入一字节(内部函数)un signedchari;ACC=d;for(i=8;i0;i-)DS1302_IO=ACC0;/相当于汇编中的RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC1;unsignedcharDS1302OutputByte(void)/实时

12、时钟读取一字节(内部函数)un signedchari;for(i=8;i0;i-)ACC=ACC1;/相当于汇编中的RRCACC7=DS1302JO;DS1302_CLK=1;DS1302_CLK=0;)return(ACC);voidWrite1302(u nsign edcharucAddr,u nsignedcharucDa)ucAddr:DS1302地址.ucData:要写的数据DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302lnputByte(ucAddr);/ 地址,命令DS1302lnputByte(ucDa);/ 写 1Byte 数据

13、 DS1302_CLK=1;DS1302_RST=0;读取DS1302某地址的unsignedcharReadl 302(u nsignedcharucAddr)/数据un signedcharucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302lnputByte(ucAddr|0x01);/ 地址,命令ucData=DS1302OutputByte();/ 读 1 Byte 数据DS1302_CLK=1;DS1302_RST=0;return(ucData);voidDS1302_GetTime(SYSTEMTIME*Time)/获取时钟芯

14、片的时钟数据到 自 定义的结构型数组un signedcharReadValue;ReadValue=Read1302(DS1302_SECOND);Time-Second=(ReadValue&0x70)4)*10+(ReadValue&OxOF);ReadValue=Read1302(DS1302_MINUTE);Time-Minute=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_HOUR);Time-Hour=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValu

15、e=Read1302(DS1302_DA Y);Time-Day=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_WEEK);Time-Week=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_MONTH);Time-Month=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=Read1302(DS1302_YEA 旳;Time- Year=(ReadValue&0x70)4 门 O

16、+(ReadValue&OxOF);voidDateToStr(SYSTEMTIME*Time)/将时间年,月,日,星期数据转换成液 晶显示字符串,放到数组里DateStringif(hide_year2)/这里的if.else语句都是判断位闪烁,2就 不显示,输出字符串为2007/07/22Time-DateString0=,2;Time-DateString1 =f0;Time-DateString2=Time- Year/10+0;Time-DateString3=Time- Year%10+0;elseTime-DateStringO=n;Time-DateString1 =n;Tim

17、e-DateString2=n;Time-DateString3=n;Time-DateString4=7,;if(hide_ mon thDateString5=Time-Month/10+,0;Time-DateString6=Time-Month%10+0;elseTime-DateString5=n;Time-DateString 6=H;Time-DateString7=7,;if(hide_dayDateString8=Time-Day/10+,0;Time-DateString9=Time-Day%10+,0,;elseTime-DateString 8=H;Time-DateS

18、tring9=n; if(hide_weekWeek%10+,0,;/ 星期的 数据另 夕卜放 到 week_value数组里,跟年 月,日的分开存放,因为等一下要在最后显示 elseweek_valueO=;week_value1=0*;Time-DateString10=,0,;/字符串末尾加9,判断结束字符voidTimeToStr(SYSTEMTIME*Time)/将时,分,秒数据转换成液晶显示字符 放到数组 TimeString;if(hide_hourTimeString0=TimeHour710+0;Time-TimeString1=Time-Hour%10+0;elseTime

19、-TimeStringO=H;Time-TimeString1 =H;Time-TimeString2=,:;Time-TimeString3=Time-Minute/10+,0;Time-TimeString4=Time-Minute%10+,0,;elseTime-TimeString3=H;Time-TimeString4=H;Time-TimeString5=,:;if(hide_secTimeString6=TimeSecond/10+0:Time-TimeString7=Time-Second%10+,0,;elseTime-TimeString6=H;Time-TimeStrin

20、g7=H;Time-DateString 8=,0,; voidlnitial_DS1302(void)/ 时钟芯片初始化unsignedcharSecond=Read1302(DS1302_SECOND);if(Second&0x80)/判断时钟芯片是否关闭Write1302(0x8e,0x00);/ 写入允许Write1302(0x8c,0x07);/以下写入初始化时间日期:07/07/25.星期:3时I、可:23:59:55Writel 302(0x88,0x07);Writel 302(0x86,0x25);Writel 302(0x8a,0x07);Writel 302(0x84,0

21、x23);Writel 302(0x82,0x59);Writel 302(0x80,0x55);Writel302(0x8e,0x80);/ 禁止写入/*ds18b20了 不早*/*ds18b20延迟子函数(晶振12MHz)*/voiddelay_18B20(unsignedinti)while(i-);y*jg-| g2071 力台d孝(7 */ voidlnit_DS18B20(void) unsig nedcharx=O;DQ=1;/DQ 复位delay_18B20(8);/ 稍做延时DQ=O;/单片机将DQ拉低delay_18B20(80);/ 精确延时大于 480usDQ=1;/拉

22、高总线delay_18B20(14);x=DQ;稍做延时后如果x=0则初始化成功x=1则初始化失败 delay_18B20(20);*读一个字节ds 8b20* IunsignedcharReadOneChar(void) uchari=0;uchardat=O;for(i=8;i0;i-)DQ=0;/给脉冲信号dat=1;DQ=1;/给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4);return (dat);* *ds 8b20写一个字节*voidWriteOneChar(uchardat) unsign edchari=0;for(i=8;i0;i-)DQ=O;

23、DQ=dat&OxO1; delay_18B20(5);DQ=1;dat=1;/*读取 ds18b20 当前温度 */voidReadTemp(void) unsig nedchara=O;unsig nedcharb=O;unsign edchart=0;lnit_DS18B20();WriteOneChar(OxCC);/跳过读序号列号的操作WriteOneChar(Ox44);/ 启动温度转换delay_18B20(100);/thismessageisweryimportant lnit_DS18B20();WriteOneChar(OxCC);/跳过读序号列号的操作WriteOneC

24、har(OxBE);/读取温度寄存器等(共可读9个寄存器)前两个就是 温度 delay_18B20(100);a=ReadOneChar();/读取温度值低位 b=ReadOneChar();/读取温度值高位 temp_value=b4;temp_value+=(a&0xf0)4;voidtemp_to_str()/温度数据转换成液晶字符显示TempBuffer0=temp_value/10+O*;/ 十位TempBuffer1 =temp_value%10+0*;/ 个位TempBuffer2=0xdf;/ 温度符号TempBuffer3=C*;TempBuffer4=,0,;voidDel

25、ayl ms(un signedi ntcount)unsig nedin tij;for(i=0;ico un t;i+)for(j=0;j0;delay-)for(i=0;i62;i+)/1 ms 延时,:voidoutkey()/跳出调整模式,返回默认显示ucharSecond;if(out=0|wireless_1 =1)mdelay(8);count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=05hide_mon th=O,hide_year=O;Second=Read1302(DS1302_SECOND);Wr

26、itel 302(0x8e,0x00);/ 写入允许Writel 302(0x80,Second&0x7f);Writel302(0x8E,0x80);/ 禁止写入done=0;while(out=0);while(wireless_1 =1);lllllllllllllllllllllllllllllllllll/voidllpkey()/ 升序按键Up=1;if(Up=O| |wireless_2=1)0x59)/超过59秒,清零 temp=0;break;case2:temp=Read1302(DS1302_MINUTE);/ 读取分数 temp=temp+1;/ 分数力口 1 up_f

27、lag=1;if(temp0x59)/ 超过 59 分,清零 temp=0;break;case3:temp=Read1302(DS1302_HOUR);/读取小时temp=temp+1;/ 小时数加 1数up_flag=1;if(temp0x23)/超过23小时,清temp=O;break;case4:temp=Read1302(DS1302_WEEK);/读取星期数temp=temp+1;/ 星期数加 1 up_flag=1;if(temp0x7)temp=1;break;case5:temp=Read1302(DS1302_DAY);/读取日temp=temp+1;/ H 数加 1数up

28、_flag=1; if(temp0x31) temp=1;break;case。(DmpHReacH302(Dsl302MONTH)wMfE0mpH(Dmp+l z m 磬莒 1 upagliif(Dmpvoxl2)CDmp!八break-case,iempHReadl302(Dsl302YEAR)wwsiempHiemp+l J一 左磨莒一upagliif(nmpvox85) ompHO-break-def au-rrbreak-wh=e(UPHHO)八whi(D(wire-ess2Hl)八)三三三三三三三三三三三三三三三三三三三三三三三三二三三三三三三三三三三三_voidDownkey()

29、/ 降序按键Down=1;if(Down=0|wireless_3=1) mdelay(8);switch (count)easel: temp=Read1302(DS1302_SECOND);/ temp=temp-1;/ 秒数减 1down_flag=1:/数据调整后更新标志读取秒数if(temp=0x7f)/ 小于 0 秒,返回 59 秒temp=0x59;break;case2:temp=Read1302(DS1302_MINUTE);/读取分数temp=temp-1;/ 分数减 1 down_flag=1; if(temp=-1)temp=0x59;/ 小于 0 秒,返回 59 秒

30、break;case3:temp=temp-1;/ 月数减 1down _flag=1;if(temp=O)temp=12;break;读取年数case7:temp=Read1302(DS1302_YEAR);/temp=temp-1;/ 年数减 1 down_flag=1; if(temp=-1) temp=0x85;break;default:break;while(Down=0);while(wireless_3=1);voidSetkey()/模式选择按键Set=1;if(Set=0|wireless_4=1) mdelay(8);count=count+1:/Setkey 按一次,c

31、ount 就加 1done=1;/进入调整模式while(Set=O);while(wireless_4=1);)voidkeydone()/按键功能执行ucharSecond;if(flag=O)/关闭时钟,停止计时Write1302(0x8e,0x00);/ 写入允许 temp=Read1302(0x80);Writel 302(0x80,temp|0x80);Write1302(0x8e,0x80);/ 禁止写入flag=1;)Setkey();/扫描模式切换按键switch (count)easel:do/count=1,调整秒 outkey();/扫描跳出按钮Upkey();/扫描加

32、按钮Downkey();/扫描减按钮(欣。SPZM 软-|42归汪+。Spz(oH6e-UMOP oH6e-dnYturqT嫌 /S8XOC1)8XO)CM0COLM 報tigBVLHT注(08X0 一 dEo8xo)CMoe L 壬 MyvEU?wsoxo(l)8xo)(xloeo壬 M )粵软g3)hide_mi n=0;show_time();while(count=3);break; case3:do/count=3,调整小时 3)hide_hour=0;show_time();while(co unt=4);break;case4:do/count=4,调整星期hide_hour=0

33、;outkey();Upkey();Downkey();if(up_flag=1 |down_flag=1)Write1302(0x8e,0x00);/写入允许Writel 302(0x8a,temp);/数写入新的星期Writel 302(0x8e,0x80);/禁止写入up_flag=O;dow n_flag=O;hide_week+; if(hide_week3) hide_week=O;show_time();while(count=5);break; case5:do/count=5,调整日hide_week=O;outkey();Upkey();Downkey();if(up_fl

34、ag=1 |down_flag=1) 3)hide_day=O;show_time();while(count=6);break;case6:do/count=6,调整月hide_day=O;outkey();Upkey();Downkey();if(up_flag=1 |down_flag=1)Writel 302(0x8e,0x00);/ 写入允许写入新的Writel 302(0x88,temp);/月数Writel 302(0x8e,0x80);/禁止写入up_flag=0;dow n_flag=O;hide_month+; if(hide_month3) hide_month=O;show_time();while(count=7);break; case7:do/count=7,调整年 hide_m on th=O;outkey()

温馨提示

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

评论

0/150

提交评论