单片机课程设计-电子万年钟.doc_第1页
单片机课程设计-电子万年钟.doc_第2页
单片机课程设计-电子万年钟.doc_第3页
单片机课程设计-电子万年钟.doc_第4页
单片机课程设计-电子万年钟.doc_第5页
免费预览已结束,剩余7页可下载查看

下载本文档

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

文档简介

东北大学秦皇岛分校单片机结课论文电子万年历1、 功能要求设计一台电子万年历,主控芯片采用8051单片机,日历时钟芯片采用dallas公司推出的高性能、低功耗、带ram的实时时钟ds1302,显示器采用点阵字符型液晶显示模块,分2行显示,第一行显示日、月、年,第2行显示时、分、秒。2、硬件电路设计 下图a所示为电子万年历的硬件电路图,主要包括8051单片机、日历时钟芯片ds1302、点阵字符型液晶显示模块等。日历时钟芯片ds302 是一种串行接口的实时时钟,芯片内部具有可编程日历时钟和31个字节的静态ram,日历时钟可自动进行闰年补偿,计时准确,接口简单,使用方便,工作电压范围宽(2.55.5v),功耗低,芯片自身还具有对备份电池进行涓流充电功能,可有效延长备份电池的使用寿命。图a 电子万年历的硬件电路图 ds1302采用8脚封装,其引脚排列如图所示,各引脚功能如下。l vcc1,vcc:电源输入l gnd:地l x1,x2:外接32.768khz石英晶振输入l rst:复位通信允许l i/o:数据输入/输出端l sclk:串行时钟输入、图b ds1302的引脚排列8051单片机与ds1302之间采用3线串行通信方式。复位/通信允许信号rst接到单片机的p1.5引脚,rst=1允许通信,rst=0禁止通信;串行时钟信号sclk接到单片机的p1.6引脚;数据输入/输出信号i/o接到单片机的p1.7引脚。8051作为主机通过控制rst、sclk和i/o信号实现两芯片之间的数据传送。 ds1302芯片的x1和x2端外接32.768khz的石英晶振vcc1和vcc2是电源引脚,单电源供电时接vcc1脚,双电源供电时主电源接vcc2,备份电池接vcc1,如果采用可充电镉镍电池,可启用内部涓流充电器在主电压正常时向电池充电,以延长电池使用时间。备份电池也可用1uf以上的超容量电容代替,需要注意备份电池电压应略低于主电源工作电压。数据传送是以8051单片机为主控芯片进行的,每次传送时由8051向ds1302写入一个命令字节开始的,命令字节的格式入下:d7d6d5d4d3d2d1d01ram/cka4a3a2a1a0rd/w命令字节的最高位必须为1,ram/ck位为ds1302片内ram/时钟选择位,ram/ck=1选择ram操作,ram/ck=0选择时钟操作。rd/w为读写控制位,rd/w=1为读操作,表示ds1302接受完命令字节后,按指定的选择对象及寄存器地址,读取数据并通过i/o线传送给单片机8051. rd/w=0为写操作,表示ds1302接受完命令字节后,紧跟着在接收来自于单片机8051的数据字节,并写入到ds1302相应的寄存器后ram单元中。a4a0为片内日历时钟寄存器后ram的地址选择位。ds1302与8051之间通过i/o线进行同步串行数据传送,sclk为串行通信时的位同步时钟,一个sclk脉冲传送一位数据,每次数据传送时都以字节为单位,低位在前,高位在后,传送一个字节需要8个sclk脉冲。数据传送可以单字节方式或多字节突发方式进行。单字节方式传送一次数据需要16个sclk脉冲,多字节方式传送一次数据在对日历进行读写时需要72个sclk脉冲。单字节操作方式可保证数据传送时的安全性和可靠性,多字节操作方式则可提高数据传送速度,两种方式可视需要灵活选用。另外,ds1302的外接晶振推荐采用32.768khz,电容推荐值为6pf,由于晶振频率较低,也可以不接电容,对计时精度影响不大。ds1302共有12个寄存器,其中7个寄存器与日历时钟有关,存放的数据为bcd码格式,日历、时钟寄存器地址及其内容如表1所示。秒寄存器的第7位为时钟暂停控制位,该位位1时暂停时钟振荡器,ds1302进入低功耗状态,该位为0时启动时钟。时寄存器的第7位为12或24小时方式选择,该位为1时选择12小时方式,该位为0时选择24小时方式。在12小时方式下,时寄存器的第5位为am/pm选择,该位为1时选择pm,该位为0时选择。在24小时方式下,时寄存器的第5位为第2个小时位(20-23).表1 ds1302内部寄存器地址与内容寄存器命令字节取值范围寄存器内容写读76543210秒寄存器80h81h00-59ch10ssec分寄存器82h83h00-59010minmin时寄存器84h85h00-2或01-1212/24010a/phrhr日寄存器86h87h01-28,29,30,310010datadate月寄存器88h89h01-1200010mmonth周寄存器8ah8bh01-0700000day年寄存器8ch8dh00-9910yearyear电子万年历的显示部分采用点阵字符型液晶显示模块,以直接方式与8051单片机进行接口。将单片机的p2.7通过适当逻辑门电路组合接到液晶显示模块的e端,p0口通过外部锁存器得到的最低2位地址线a0和a1分别接到液晶显示模块的rw和rs端,从而可得到接口有电路的命令写入地址为7ff0h,命令读取地址为7ff1h,数据操作地址为7ff2h,分别对这3个地址进行操作即可将ds1302中的日历时钟信息显示在lcd屏幕上。3、软件程序设计 在8051单片机片内r中开辟30h36h作为万年历的秒、分、时、日、月、周和年计时单元,并将初始时间设为23:59:55,初始日期设为07年12月31日第一周。采用8051单片机内定时器t0来定时刷新lcd显示内容,t0定时初始值设为50ms,以查询方式检查t0溢出标志,每当溢出次数达到20时,读取一次ds1302的日历时钟数据,同时对lcd显示信息进行更新。电子万年历的软件程序:;*/t_rst bit p1.5 ;实时时钟复位线引脚t_clk bit p1.6 ;实时时钟时钟线引脚t_io bit p1.7 ;实时时钟数据线引脚second equ 30hminute equ 31hhour equ 32hday equ 33hmonth equ 34hweek equ 35hyearl equ 36h;*/ org 0000hstart: ljmp main org 0060hmain: mov sp,#60h ;修改堆栈;* mov second,#55h ;初始时间设为23:59:55 mov minute,#59h mov hour,#23h mov day,#31h ;初始日期设为09年12月31日第一周 mov month,#12h mov week,#01h mov yearl,#09h lcall setds1302lcall lcd_init ;调用液晶模块初始化子程序 mov r3,#20 mov tmod,#01h mov th0,#3ch ;置定时器初值(定时50ms) mov tl0,#0b0h setb tr0 ;启动定时器0lp1: jbc tf0,lp2 ;查询计数溢出 sjmp lp1 ;未到50 ms继续计数lp2: mov th0,#3ch ;重新置定时器初值 mov tl0,#0b0hmov r2,#81h ;从第1行第2位开始,设置ddram地址lcall wrtc mov dptr,#zifu1 ;指向显示字符代码首地址mov r4,#06hlcall wp1 ;第1行字符代码写入ddram lcall dispymd ;显示年月日mov r2,#0c1h ;设置第2行ddram地址lcall wrtcmov dptr,#zifu2 ;指向显示字符代码首地址mov r4,#06hlcall wp1 ;第1行字符代码写入ddram lcall disphms ;显示时分秒 djnz r3,lp1 ;未到1s继续循环 lcall get1302 ;每到1s从ds1302读取一次时间 mov r3,#20 sjmp lp1zifu1: db date: zifu2: db time: ;*disphms:mov a,hour ;时分秒显示子程序 swap a anl a,#03hadd a,#30hmov r2,alcall wrtd mov a,hour anl a,#0fhadd a,#30hmovr2,alcall wrtdmov r2,#2dhlcall wrtd mov a,minute ;显示分 swap a anl a,#07hadd a,#30hmov r2,alcall wrtd mov a,minute anl a,#0fhadd a,#30hmov r2,alcall wrtdmov r2,#2dhlcall wrtd mov a,second ;显示秒 swap a anl a,#07hadd a,#30hmov r2,alcall wrtd mov a,second anl a,#0fhadd a,#30hmov r2,alcall wrtd ret;*dispymd:mov a,yearl ;年月日显示子程序 swap a anl a,#03hadd a,#30hmov r2,alcall wrtd mov a,yearl anl a,#0fhadda,#30hmovr2,alcall wrtdmov r2,#2dhlcall wrtd mov a,month ;显示月 swap a anl a,#07hadd a,#30hmov r2,alcallwrtd mov a,month anl a,#0fhadd a,#30hmov r2,alcall wrtdmov r2,#2dhlcall wrtd mov a,day ;显示日 swap a anl a,#07hadd a,#30hmov r2,alcall wrtd mov a,day anl a,#0fhadd a,#30hmovr2,alcall wrtd ret ;*setds1302: clr t_rst ;设置ds1302初始时间,并启动计时 nop clr t_clk nop setb t_rst nop mov b,#8eh ;写控制命令字 lcall inputbyte mov b,#00h ;写保护关闭 lcall inputbyte setb t_clk nop clr t_rst mov r0,#second ;内存中的时间首地址 mov r1,#80h ;ds1302中的时间首地址 mov r7,#7 ;字节数setloop:clr t_rst nop clr t_clk nop setb t_rst nop mov b,r1 ;写命令字 lcall inputbyte mov a,r0 ;设置时间 mov b,a lcall inputbyte inc r0 inc r1 inc r1 setb t_clk nop clr t_rst nop djnz r7,setloop clr t_rst nop clr t_clk nop setb t_rst nop mov b,#8eh lcall inputbyte mov b,#80h ;开写保护 lcall inputbyte setb t_clk nop clr t_rst nop ret;*get1302: ;从ds1302读取时间 mov r0,#second mov r1,#81h ;ds1302中读时间的首地址 mov r7,#7getloop:clr t_rst nop clr t_clk nop setb t_rst nop ;*inputbyte:mov r4,#8 ;向ds1302写一个字节inputloop:mov a,b rrc a mov b,a mov t_io,c setb t_clk nop clr t_clk djnz r4,inputloop ret;*outputbyte:clr a ;从ds1302读一个字节 clr c mov r4,#8outputloop:nop mov c,t_io rrc a setb t_clk nop clr t_clk djnz r4,outputloop ret;*lcd_init:lcall tim1 ;lcd初始化子程序mov r2,#38h ;功能设置命令,设定8位字长,2行,5*7点阵lcall wrtc ;写入lcall tim3 ;延时100usmov r2,#38h lcall wrtc ;写入lcall tim3 ;延时100usmov r2,#38hlcall wrtc ;写入lcall tim3 ;延时100usmov r2,#01h ;清屏命令lcall wrtc ;写入mov r2,#06h ;输入方式命令lcall wrtc ;写入mov r2,#0eh ;开显示、光标不闪命令lcall wrtc ;写入ret;*wait:mov p2,#7fh ;忙标志判断子程序mov r0,#0f1h ;读忙标志地址movx a,r0jb acc.7,waitret;*wrtc:lcall wait ;写指令代码子程序mov a,r2mov r0,#0f0h ;写指令地址movx r0,aret;*wrtd:lcall wait ;写数据子程序mov r

温馨提示

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

评论

0/150

提交评论