1、SPI总线的DS1302实时钟控制SPI总线的DS1302实时钟控制实验四 SPI总线的DS1302实时钟控制一、实验目的1、了解电子电路PROTEUS软件的在单片机方面的仿真应用2、掌握具有SPI总线DS1302、MAX7219芯片的应用及编程二、实验要求在PROTEUS环境下,利用DS1302实时钟芯片实现时间、日期的显示,并且具有调节时间、日期的功能,显示用共阴极LED显示。用串行芯片MAX7219驱动LED显示.实现此功能的电路原理图如下所示:1、显示“星期”的共阳极二极管接到单片机的P0口,P0口数据线接上拉电阻;2、显示“时间”或“日期”,是采用MAX7219控制共阴极LED来实现
2、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、打开PROTEUS ISI
3、S,在PROTEUS ISIS编辑窗口中单击列表上的“P”按钮,添加下列元器件:元件名称所属类AT89C51Microprocessor ICSCRYSTAL 晶振MisecllaneousCAP 电容CapacitorRES 电阻ResistorDS1302Microprocessor ICS7SEG-COM-ANODE共阳极OptoeletronicsBUTTON按键Switches&relaysMAX7129Microprocessor ICSRESPACK-7排阻Resistor7SEG-MPX-CA-BLUE 共阴极Optoeletronics表1在PROTEUS编辑窗口添加完元器件
4、,连线。如附图1。四、软件设计 在KEIL环境下编辑、编译程序,生成*.HEX文件后,装入单片机即可。五、实验程序源程序:#include /包含特殊功能寄存器库#include #include /该汉字库要求在你要显示的位置装入你要的汉字模(16*16)。void main() Init7219(); /初始化7219 Set1302(time); /设置初始时间 Get1302(Curtime); /读回DS1302中的数据 P0=CODE1Curtime5-1;/显示星期 Display1(num); /默认显示时间 delay(255); /延时 delay(255); while(
5、1) Get1302(Curtime); /取数据 if(TICK=0) /判断是否更改 t=t; while(TICK=0) while (t=1) if(WEEK=0) /更改星期 w+; while (WEEK=0); Get1302(Curtime); Curtime5=Curtime5+w; if(Curtime5=8) Curtime5=1; w=0; Set1302(Curtime); else if(YEAR=0) /更改年份 while (YEAR=0); Get1302(Curtime); Curtime6=add5(Curtime6); Set1302(Curtime);
6、 else if(MONTH=0) /更改月份 while (MONTH=0); Get1302(Curtime); Curtime4=add4(Curtime4); Set1302(Curtime); else if(DAY=0) /更改号数 while (DAY=0); Get1302(Curtime); Curtime3=add3(Curtime3); Set1302(Curtime); else if(HOUR=0) /更改时 while (HOUR=0); Get1302(Curtime); Curtime2=add2(Curtime2); Set1302(Curtime); els
7、e if(MIN=0) /更改分 while (MIN=0); Get1302(Curtime); Curtime1=add1(Curtime1); Set1302(Curtime); else if(SEC=0) /更改秒 while (SEC=0); Get1302(Curtime); Curtime0=0; Set1302(Curtime); if(CHAN=0) /是否有显示切换 n=n; while(CHAN=0) Get1302(Curtime); if(n=1) Display2(num); else Display1(num); P0=CODE1Curtime5-1; if(T
8、ICK=0) t=t; while(TICK=0) if(CHAN=0) /是否有显示切换 n=n; while(CHAN=0) if(n=1) Display2(num); else Display1(num);头文件“DS1302”#ifndef _DS1302_H_#define _DS1302_H_/*/#include void InputByte(unsigned char Da)/把数据Da写入DS1302 的IO口,先送低位 unsigned char i; ACC=Da; for(i=8;i0;i-) /开始传输8个字节的数据 IO=ACC0; /取最低位,注意DS1302的
9、数据和地址都是从最低位开始传输的 SCLK=1; /时钟线拉高,制造上升沿,SDA的数据被传输 SCLK=0; /时钟线拉低,为下一个上升沿做准备 ACC=ACC1; unsigned char OutputByte(void)/读出DS1302的数据并保存在Da中 unsigned char i; for(i=8;i0;i-) ACC=ACC1; ACC7=IO; SCLK=1; SCLK=0; return(ACC); void Write1302(unsigned char Addr, unsigned char Da)/写入DS1302地址和数据 RST=0; /初始CE线置为0 SC
10、LK=0; /初始时钟线置为0 RST=1; /初始CE置为1,传输开始 InputByte(Addr); /地址,命令 传输命令字,要写入的时间/日期地址 InputByte(Da); /*写1Byte数据 /写入要修改的时间/日期 SCLK =1; /时钟线拉高 RST=0; /读取结束,CE置为0,结束数据的传输unsigned char Read1302(unsigned char Addr)/根据寄存器地址读出DS1302的相应数据 unsigned char DD; RST=0; /初始CE线置为0 SCLK=0;/初始时钟线置为0 RST=1; /初始CE置为1,传输开始 Inp
11、utByte(Addr); /地址,命令 传输命令字,要读取的时间/日历地址 DD=OutputByte(); /读1Byte数据 读取要得到的时间/日期 SCLK=1; /时钟线拉高 RST =0; /读取结束,CE置为0,结束数据的传输 return(DD);/得到的时间/日期void Set1302(unsigned char *pSDa)/设置时间 unsigned char i; unsigned char Addr=0x80; Write1302(0x8e,0x00); /控制命令,WP=0,写操作 for(i =7;i0;i-) Write1302(Addr,*pSDa); /格
12、式为:秒 分 时 日 月 星期 年 pSDa+; Addr+=2; Write1302(0x8e,0x80); /控制命令,WP=1,写保护void Get1302(unsigned char *pSDa) unsigned char i; unsigned char Addr=0x81; for(i=0;i=1;i-) CLK=0; DIN=ACC7; ACC=ACC0;x-) for(y=255;y0;y-);unsigned char add1(unsigned char DATA)/分、秒调整子程序 unsigned char i,j; i=DATA&0x0f; j=DATA4; i+
13、; if(i=0x0a) i=0x00;j+; if(j=0x06)&(i=0x00) /超过59就变成0 i低位,j高位 i=0;j=0; DATA=(j4; i+; if(i=10) i=0;j+; if(j=2)&(i=4) /超过23就变成0,i低位,j高位 i=0;j=0; DATA=(j4; i+; if(i=10) i=0;j+;if(Curtime6/16*10+Curtime6%16)%4=0)&(Curtime4=0x02)&(j=0x03)&(i=0x00) i=1;j=0; Else if(Curtime6/16*10+Curtime6%16)%4!=0)&(Curti
14、me4=0x02)&(j=0x02)&(i=0x09) i=1;j=0; else if(Curtime4=0x01)|(Curtime4=0x03)|(Curtime4=0x05)|(Curtime4=0x07)|(Curtime4=0x08)|(Curtime4=0x10)|(Curtime4=0x12)&(j=0x03)&(i=0x02) i=1;j=0; else if(Curtime4=0x04)|(Curtime4=0x06)|(Curtime4=0x09)|(Curtime4=0x11)&(j=0x03)&(i=0x01) i=1;j=0; DATA=(j4; i+; if(i=
15、0x0a) i=0;j+; if(j=0x01)&(i=0x03)/超过12就变成0,i低位,j高位 i=1;j=0; DATA=(j4)+i; return(DATA);unsigned char add5(unsigned char Data)/年份调整子程序 unsigned char i,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);void Display1(unsigned char *num)/显示时间 unsigned
16、 char i,j,m=0x08; for(i=0;i4; num+; m-; *num=CODE2j&0x0f; Write7219(m,*num); num+; m-; if(num!=8) *num=0x01; Write7219(m,0x01); num+; m-; void Display2(unsigned char *num)/显示日期 unsigned char i,j,m=0x08; for(i=3;i4; num+; m-; *num=CODE2j&0x0f; Write7219(m,*num); num+; m-; if(num!=5) *num=0x01; Write7
17、219(m,0x01); num+; m-; *num=CODE2Curtime6&0x0f; Write7219(m,*num); j=Curtime64; num+; m-; *num=CODE2j&0x0f; Write7219(m,*num); num+; m-;#endif六、实验小结这次实验让我掌握具有SPI总线DS1302、MAX7219芯片的应用及编程,在实验中体会乐趣并掌握新知识是我一直梦寐以求的。我喜欢这样的实验,能用自己的双手做出有成就的东西,每当图形出现,心中就会有丝快乐,神奇的代码与图形的结合,让我更加佩服软件的设计者,虽然我不能达到他们的成就,但我也会凭着自己的兴趣,努力做好自己的每一件事,下次的实验我会继续努力。附录:图1 日期的显示图2 时间的显示
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1