sm町島5Pl-flB
关屏
A
GHnnsea
RPt
rr5P*r»?
-i
a-1754£^0T.
hEHptplm叭可
LUJ1
U¥I=IL
hb-•-一-
EG
EHBEGEB
F
'■
叭TP”価H-厕
时间调整
六、总结与体会
历经一个星期的设计、修改、调试,最终,我们得到了想要的结果,感受成功之喜悦,但这并不意味着我们做得很好,相反,在这当中暴露出了我们在各个方面许许多多的问题,学到许多的同时感触也很深厚。
在硬件设计时,通过对需要系统的分析,单元模块的设计,元件的选取等,使我们了解到平时所学单片机课程的实用价值,以及设计过程中的大局协调、取舍、分析能力的培养。
在编程以及仿真时,充分将单片机原理的知识学以致用,既是对我们单片机基础知识的考验,又是对我们灵活运用及创新能力的检验;既考验我们的学习能力,又考验逻辑思维技巧;既体现了个人对课程设计的灵思妙想,又培养了团队之间的合作能力。
我们能够很好地完成这次课设,离不开在科学研究上实事的工作原则、一丝不苟的工作态度、勤于思考的工作方法、百折不饶的工作精神和精益求精的工作作风,此外,最重要的就是团队之间相处和谐、分工明确。
在大家的共同努力下,
得到了满意的成果,更使我们明白团队合作的重要与便利。
最后,衷心感谢老师在这次设计中耐心给予的大量帮助,解决了我程序中存在的不少问题,并指导了我一些设计的思路,也令我明白自己的大量不足之处,受益匪浅。
附录
1、程序
#include
#include
#defineucharunsignedchar
#defineDS1302_SECOND_WRITE0x80
#defineDS1302_MINUTE_WRITE0x82
#defineDS1302_HOUR_WRITE0x84
#defineDS1302_DAY_WRITE0x86
#defineDS1302_WEEK_WRITE0x8a
#defineDS1302_MONTH_WRITE0x88
#defineDS1302_YEAR_WRITE0x8c
#defineDS1302_PROTECT_WRITE0x8e
#defineDS1302_SECOND_READ0x81
#defineDS1302_MINUTE_READ0x83
#defineDS1302_HOUR_READ0x85
#defineDS1302_DAY_READ0x87
#defineDS1302_WEEK_READ0x8b
#defineDS1302_MONTH_READ0x89
#defineDS1302_YEAR_READ0x8dsbitIcden=P2A2;
sbitIcdrs=P2A0;
sbitwrite=P2A1;
sbitsck=P1A6;//时钟
sbitio=P1A7;//数据
sbitrst=P1A5;//DS1302复位
unsignedcharChinese_1[3]={0x2d,0x20,0x3a};//“-”“”
一二三四五六天
定义光标移动的位置
unsignedcharChinese_2[7]={0x31,0x32,0x33,0x34,0x35,0x36,0x37};//
//unsignedcharCursor[6]={0x81,0x83,0x85,0x90,0x92,0x94};//
unsignedcharnum=0;
unsignedintji=0;
unsignedintjiao=0;
voidDeIayms(unsignedintz)//延时
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
//Icd子程序
voidWrite_(unsignedchar)//写命令
{
Icdrs=0;
P0=;
DeIayms(5);
Icden=1;
Delayms(5);
lcden=0;
写数据
}
voidWrite_data(unsignedchardat)//
{
lcdrs=1;
P0=dat;
Delayms(5);
lcden=1;
Delayms(5);
lcden=0;
}
unsignedcharRead_()//读命令
{
unsignedchar;
write=1;
lcdrs=0;
lcden=1;
=P0;
Delayms(5);
write=0;
lcdrs=0;
lcden=0;
return;
}
voidinit_lcd()//lcd初始化
{
lcden=0;
Write_(0x38);
Write_(0x0c);
Write_(0x06);
Write_(0x01);
Write_(0x80);
}
//ds1302子程序
voidDS1302WriteByte(uchardat)//写字节
{
uchari;
sck=0;
Delayms
(2);
for(i=0;i<8;i++)
{
io=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的
Delayms
(2);
sck=1;
Delayms
(2);
sck=0;
dat>>=1;
}
}
ucharDS1302ReadByte()//读字节
{
uchari,dat;
Delayms
(2);
for(i=0;i<8;i++)
{
dat>>=1;
if(io==1)//当数据线为高时,证明该位数据为1
dat|=0x80;//要传输数据的当前值置为1,若不是,则为0sck=1;
Delayms
(2);
sck=0;
Delayms
(2);
}
returndat;
读命令
传输地址
读取要得到的时间/日期
}
ucharDS1302Read(ucharcmd)//
{
uchardat;
rst=0;
sck=0;
rst=1;
DS1302WriteByte(cmd);//
dat=DS1302ReadByte();//
sck=1;
rst=0;returndat;
}
voidDS1302Write(ucharcmd,uchardat)//写命令
{
rst=0;
sck=0;
rst=1;
DS1302WriteByte(cmd);//传输地址
DS1302WriteByte(dat);//写入时间/日期
sck=1;
rst=0;
}
voidInit_DS1302(void)//初始化
{
DS1302Write(0x8e,0x00);//写保护关
DS1302Write(DS1302_SECOND_WRITE,0x55);//初始秒值
DS1302Write(DS1302_MINUTE_WRITE,0x59);//初始分钟
DS1302Write(DS1302_HOUR_WRITE,0x23);//初始为24小时模式初始时间为
DS1302Write(DS1302_DAY_WRITE,0x02);//20xx年x月x日星期x
DS1302Write(DS1302_MONTH_WRITE,0x03);
DS1302Write(DS1302_YEAR_WRITE,0x16);
DS1302Write(DS1302_WEEK_WRITE,0x03);
DS1302Write(0x90,0x01);//充电
DS1302Write(0xc0,0xf0);//初始化一次标示
DS1302Write(0x8e,0x80);
}
voidSplit_display(unsignedcharaddress)//取数显示
{
unsignedchari;
i=DS1302Read(address);
i=i/16+'0';
Write_data(i);//显示十位
Delayms(3);
i=DS1302Read(address);i=i%16+'0';
Write_data(i);//显示个位
Delayms(5);
}
voidDispaly_shi()//显示时间
{
Write_(0x84);
Split_display(DS1302_HOUR_READ);//
Write_data(Chinese_1[2]);//显示“:
”
Delayms(3);
Split_display(DS1302_MINUTE_READ);//
Write_data(Chinese_1[2]);
Delayms(3);
Split_display(DS1302_SECOND_READ);//
Delayms(3);
Delayms(50);
}
显示小时
显示分钟
显示秒
voidDisplay_nian()//显示年月日
{
uchari;
Write_(0x82);
Delayms(100);
Write_(0x82);
Delayms(100);
Write_data('2');
Delayms(5);
Write_data('0');
Delayms
(1);
Split_display(DS1302_YEAR_READ);//显示年份
Write_data(Chinese_1[0]);//显示“-”
Delayms(3);
Split_display(DS1302_MONTH_READ);//显示月份
Write_data(Chinese_1[0]);
Delayms(3);
Split_display(DS1302_DAY_READ);//显示日期
Write_data(Chinese_1[1]);
Delayms(3);
Write_data(Chinese_1[1]);
Delayms(3);
i=DS1302Read(DS1302_WEEK_READ);//显示星期i=i%16+'0';
Write_data(i);
Delayms(3);
Write_(0x82);
Delayms(50);
}
voidinter0()interrupt0//按键中断1
{
ji=ji+1;
if(ji%2==0)
Write_(0x0c);
else
Write_(0x08);
}
voidinter2()interrupt2//按键中断2
{
unsignedchark,j,i,b;
//Delayms(500);
while(INT1!
=1);
b=Read_();
b=ACC&0x7f;
Write_(0x01);
Dispaly_shi();
EA=0;
EX0=0;EX1=0;k=DS1302Read(DS1302_SECOND_READ);
while(INT1)
{
Write_(0x8a);
Write_(0x0f);
if(INT0==0)
{
Delayms(10);if(INT0==0)
{
if(k<0x59)
{
ACC=k;
#pragmaasmadda,#1daa
#pragmaendasmk=ACC;
else
{
DS1302Write(DS1302_SECOND_WRITE,k);
while(k!
=0)
{k=DS1302Read(DS1302_SECOND_READ);}
Write_(0x01);
Dispaly_shi();
}
Write_(0x8a);
i=k/16+'0';
j=k%16+'0';
Write_data(i);
Delayms(3);
Write_data(j);
while(!
INT0);
}
}
}
while(!
INT1);
DS1302Write(DS1302_SECOND_WRITE,k);
Write_(0x0c);
Write_(0x01);
if(jiao==0)
{Dispaly_shi();}
else{Display_nian();}
Write_(b);
EA=1;
EX0=1;EX1=1;
}
voidmain()
{
uchari;
write=0;
Delayms(50);
IT0=1;IT1=1;
EX0=1;EX1=1;
EA=1;
init_lcd();
Init_DS1302();
while
(1)
{
Write_(0x01);
for(i=9;i>0;i--)
Dispaly_shi();
Write_(0x01);
for(i=9;i>0;i--)
Display_nian();
Delayms(50);
};
}
2、参考文献
郭文川.MCS-51单片机原理、接口及应用电子工业出版社2013.01吴国凤、宣善立.C/C++程序设计高等教育出版社2009.09江思敏、明Protel电路设计教程清华大学出版社2006.12莫名到奇妙.DS1302中文资料,带源代码XX文库2012.5.10
wubanwudi.
超详细的ds1302使用说明及其例程XX文库2011.08.10
指导教师评语:
成绩评定:
指导教师: