ds1302时间读取Word格式文档下载.docx

上传人:b****7 文档编号:22873127 上传时间:2023-02-05 格式:DOCX 页数:31 大小:18.91KB
下载 相关 举报
ds1302时间读取Word格式文档下载.docx_第1页
第1页 / 共31页
ds1302时间读取Word格式文档下载.docx_第2页
第2页 / 共31页
ds1302时间读取Word格式文档下载.docx_第3页
第3页 / 共31页
ds1302时间读取Word格式文档下载.docx_第4页
第4页 / 共31页
ds1302时间读取Word格式文档下载.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

ds1302时间读取Word格式文档下载.docx

《ds1302时间读取Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ds1302时间读取Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。

ds1302时间读取Word格式文档下载.docx

writetime_ds1302(0x8e,0x00);

//writeenable

for(i=0;

i<

7;

i++)//settime--second,munite,hour,day,month,week,year

{

writetime_ds1302(0x80+i*2,time[i]);

writetime_ds1302(0x8e,0x80);

//writeprotect

//从DS1302中一次读出所有的数据并存在数组time[7]当中

voidgettime_ds1302()

i++)//gettime--second,munite,hour,day,month,week,year

time[i]=readtime_ds1302(0x81+i*2);

//往DS1302的地址ds1302_add处写入ds1302_cmd数据或命令

voidwritetime_ds1302(uchards1302_add,uchards1302_cmd)

//ds1302_rst=0;

//ds1302_clk=0;

ds1302_rst=1;

writebyte_ds1302(ds1302_add);

writebyte_ds1302(ds1302_cmd);

//ds1302_clk=1;

ds1302_rst=0;

//从DS1302的地址DS1302_ADD处读出时间值

ucharreadtime_ds1302(uchards1302_add)

uchartemp_data;

temp_data=readbyte_ds1302();

returntemp_data;

//从DS1302中读出一字节并返回

ucharreadbyte_ds1302()

{

i<

8;

i++)

/*if(ds1302_io)//这个延时有没有也是一样的

temp_data=(temp_data>

>

1)|0x80;

else

temp_data>

=1;

*/

//***********以上被注释部分的代码也可以用,实际测试过****************

if(ds1302_io)

temp_data|=(1<

<

i);

//如果读到高电平,则置位相应位

temp_data&

=(~(1<

i));

//如果读到低电平,则清零相应位

ds1302_clk=1;

ds1302_clk=0;

//往DS31302中写入一字节

voidwritebyte_ds1302(uchards1302_data)

uchartemp_data=ds1302_data;

for(i=8;

i>

0;

i--)

ds1302_io=temp_data&

0x01;

//将读到的时间显示在六个数码管上,该子程序只显示分秒时。

voidtime_display()

=2;

numdis(time[i]&

0x0f,i*2,20);

numdis(((time[i]&

0xf0)>

4),i*2+1,20);

//数码管显示子程序,将一个数num显示到某一位weixuan数码管

voidnumdis(ucharnum,ucharweixuan,ucharbrightness)

while(brightness--)LED=num*0x10+weixuan*0x01;

LED=LED_OFF;

MS1602的读写时序**************************

voidWrite(uchartempdata)

DB0_DB7=tempdata;

RS=0;

RW=0;

E=0;

nop;

E=1;

CheckBusy();

voidWriteDDR(uchartempdata)

RS=1;

voidCheckBusy()

DB0_DB7=0xff;

RW=1;

do

nop;

TEMP=DB0_DB7;

}while((TEMP&

0x80)==0x80);

二、

#include<

intrins.h>

sbitSCK=P3^6;

sbitSDA=P3^4;

sbitRST=P3^5;

//DS1302复位

sbitset=P3^0;

//定义按键端口

sbits1=P3^1;

sbits2=P3^2;

sbits3=P3^3;

/************液晶口定义*******/

sbitRS=P2^4;

//RS为数据/指令选择1/0

sbitRW=P2^5;

//读写

sbitE=P2^6;

//E为使能信号

bitflag;

//是否读取时间的标志位

ucharsetn=0;

//复位键、增加键、减少键按下次数

ucharcodetime0[]="

DATE:

--"

;

ucharcodetime1[]="

TIME:

:

"

ucharl_tmpdate[7]={0,55,16,22,8,6,9};

//秒分时日月周年//可随时更改

ucharcodewrite_add[7]={0x80,0x82,0x84,0x86,

0x88,0x8a,0x8c};

//秒分时日月周年写的寄存器地址

ucharcoderead_add[7]={0x81,0x83,0x85,0x87,

0x89,0x8b,0x8d};

//秒分时日月周年读的寄存器地址

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d

0x7d,0x07,0x7f,0x6f,0x40};

//共阴数码管0-9加'

-'

熄灭表

voiddelay(uintz)

while(--z);

voidwrite_com(ucharcom)//液晶写命令函数

RS=0;

//写命令使能

RW=0;

//写

delay(5000);

/****在高脉冲下命令输入*****/

E=0;

P0=com;

delay(500);

E=1;

voidwrite_data(uchardat)//液晶写数据函数

RS=1;

//写数据使能

/****在高脉冲下数据输入*****/

P0=dat;

voidinit()//液晶初始化

ucharnum;

write_com(0x38);

//显示模式设置

