DS3231高精度时钟模块程序Word格式.docx

上传人:b****2 文档编号:4495326 上传时间:2023-05-03 格式:DOCX 页数:12 大小:17.63KB
下载 相关 举报
DS3231高精度时钟模块程序Word格式.docx_第1页
第1页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第2页
第2页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第3页
第3页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第4页
第4页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第5页
第5页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第6页
第6页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第7页
第7页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第8页
第8页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第9页
第9页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第10页
第10页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第11页
第11页 / 共12页
DS3231高精度时钟模块程序Word格式.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DS3231高精度时钟模块程序Word格式.docx

《DS3231高精度时钟模块程序Word格式.docx》由会员分享,可在线阅读,更多相关《DS3231高精度时钟模块程序Word格式.docx(12页珍藏版)》请在冰点文库上搜索。

DS3231高精度时钟模块程序Word格式.docx

unsignedint

sbitSDA=P3^6;

//模拟I2C数据传送位SDA 

sbitSCL=P3^7;

//模拟I2C时钟控制位SCL

sbitINT=P3^2;

sbitRESET=P3^3;

sbitled0=P1^0;

sbitled1=P1^1;

sbitled2=P1^2;

sbitled3=P1^3;

sbitled4=P1^4;

sbitled5=P1^5;

sbitled6=P1^6;

sbitled7=P1^7;

bit 

ack;

//应答标志位

#defineDS3231_WriteAddress0xD0 

//器件写地址 

#defineDS3231_ReadAddress 

0xD1 

//器件读地址

#defineDS3231_SECOND 

0x00 

//秒

#defineDS3231_MINUTE 

0x01 

//分

#defineDS3231_HOUR 

0x02 

//时

#defineDS3231_WEEK 

0x03 

//星期

#defineDS3231_DAY 

0x04 

//日

#defineDS3231_MONTH 

0x05 

//月

#defineDS3231_YEAR 

0x06 

//年

//闹铃1 

#defineDS3231_SALARM1ECOND0x07 

#defineDS3231_ALARM1MINUTE0x08 

#defineDS3231_ALARM1HOUR 

0x09 

#defineDS3231_ALARM1WEEK 

0x0A 

//星期/日

//闹铃2

#defineDS3231_ALARM2MINUTE0x0b 

#defineDS3231_ALARM2HOUR 

0x0c 

#defineDS3231_ALARM2WEEK 

0x0d 

#defineDS3231_CONTROL 

0x0e 

//控制寄存器

#defineDS3231_STATUS 

0x0f 

//状态寄存器

#defineBSY 

//忙

#defineOSF 

//振荡器停止标志

#defineDS3231_XTAL 

0x10 

//晶体老化寄存器

#defineDS3231_TEMPERATUREH0x11 

//温度寄存器高字节(8位)

#defineDS3231_TEMPERATUREL0x12 

//温度寄存器低字节(高2位) 

ucharcodedis_code[11]={0xc0,0xf9,0xa4,0xb0, 

//0,1,2,3

0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

//4,5,6,7,8,9,off

uchardatadis_buf[8];

uchardatadis_index;

uchardatadis_digit;

ucharBCD2HEX(ucharval) 

//BCD转换为Byte

{

uchartemp;

temp=val&

0x0f;

val>

>

=4;

val&

=0x0f;

val*=10;

temp+=val;

returntemp;

}

ucharHEX2BCD(ucharval) 

//B码转换为BCD码

uchari,j,k;

i=val/10;

j=val;

k=j+(i<

<

4);

returnk;

voiddelayus(uintus) 

while(us--);

voidStart_I2C()

SDA=1;

//发送起始条件的数据信号

delayus

(1);

SCL=1;

delayus(5);

//起始条件建立时间大于4.7us,延时

SDA=0;

//发送起始信号

//起始条件锁定时间大于4μs

SCL=0;

//钳住I2C总线,准备发送或接收数据

delayus

(2);

voidStop_I2C()

//发送结束条件的数据信号

//发送结束条件的时钟信号

//结束条件建立时间大于4us

//发送I2C总线结束信号

delayus(4);

voidSendByte(ucharc)

ucharBitCnt;

for(BitCnt=0;

BitCnt<

8;

BitCnt++) 

//要传送的数据长度为8位

{

if((c<

BitCnt)&

0x80)

//判断发送位

else 

//置时钟线为高,通知被控器开始接收数据位

//保证时钟高电平周期大于4μs 

}

//8位发送完后释放数据线,准备接收应答位

delayus(3);

if(SDA==1)

ack=0;

else

ack=1;

//判断是否接收到应答信号

ucharRcvByte()

ucharretc;

retc=0;

//置数据线为输入方式

BitCnt++)

//置时钟线为低,准备接收数据位

//时钟低电平周期大于4.7μs

//置时钟线为高使数据线上数据有效

retc=retc<

1;

retc=retc+1;

//读数据位,接收的数据位放入retc中

return(retc);

voidAck_I2C(bita)

if(a==0)

//在此发出应答或非应答信号

//时钟低电平周期大于4μs

