电子专业毕业设计万年历制作.docx
《电子专业毕业设计万年历制作.docx》由会员分享,可在线阅读,更多相关《电子专业毕业设计万年历制作.docx(62页珍藏版)》请在冰豆网上搜索。
电子专业毕业设计万年历制作
单片机课程设计说明书
题 目:
电子万年历的设计与制作
专业:
唐山工职院08级电子与技术
班级:
11班
姓名:
郝彦龙
学 号:
085223141
指导教师:
高松
二0一0年9月20日
一、设计目的及意义
(1)在学习了《数字电子技术》和《单片机原理及接口技术》课程后,为了加深对理论知识的理解,学习理论知识在实际中的运用,培养动手能力和解决实际问题的经验让学生接触专用时钟芯片DS1302,并会用DS1302芯片开发时钟模块,应用到其他系统中去。
熟悉WAVE软件调试程序和仿真.
(2)、通过实验提高对单片机的认识;
(3)通过实验提高焊接、布局、电路检查能力;
(4)、通过实验提高软件调试能力;
(5)进一步熟悉和掌握单片机的结构及工作原理。
(6)通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解表关电路参数的计算方法。
(7)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
(8)通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发一单片机应用系统的全过程,为今后从事相应打下基础。
二、设计内容要求
电子万年历能显示阳历年、月、日、星期、[小]时、分、秒和阴历月、日,在显示阴历时间时能标明是否为闰年。
三、方案选择与实验基本原理。
按照系统设计功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键盘接口模块共4个模块组成,电路系统构成框图如图L1所示。
主控芯片使用51系列AT89c52单片机,时钟芯片使用美国DALLAs公司推出的一种高性能、低功耗、带RAM的实时时钟DSl302。
采用DSl302作为主要计时芯片,可以做到计时准确。
更重要的是,DSl302可以在很小电流的后备电源(2.5—5.5v电源,在2.5v时耗电小于300nA)下继续计时,并可编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电。
显示模块采用普通的共阳LED数码管,键输入采用查询法实现调整功能。
图1电子万年历电路系统构成框图
系统硬件电路的设计
图2为电子万年历电路设计原理图,系统由主控制器AT89C52、时钟芯片DSl302、串口显示电路及键扫描电路组成。
图2电子万年历电路设计原理图
3.3.1主控制器AT89C52
ATMEL公司生产的AT89C52单片机采用高性能的静态80C51设计,由先进工艺制造,
并带有非易失性F1ash程序存储器。
它是一种高性能、低功耗的8位cMos微处理芯片,市
场应用最多。
主要性能特点有:
●8KHF1ashROM,可以擦除1000次以上,数据保存10年
●256字节内部RAM。
●电源控制模式
——时钟可停止和恢复
——空闲模式;
——掉电模式。
●6个中断源。
●4个中断优先级。
●4个8位I/O口。
●全双工增强型UART。
●3个16位定时/计数器,To、T1(标准80c51)和增加的T2(捕获和比较)。
●全静态工作方式:
0-24MHz。
3.3.2时钟电路DSl302
1.ds1302的性能特性
●实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;
●用于高速数据暂存的31×8位RAM;
●最少引脚的串行I/o;
●2.5—5.5V电压工作范围;
●2.5V时耗电小于300nA;
●用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;
●简单的3线接口;
●可选的慢速充电(至Vcc1)的能力。
D51302时钟芯片包括实时时钟/日历和3l字节的静态RAM。
它经过一个简单的串行接口与微处理器通信。
实时时钟/日历提供秒、分、时、日、周、月和年等信息。
对于小于31天的月利月末的日期自动进行调整,还包括闰年校正的功能。
时钟的运行可以采用24H或带AM(上午)/PM(下午)的12H格式。
采用三线接口与cPu进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
Dsl302有主电源/后备电源双电源引脚:
Vcc1在单电源与电他供电的系统中提供低电源,并提供低功率的电池备份;Vcc2在双电源系统中提供主电源,在这种运用方式中,Vcc1连接到备份电,以便在没有主电源的情况下能保存时间信息以及数据。
Ds1302由Vcc1或vcc2中较大者供电。
当vcc2大于Vcc1十o.2v时,vcc2v给DSl302供电;当vcc2小于Vcc1时,DSl302由Vcc1供电。
2.DSl302数据操作原理
Dsl302在任何数据传送时必须先初始化,把RsT脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在scLK的上升沿被输入。
无论是读周期还是写周期,开始8位指定40个寄存器中哪个将被访问到。
在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作时写人数据。
时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数。
如果在传送过程中置RsT脚为低电平,则会终止本次数据传送,并且I/()引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RsT脚必须保持低电平。
只有在scLK为低电平时,才能将RsT置为高电平。
D引302的引脚及内部结构图如图3.3所示,表3.1为各引脚的功能
图3DS1302引脚及内部结构表1DS102引脚功能
Dsl302的控制字如图3.4所示。
控制字节的最高有效位(位7)必须是逻辑1;如果它为
0,则不能把数据写入到Dsl302中。
位6如果为0,则表示存取日历时钟数据;为1表示存取
RAM数据。
位5—1(A4一A0)指示操作单元的地址。
最低有效位(位0)如为0,表示要进行写操作;为1表示进行读操作。
控制字节总是从最低位开始输入/输出。
为了提高对32个地址的寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。
位6规定时钟或RAM,而位0规定读或写。
在时钟/日历寄存器中的地址9—31或RAM寄存器中的地址31不能存储数据。
在多字节方式中,读或写从地址0的位0开始。
必须按数据传送的次序写最先的8个寄存器。
但是,当以多字节方式写RAM时,为了传送数据不必写所有31字节。
小管是否写了全部31字节,所写的每一字节都将传送至RAM。
图4DS1302的控制字
图5DS1302数据读/写时序
Dsl302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。
其H历、时间寄存器及其控制字见表3.2,其中奇数为读操作,偶数为写操作。
时钟暂停:
秒寄存器的位7定义位时钟暂停位。
当它为1时,DS1302停止振荡,进入低功耗的备份方式.通常在对Dsl302进行写操作时(如进入时钟调整程序),停止振荡。
当它为0时,时钟将开始启动。
AM—PM/12—24[小]时方式:
[小]时寄存器的位7定义为12或24[小]时方式选择位。
它为高电平时,选择12[小]时方式。
在此方式下,位5是AM/PM位,此位是高电平时表示PM,低电平表示AM。
在24[小]时方式下,位5为第二个10[小]时位(20一23h)。
表2内部寄存器地址和内容
Dsl302的品振选用32.768kHz,电容推荐值为6PF,因为振荡频率较低,也可以不接电容.对计时精度影响不大。
3.3.3显示电路的设计
显示部分采用普通的共阳数码管显示,采用动态扫描,以减少硬件电路。
考虑到一次扫描19位数的管显示时会出现闪烁情况,设计时19个数码管分3排同时扫描。
第一排6个数码
管分别为千年、百年、十午、年、十月、月,第二排6位数码管分别为十时、时、十分、分、十秒、秒,第三排7位数码管分别为星期、阴历十月、阴历月、阴历十日、阴历日、十日、日。
显示时采用串行口输出段码,用3片74ls164来驱动3排数码管,这样扫描一次只需7ms。
741ls164内部为8个D触发器,用以实现数据的串行移位,741ls164特性见表3。
单片机以串行口方式0〔移仿寄存器方式)输山数据,3片74Lsl64作为3排共阳数码管的串/并转换显示接口。
74ls164为TTL单向8位移位寄存器,可实现串行输入,并行输出。
其中A、B(第1、2脚)为串行数据输入端,2个引脚按逻辑“与”运算规律输入信号,共一个输入信号时可并接,共同作为输入脚。
cP(第8脚)为时钟输入端,可连接到串行口的TxD端。
每一个时钟信号的上升沿加到cP端时,移位寄存器移一位。
8个时钟脉冲过后,8位二进制数全部移入
74lsl64中。
MR脚(第9脚)为复位端,当该脚为低电平时,移位寄存器各位复0;只有当它为高电平时,时钟脉冲才起作用。
Q1一Q8(第3—6和10一13引脚)并行输出端分别接数码管的h—a(因为串行n从低位开始传送)各段对应的引脚上。
在给出了8个脉冲后,最先进入741。
s164的第1个字Ll数据到达厂最高位。
再来1个脉冲,第1个脉冲就会从最高位移出,进入下个74L5164的第1位。
3片741‘S164首尾相串,而时钟端则接在一起。
这样,当输入8个
脉冲时,从—9片机RXD端输出的第1字节数据就进入了第1片74LSl64中,而当第2个8个脉冲到来后,第l字节数据就进入了第2片74Lsl64,而随后的第2字节的数据则进入了第1片74LS164。
这样,当第3个8个脉冲完成后,首次送出的数据被送到了最下面的164(第3片)中,其它数据依次出现在第二和第一片74LS164中,实现了数据在74LS164中的串行输入、并行输出。
表374LS164特性表
在方式0状态下,串行口为同步移位寄存器方式,其波特率是固定的,为fosc/12。
数据由RxD(P3.0)端输入或输出,同步移位脉冲由TxD(P3.1)端输出。
发送、接收数据时低位在先。
所以,根据本小节下面提供的硬件电路图,在编写程序时,查共阳数码管的段码的二进制数据应该将正常的共阳数码管0一9的二进制值按位反序排序,如原来的二进制为11000000(C0H),要改为00000011(03H),就能使数码管正常显示。
3.3.4键盘接口的设计
由于按键只有3个,用普通按钮接10kw上拉电阻,用查询法完成读键功能。
3.4 系统程序的设计
因为使用了时钟芯片Dsl302,阳历程序只需从Dsl302各寄存器中读出年、周、月、日、
[小]时、分、秒等数据,再处理即可。
在首次对Dsl302进行操作之前,必须对它进行初始化,然后从Dsl302中读出数据,再经过处理后,送给显示缓冲单元。
阳历程序流程图见图3.6所示。
图6阳历程序流程图
3.4.2时间调整程序设计
调整时间用2个调整按钮,1个作为移位、控制用,另外1个作为加和减用,分别定义为控制按钮、加按钮。
在调整时间过程中,要调整的位与别的位应该有区别,所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位。
闪烁原理就是,让要调整的一位每隔一定时间熄灭一次,比如说50ms。
利用定时器计时,当达到50ms溢出时,就送给该位熄灭符,在下一次溢出时。
再送正常显示的值,不断交替,直到调整该位结束。
此时送正常显示值给该位,再进人下一位调整闪烁程序。
时间调整程序程序流程图如图3.7所示。
3.4.3阴历程序设计
阴历程序的实现是要靠阳历日期来推算的。
要根据阳历来推算阴历日期,首先要设计算法。
推算方法是,根据阳历当前日期在一年中的天数来计算阴历日期。
阳历一个月不是30天就是3l天(2月除外,闰年2月为29天,平年2月为28天)。
阴历一年有12个月或13个月(含闰月),一个月为30天或29天。
如果把一个只有29天的月称为小月,用1为标志,把30天的月称为大月,用0为标志,那么12位二进制就能表示一年12个月的大小。
如果有闰月,则把闰月的月份作为“一个字节的高4位,低4位表示闰月大小,大月为0,小月为1.这样一个
字节就包含了所有闰月的信息。
阴历春节和阳历元旦相差的天数也用一个字节表示。
总共用1字节就可以存储一年中任何一天阳历和阴历的对应关系的有关数据,例如2004年的阴历和阳历对应关系如表3.4所列。
图7时间调整程序流程图
表42004年的阴历和阳历关系表
2004年的春节和元旦差20天,这样2004年的信息表示为:
21,42H,52H,21H。
其中表示12个月大小信息的字,第4位和第7位不用。
第1个字节为十进制,其它的都为十六进制。
按此方法,50年的阳历和阴历对应关系表总共使用200字节。
有了算法和数据以后,就可设计软件了。
先要根据当前阳历的日期,算出阳历为该年中的第几天。
图3.8为计算阳历中任何一天在该年中为第几天的程序流程图。
计算出当前阳历日期为该年中的第几天后,再减去阳历该年春节和元旦的日差,如果够减.则相减的结果就是阴历在该年的总第几天了。
根据该数据就可以推算出具体的当前阴历日期;如果不够减,则表示当的阴历年为阳历年的前一年。
这种情况下,根据实际、当前阴历日期会处十阴历11月或12月,此时春节和元旦的日差减去前面计算出的当前阳历日期在阳历年为第几天的数据.其结果表示当的阴历日期离春节的天数。
计算出的阳历天数为该年的第几天,存放在寄存器只2和只3中。
计算出天数后,如果大于#FFH,则把#FFH存放在R2中,余值存放在R3中。
也就是说在用寄存器R2和R3表示的天数信息中.R2充当主寄存器,数据先存满R2,再存R3。
整个转换程序中,这里面的数据不能被覆盖。
计算出阳历总天数后,就可以根据它来推算阴历日期。
推算方法是,先用总天数减去春节相元旦的日差,如果结果为1,则该天正好是春节(因为春节在元旦之后,在计算春节和几旦的日差0时,假设元旦为0天,春节为M天,则日差为M。
而前面计算的阳历总天数是该天在该年
中的第几天,是以元旦为1而得到的,与计算春节和元旦日差的这种方法相比,其数值少了1.所以要在原来本应该以0作为该天就是春节的依据的基础上加1,所以以1作为该天是春节的标志);如果结果小于1,则阴历应该是阳历的前一年;如果结果大于1,说明阳历和阴历为同一年。
再根据查表所得的该年的阴历的闰月和大小月的信息,就可以推算出该大的阴历日期
了。
图3.9为由总天数推算出阴历日期的程序流程图。
图9推算阴历日期的程序流程图
四、调试总结及改进
(1)DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。
在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。
若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。
(2)在仿真头调试时候,我发现在LED显示板上能够正常显示数字,但是秒位不能记数,检查DS1302的连接(没有错,接触也良好),说明了这片DS1302不能记数,然后换掉DS1302后此时不但可以正常显示数字,而且可以正常记数,说明刚才那片是坏的。
(3)(2M)晶振的调试,在调试晶振的时候发现,在没有给电路同电的时候,晶振两端输出波形是个不稳定的正弦波,而通电后也是个正弦波,但是中间一个引脚接地时候,波形比较稳定,接示波器时间长了,发现DS1302很发烫(时间很短内温度达到很高),但是不接示波器,时间长点也不会出现发烫现象。
我认为是示波器引脚上的电和电路板上的电相通的原因。
五元器件
主控器AT89C52一片、时钟芯片DS1302一片、10P瓷片电容2个、22P瓷片电容3个,32.768K(时钟晶体)1片、510欧排电阻3个、共阳LED19片,9012三极管1片、8550三极管7个,2M晶体1片、74LS104三片、发光二极管一个、按钮开关2个、万能电路板(大小个1个),5V电源一个、导线若干。
六、参考书目
1、李振声.实验电子技术(P182~193).国防工业大学出版社,2001年
2李飞光单片机课程设计实例指导北京航空航天大学出版社2004年
七程序调试
SCLKEQUP3.2
IOEQUP3.3
RSTEQUP3.4
YEARDATA66H
MONTHDATA65H
WEEKDATA64H
DAYDATA63H
HOURDATA62H
MINTUEDATA61H
SECONDDATA60H
DS1302_ADDRDATA32H
DS1302_DATADATA31H
ORG0000H
AJMPSTART
ORG0003H
RETI
ORG000BH
RETI
ORG0013H
RETI
ORG001BH
LJMPINTT1
ORG0023H
RETI
ORG002BH
RETI
START:
SETBEA
MOVSCON,#00H
MOVTMOD,#10H
MOVTL1,#00H
MOVTH1,#00H
MOVDS1302_ADDR,#8EH
MOVDS1302_DATA,#00H
LCALLWRITE
MOVDS1302_ADDR,#90H
MOVDS1302_DATA,#0A6H
LCALLWRITE
MAIN1:
MOVDS1302_ADDR,#8DH
LCALLREAD
MOVYEAR,DS1302_DATA
MOVDS1302_ADDR,#8BH
LCALLREAD
MOVWEEK,DS1302_DATA
MOVDS1302_ADDR,#89H
LCALLREAD
MOVMONTH,DS1302_DATA
MOVDS1302_ADDR,#87H
LCALLREAD
MOVDAY,DS1302_DATA
MOVDS1302_ADDR,#85H
LCALLREAD
MOVHOUR,DS1302_DATA
MOVDS1302_ADDR,#83H
LCALLREAD
MOVMINTUE,DS1302_DATA
MOVDS1302_ADDR,#81H
LCALLREAD
MOVSECOND,DS1302_DATA
MOVR0,YEAR
LCALLDIVIDE
MOV7BH,R1
MOV4BH,R1
MOV7CH,R2
MOV4CH,R2
MOV78H,WEEK
MOV48H,WEEK
MOVR0,MONTH
LCALLDIVIDE
MOV79H,R1
MOV49H,R1
MOV7AH,R2
MOV4AH,R2
MOVR0,DAY
LCALLDIVIDE
MOV76H,R1
MOV46H,R1
MOV77H,R2
MOV47H,R2
MOVR0,HOUR
LCALLDIVIDE
MOV74H,R1
MOV44H,R1
MOV75H,R2
MOV45H,R2
MOVR0,MINTUE
LCALLDIVIDE
MOV72H,R1
MOV42H,R1
MOV73H,R2
MOV43H,R2
MOVR0,SECOND
LCALLDIVIDE
MOV70H,R1
MOV40H,R1
MOV71H,R2
MOV41H,R2
LCALLDISPLAY
LCALLGENGXIAN
JNBP1.2,NUM
JNBP1.1,SETG
JNBF0,SSS
CLRP1.3
LJMPMAIN1
SSS:
SETBP1.3
LJMPMAIN1
NUM:
MOVMONTH,#0AAH
MOVHOUR,#0AAH
MOVMINTUE,#0AAH
MOVSECOND,#04H
MOVR0,MONTH
LCALLDIVIDE
MOV79H,R1
MOV49H,R1
MOV7AH,R2
MOV4AH,R2
MOVR0,HOUR
LCALLDIVIDE
MOV74H,R1
MOV44H,R1
MOV75H,R2
MOV45H,R2
MOVR0,MINTUE
LCALLDIVIDE
MOV72H,R1
MOV42H,R1
MOV73H,R2
MOV43H,R2
MOVR0,SECOND
LCALLDIVIDE
MOV70H,R1
MOV40H,R1
MOV71H,R2
MOV41H,R2
LCALLDISPLAY
JNBP1.2,NUM
LJMPMAIN1
SETG:
SETBTR1
SETBET1
CLR08H
CLR09H
CLR0AH
CLR0BH
CLR0CH
CLR0DH
CLR0EH
CLR0FH
MOVDS1302_ADDR,#8EH
MOVDS1302_DATA,#00H
LCALLWRITE
MOVDS1302_ADDR,#80H
MOVDS1302_DATA,#80H
LCALLWRITE
GWAIT:
LCALLDISPLAY
JNBP1.1,GWAIT
SETG1:
LCALLDISPLAY
JNBP1.1,SETG2
JNBP1.2,GADDYEAR
AJMPSETG1
GADDYEAR:
MOVR7,66H
LCALLADD1
MOV66H,A
CJNEA,#51H,GADDYEAR1
MOV66H,#01H
GADDYEAR1:
MOVDS1302_ADDR,#8CH
MOVDS1302_DATA,66H
LCALLWRITE
MOVR0,66H
LCALLDIVIDE
MOV4BH,R1
MOV7BH,R1
MOV4CH,R2
MOV7CH,R2
WAITT1:
LCALLDISPLAY
JNBP1.2,WAITT1
AJMPSETG1
SETG2:
SETB0AH
GWAIT2:
LCALLDISPLAY
JNBP1.1,GWAIT2
SETG3:
LCALLDISPLAY
JNBP1.1,SETG4
JNBP1.2,GADDMONTH
AJMPSETG3
GADDMONTH:
MOVR7,65H
LCALLADD1
MOV65H,A
CJNEA,#13H,GADDMONTH1
MOV65H,#01H
GADDMONTH1:
MOVDS1302_ADDR,