DS1302电子钟程序.docx
- 文档编号:10826518
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:17
- 大小:17.21KB
DS1302电子钟程序.docx
《DS1302电子钟程序.docx》由会员分享,可在线阅读,更多相关《DS1302电子钟程序.docx(17页珍藏版)》请在冰豆网上搜索。
DS1302电子钟程序
#include
#defineucharunsignedchar
#defineuintunsignedint
//读写操作位//
#defineCMD_READ0x01
#defineCMD_WRITE0x00
//命令/
#defineCMD_SECOND0X80//秒寄存器。
#defineCMD_MINUTE0X82//分钟.
#defineCMD_HOUR0x84//小时
#defineCMD_DAY0X86//日
#defineCMD_MONTH0X88//月
#defineCMD_WEEK0X8A//星期/
#defineCMD_YEAR0X8C//年
#defineCMD_CONTROL0X8E//写保护。
#defineCMD_TRICKLE_CHARGE0X90//涓流充电/
#defineCMD_CLOCK_BURST0XBE//时钟突发模式/
//RAM命令,
#defineCMD_RAM_BASE0XC0//RAM区起始地址./
#defineCMD_RAM_BURST0XFE//RAM突发模式/
//时钟配置常量。
#defineCFG_CLOCK_HALT0X80//暂停时钟运行。
#defineCFG_12_240x80//12/24小时选择/
#defineCFG_AM_PM0X20//AM/PM位
#defineCFG_PROTECT0X80//写保护/
#defineCFG_UNPROTECT0X00//写允许/
sbitIO=P3^5;
sbitSCK=P1^6;
sbitRST=P1^7;
unsignedcharcur_time[7]={0x30,0x30,0x12,0x01,0x01,0x05,0x10};
uchars1num;
sbitE=P2^7;//1602使能引脚
sbitRW=P2^6;//1602读写引脚
sbitRS=P2^5;//1602数据/命令选择引脚
sbitkey1=P3^2;
sbitkey2=P3^3;
sbitkey3=P3^4;ucharcodetable[]="20--";
ucharcodetable1[]=":
:
";
voiddelay()
{
inti,j;
for(i=0;i<=100;i++)
for(j=0;j<=20;j++)
;
}
/********************************************************************
*名称:
enable(uchardel)
*功能:
1602命令函数
*输入:
输入的命令值
*输出:
无
***********************************************************************/
voidenable(uchardel)
{
P0=del;
RS=0;
RW=0;
E=0;
delay();
E=1;
delay();
}
/********************************************************************
*名称:
write(uchardel)
*功能:
1602写数据函数
*输入:
需要写入1602的数据
*输出:
无
***********************************************************************/
voidwrite(uchardel)
{
P0=del;
RS=1;
RW=0;
E=0;
delay();
E=1;
delay();
}
/********************************************************************
*名称:
L1602_init()
*功能:
1602初始化,请参考1602的资料
*输入:
无
*输出:
无
***********************************************************************/
voidL1602_init()
{
ucharnum;
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0x01);
enable(0x80);
for(num=0;num<14;num++)
{
write(table[num]);
delay();
}
enable(0x80+0x40);
for(num=0;num<11;num++)
{
write(table1[num]);
delay();
}
}
voidwrite_sfm2(ucharadd,uchardate)
{
ucharshi,ge;
shi=(date>>4)&0x07;
ge=date&0x0f;
enable(0x80+0x40+add);
write(0x30+shi);
write(0x30+ge);
}
voidwrite_sfm1(ucharadd,uchardate)
{
ucharshi,ge;
shi=date>>4;
ge=date&0x0f;
enable(0x80+add);
write(0x30+shi);
write(0x30+ge);
}
unsignedchards1302_rw(unsignedcharwdata)
{
unsignedchari;
unsignedcharrdata;
for(i=0;i<8;i++)
{
SCK=0;//时钟线拉低产生下降沿;/
rdata>>=1;
IO=1;//向MISO写12准备读,
if(IO==1)
{
rdata|=(1<<7);//最高为置11
}
if(wdata&0x01)
{
IO=1;//输出1;
}
else
{
IO=0;//输出0;
}
wdata>>=1;//右移一位;
SCK=1;//时钟线拉高,产生上升沿;
}
SCK=0;
returnrdata;
}
unsignedcharsingal_SPI(unsignedcharcommond,unsignedcharwdata)
{
unsignedcharrdata;
RST=1;//DS1302使能/
ds1302_rw(commond);//传送命令到DSDS1302.(写入地址)))
rdata=ds1302_rw(wdata);//写入或读出以字节数据。
。
RST=0;
returnrdata;
}
voidBurst_SPI(unsignedcharCMD,unsignedcharlen,
unsignedchar*pwdata,unsignedchar*prdata)
{
RST=1;//DS1302使能/
ds1302_rw(CMD);//传送命令到DSDS1302.
while(len--)
{
*prdata++=ds1302_rw(*pwdata++);
}
RST=0;//DS1302关断
}
voidxianshi()//显示函数/
{
if(singal_SPI(0x81,0xff)!
=cur_time[0])//读秒寄存器//
{
Burst_SPI(0XBE|CMD_READ,7,0,cur_time);//突发模式读/
write_sfm2(10,cur_time[0]);
write_sfm2(7,cur_time[1]);
write_sfm2(4,cur_time[2]);
write_sfm1(8,cur_time[3]);
write_sfm1(5,cur_time[4]);
write_sfm1(2,cur_time[6]);
}
}
voidkey()
{
if(key1==0)
{
delay();
if(key1==0)
{
s1num++;
while(key1==0);
if(s1num==1)
{
singal_SPI(0x80,cur_time[0]|0x80);//时钟暂停/
enable(0x80+3);
enable(0x0f);
}
if(s1num==2)
{
enable(0x80+6);
}
if(s1num==3)
{
enable(0x80+9);
}
if(s1num==4)
{
enable(0x80+0x40+5);
}
if(s1num==5)
{
enable(0x80+0x40+8);
}
if(s1num==6)
{
enable(0x80+0x40+11);
}
if(s1num==7)
{
s1num=0;
enable(0x0c);
singal_SPI(0x80,cur_time[0]&0x7f);//开时钟
}
}
}
}
voidkey_2()
{
if(s1num!
=0)
{
if(key2==0)
{
delay();
if(key2==0)
{
if(s1num==1)
{
cur_time[6]++;
if((cur_time[6]&0x0f)>9)
{
cur_time[6]&=0xf0;
cur_time[6]+=0x10;
}
if(cur_time[6]>=0x100)
cur_time[6]=0;
singal_SPI(0x8c,cur_time[6]);
write_sfm1(2,cur_time[6]);
enable(0x80+3);
}
if(s1num==2)
{
cur_time[4]++;
if((cur_time[4]&0x0f)>9)
{
cur_time[4]&=0xf0;
cur_time[4]+=0x10;
}
if((cur_time[4]&0x1f)>=0x13)
cur_time[4]=0;
singal_SPI(0x88,cur_time[4]&0x1f);
write_sfm1(5,cur_time[4]);
enable(0x80+6);
}
if(s1num==3)
{
cur_time[3]++;
if((cur_time[3]&0x0f)>9)
{
cur_time[3]&=0xf0;
cur_time[3]+=0x10;
}
if((cur_time[3]&0x3f)>=0x32)
cur_time[3]=0;
singal_SPI(0x86,cur_time[3]&0x3f);
write_sfm1(8,cur_time[3]);
enable(0x80+9);
}
if(s1num==4)
{
cur_time[2]++;
if((cur_time[2]&0x0f)>9)
{
cur_time[2]=cur_time[2]&0x10;
cur_time[2]=cur_time[2]+0x10;
}
if((cur_time[2]&0x3f)>=0x24)
cur_time[2]=0;
cur_time[2]&=0x3f;
singal_SPI(0x84,cur_time[2]);
write_sfm2(4,cur_time[2]);
enable(0x80+0x40+5);
}
if(s1num==5)
{
cur_time[1]++;
if((cur_time[1]&0x0f)>9)
{
cur_time[1]=(cur_time[1]&0xf0)+0x10;
}
if((cur_time[1]&0x7f)>=0x60)
cur_time[1]=0;
singal_SPI(0x82,cur_time[1]&0x7f);
write_sfm2(7,cur_time[1]);
enable(0x80+0x40+8);
}
if(s1num==6)
{
cur_time[0]++;
if((cur_time[0]&0x0f)>9)
{
cur_time[0]=cur_time[0]&0xf0;
cur_time[0]=cur_time[0]+0x10;
}
if((cur_time[0]&0x7f)>=0x60)
cur_time[0]=0;
singal_SPI(0x80,cur_time[0]|0x80);
write_sfm2(10,cur_time[0]);
enable(0x80+0x40+11);
}
}
}
}
}
voidkey_3()
{
if(s1num!
=0)
{
if(key3==0)
{
delay();
if(key3==0)
{
if(s1num==1)
{
cur_time[6]--;
if((cur_time[6]&0x0f)==0x0f)
{
cur_time[6]=(cur_time[6]&0xf0)+0x09;
}
if(cur_time[6]==0xf9)
cur_time[6]=0x99;
singal_SPI(0x8c,cur_time[6]);
write_sfm1(2,cur_time[6]);
enable(0x80+3);
}
if(s1num==2)
{
cur_time[4]--;
if((cur_time[4]&0x0f)==0x0f)
{
cur_time[4]=(cur_time[4]&0xf0)+0x09;
}
if(cur_time[4]==0xf9)
cur_time[4]=0x12;
singal_SPI(0x88,cur_time[4]&0x1f);
write_sfm1(5,cur_time[4]);
enable(0x80+6);
}
if(s1num==3)
{
cur_time[3]--;
if((cur_time[3]&0x0f)==0x0f)
{
cur_time[3]=(cur_time[3]&0xf0)+0x09;
}
if(cur_time[3]==0xf9)
cur_time[3]=0x31;
singal_SPI(0x86,cur_time[3]&0x3f);
write_sfm1(8,cur_time[3]);
enable(0x80+9);
}
if(s1num==4)
{
cur_time[2]--;
if((cur_time[2]&0x0f)==0x0f)
{
cur_time[2]=(cur_time[2]&0xf0)+0x09;
}
if(cur_time[2]==0xf9)
cur_time[2]=0x23;
cur_time[2]&=0x3f;
singal_SPI(0x84,cur_time[2]);
write_sfm2(4,cur_time[2]);
enable(0x80+0x40+5);
}
if(s1num==5)
{
cur_time[1]--;
if((cur_time[1]&0x0f)==0x0f)
{
cur_time[1]=(cur_time[1]&0xf0)+0x09;
}
if(cur_time[1]==0xf9)
cur_time[1]=0x59;
singal_SPI(0x82,cur_time[1]&0x7f);
write_sfm2(7,cur_time[1]);
enable(0x80+0x40+8);
}
if(s1num==6)
{
cur_time[0]--;
if((cur_time[0]&0x0f)==0x0f)
{
cur_time[0]=(cur_time[0]&0xf0)+0x09;
}
if((cur_time[0]&0x7f)==0x79)
cur_time[0]=0x59;
singal_SPI(0x80,cur_time[0]|0x80);
write_sfm2(10,cur_time[0]);
enable(0x80+0x40+11);
}
}
}
}
}
voidmain()
{
L1602_init();
singal_SPI(0x8e,0x00);//写允许/
Burst_SPI(0XBE|CMD_WRITE,7,cur_time,0);//突发模式写//
//singal_SPI(0x8e,0x80);//写保护/
while
(1)
{
xianshi();
key();
key_2();
key_3();
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS1302 电子钟 程序