//清时钟线,钳住I2C总线以便继续接收

ucharwrite_byte(ucharaddr,ucharwrite_data)

Start_I2C();

SendByte(DS3231_WriteAddress);

if(ack==0)

return0;

SendByte(addr);

SendByte(write_data);

Stop_I2C();

delayus(10);

return1;

ucharread_current()

ucharread_data;

SendByte(DS3231_ReadAddress);

if(ack==0)

return(0);

read_data=RcvByte();

Ack_I2C

(1);

returnread_data;

ucharread_random(ucharrandom_addr)

SendByte(random_addr);

return(read_current());

voidModifyTime(ucharyea,ucharmon,ucharda,ucharhou,ucharmin,ucharsec)

uchartemp=0;

temp=HEX2BCD(yea);

write_byte(DS3231_YEAR,temp);

//修改年

temp=HEX2BCD(mon);

write_byte(DS3231_MONTH,temp);

//修改月

temp=HEX2BCD(da);

write_byte(DS3231_DAY,temp);

//修改日

temp=HEX2BCD(hou);

write_byte(DS3231_HOUR,temp);

//修改时

temp=HEX2BCD(min);

write_byte(DS3231_MINUTE,temp);

//修改分

temp=HEX2BCD(sec);

write_byte(DS3231_SECOND,temp);

//修改秒

voidTimeDisplay(ucharDhour,ucharDmin,ucharDsec)

dis_buf[7]=dis_code[Dhour/10];

//时十位

dis_buf[6]=dis_code[Dhour%10];

//时个位

dis_buf[4]=dis_code[Dmin/10];

//分十位

dis_buf[3]=dis_code[Dmin%10];

//分个位

dis_buf[1]=dis_code[Dsec/10];

//秒十位

dis_buf[0]=dis_code[Dsec%10];

//秒个位

dis_buf[2]=0xbf;

//显示"

-"

dis_buf[5]=0xbf;

voidDateDisplay(ucharDyear,ucharDmonth,ucharDday)

dis_buf[7]=dis_code[Dyear/10];

//年十位

dis_buf[6]=dis_code[Dyear%10];

//年个位

dis_buf[4]=dis_code[Dmonth/10];

//月十位

dis_buf[3]=dis_code[Dmonth%10];

//月个位

dis_buf[1]=dis_code[Dday/10];

//天十位

dis_buf[0]=dis_code[Dday%10];

//天个位

voidget_show_time(void)

ucharHtemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;

Htemp1=read_random(DS3231_HOUR);

//时24小时制

Htemp1&

=0x3f;

Htemp2=BCD2HEX(Htemp1);

Mtemp1=read_random(DS3231_MINUTE);

Mtemp2=BCD2HEX(Mtemp1);

Stemp1=read_random(DS3231_SECOND);

Stemp2=BCD2HEX(Stemp1);

TimeDisplay(Htemp2,Mtemp2,Stemp2);

voidget_show_date(void)

ucharYtemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;

Ytemp1=read_random(DS3231_YEAR);

Ytemp2=BCD2HEX(Ytemp1);

Mtemp1=read_random(DS3231_MONTH);

Dtemp1=read_random(DS3231_DAY);

Dtemp2=BCD2HEX(Dtemp1);

DateDisplay(Ytemp2,Mtemp2,Dtemp2);

voidget_show_Temperature(void)

ucharTtemp1,Ttemp2,Ttemp3,Ttemp4;

Ttemp1=read_random(DS3231_TEMPERATUREH);

//温度高字节

Ttemp2=BCD2HEX(Ttemp1);

Ttemp3=read_random(DS3231_TEMPERATUREL);

//温度低字节

Ttemp4=BCD2HEX(Ttemp3);

DateDisplay(0,Ttemp2,Ttemp4);

voidtimer0()interrupt1

TH0=0xFC;

TL0=0x17;

P2=0xff;

//先关闭所有数码管

P0=dis_buf[dis_index];

//显示代码传送到P0口

P2=dis_digit;

if(dis_digit&

0x80)

dis_digit=(dis_digit<

1)|0x1;

1);

dis_index++;

dis_index&

=0x07;

//8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描

voidmain()

uintii=0;

RESET=0x1;

//DS3231复位操作,正常操作下不需要每次都复位

delayus(5000);

led0=0;

led1=0;

led2=0;

led3=0;

led4=0;

P0=0xff;

dis_digit=0xfe;

dis_index=0;

TimeDisplay(12,5,18);

TMOD=0x11;

//定时器0,1工作模式1,16位定时方式

TCON=0x01;

IE=0x82;

//使能timer0,1中断

TR0=1;

if(write_byte(DS3231_CONTROL,0x1C)==0)

led0=1;

if(write_byte(DS3231_STATUS,0x00)==0)

led1=1;

ModifyTime(10,6,13,15,30,00);

//初始化时钟,2010/6/13,15/30/00

//小时采用24小时制

while

(1)

//get_show_date();

//显示日期

//get_show_Temperature();

//显示温度

get_show_time();

//显示时间

delayus(50000);

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

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2