综合实验六 实时时钟12C887实验.docx

上传人:b****5 文档编号:5616894 上传时间:2022-12-29 格式:DOCX 页数:10 大小:17.85KB
下载 相关 举报
综合实验六 实时时钟12C887实验.docx_第1页
第1页 / 共10页
综合实验六 实时时钟12C887实验.docx_第2页
第2页 / 共10页
综合实验六 实时时钟12C887实验.docx_第3页
第3页 / 共10页
综合实验六 实时时钟12C887实验.docx_第4页
第4页 / 共10页
综合实验六 实时时钟12C887实验.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

综合实验六 实时时钟12C887实验.docx

《综合实验六 实时时钟12C887实验.docx》由会员分享,可在线阅读,更多相关《综合实验六 实时时钟12C887实验.docx(10页珍藏版)》请在冰豆网上搜索。

综合实验六 实时时钟12C887实验.docx

综合实验六实时时钟12C887实验

实验六实时时钟12C887实验

一、实验目的

1.理解单片机并口编程方法;

2.掌握12C887编程方法;

3.了解12C887原理;

4.了解实时时钟的设计方法。

二、实验原理及内容

1.实验原理

DS12C887是DALLAS公司开发的实时时钟芯片,12C887可以提供实时时钟/日历、时间报警、3个可屏蔽中断、1个可编程方波输出、113个字节电池供电的静态RAM。

DS12C887内部集成了一个晶体和一个锂电池,DS12C887是DIP(双列直插)封装。

DS12C887在32H地址增加了100个字节的存储器。

DS12C887能够自动调整31天和30天的月份。

器件可以工作在在24小时和12小时方式(AM/PM)中切换。

在芯片内部有一个精确的温度补偿电路用于检测电源电压的状态。

当电源电压变化超出允许范围时,内部电源切换到备用电池供电。

12C887主要应用在嵌入式系统、仪表、安全系统、网络交换机、路由器,等等。

下面是12C887在该实验系统的应用。

如图8-8所示,读写信号与单片机的接口如图所示。

A15通过跳线J407作为DS12C887的片选信号。

实验系统工作原理:

INT0用于进入设置,当该键有按下,就进入时间设置,再次按下时,进入下一个时间设置,可以参考实验例程的操作。

DOWN和UP设置,OK用于退出时间设置。

图8-812C887应用原理图

2.实验内容

1)将扩展板的电源J501与主板的电源接口J2或J14连接起来;将扩展板的信号接口J500与主板的信号接口J15或J13连接起来;将主板上的液晶跳线跳上;

2)在keil编程环境下编写程序,完成实验功能要求能显示年月日,而且时间能够通过键盘设置。

3)编译生成HEX文件,将HEX文件下载到实验系统中。

观察液晶上显示的数据;用键盘设置时间参数。

三、实验例程

//说明:

6位数码管显示时,分,秒;键盘可调时间

//晶振11.0592

#include

#include

sbitRESET=P3^2;//键盘

sbitOK=P3^4;//键盘

sbitINC=P2^1;//键盘

sbitDEC=P2^2;//键盘

sbitRS=P1^0;//指令和数据寄存器

sbitRW=P1^1;//读写控制

sbitE=P1^2;//片选

sbitFLAG=P0^7;//忙信号

#defineucharunsignedchar

#definetime_aXBYTE[0x7f0a]//控制寄存器A

#definetime_bXBYTE[0x7f0b]//控制寄存器B

#definedata_IOP0

uchartime[12]={0};

ucharxdata*addr=0x7f00;//P2.7片选,低电平有效

ucharyear,month,day,hour,minute,second;

//声明函数

voidget_time(void);

voidintial(void);

intial_lcd();

voidbusy();

voidw_com(ucharcom);

voidw_dat(uchardat);

voiddisplay();

voiddelay(unsignedlongN);

voiddisplayD(ucharj);

voidconvert(void);

voidINT0_ISR();

voidget_time(void)

{

year=*(addr+9);

month=*(addr+8);

day=*(addr+7);

hour=*(addr+4);

minute=*(addr+2);

second=*addr;

}

voidintial(void)

{

time_a=0x70;

time_b=0x8e;//可以设置12、24小时制

*(addr+2)=0x00;//分--初值--30

*(addr+4)=0x0C;//时--初值--12

*(addr+7)=0x10;//日--初值--16

*(addr+8)=0x07;//月--初值--07

*(addr+9)=0x07;//年--初值--07

time_a=0x27;

time_b=0x1e;//SET最高位为0,芯片更新,正常运行

}

//---------------------------液晶显示---------------

intial_lcd()

{

RS=0;

RW=0;

E=0;

delay(100);

w_com(0x38);

w_com(0x38);

w_com(0x38);//显示为八位两行字符

w_com(0x08);

w_com(0x01);

w_com(0x0C);//开显示

}

voidbusy()//忙检测

{

while

(1)

{

data_IO=0xff;

RS=0;

RW=1;

E=1;

if(!

FLAG)break;

E=0;

}

}

voidw_com(ucharcom)//写指令

