单片机数字时钟设计.doc_第1页
单片机数字时钟设计.doc_第2页
单片机数字时钟设计.doc_第3页
单片机数字时钟设计.doc_第4页
单片机数字时钟设计.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

单片机数字时钟课程设计课 程 设 计 (报 告)课 程 设 计 题 目: 数字时钟 学 院 名 称: 电子与信息工程学院 专 业: 电气工程及其自动化 班 级: 姓 名: 学 号 指 导 教 师: 日 期: 2012.12.292013.01.1121单片机数字时钟课程设计1 课程设计任务 1.用80c51设计一个数字时钟 2.可显示时、分、秒 3.按键实现时、分、秒人工校准 二总体方案本次课程设计选用通用的80c51芯片,显示单元为实验箱的液晶1602显示单元,选用ds1302时钟芯片,利用矩阵键盘进行调时。1.80c51简介虽然目前单片机的品种很多,但其中最具代表性的当属intel公司的mcs-51单片机系列。mcs-51以其典型的结构、完善的总线、sfr的集中管理模式、位操作系统和面向控制功能的丰富的指令系统,为单片机的发展奠定了良好的基础。mcs-51系列的典型芯片是80c51(chmos型的8051)。为此,众多的厂商都介入了以80c51为代表的8位单片机的发展,如philips、siemens(infineon)、dallas、atmel等公司,我们把这些公司生产的与80c51兼容的单片机统称为80c51系列。特别是在近年来,80c51系列又有了许多发展,推出了一些新产品,主要是改善单片机的控制功能,如内部集成了高速i/o口、adc、pwm、wdt等,以及低电压、微功耗、电磁兼容、串行扩展总线和控制网络总线性能等。 单片机内部结构图为如图所示 80c51单片机管脚说明vcc:供电电压。gnd:接地。 p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在fiash编程时,p0口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。 p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。 p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。 p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。 p3口也可作为80c51的一些特殊功能口,如下所示: 口管脚备选功能p3.0 rxd串行输入口p3.1 txd串行输出口p3.2 /int0外部中断0p3.3 /int1外部中断1p3.4 t0记时器0外部输入p3.5 t1记时器1外部输入p3.6 /wr外部数据存储器写选通p3.7 /rd外部数据存储器读选通2. 时钟芯片ds1302简介:ds13021是美国dallas公司推出的一种高性能、低功耗、带ram的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.55.5v。时钟可工作在24小时格式或12小时(am/pm)格式。 ds1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或ram数据。ds1302内部有一个318的用于临时性存放数据的ram寄存器。ds1302是ds1202的升级产品,与ds1202兼容,但增加了主电源后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。2.1. ds1302引脚功能与内部结构ds1302的引脚功能如表1所示,外形及内部结构如图1所示2:引脚号引脚名称功能1vcc2主电源2、3x1、x2振荡源,外接32768hz晶振4gnd地线5rst复位/片选线6i/o串行数据输入/输出端(双向)7sclk串行时钟输入端8vcc1后备电源表1 ds1302引脚功能表图1 ds1302管脚图及内部结2.2 ds1302的控制字ds1302的控制字节如图2所示: 7 6 5 4 3 2 1 01rama4a3a2a1a0ram 图2 ds1302控制字节的含义控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到ds1302中。位6如果为0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。2.3 ds1302的复位引脚通过把输入驱动置高电平来启动所有的数据传送。 输入有两种功能:首先,接通控制逻辑,允许地址命令序列送入移位寄存器;其次,提供了终止单字节或多字节数据的传送手段。当为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过程中置为低电平,则会终止此次数据传送,并且i/o引脚变为高阻态。上电运行时,在vcc2.5v之前,必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。2.4 ds1302的数据输入输出在控制指令字输入后的下一个sclk时钟的上升沿时数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位至高位7,数据读写时序如图3所示:图3 数据读写时序2.5 ds1302的寄存器ds1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。其日历、时间寄存器及其控制字见表2。此外,ds1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。 ds1302与ram相关的寄存器分为两类,一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为c0h-fdh,其中奇数为读操作,偶数为写操作;再一类为突发方式下的ram寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写)、ffh(读)ds1302内部寄存器列表如表所示:寄存器名称命令字取值范围各位内容写读76543210秒寄存器80h81h00-59ch10secsec分寄存器82h83h00-59010minmin小时寄存器84h85h01-12或00-2312/240ahrhr日期寄存器86h87h01-28,29,30,310010datedate月份寄存器88h89h01-1200010mmonth周寄存器8ah8bh01-0700000day年份寄存器8ch8dh00-9910yearyear3.lcd1602液晶显示简介:lcd1602通常有14条引脚线或16条引脚线的lcd,多出来的2条线是背光电源线vcc(15脚)和地线gnd(16脚),其控制原理与14脚的lcd完全一样,引脚定义如下表所示: 4. 矩阵键盘 矩阵键盘如实验图所示,h1接地,l1、l2、l3、l4分别控制时钟的调时。其中l1为调设置键,l2为加键,l3为减键,l4为调时确定键。三硬件设计部分1. 硬件设计流程图: 80c51 仿真单元ds1302时钟芯片 矩阵键盘 调时控制液晶显示单元2. 实验原理图:4 软件设计部 1.软件设计流程图:开始 液晶初始化ds1302初始化 调整模块检测按键液晶显示ds18b20初始化yn实验程序代码:rwbitp2.1rsbitp2.0ebitp2.7sclkbitp0.1siobitp0.0rstbitp0.2yhequ80hehequ0c0horg 0000hjmp mainorg 0040hmain:mov30h,#00h;30h36h存放 时分秒日月星期年mov31h,#00hmov32h,#00hmov33h,#01hmov34h,#01hmov35h,#02hmov36h,#13h mov 37h,#00h;37h存放 设置键按了几下 call lcdinit;调用1602初始化 call dsinit;调用1302初始化st1:mova,37hjnzst2;查看设置有没有被按call read;读1302内容对应存入30h36h call xs;读30h36h在1602中显示st2:call keyhn;查看有没有按下的 jz st1have:calld100ms;延迟 去抖动 call keyhn;再查看按键 jnz true;真的有按下true: jb acc.3,k1;跳到k1对应有设置键的内容 jb acc.4,k2;+1 jb acc.5,k3;1 jb acc.6,k4;确定 jmp st1k1: inc37h;增加按的次数 mov r4,37hcjner4,#1,l2l1: mova,#yh+3;按1下对应年的位置callwrcmova,#0fh;1602的光标设置为闪烁callwrcjmpst1l2:cjner4,#2,l3;2下月的位置mova,#yh+6callwrcjmpst1l3:cjner4,#3,l4;日期的mova,#yh+9callwrcjmpst1l4:cjner4,#4,l5;星期的mova,#yh+0dhcallwrcjmpst1l5:cjner4,#5,l6;时mova,#eh+3callwrcjmpst1l6:cjner4,#6,l7;分mova,#eh+6callwrcjmpst1l7:cjner4,#7,l8;秒mova,#eh+9callwrcjmpst1l8:mova,#0ch;返回callwrcmov37h,#00h;光标去闪烁calldsinit;1302初始化 jmp st1k2:mov r4,37h call jia;调用加1的子程序 call xs;1602显示 call gb;把光标显示位 确定在设置位上 jmp st1k3:mov r4,37h call jian;减的 以下同理 call xs call gb jmp st1k4:mov 37h,#00h;37h内容归零返回 mov a,#0ch;去光标 call wrc call dsinit;1302初始化 jmpst1d100ms:movr5,#100;延迟子程序d1ms:movr4,#249dl:nopnopdjnzr4,dldjnzr5,d1msretkeyhn:movp3,#78h;按键查看子程序 mov a,p3 cpl a anl a,#78h retlcdinit:;1602初始化子程序mova,#01h;清屏callwrcmova,#38h;设置液晶工作模式16*2行显示5*7点阵8位数据callwrcmova,#0ch;开显示不显示光标callwrcmova,#06h;整屏不移动,光标自动右移callwrcmova,#yh;显示位置 在1602第一行首 yh80hcallwrc mov a,#32h;以下为在第一行显20 call wrd mov a,#30h call wrd mov a,#20h call wrd mov a,#20h call wrd mov a,#2dh call wrd mov a,#20h call wrd mov a,#20h call wrd mov a,#2dh call wrd mov a,#20h call wrd mov a,#20h call wrd mov a,#eh+2;以下在第二显 : : call wrc mov a,#20h call wrd mov a,#20h call wrd mov a,#3ah call wrd mov a,#20h call wrd mov a,#20h call wrd mov a,#3ah call wrd mov a,#20h call wrd mov a,#20h call wrd call xs retxs: callwriteyear call writeweek call writey call writer call writes call writef call writemcbusy:pushacc;检查忙pushdphpushdplpushpswweit:clrrssetbrwclresetbemova,p1clrejbacc.7,weitpoppswpopdplpopdphpopacccalldelayretwrc:callcbusy;写命令字clreclrrsclrrwsetbemovp1,aclrecalldelayretwrd:callcbusy;写数据clresetbrsclrrwsetbemovp1,aclrecalldelayretdelay:movr7,#5lp1:movr6,#0f8hdjnzr6,$djnzr7,lp1retwrb:mov40h,#8h;1302写命令字lpw:mova,brrcamovb,amovsio,csetbsclkclrsclkdjnz40h,lpwretrdb:mov40h,#8;读数据lpr:movc,siorrcasetbsclkclrsclkdjnz40h,lprretread:movr0,#30h;读数据 存放在30h36hmovr7,#7movr1,#81hloop2: clrrstclrsclksetbrstmovb,r1callwrbcallrdbmovr0,aincr0incr1incr1setbsclkclrrstdjnzr7,loop2retdsinit:clrrst;1302初始化子程序clrsclksetbrstmovb,#8ehcallwrbmovb,#00hcallwrbsetbsclkclrrst mov r0,#30h mov r7,#7 mov r1,#80hloop: clr rst clr sclk setb rst mov b,r1 call wrb mov a,r0 mov b,a call wrb inc r0 inc r1 inc r1 setb sclk clr rst djnz r7,loopretwrites: mova,#eh+2;1602显示写时callwrcmova,32hmovb,#10hdivab add a,#30hcallwrdmova,b add a,#30hcallwrd retwritef: mova,#eh+5;1602显示写分callwrcmova,31hmovb,#10hdivab add a,#30hcallwrdmova,b add a,#30hcallwrd retwritem: mova,#eh+8;1602显示写秒callwrcmova,30hmovb,#10hdivab add a,#30hcallwrdmova,b add a,#30hcallwrd retwritey:mov a,#yh+5;1602显示写月 call wrc mov a,34h mov b,#10h div ab add a,#30h call wrd mov a,b add a,#30h call wrd retwriter:mov a,#yh+8;1602显示写日 call wrc mov a,33h mov b,#10h div ab add a,#30h call wrd mov a,b add a,#30h call wrd retwriteyear:;1602显示写年mova,#yh+2callwrcmova,36h mov b,#10h div ab add a,#30hcallwrd mov a,b add a,#30h call wrdretwriteweek:;写星期mova,#yh+0dhcallwrcmova,35hmon:cjnea,#1,tuemova,#4dhcallwrdmova,#4fhcallwrdmova,#4ehcallwrdmova,35htue:cjne a,#2,wedmova,#54hcallwrdmova,#55hcallwrdmova,#45hcallwrdmova,35hwed:cjnea,#3,thumova,#57hcallwrdmova,#45hcallwrdmova,#44hcallwrdmova,35hthu:cjnea,#4,frimova,#54hcallwrdmova,#48hcallwrdmova,#55hcallwrdmova,35hfri:cjnea,#5,satmova,#46hcallwrdmova,#52hcallwrdmova,#49hcallwrdmova,35hsat:cjnea,#6,sunmova,#53hcallwrdmova,#41hcallwrdmova,#54hcallwrdmova,35hsun: mova,#53hcallwrdmova,#55hcallwrdmova,#4ehcallwrdretjia: cjne r4,#0,j1;设置内容+1子程序 没有按就返回扫描键盘 retj1: cjne r4,#1,j2;以下分别都是先判断是不是边界数是回到可能的初值 mov a,36h;再判断个位是否为9是+7 不是+1 anl a,#0fh cjne a,#9,jw1 mov a,#07h add a,36h mov 36h,a retjw1: inc 36hretj2: cjne r4,#2,j3 mov a,34h cjne a,#12h,jww1 mov 34h,#01h retjww1: anl a,#0fh cjne a,#9,jw2 mov a,#07h add a,34h mov 34h,a retjw2: inc 34h retj3: cjne r4,#3,j4 mov a,33h cjne a,#31h,jww2 mov 33h,#01h retjww2: anl a,#0fh cjne a,#9,jw3 mov a,#07h add a,33h mov 33h,a retjw3: inc 33h retj4: cjne r4,#4,j5 mov a,35h cjne a,#7,jww3 mov 35h,#01h retjww3: inc 35h retj5: cjne r4,#5,j6 mov a,32h cjne a,#23h,jww4 mov 32h,#00h retjww4: anl a,#0fh cjne a,#9,jw4 mov a,#07h add a,32h mov 32h,a retjw4: inc 32h retj6: cjne r4,#6,j7 mov a,31h cjne a,#59h,jww5 mov 31h,#00h retjww5: anl a,#0fh cjne a,#9,jw5 mov a,#07h add a,31h mov 31h,a retjw5: inc 31h retj7: mov a,30h cjne a,#59h,jww6 mov 30h,#00h retjww6: anl a,#0fh cjne a,#9,jw6 mov a,#07h add a,30h mov 30h,a retjw6: inc 30h retjian: cjne r4,#0,d1;设置位减1的子程程序 原理同上 retd1: cjne r4,#1,d2 mov a,36h cjne a,#0,dw1 mov 36h,#99h retdw1: anl a,#0fh jz dww1 dec 36h retdww1: mov a,36h subb a,#07h mov 36h,a retd2: cjne r4,#2,d3 mov a,34h cjne a,#1,dw2 mov 34h,#12h retdw2: anl a,#0fh jz dww2 dec 34h retdww2: mov a,34h subb a,#07h mov 34h,a retd3: cjne r4,#3,d4 mov a,33h cjne a,#01h,dw3 mov 33h,#31h retdw3: anl a,#0fh jz dww3 dec 3

温馨提示

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

评论

0/150

提交评论