SPI总线的DS1302实时钟控制.docx
- 文档编号:25160428
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:12
- 大小:18.24KB
SPI总线的DS1302实时钟控制.docx
《SPI总线的DS1302实时钟控制.docx》由会员分享,可在线阅读,更多相关《SPI总线的DS1302实时钟控制.docx(12页珍藏版)》请在冰豆网上搜索。
SPI总线的DS1302实时钟控制
实验四SPI总线的DS1302实时钟控制
一、实验目的
1、了解电子电路PROTEUS软件的在单片机方面的仿真应用
2、掌握具有SPI总线DS1302、MAX7219芯片的应用及编程
二、实验要求
在PROTEUS环境下,利用DS1302实时钟芯片实现时间、日期的显示,并且具有调节时间、日期的功能,显示用共阴极LED显示。
用串行芯片MAX7219驱动LED显示.
实现此功能的电路原理图如下所示:
1、显示“星期”的共阳极二极管接到单片机的P0口,P0口数据线接上拉电阻;
2、显示“时间”或“日期”,是采用MAX7219控制共阴极LED来实现
3、DS1302的IO脚接单片机的P1.1,时钟信号SCLK接单片机P1.0,复位信号/RST接单片机P1.2。
DS1302的晶振在这里可以不接,电源、地线都省略。
4、MAX7219是用来驱动“时间”或“日期”的LED显示的。
MAX7219的DIN信号脚接单片机的P2.0,/LOAD接单片机的P2.1,CLK接单片机的P2.2;
5、时间/日期的调整:
按下调整键,再分别按相应的“星期”、“年”、“月”、“日”,“时”、“分”、“秒“键,即可以调整时间/日期;
6、在正常显示时,按下“时间/日期“切换键,即可以在显示时间或日期来回切换。
三、PROTEUS环境下的硬件设计
1、打开PROTEUSISIS,在PROTEUSISIS编辑窗口中单击列表上的“P”按钮,添加下列元器件:
元件名称
所属类
AT89C51
MicroprocessorICS
CRYSTAL晶振
Misecllaneous
CAP电容
Capacitor
RES电阻
Resistor
DS1302
MicroprocessorICS
7SEG-COM-ANODE共阳极
Optoeletronics
BUTTON按键
Switches&relays
MAX7129
MicroprocessorICS
RESPACK-7排阻
Resistor
7SEG-MPX-CA-BLUE共阴极
Optoeletronics
表1
在PROTEUS编辑窗口添加完元器件,连线。
如附图1。
四、软件设计
在KEIL环境下编辑、编译程序,生成*.HEX文件后,装入单片机即可。
五、实验程序
源程序:
#include
#include
#include<7219.h>//该汉字库要求在你要显示的位置装入你要的汉字模(16*16)。
voidmain()
{Init7219();//初始化7219
Set1302(time);//设置初始时间
Get1302(Curtime);//读回DS1302中的数据
P0=CODE1[Curtime[5]-1];//显示星期
Display1(num);//默认显示时间
delay(255);//延时
delay(255);
while
(1)
{Get1302(Curtime);//取数据
if(TICK==0)//判断是否更改
{t=~t;
while(TICK==0){}
}
while(t==1)
{if(WEEK==0)//更改星期
{w++;
while(WEEK==0){};
Get1302(Curtime);
Curtime[5]=Curtime[5]+w;
if(Curtime[5]==8)Curtime[5]=1;
w=0;
Set1302(Curtime);
}
elseif(YEAR==0)//更改年份
{while(YEAR==0){};
Get1302(Curtime);
Curtime[6]=add5(Curtime[6]);
Set1302(Curtime);
}
elseif(MONTH==0)//更改月份
{while(MONTH==0){};
Get1302(Curtime);
Curtime[4]=add4(Curtime[4]);
Set1302(Curtime);
}
elseif(DAY==0)//更改号数
{while(DAY==0){};
Get1302(Curtime);
Curtime[3]=add3(Curtime[3]);
Set1302(Curtime);
}
elseif(HOUR==0)//更改时
{while(HOUR==0){};
Get1302(Curtime);
Curtime[2]=add2(Curtime[2]);
Set1302(Curtime);
}
elseif(MIN==0)//更改分
{while(MIN==0){};
Get1302(Curtime);
Curtime[1]=add1(Curtime[1]);
Set1302(Curtime);
}
elseif(SEC==0)//更改秒
{while(SEC==0){};
Get1302(Curtime);
Curtime[0]=0;
Set1302(Curtime);
}
if(CHAN==0)//是否有显示切换
{n=~n;
while(CHAN==0){}
}
Get1302(Curtime);
if(n==1)Display2(num);
elseDisplay1(num);
P0=CODE1[Curtime[5]-1];
if(TICK==0)
{t=~t;
while(TICK==0){}
}
}
if(CHAN==0)//是否有显示切换
{n=~n;
while(CHAN==0){}
}
if(n==1)Display2(num);
elseDisplay1(num);
}
}
头文件“DS1302”
#ifndef__DS1302_H__
#define__DS1302_H__
/****/
#include<7219.h>
voidInputByte(unsignedcharDa)//把数据Da写入DS1302的IO口,先送低位
{unsignedchari;
ACC=Da;
for(i=8;i>0;i--)//开始传输8个字节的数据
{IO=ACC0;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的
SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输
SCLK=0;//时钟线拉低,为下一个上升沿做准备
ACC=ACC>>1;
}
}
unsignedcharOutputByte(void)//读出DS1302的数据并保存在Da中
{unsignedchari;
for(i=8;i>0;i--)
{ACC=ACC>>1;
ACC7=IO;
SCLK=1;
SCLK=0;
}
return(ACC);
}
voidWrite1302(unsignedcharAddr,unsignedcharDa)//写入DS1302地址和数据
{RST=0;//初始CE线置为0
SCLK=0;//初始时钟线置为0
RST=1;//初始CE置为1,传输开始
InputByte(Addr);//地址,命令传输命令字,要写入的时间/日期地址
InputByte(Da);//*写1Byte数据//写入要修改的时间/日期
SCLK=1;//时钟线拉高
RST=0;//读取结束,CE置为0,结束数据的传输
}
unsignedcharRead1302(unsignedcharAddr)//根据寄存器地址读出DS1302的相应数据
{unsignedcharDD;
RST=0;//初始CE线置为0
SCLK=0;//初始时钟线置为0
RST=1;//初始CE置为1,传输开始
InputByte(Addr);//地址,命令传输命令字,要读取的时间/日历地址
DD=OutputByte();//读1Byte数据读取要得到的时间/日期
SCLK=1;//时钟线拉高
RST=0;//读取结束,CE置为0,结束数据的传输
return(DD);//得到的时间/日期
}
voidSet1302(unsignedchar*pSDa)//设置时间
{unsignedchari;
unsignedcharAddr=0x80;
Write1302(0x8e,0x00);//控制命令,WP=0,写操作
for(i=7;i>0;i--)
{Write1302(Addr,*pSDa);//格式为:
秒分时日月星期年
pSDa++;
Addr+=2;
}
Write1302(0x8e,0x80);//控制命令,WP=1,写保护
}
voidGet1302(unsignedchar*pSDa)
{unsignedchari;
unsignedcharAddr=0x81;
for(i=0;i<7;i++)
{*(pSDa+i)=Read1302(Addr);//格式为:
秒分时日月星期年
Addr+=2;
}
}
#endif
头文件“7219”
#ifndef__7219_H__
#define__7219_H__
/****/
#defineDECODE_MODE0x09
#defineINTESITY0x0a
#defineSCAN_LIMIT0x0b
#defineSHUT_DOWN0x0c
#defineDEISPLAY_TEST0x0f
unsignedchartime[]={0x00,0x00,0x08,0x28,0x05,0x06,0x11};//初始值,秒分时日月星期年
unsignedcharCurtime[7],num[8];
unsignedcharCODE1[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};//星期,共阳极字段
unsignedcharCODE2[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};
sbitRST=P1^2;
sbitIO=P1^1;
sbitSCLK=P1^0;
sbitDIN=P2^0;
sbitLOAD=P2^1;
sbitCLK=P2^2;
sbitWEEK=P3^0;
sbitYEAR=P3^1;
sbitMONTH=P3^2;
sbitDAY=P3^3;
sbitHOUR=P3^4;
sbitMIN=P3^5;
sbitSEC=P3^6;
sbitTICK=P3^7;
sbitCHAN=P1^7;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
bitn=0;
bitt=0;
unsignedcharw=0;
voidWrite_7219(unsignedcharDATA)//MAX7219写数据函数
{unsignedchari;ACC=DATA;
for(i=8;i>=1;i--)
{CLK=0;
DIN=ACC7;
ACC=ACC<<1;
CLK=1;
}
}
voidWrite7219(unsignedcharaddr,unsignedchardat)
{LOAD=0;
Write_7219(addr);
Write_7219(dat);
LOAD=1;
}
voidInit7219(void)
{Write7219(DECODE_MODE,0x00);//译码寄存器,写入00H,对0至7位均不译码
Write7219(INTESITY,0x04);//亮度调节寄存器,写入04H,实现一般的亮度显示
Write7219(SCAN_LIMIT,0x07);//扫描界限寄存器,写入07H,实现0到7位数码管的显示
Write7219(SHUT_DOWN,0x01);//停机寄存器,写入01H,实现正常工作
Write7219(DEISPLAY_TEST,0x00);//显示测试寄存器,写入00H,实现正常工作
}
voiddelay(unsignedcharm)//延时程序
{unsignedcharx,y;
for(x=m;x>0;x--)
for(y=255;y>0;y--);
}
unsignedcharadd1(unsignedcharDATA)//分、秒调整子程序
{unsignedchari,j;
i=DATA&0x0f;
j=DATA>>4;
i++;
if(i==0x0a)
{i=0x00;j++;}
if((j==0x06)&&(i==0x00))//超过59就变成0i低位,j高位
{i=0;j=0;}
DATA=(j<<4)+i;
return(DATA);
}
unsignedcharadd2(unsignedcharDATA)//小时调整子程序
{unsignedchari,j;
i=DATA%16;
j=DATA>>4;
i++;
if(i==10){i=0;j++;}
if((j==2)&&(i==4))//超过23就变成0,i低位,j高位
{i=0;j=0;}
DATA=(j<<4)+i;
return(DATA);
}
unsignedcharadd3(unsignedcharDATA)//号数调整子程序
{unsignedchari,j;
i=DATA%16;
j=DATA>>4;
i++;
if(i==10){i=0;j++;}
if(((Curtime[6]/16*10+Curtime[6]%16)%4==0)&&(Curtime[4]==0x02)&&(j==0x03)&&(i==0x00))
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SPI 总线 DS1302 实时 控制