{

busy();

data_IO=com;

RS=0;

RW=0;

E=1;

E=0;

}

voidw_dat(uchardat)//写数据

{

busy();

data_IO=dat;

RS=1;

RW=0;

E=1;

E=0;

return;

}

/**********int0中断服务程序**********/

voidINT0_ISR(void)interrupt0

{uchark=1,m=0,n=0,j=0,h=0,num=9;

while(k)

{

get_time();

displayD(num);

switch(m)

{

case0x00:

num=9;break;//年

case0x02:

num=8;break;//月

case0x04:

num=7;break;//日

case0x06:

num=4;break;//时

case0x08:

num=2;break;//分

}

if(INC==0&&*(addr+num)<99&&num==9&&h++>93){h=0;*(addr+num)+=1;}

if(INC==0&&*(addr+num)<12&&num==8&&h++>93){h=0;*(addr+num)+=1;}

if(INC==0&&*(addr+num)<31&&num==7&&h++>93){h=0;*(addr+num)+=1;}

if(INC==0&&*(addr+num)<24&&num==4&&h++>93){h=0;*(addr+num)+=1;}

if(INC==0&&*(addr+num)<59&&num==2&&h++>93){h=0;*(addr+num)+=1;}

if((DEC==0)&&*(addr+num)>0&&j++>93){j=0;*(addr+num)-=1;}

if(OK==0&&n++>93){n=0;m+=2;}

delay(10);

if(m==0x0A)k=0;

}

}

voiddisplayD(ucharj)//调整时间子程序

{

convert();

w_com(0x82);//显示数据存储器首地址

w_dat(0x32);//显示字母2

w_dat(0x30);//显示字母0

if(j==9)

{

w_com(0x84);w_dat(time[0]);w_dat(time[1]);

w_com(0x84);w_dat(0x20);w_dat(0x20);delay

(2);

w_com(0x84);w_dat(time[0]);w_dat(time[1]);

w_dat(0x2D);}//年07

elseif(j==8)

{w_com(0x87);w_dat(time[2]);w_dat(time[3]);

w_com(0x87);w_dat(0x20);w_dat(0x20);delay

(2);

w_com(0x87);w_dat(time[2]);w_dat(time[3]);

w_dat(0x2D);}//月07

elseif(j==7)

{w_com(0x8A);w_dat(time[4]);w_dat(time[5]);

w_com(0x8A);w_dat(0x20);w_dat(0x20);delay

(2);

w_com(0x8A);w_dat(time[4]);w_dat(time[5]);}//日

elseif(j==4)

{w_com(0xC4);w_dat(time[6]);w_dat(time[7]);

w_com(0xC4);w_dat(0x20);w_dat(0x20);delay

(2);

w_com(0xC4);w_dat(time[6]);w_dat(time[7]);

w_dat(0x2D);}//时

else//if(j==2)

{w_com(0xC7);w_dat(time[8]);w_dat(time[9]);

w_com(0xC7);w_dat(0x20);w_dat(0x20);delay

(2);

w_com(0xC7);w_dat(time[8]);w_dat(time[9]);

}//分

w_com(0xCA);w_dat(time[10]);w_dat(time[11]);//秒

}

voiddisplay()

{

convert();

w_com(0x82);//显示数据存储器首地址

w_dat(0x32);//显示字母2

w_dat(0x30);//显示字母0

w_dat(time[0]);//年

w_dat(time[1]);

w_dat(0x2D);

w_com(0x87);//显示数据存储器首地址

w_dat(time[2]);//月

w_dat(time[3]);

w_dat(0x2D);

w_com(0x8A);//显示数据存储器首地址

w_dat(time[4]);//日

w_dat(time[5]);

w_com(0xC4);//显示数据存储器首地址

w_dat(time[6]);//时

w_dat(time[7]);

w_dat(0x3A);

w_com(0xC7);//分

w_dat(time[8]);

w_dat(time[9]);

w_com(0xCA);//秒

w_dat(time[10]);

w_dat(time[11]);

w_dat(0x20);

w_dat(0x20);

w_dat(0x20);

w_dat(0x20);

}

voidconvert(void)

{

time[0]=year/10+0x30;

time[1]=year%10+0x30;

time[2]=month/10+0x30;

time[3]=month%10+0x30;

time[4]=day/10+0x30;

time[5]=day%10+0x30;

time[6]=hour/10+0x30;

time[7]=hour%10+0x30;

time[8]=minute/10+0x30;

time[9]=minute%10+0x30;

time[10]=second/10+0x30;

time[11]=(second%10+0x30);

time[12]=0x20;

time[13]=0x20;

}

voiddelay(unsignedlongN)

{

for(;N>0;N--);

}

voidmain(void)

{

IT0=1;//下降延中断

EX0=1;//int0中断使能

EA=1;//总中断使能

intial();

intial_lcd();

while

(1)

{

get_time();

display();

}

}

四、实验仪器和设备

Keil软件;AT89S52实验平台;ISP在线编程软件;仿真器。

五、实验结果和数据分析

问题:

1.修改程序输出方波。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1