SPI总线的DS1302实时钟控制Word文档格式.docx
- 文档编号:21937099
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:91.88KB
SPI总线的DS1302实时钟控制Word文档格式.docx
《SPI总线的DS1302实时钟控制Word文档格式.docx》由会员分享,可在线阅读,更多相关《SPI总线的DS1302实时钟控制Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
Switches&
relays
MAX7129
RESPACK-7排阻
7SEG-MPX-CA-BLUE共阴极
表1
在PROTEUS编辑窗口添加完元器件,连线。
如附图1。
四、软件设计
在KEIL环境下编辑、编译程序,生成*.HEX文件后,装入单片机即可。
五、实验程序
源程序:
#include<
reg51.h>
//包含特殊功能寄存器库
#include<
DS1302.h>
7219.h>
//该汉字库要求在你要显示的位置装入你要的汉字模(16*16)。
voidmain()
{Init7219();
//初始化7219
Set1302(time);
//设置初始时间
Get1302(Curtime);
//读回DS1302中的数据
P0=CODE1[Curtime[5]-1];
//显示星期
Display1(num);
//默认显示时间
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){};
Curtime[6]=add5(Curtime[6]);
elseif(MONTH==0)//更改月份
{while(MONTH==0){};
Curtime[4]=add4(Curtime[4]);
elseif(DAY==0)//更改号数
{while(DAY==0){};
Curtime[3]=add3(Curtime[3]);
elseif(HOUR==0)//更改时
{while(HOUR==0){};
Curtime[2]=add2(Curtime[2]);
elseif(MIN==0)//更改分
{while(MIN==0){};
Curtime[1]=add1(Curtime[1]);
elseif(SEC==0)//更改秒
{while(SEC==0){};
Curtime[0]=0;
if(CHAN==0)//是否有显示切换
{n=~n;
while(CHAN==0){}
if(n==1)Display2(num);
elseDisplay1(num);
P0=CODE1[Curtime[5]-1];
if(TICK==0)
{t=~t;
if(CHAN==0)//是否有显示切换
{n=~n;
if(n==1)Display2(num);
elseDisplay1(num);
}
头文件“DS1302”
#ifndef__DS1302_H__
#define__DS1302_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中
i--)
{ACC=ACC>
ACC7=IO;
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;
//初始时钟线置为0
//地址,命令传输命令字,要读取的时间/日历地址
DD=OutputByte();
//读1Byte数据读取要得到的时间/日期
SCLK=1;
RST=0;
//读取结束,CE置为0,结束数据的传输
return(DD);
//得到的时间/日期
voidSet1302(unsignedchar*pSDa)//设置时间
unsignedcharAddr=0x80;
Write1302(0x8e,0x00);
//控制命令,WP=0,写操作
for(i=7;
i--)
{Write1302(Addr,*pSDa);
//格式为:
秒分时日月星期年
pSDa++;
Addr+=2;
}
Write1302(0x8e,0x80);
//控制命令,WP=1,写保护
voidGet1302(unsignedchar*pSDa)
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写数据函数
ACC=DATA;
=1;
{CLK=0;
DIN=ACC7;
ACC=ACC<
<
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>
x--)
for(y=255;
y>
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)//小时调整子程序
i=DATA%16;
if(i==10){i=0;
if((j==2)&
(i==4))//超过23就变成0,i低位,j高位
{i=0;
DATA=(j<
return(DATA);
unsignedcharadd3(unsignedcharDATA)//号数调整子程序
if(((Curtime[6]/16*10+Curtime[6]%16)%4==0)&
(Curtime[4]==0x02)&
(j==0x03)&
(i==0x00))
{i=1;
Elseif(((Curtime[6]/16*10+Curtime[6]%16)%4!
=0)&
(j==0x02)&
(i==0x09))
elseif(((Curtime[4]==0x01)||(Curtime[4]==0x03)||(Curtime[4]==0x05)||(Curtime[4]==0x07)||(Curtime[4]==0x08)||(Curtime[4]==0x10)||(Curtime[4]==0x12))&
(i==0x02))
{i=1;
elseif(((Curtime[4]==0x04)||(Curtime[4]==0x06)||(Curtime[4]==0x09)||(Curtime[4]==0x11))&
(i==0x01))
}
unsignedcharadd4(unsignedcharDATA)//月份调整子程序
if((j==0x01)&
(i==0x03))//超过12就变成0,i低位,j高位
{i=1;
unsignedcharadd5(unsignedcharData)//年份调整子程序
i=Data%16;
j=Data/16;
if((j==0x0a)&
Data=(j<
=4)+i;
return(Data);
voidDisplay1(unsignedchar*num)//显示时间
{unsignedchari,j,m=0x08;
3;
{*num=CODE2[Curtime[i]&
0x0f];
Write7219(m,*num);
j=Curtime[i]>
num++;
m--;
*num=CODE2[j&
if(num!
=8)
{*num=0x01;
Write7219(m,0x01);
num++;
m--;
voidDisplay2(unsignedchar*num)//显示日期
for(i=3;
5;
=5)
*num=CODE2[Curtime[6]&
Write7219(m,*num);
j=Curtime[6]>
num++;
m--;
*num=CODE2[j&
六、实验小结
这次实验让我掌握具有SPI总线DS1302、MAX7219芯片的应用及编程,在实验中体会乐趣并掌握新知识是我一直梦寐以求的。
我喜欢这样的实验,能用自己的双手做出有成就的东西,每当图形出现,心中就会有丝快乐,神奇的代码与图形的结合,让我更加佩服软件的设计者,虽然我不能达到他们的成就,但我也会凭着自己的兴趣,努力做好自己的每一件事,下次的实验我会继续努力。
附录:
图1日期的显示
图2时间的显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SPI 总线 DS1302 实时 控制