ds12c887电子芯片的应用学士学位论文.docx
- 文档编号:10407593
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:26
- 大小:183.88KB
ds12c887电子芯片的应用学士学位论文.docx
《ds12c887电子芯片的应用学士学位论文.docx》由会员分享,可在线阅读,更多相关《ds12c887电子芯片的应用学士学位论文.docx(26页珍藏版)》请在冰豆网上搜索。
ds12c887电子芯片的应用学士学位论文
福州职业技术学院
毕业设计
设计题目DS12C887
时钟芯片的应用
系别技术工程系
年级专业09应用电子技术(闽台)
学号
姓名
指导教师倪榕生
职称讲师
2012年3月30日
目录
内容摘要………………………………………………………………………………2
关键词…………………………………………………………………………………2
一、DS12C887简介…………………………………………………………………2
(一)器件特性…………………………………………………………………2
(二)引脚功能…………………………………………………………………2
(三)应用………………………………………………………………………5
二、DS12C887时钟芯片在设计中的应用……………………………………………7
(一)概述………………………………………………………………………7
(二)系统硬件的设计…………………………………………………………7
(三)系统的软件设计…………………………………………………………8
(四)主要源程序代码如下……………………………………………………9
结语…………………………………………………………………………………16
参考文献……………………………………………………………………………17
附录…………………………………………………………………………………18
DS12C887时钟芯片的应用
[内容摘要]电子万年历在家庭居室、学校、车站和广场使用越来越广泛,给人们的生活、学习、工作带来极大的方便。
针对以往的电子万年历断电后需重新调整时间与日期,且计时误差大的现象。
本系统设计采用实时钟芯片(DS12C887)作为计时器件,该芯片内部自带晶体振荡器,这样就有效的保证了计时的精确性,并且内部自带锂电池使得在断情况能继续更新时间信息。
[关键词]万年历时钟芯片DS12C887
一DS12C887简介
(一)器件特性
DS12C887实时时钟芯片功能丰富,可以用来
直接代替IBMPC上的时钟日历芯片DS12887,
同时,它的管脚也和MC146818B、DS12887相
兼容。
由于DS12C887能够自动产生世纪、
年、月、日、时、分、秒等时间信息,其内部
又增加了世纪寄存器,从而利用硬件电路解决
子“千年”问题;DS12C887中自带有锂电池,
外部掉电时,其内部时间信息还能够保持10
年之久;对于一天内的时间记录,有12小时
制和24小时制两种模式。
在12小时制模式
中,用AM和PM区分上午和下午;时间的表
示方法也有两种,一种用二进制数表示,一
种是用BCD码表示;DS12C887中带有128字节RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。
(二)引脚功能
DS12C887的引脚排列如图1所示,各管脚的功能说明如下:
GND、VCC:
直流电源,其中VCC接+5V输入,GND接地,当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;当VCC的输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;当VCC的输入小于+3V时,DS12C887会自动将电源发换到内部自带的锂电池上,以保证内部的电路能够正常工作。
(1)MOT:
模式选择脚,DS12C887有两种工作模式,即Motorola模式和Intel模式,当MOT接VCC时,选用的工作模式是Motorola模式,当MOT接GND时,选用的是Intel模式。
本文主要讨论Intel模式。
(23)SQW:
方波输出脚,当供电电压VCC大于4.25V时,SQW脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到13种方波信号的输出。
AD0~AD7:
复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出现在AD0~AD7上的是地址信息,可用以选通DS12C887内的RAM,总线周期的后半部分出现在AD0~AD7上的数据信息。
(14)AS:
地址选通输入脚,在进行读写操作时,AS的上升沿将AD0~AD7上出现的地址信息锁存到DS12C887上,而下一个下降沿清除AD0~AD7上的地址信息,不论是否有效,DS12C887都将执行该操作。
(17)DS/RD:
数据选择或读输入脚,该引脚有两种工作模式,当MOT接VCC时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通。
在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取。
在写操作中,DS的下降沿将使总线AD0~AD7上的数据锁存在DS12C887中;当MOT接GND时,选用Intel工作模式,在该模式中,该引脚是读允许输入脚,即ReadEnable。
(15)R/W:
读/写输入端,该管脚也有2种工作模式,当MOT接VCC时,R/W工作在Motorola模式。
此时,该引脚的作用是区分进行的是读操作还是写操作,当R/W为高电平时为读操作,R/W为低电平时为写操作;当MOT接GND时,该脚工作在Intel模式,此时该作为写允许输入,即WriteEnable。
(13)
:
片选输入,低电平有效。
(19)
:
中断请求输入,低电平有效,该脚有效对DS12C887内的时钟、日历和RAM中的内容没有任何影响,仅对内部的控制寄存器有影响,在典型的应用中,RESET可以直接接VCC,这样可以保证DS12C887在掉电时,其内部控制寄存器不受影响。
在DS12C887内有11字节RAM用来存储时间信息,4字节用来存储控制信息,其具体垢地址及取值如表1所列。
(三)应用
在各种设备、家电、仪器、工业控制系统中,可以很容易地用DS12C887来组成时间获取单元,以实现各种时间的获取。
图2是用8031单片机和DS12C887构成的时间获取电路图,其中DS12C887的基地址为7F00H,相应的程序采用C51语言编写(以Intel工作模式为例)。
由8031单片机和DS12C887构成的时间获取电路的初始化程序如下:
XBYTE[0x7F00+0x0B]=0x82;
XBYTE[0x7F00+0x0A]=0xA0;
XBYTE[0x7F00+0x0A]=0x20;
XBYTE[0x7F00+0x0B]=0x02;
/*所有的中断禁止,24小时制,
BCD码模式*/
以下均获取时间程序:
unsignedchardatat-century;
unsignedchardatat-year
unsignedchardatat-month;
unsignedchardatat-date;
unsignedchardatat-week;
unsignedchardatat-hour;
unsignedchardatat-minute;
unsignedchardatat-second;
if((XBYTE[7F00+0x0A]&0x80)!
=0){
t-century=XBYTE[0x7F00+0x32];/*读取世纪*/
t-year=XBYTE[Ox7F00+0x09];/*读取年份*/
t-month=XBYTE[Ox7F00+0x08];/*读取月份*/
t-date=XBYTE[Ox7F00+0x07];/*读取日期*/
t-week=XBYTE[Ox7F00+0x06];/*读取星期几*/
t-hour=XBYTE[Ox7F00+0x04];/*读取小时*/
t-minute=XBYTE[DS12887+0x02];/*读取分钟*/
t-second=XBYTE[Ox7F00+0x00];}/*读取秒
二DS12C887时钟芯片在设计电子万年历中的应用
(一)概述
电子万年历在家庭居室、学校、车站和广场使用越来越广泛,给人们的生活、学习、工作带来极大的方便。
针对以往的电子万年历断电后需重新调整时间与日期,且计时误差大的现象。
本系统设计采用实时钟芯片(DS12C887A)作为计时器件,该芯片内部自带晶体振荡器,这样就有效的保证了计时的精确性,并且内部自带锂电池使得在断情况能继续更新时间信息。
本设计采用AT89S52作为主控制器,为了提高电路的实用性加入温度测量电路、报时和闹钟功能。
系统的工作原理是:
主控制器每隔一段时间(小于一秒钟)读一次时钟芯片的内部寄存器的值,将读出的日历、时间信息实时的显示在LED数码显示器上。
同时,主控制器不断的扫描按键电路和温度测量电路,当有键按下时,识别出按键的值并调整相应的时间或日历的值再写入时钟芯片内部。
温度数据由测量电路(DS1280)获得的温度值送入显示电路显示。
(二)系统硬件的设计
2.1电源电路
为了减少电路成本,本系统电源电路由变压器变压、三端集成稳压(L7805)电路产生5V,具有简单、可靠、价格低廉等特点。
2.2主控制器
主控制器采用ATMEL公司的最新系列单片机产品AT89S52。
该单片机除了拥有MCS一51系列单片机的所有;优点外,内部还具有8KB的在系统可编程FLASH存储器,!
低功耗的空闲和掉电模式,极大的降低了电路的功耗。
另外,还具有一个看门狗电路,为电路的可靠工作提供了更大的保证。
2.3数码管显示电路
显示电路采用具有高亮度、使用寿命长、价格低廉等特点的LED数码管。
整个显示电路由LED数码管和显示驱动电路和译码电路构成。
由于本系统中显示的内容较多,共需要16个数码管,分别用八位显示年、月、日,四位显示时间,二位显示星期,二位显示温度。
为了节省控制器的资源,在控制器和显示器之间加入一个译码电路使本来需要16根控制线的电路变成只需四根控制线,极大的节省了系统资源。
该译码器由两个3—8译码器构成。
2.4按键与温度测量电路
本系统为了使电路更简单,按键电路只设计了个按键,分别是’设置’、’+’、’一’三个键用来调整日历以及时钟。
本系统为了提高电路的实用性,增加了一个温度显示功能。
该系统的温度测量电路采用DallaS公司的DS1280。
该器件由于其具有价格低廉电路简单、测量精确等优点。
2.5音频信号产生及驱动电路
本电路的功能是接收控制电路发送来的整点报时及定时信号,根据系统设定产生不同频率的音频信号,由驱动电路加以放大驱动扬声器发出声音,从而实现整点报时及闹钟的功能。
(三)系统的软件设计
本系统程序由主程序、中断服务函数和多个子函数构成。
主函数主要完成各子函数和中断函数的初始化。
定时中断函数主要完成时钟芯片的定时扫描及键盘扫描。
时钟芯片的读写函数主要是将时间、日历信息读出来,并把要修改的具体值写入时钟芯片内部。
相关程序流程图如下:
(四)主要源程序代码如下:
#itic1ude
#itic1ude
#defitieintenab1eEA=1
#defitieUrlsignedcharuchar
#defitieUrlSignedintUint
/********函数声明********/
VOidreadrtc(void):
VOidbus
initialize(VOid):
—
voiddisplay(VOid):
/*显示函数*/
voiddiS
ca1endar(ucharbit
——sh
voiddistd
t(ucharbitshiel
———
VOidintinitialize(VOid):
VOidtimerOinitialize(VOid):
/**********************************/
Staticintdatayear=O:
Staticuchardatamonth=O:
Staticuchardataday=O:
Staticuchardataweekday=O:
Staticuchardatahour=O:
StaticuchardatamiflUte=O:
Staticuchardatacounter=O:
StaticuchardataaregiSter=O
—
StaticuchardatabregiSter=O
—
#defitieadddataP1
sbitcS=P37:
sbitas=P36:
sbitr71--P35;
Sbitds=P34:
sbitadd138=P24:
Sbita138=P27:
sbitb138=P26:
Sbitc138=P25:
sbitset=P23:
sbitup=P22:
sbitdown=P21:
sbit1edour=P20:
sbitDO=P30:
#defitiediSP1aydataPO
#defitieAREGISTEROxOa
#defitieBREGISTEROxOb
#defitieCENTURYREG0x32
#defitieYEARREGOx09
#defitieMONTHREGOx08
#defitieDAYREGOxO7
#defitieWEEKDAYREGOx06
#defitieHOURREGOx04
#defitieMINUTEREGOx02
#defitieSECONDREGOxO0
StaticuchardataREGISTERADD
StaticucharSetc1ock=O:
Staticbitbdatava1ueset=1:
StaticbitbdatafSet=O:
StaticbitbdatafSetcorl=O:
stariCucharupclock=O:
Staticbitbdatava1ueup=1:
staticbitbdataf_up=O:
staticbitbdataf_up—con=O;
staticuchardown_clock=O;
staticbitbdata.value_down=1:
staticbitbdataf_down=O:
staticbitbdataf_down_con=O;
ucharcodetab_dis[11]={OxcO,Oxf9,Oxa4,OxbO,0x99,
0x92,0x82,Oxf8,Ox80,Ox90,Oxff):
/*消隐信号*/
voidmain(void)//主函数
{
uchardataverdict_set=O
apart_year,apart_century;
int_enable;//开总中断
timerO_initialize0:
//定时器0初始化
int_initialize0;//外部中断初始化
whi1e
(1)
{
set
if(f_con==1)//set键处理
{
f_set_con=O:
REGISTER_ADD++:
if(REGISTER_ADD>6)
REGISTER_ADD=O:
)
if(f_up_con==1)//up键处理
{
f_up_con=O;
write_timing(B_REGISTER,Ox8f):
switch(REGISTERADD)
{
case0:
break:
case1:
year++:
if(year>9999)year=O:
apart_year=(year%l0):
write_timing(YEAR_REGapart_year):
write_timing(CENTURY_REG,apart_century):
break:
case2:
month++:
if(month>12)month=l;
write_timing(MONTH_REG,month);
break;
case3:
day++:
if(day>31)day=l:
write_timing(DAY_REG,day):
break:
case4:
hour++:
if(hour>23)hour=O:
write_timing(HOUR_REG,hour):
break:
case5:
minute++:
if(minute>59)minute=O:
write_timing(MINUTE_REG,minute)
break:
case6:
weekday++;
if(weekday>7)weekday=1:
write_timing(WEEKDAY_REG,weekday)
break:
)
Write_timing(B_REGISTER,OxOf);
switch(REGISTERADD)
{
case0:
break:
case1:
year一一:
if(year apart_century=(year10): apart_year=(year%lO); write_timing(YEAR_REG,apart_year) writ_timing(CENTURY_REG,apart_century) break: case2: month一一: if(month<1)month=l2: write_timing(MONTH_REG,month); break; case3: day一一: if(day<1)day=31: write_timing(DAY_REG,day): break: case4: hour一一: if(hour==255)hour=23: write_timing(HOUR_REG,hour): break: case5: minute一一: if(minute==255)minute=59: write_timing(MINUTE_REG,minute) break: case6: weekday一一: if(weekday<1)weekday=7; write_timing(WEEKDAY_REG,weekday); break; } Write_timing(B_REGISTER,OxOf): } display(): //调用显示函数 } voidread_rtc(void)//读时钟芯片函数 { ucharverdict_uiP,century, comp_month,comp_day, comp_hour,comp_minute, comp_weekday: intcomp_year: do { Verdict_uip=read_timing(OxOa): verdict_uip<<=1: } century=read_timing(CENTURY_REG): comp_year=lO*century+read_timing(YEAR_REG) comp_month=read_timing(MONTH_REG): comp_day=read_timing(DAY_REG): comp_weekday=read_timing(WEEKDAY_REG): comp_hour=read_timing(HOUR_REG): comp_minute=read_timing(MINUTE_REG): if(comp_year-year! =0)year=comp_year: month; if(comp_month—month! =0)month=comp_day: if(comp_day-day! =0)day=comp_day; if(comp_weekday! =0)weekday=comp_weekday; if(comp_hour-hour! =0)hour=comp_hour; if(comp_minute-minute! =0)minute=comp_minute; } /木木木定时器0中断函数木木木/ voidtimerO(void)interrupt1USing1 { TRO=O; THO=Oxfd: TLO=OxO0: TRO=1: Counter++: if(counter==l50) {read —rtc0: counter=O: } } 结语 这次的毕业设计是对我大学三年里所学知识的考核和总结,考察了我对所学基础知识和专业知识的一种综合应用能力,在这几个月里通过我自己的努力以及倪榕生老师的悉心指导,本着严谨求实,开拓创新的精神完成了这次毕业设计。 在这次毕业设计中让我学会了把书本上的知识应用到了实际中来,在实践中加深了对所学知识理解,真正的理解了理论可以指导实践,实践可以加深对理论的理解这句话。 虽然在这毕业设计中有遇到过不少的问题,但是在我自己的努力之下,在老师的悉心帮助之下都一一的解决了,在解决问题的同时也提高了自己分析问题的能力,增加了不少宝贵的经验,学习到了书本上没有的东西。 在此要感谢倪榕生老师对我悉心的指导,感谢老师们给我的帮助。 在设计过程中,我通过查阅大量有关资料,与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。 在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。 而且大大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ds12c887 电子 芯片 应用 学士学位 论文