入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图 。
数据读写时序
3 电路原理图:
电路原理图如图,DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。
4软件设计
软件各模块设计流程: 日期功能设计:
时间功能设计:
闹钟功能设计:
闹钟设置显示设计 实现三个闹钟能够独立显示设置,互相之间没有干扰 编写程序实现闹钟到点后蜂鸣器响,LED灯亮红色 闹钟时间点过去后蜂鸣器停止响声,LED灯灭 模块功能实对显示的时间进行长度判断 在LED数码管上显示读出的时间 初始化向DS1302芯片写入初始化时从DS1302中读出时间 模块功能实对显示的日期进行在LED数码管上显示读初始化向DS1302芯片写入初始化日从DS1302中读出日DS1302芯片 DS1302芯片 程序实现代码:
#include
typedef unsigned char unchar; typedef unsigned int unint;
sbit T_CLK = P2^0; //DS1302中串行时钟引脚
sbit T_IO = P2^1; //DS1302中串行数据输入/输出 sbit T_RST = P2^2; //DS1302中复位/片选线 sbit Bee = P2^7; sbit DQ = P3^4; sbit DT =P0^7; sbit P1_6=P1^6; sbit P1_7=P1^7;
sbit TAD = P2^7; sbit K1=P2^6; sbit K2=P2^5; sbit K3=P2^4;
sbit ACC0=ACC^0;//累加寄存器 sbit ACC7=ACC^7;
unchar data year=0x10, month=0x07, date=0x25, day=0x01, hour=0x12, minute=0x59, second=0x45;
unchar data Led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //分别代表0,1,2,3,4,5,6,7,8,9,-
unchar data Dispbuff[] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unchar data ring[]={0x00,0x00}; unchar data ring1[]={0x00,0x00}; unchar data ring2[]={0x00,0x00};
unsigned char Code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unchar sec,min,hou,dat,mon,wek,yea,i=0,j=0,i1=0,i2=0,i3=0,i4=0; long k=0;
void CDelay(unchar CDelay) //延时 {
while(CDelay--); }
ReadOneChar(void) //读一个字节 {
unchar i = 0; unchar dat = 0; for(i=8;i>0;i--) {
DQ = 0; dat>>=1; DQ = 1;
if(DQ) //判断DQ高低电平,若为高电平则赋给dat高电平值 {
dat |= 0x80; }
CDelay(4);//延时 }
return(dat); //返回dat值 }
WriteOneChar(unchar dat) //写一个字节 {
unchar i = 0; for(i=8;i>0;i--) {
DQ = 0; //低电平脉冲信号 DQ = dat&0x01; CDelay(5);//延时
DQ = 1; //高电平脉冲信号 dat >>= 1;//dat右移一位 }
CDelay(4); }
void oneByteToClock(unchar ucDa) //向DS1302中写一位 {
unchar i; ACC= ucDa; for(i=8; i>0; i--) {
T_IO = ACC0; //相当于汇编中的 RRC T_CLK = 1; T_CLK = 0;
ACC =ACC>> 1;//下一位移到ACC0 } }
unchar oneByteFromClock(void) //从DS1302中读一位 {
unchar i;
for(i=8; i>0; i--) {
ACC = ACC>>1; //*相当于汇编中的 RRC ACC7 = T_IO;
T_CLK = 1; T_CLK = 0; }
return(ACC); }
void giveOneTime(unchar ucAddr, unchar ucDa) {
T_RST = 0; T_CLK = 0; T_RST = 1;
oneByteToClock(ucAddr); //地址,命令 oneByteToClock(ucDa); //写1Byte数据 T_CLK = 1; T_RST =0; }
unchar getOneTime(unchar ucAddr) {
unchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1;
oneByteToClock(ucAddr); // 地址,命令
ucDa = oneByteFromClock(); // 读1Byte数据 T_CLK = 1; T_RST =0; return(ucDa); }
void resetTime(void) {
giveOneTime(0x8e,0x00); //8e:写寄存器BIT7=WP 作
T_RST = 0; T_CLK = 0;
控制命令,WP=0,写操