SCLK:
串行时钟,输入,控制数据的输入与输出;
I/O:
三线接口时的双向数据线;
CE:
输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:
第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。
③读写时序说明:
DS1302是SPI总线驱动方式。
它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
要想与DS1302通信,首先要先了解DS1302的控制字。
DS1302的控制字如下图。
7
6
5
4
3
2
1
0
1
RAM
A4
A3
A2
A1
A0
RD
CK
WR
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。
位6:
如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1(A4~A0):
指示操作单元的地址;
位0(最低有效位):
如为0,表示要进行写操作,为1表示进行读操作。
控制字总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。
④芯片与单片机连接图:
电路原理图如下图,DS1302与单片机的连接也仅需要3条线:
CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。
⑤驱动程序:
见软件设计部分
3.2.4蜂鸣电路:
蜂鸣器电路主要实现的是整点报时和闹铃的功能,电路连接如下:
3.2.5按键电路:
本设计采用的是独立按键方式,分别由单片机的P3.0,P3.1,P3.2,P3.3控
制,P3.0控制加,P3.1控制减,P3.2控制修改时间等信息,P3.3控制闹铃的
定。
单片机通过扫描键盘,读取信息,完成相应的动作。
相关程序见软件部分。
3.2.6稳压电源电路
①本电源采用桥式全波整流、大电容滤波、三端稳压器件7805稳压的方法,产生给单片机、液晶、DS1302等供电的+5V电压,输出的纹波较小,供电较稳定。
稳压电源电路图下图所示:
②7805相关资料
78**系列是三端正电源稳压电路,它的封装形式为TO-220,它有一系列固定的电压输出,应用非常的广泛。
每种类型由于内部电流的限制,以及过热保护和安全工作区的保护,使它基本上不会损坏。
如果能提供足够的散热片,它们就能够提供大于1.5A的输出电流。
虽然是按照固定电压值来设计的,但是当接入适当的外部器件后,就能够获得各种不同的电压和电流。
7805特点:
最大输出电流为1.5A;
输出电压为5V;
热过载保护;
短路保护;
输出晶体管安全工作区保护;
7805引脚图
四、软件设计
4.1软件设计内容
本设计的软件包括主程序、时钟显示子程序、键盘扫描程序、闹铃子程序、整点报时子程序等等,另外由于电路中有独立按键,因此还设计了防抖动程序来防止干扰。
4.2软件流程图
4.2.1主程序:
voidmain()//主函数
{
init();
Initial();//初始化DS1302
while
(1)
{
keyscan();
}
}
4.2.2时钟初始化:
voidInitial(void)
{
Write1302(WRITE_PROTECT,0X00);//禁止写保护
Write1302(WRITE_SECOND,0x56);//秒位初始化
Write1302(WRITE_MINUTE,0x59);//分钟初始化
Write1302(WRITE_HOUR,0x23);//小时初始化
Write1302(WRITE_day,0x31);//tian位初始化
Write1302(WRITE_month,0x12);//yue初始化
Write1302(WRITE_year,0x11);//nian初始化
Write1302(WRITE_week,0x06);
Write1302(WRITE_PROTECT,0x80);//允许写保护
}
voidinit()
{
ucharnum;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
五、调试及结果
5.1结果报告:
本多功能数字钟最终完成了简易数字钟的所有基本要求和所有发挥部分的内容。
具体结果如下:
1、上电后,按下复位键,电路即开始工作;
2、按下S1,选择对分、时、月份、日期、年份的修改,而星期是随着年份、月份和日期的修改而做出相应的变化的,所以不需要再修改;S1与S2按键分别表示加和减;修改完成后即可进行数字钟的显示;
3、因为加了整点报时的功能,所以每到整点时,蜂鸣器电路就会工作,蜂鸣器响的次数就代表了现在是几点,完成整点报时的要求;
4、按下S4,即进入闹铃设置界面;通过按S4选择秒、分、时的设定,即设置闹铃时间,当闹铃时间到的时候,蜂鸣器电路工作,就开始闹铃;这时再按S1就可关闭闹铃;这样便完成了闹铃功能的要求。
5.2调试中遇到的问题以及解决方法:
1、首先是硬件方面,本设计的电路不是十分复杂,所以我们先在PROTEL中画出了原理图,做好了在板子上的走线布局。
但在实际过程中,遇到不少问题。
比如,电路焊完之后,接好线,可是液晶上总是不显示字,我们以为是单片机芯片坏了,可是换了几个还是不成功;后来我们觉得可能是液晶的焊接错了,可是用万用表查了好几遍电路,都是没问题的。
试了很多次之后,我们才发现,液晶的3脚接的是电位器,而3脚是液晶显示对比度调节端,所以它的大小关系到液晶是不是可以显示字。
单片机学习板上焊的是5K的,我们焊的是20K,用万用表测量阻值,大概15K,这样肯定不显示字。
所以我们调节了电位器,成功了。
还比如,在调试的过程中,液晶常会突然变暗,然后就像断电了似的,过了会就又被初始化了。
检查电路是没有问题的,后来我们分析,老师在上课的时候提到过,自己做的电源有可能存在带载能力不强的问题,而且我们的电路把所有的电源线都并到一个输出端,而且我们的板上还有三块没参与工作的芯片,但都练到电源线上了,所以需要供电,这就可能导致供电不足,所以液晶就无法正常工作。
所以我们把不需要的电源线都拆掉,而且从电源那块板上多引了一根线直接供给液晶。
这样,就再也没发生过这种情况。
硬件调试中还有其他很多的情况出现,在这里就不再过多赘述了。
2、下面是软件方面,本数字钟的设计核心部分还是软件部分及编程。
其中涉及到每个部分的编写:
主程序、时钟程序、液晶程序、键盘扫描、以及对日期之类的修改,整点报时、闹铃等,工作量的比较大的,而且,将程序下到芯片中工作的时候,发生了按键不起作用、加减不起作用、闹铃无法实现等方面的问题,说明编程有很多地方出错,这些错误经过一点点改进之后也都完成了。
六、心得与收获
首先,通过这学期对单片机的学习和最后这个作品的完成,我们对单片机有了更进一步的了解,比以前进步了很多,也从中学习到了不少知识。
做这个设计花费了我们很多的时间,主要还是因为平时基础没打牢,所以以后我们会不断锻炼自己的动手能力,努力将书本上的知识运用与实践,争取做的更好!
!
参考文献:
《51单片机C语言教程》郭天祥电子工业出版社
《单片机原理及应用》姜志海电子工业出版社
《电子设计从零开始》杨欣清华大学出版社
《C语言程序设计》谭浩强清华大学出版社