综合实验六 实时时钟12C887实验.docx
- 文档编号:5616894
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:10
- 大小:17.85KB
综合实验六 实时时钟12C887实验.docx
《综合实验六 实时时钟12C887实验.docx》由会员分享,可在线阅读,更多相关《综合实验六 实时时钟12C887实验.docx(10页珍藏版)》请在冰豆网上搜索。
综合实验六实时时钟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.修改程序输出方波。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合实验六 实时时钟12C887实验 综合 实验 实时 时钟 12 C887