write_com(0x08);

//显示关闭

write_com(0x01);

//显示清屏

write_com(0x06);

//光标移动设置整屏不移动

write_com(0x0c);

//屏幕开、光标不闪(0)不显示(0)

write_com(0x80);

for(num=0;

num<

16;

num++)

write_data(time0[num]);

delay(5);

write_com(0x80+0x40);

13;

write_data(time1[num]);

voidWrite_Ds1302_Byte(uchartemp)//写一个字节

for(i=0;

i++)//循环8次写入数据

SCK=0;

SDA=temp&

//每次传输低字节

temp>

//右移一位

SCK=1;

}

/****************************************************************************/

voidWrite_Ds1302(ucharadd,uchardat)//向寄存器写数据

RST=0;

_nop_();

RST=1;

//启动

Write_Ds1302_Byte(add);

//发送地址

Write_Ds1302_Byte(dat);

//发送数据

//恢复

ucharRead_Ds1302_Byte()//读一个字节

uchari,temp=0x00;

i++)//循环8次读取数据

if(SDA)

temp|=0x80;

//每次传输低字节

return(temp);

ucharRead_Ds1302(ucharaddress)//从寄存器读数据

uchardate;

Write_Ds1302_Byte(address);

date=Read_Ds1302_Byte();

//以下为DS1302复位的稳定时间

SDA=0;

SDA=1;

return(date);

/*********************************************************/

voidRead_RTC(void)//读取日历

uchari,*p;

p=read_add;

//读的地址传递

i++)//分7次读取秒分时日月周年

l_tmpdate[i]=Read_Ds1302(*p);

p++;

/******************************************************/

voidSet_RTC(void)//设定日历

uchari,*p,tmp;

{//BCD处理,将十六进制转换成十进制

tmp=l_tmpdate[i]/10;

l_tmpdate[i]=l_tmpdate[i]%10;

l_tmpdate[i]=l_tmpdate[i]+tmp*16;

Write_Ds1302(0x8E,0X00);

//关闭写保护

p=write_add;

//传要写的寄存器地址

i++)//7次写入秒分时日月周年

Write_Ds1302(*p,l_tmpdate[i]);

Write_Ds1302(0x8E,0x80);

//打开写保护

voidwrite_lcd()

staticuchari,temp[2];

switch(i)

case0:

write_com(0x80+0x40+0x0b);

break;

//秒

case1:

write_com(0x80+0x40+8);

//分

case2:

write_com(0x80+0x40+5);

//时

case3:

write_com(0x80+0x0b);

//日

case4:

write_com(0x80+8);

//月

case5:

write_com(0x80+0x0e);

//星期

case6:

write_com(0x80+5);

//年

temp[0]=l_tmpdate[i]/16;

//数据的转换

temp[1]=l_tmpdate[i]&

0x0f;

write_data(0x30+temp[0]);

write_data(0x30+temp[1]);

i++;

if(i==7)

i=0;

ucharchange(ucharx)//十进制转换成十六进制

uchartep,y;

y=x;

tep=y/16;

y=y%16;

y=y+tep*10;

returny;

voidkeyscan()

uchartem[2],tp,Flag;

//存储要更改的时间数据

if(set==0)

flag=1;

//时间停止

//去键盘按下抖动

while(!

set);

//去键盘抬起时抖动

setn++;

if(setn==1)

write_com(0x80+0x40+12);

//将光标移动到秒个位

write_com(0x0f);

//显示光标并且闪烁

if(setn==2)

write_com(0x80+0x40+9);

//将光标移动到分个位

if(setn==3)

write_com(0x80+0x40+6);

//将光标移动到时个位

if(setn==4)

write_com(0x80+15);

if(setn==5)

write_com(0x80+12);

if(setn==6)

write_com(0x80+9);

if(setn==7)

write_com(0x80+6);

if(setn==8)

setn=0;

Write_Ds1302(write_add[0],l_tmpdate[0]);

flag=0;

//时钟正常运行

//光标停止闪烁

if(setn!

=0)//更改时间

if(s1==0)//增加时间

if(s1==0)

s1);

l_tmpdate[0]=change(l_tmpdate[0]);

l_tmpdate[0]++;

if(l_tmpdate[0]>

=60)

l_tmpdate[0]=0;

tp=l_tmpdate[0]/10;

l_tmpdate[0]=l_tmpdate[0]%10;

l_tmpdate[0]=l_tmpdate[0]+tp*16;

write_com(0x80+0x40+11);

tem[0]=l_tmpdate[0]/16;

tem[1]=l_tmpdate[0]&

write_data(0x30+tem[0]);

write_data(0x30+tem[1]);

Flag=1;

{l_tmpdate[1]=change(l_tmpdate[1]);

l_tmpdate[1]++;

if(l_tmpdate[1]==60)

l_tmpdate[1]=0;

tp=l_tmpdate[1]/10;

l_tmpdate[1]=l_tmpdate[1]%10;

l_tmpdate[1]=l_tmpdate[1]+tp*16;

Write_Ds1302(write_add[1],l_tmpdate[1]);

tem[0]=l_tmpdate[1]/16;

tem[1]=l_tmpdate[1]&

write_data(0x30+tem[

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

当前位置:首页 > 高等教育 > 院校资料

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

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