SPI总线的DS1302实时钟控制.docx

上传人:b****8 文档编号:9851572 上传时间:2023-02-07 格式:DOCX 页数:17 大小:91.81KB
下载 相关 举报
SPI总线的DS1302实时钟控制.docx_第1页
第1页 / 共17页
SPI总线的DS1302实时钟控制.docx_第2页
第2页 / 共17页
SPI总线的DS1302实时钟控制.docx_第3页
第3页 / 共17页
SPI总线的DS1302实时钟控制.docx_第4页
第4页 / 共17页
SPI总线的DS1302实时钟控制.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

SPI总线的DS1302实时钟控制.docx

《SPI总线的DS1302实时钟控制.docx》由会员分享,可在线阅读,更多相关《SPI总线的DS1302实时钟控制.docx(17页珍藏版)》请在冰豆网上搜索。

SPI总线的DS1302实时钟控制.docx

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))

{i=1;j=0;}

Elseif(((Curtime[6]/16*10+Curtime[6]%16)%4!

=0)&&(Curtime[4]==0x02)&&(j==0x02)&&(i==0x09))

{i=1;j=0;}

elseif(((Curtime[4]==0x01)||(Curtime[4]==0x03)||(Curtime[4]==0x05)||(Curtime[4]==0x07)||(Curtime[4]==0x08)||(Curtime[4]==0x10)||(Curtime[4]==0x12))&&(j==0x03)&&(i==0x02))

{i=1;j=0;}

elseif(((Curtime[4]==0x04)||(Curtime[4]==0x06)||(Curtime[4]==0x09)||(Curtime[4]==0x11))&&(j==0x03)&&(i==0x01))

{i=1;j=0;}

DATA=(j<<4)+i;

return(DATA);

}

unsignedcharadd4(unsignedcharDATA)//月份调整子程序

{unsignedchari,j;

i=DATA%16;

j=DATA>>4;

i++;

if(i==0x0a)

{i=0;j++;}

if((j==0x01)&&(i==0x03))//超过12就变成0,i低位,j高位

{i=1;j=0;}

DATA=(j<<4)+i;

return(DATA);

}

unsignedcharadd5(unsignedcharData)//年份调整子程序

{unsignedchari,j;

i=Data%16;

j=Data/16;

i++;

if(i==0x0a)

{i=0;j++;}

if((j==0x0a)&&(i==0x00))

{i=0;j=0;}

Data=(j<<=4)+i;

return(Data);

}

voidDisplay1(unsignedchar*num)//显示时间

{unsignedchari,j,m=0x08;

for(i=0;i<3;i++)

{*num=CODE2[Curtime[i]&0x0f];

Write7219(m,*num);

j=Curtime[i]>>4;

num++;

m--;

*num=CODE2[j&0x0f];

Write7219(m,*num);

num++;

m--;

if(num!

=8)

{*num=0x01;

Write7219(m,0x01);

num++;

m--;

}

}

}

voidDisplay2(unsignedchar*num)//显示日期

{unsignedchari,j,m=0x08;

for(i=3;i<5;i++)

{*num=CODE2[Curtime[i]&0x0f];

Write7219(m,*num);

j=Curtime[i]>>4;

num++;

m--;

*num=CODE2[j&0x0f];

Write7219(m,*num);

num++;

m--;

if(num!

=5)

{*num=0x01;

Write7219(m,0x01);

num++;

m--;

}

}

*num=CODE2[Curtime[6]&0x0f];

Write7219(m,*num);

j=Curtime[6]>>4;

num++;

m--;

*num=CODE2[j&0x0f];

Write7219(m,*num);

num++;

m--;

}

#endif

 

六、实验小结

这次实验让我掌握具有SPI总线DS1302、MAX7219芯片的应用及编程,在实验中体会乐趣并掌握新知识是我一直梦寐以求的。

我喜欢这样的实验,能用自己的双手做出有成就的东西,每当图形出现,心中就会有丝快乐,神奇的代码与图形的结合,让我更加佩服软件的设计者,虽然我不能达到他们的成就,但我也会凭着自己的兴趣,努力做好自己的每一件事,下次的实验我会继续努力。

附录:

图1日期的显示

图2时间的显示

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1