SPI總線的DS實時鐘控制_第1頁
SPI總線的DS實時鐘控制_第2頁
SPI總線的DS實時鐘控制_第3頁
SPI總線的DS實時鐘控制_第4頁
SPI總線的DS實時鐘控制_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、實驗四 SPI總線的DS1302實時鐘控制一、實驗?zāi)康?、了解電子電路PROTEUS軟件的在單片機方面的仿真應(yīng)用2、掌握具有SPI總線DS1302、MAX7219芯片的應(yīng)用及編程二、實驗要求在PROTEUS環(huán)境下,利用DS1302實時鐘芯片實現(xiàn)時間、日期的顯示,并且具有調(diào)節(jié)時間、日期的功能,顯示用共陰極LED顯示。用串行芯片MAX7219驅(qū)動LED顯示.實現(xiàn)此功能的電路原理圖如下所示:1、顯示“星期的共陽極二極管接到單片機的P0口,P0口數(shù)據(jù)線接上拉電阻;2、顯示“時間或“日期,是采用MAX7219控制共陰極LED來實現(xiàn)3、DS1302的IO腳接單片機的P1.1,時鐘信號SCLK接單片機P1.

2、0,復(fù)位信號/RST接單片機P1.2。DS1302的晶振在這里可以不接,電源、地線都省略。4、MAX7219是用來驅(qū)動“時間或“日期的LED顯示的。MAX7219的DIN信號腳接單片機的P2.0,/LOAD接單片機的P2.1,CLK接單片機的P2.2;5、時間/日期的調(diào)整:按下調(diào)整鍵,再分別按相應(yīng)的“星期、“年、“月、“日,“時、“分、“秒“鍵,即可以調(diào)整時間/日期;6、在正常顯示時,按下“時間/日期“切換鍵,即可以在顯示時間或日期來回切換。三、PROTEUS環(huán)境下的硬件設(shè)計1、翻開PROTEUS ISIS,在PROTEUS ISIS編輯窗口中單擊列表上的“P按鈕,添加以下元器件:元件名稱所屬

3、類AT89C51Microprocessor ICSCRYSTAL 晶振MisecllaneousCAP 電容CapacitorRES 電阻ResistorDS1302Microprocessor ICS7SEG-COM-ANODE共陽極OptoeletronicsBUTTON按鍵Switches&relaysMAX7129Microprocessor ICSRESPACK-7排阻Resistor7SEG-MPX-CA-BLUE 共陰極Optoeletronics表1在PROTEUS編輯窗口添加完元器件,連線。如附圖1。四、軟件設(shè)計 在KEIL環(huán)境下編輯、編譯程序,生成*.HEX文件后

4、,裝入單片機即可。五、實驗程序源程序:#include<reg51.h>/包含特殊功能存放器庫#include <DS1302.h> #include <7219.h> /該漢字庫要求在你要顯示的位置裝入你要的漢字模(16*16)。void main()Init7219(); /初始化7219 Set1302(time);/設(shè)置初始時間 Get1302(Curtime);/讀回DS1302中的數(shù)據(jù) P0=CODE1Curtime5-1;/顯示星期 Display1(num);/默認顯示時間 delay(255);/延時 delay(255); while(1

5、) Get1302(Curtime);/取數(shù)據(jù) 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); else if(M

6、ONTH=0)/更改月份 while (MONTH=0); Get1302(Curtime);Curtime4=add4(Curtime4);Set1302(Curtime); else if(DAY=0)/更改號數(shù) while (DAY=0); Get1302(Curtime);Curtime3=add3(Curtime3);Set1302(Curtime); else if(HOUR=0)/更改時 while (HOUR=0); Get1302(Curtime);Curtime2=add2(Curtime2);Set1302(Curtime); else if(MIN=0)/更改分 whi

7、le (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(TICK=0) t=t; while(TICK=0)

8、if(CHAN=0) /是否有顯示切換 n=n; while(CHAN=0) if(n=1) Display2(num); else Display1(num);頭文件“DS1302#ifndef _DS1302_H_#define _DS1302_H_/*/#include <7219.h> void InputByte(unsigned char Da)/把數(shù)據(jù)Da寫入DS1302 的IO口,先送低位unsigned char i; ACC=Da; for(i=8;i>0;i-)/開始傳輸8個字節(jié)的數(shù)據(jù) IO=ACC0; /取最低位,注意DS1302的數(shù)據(jù)和地址都是從最低

9、位開始傳輸?shù)?SCLK=1;/時鐘線拉高,制造上升沿,SDA的數(shù)據(jù)被傳輸 SCLK=0;/時鐘線拉低,為下一個上升沿做準備 ACC=ACC>>1; unsigned char OutputByte(void)/讀出DS1302的數(shù)據(jù)并保存在Da中 unsigned char i; for(i=8;i>0;i-) ACC=ACC>>1; ACC7=IO; SCLK=1; SCLK=0; return(ACC); void Write1302(unsigned char Addr, unsigned char Da)/寫入DS1302地址和數(shù)據(jù)RST=0; /初始CE

10、線置為0 SCLK=0; /初始時鐘線置為0 RST=1; /初始CE置為1,傳輸開始 InputByte(Addr); /地址,命令 傳輸命令字,要寫入的時間/日期地址 InputByte(Da); /*寫1Byte數(shù)據(jù) /寫入要修改的時間/日期 SCLK =1;/時鐘線拉高 RST=0;/讀取結(jié)束,CE置為0,結(jié)束數(shù)據(jù)的傳輸unsigned char Read1302(unsigned char Addr)/根據(jù)存放器地址讀出DS1302的相應(yīng)數(shù)據(jù)unsigned char DD; RST=0;/初始CE線置為0 SCLK=0;/初始時鐘線置為0 RST=1;/初始CE置為1,傳輸開始 I

11、nputByte(Addr); /地址,命令 傳輸命令字,要讀取的時間/日歷地址 DD=OutputByte(); /讀1Byte數(shù)據(jù)讀取要得到的時間/日期 SCLK=1; /時鐘線拉高 RST =0; /讀取結(jié)束,CE置為0,結(jié)束數(shù)據(jù)的傳輸 return(DD);/得到的時間/日期void Set1302(unsigned char *pSDa)/設(shè)置時間 unsigned char i; unsigned char Addr=0x80; Write1302(0x8e,0x00); /控制命令,WP=0,寫操作 for(i =7;i>0;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<7;i+) *(pSDa+i)=Read1302(Addr);/格式為: 秒 分 時 日 月 星期 年 Addr+=2; #endif頭文件“7219#ifndef _7219_H_#define _7219_H_/*/#define DECODE_MODE 0x09#d

13、efine INTESITY 0x0a#define SCAN_LIMIT 0x0b#define SHUT_DOWN 0x0c#define DEISPLAY_TEST 0x0funsigned char time=0x00,0x00,0x08,0x28,0x05,0x06,0x11;/初始值,秒分時日月星期年unsigned char Curtime7,num8;unsigned char CODE1=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8;/星期,共陽極字段unsigned char CODE2=0x7e,0x30,0x6d,0x79,0x33,0x5b,0

14、x5f,0x70,0x7f,0x7b;sbit RST=P12;sbit IO =P11;sbit SCLK=P10;sbit DIN=P20;sbit LOAD=P21;sbit CLK=P22;sbit WEEK=P30;sbit YEAR=P31;sbit MONTH=P32;sbit DAY=P33;sbit HOUR=P34;sbit MIN=P35;sbit SEC=P36;sbit TICK=P37;sbit CHAN=P17;sbit ACC0=ACC0;sbit ACC7=ACC7;bit n=0;bitt=0;unsigned char w=0;void Write_721

15、9(unsigned char DATA)/MAX7219寫數(shù)據(jù)函數(shù)unsigned char i;ACC=DATA; for(i=8;i>=1;i-) CLK=0; DIN=ACC7; ACC=ACC<<1; CLK=1; void Write7219(unsigned char addr,unsigned char dat)LOAD=0; Write_7219(addr); Write_7219(dat); LOAD=1; void Init7219(void) Write7219(DECODE_MODE,0x00);/譯碼存放器,寫入00H,對0至7位均不譯碼 Writ

16、e7219(INTESITY,0x04);/亮度調(diào)節(jié)存放器,寫入04H,實現(xiàn)一般的亮度顯示 Write7219(SCAN_LIMIT,0x07);/掃描界限存放器,寫入07H,實現(xiàn)0到7位數(shù)碼管的顯示 Write7219(SHUT_DOWN,0x01);/停機存放器,寫入01H,實現(xiàn)正常工作 Write7219(DEISPLAY_TEST,0x00);/顯示測試存放器,寫入00H,實現(xiàn)正常工作void delay(unsigned char m)/延時程序unsigned char x,y; for(x=m;x>0;x-) for(y=255;y>0;y-);unsigned ch

17、ar add1(unsigned char DATA)/分、秒調(diào)整子程序unsigned char i,j; i=DATA&0x0f; j=DATA>>4; i+; if(i=0x0a) i=0x00;j+; if(j=0x06)&&(i=0x00) /超過59就變成0 i低位,j高位 i=0;j=0; DATA=(j<<4)+i; return(DATA);unsigned char add2(unsigned char DATA)/小時調(diào)整子程序unsigned char i,j; i=DATA%16; j=DATA>>4; i+

18、; 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);unsigned char add3(unsigned char DATA)/號數(shù)調(diào)整子程序unsigned char i,j; i=DATA%16; j=DATA>>4; i+; if(i=10) i=0;j+;if(Curtime6/16*10+Curtime6%16)%4=0)&&(Curtime4=0x02)&&(j=0x03)&&a

19、mp;(i=0x00) i=1;j=0;Else if(Curtime6/16*10+Curtime6%16)%4!=0)&&(Curtime4=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 i

20、f(Curtime4=0x04)|(Curtime4=0x06)|(Curtime4=0x09)|(Curtime4=0x11)&&(j=0x03)&&(i=0x01) i=1;j=0; DATA=(j<<4)+i; return(DATA); unsigned char add4(unsigned char DATA)/月份調(diào)整子程序unsigned char i,j; i=DATA%16; j=DATA>>4; i+; if(i=0x0a) i=0;j+; if(j=0x01)&&(i=0x03)/超過12就變成0,i

21、低位,j高位 i=1;j=0; DATA=(j<<4)+i; return(DATA);unsigned char add5(unsigned char Data)/年份調(diào)整子程序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 char i,j,m=0x08; for(i=0;i<3;i+) *num=CODE2Curtimei&0x0f; Write7219(m,*num); j=Curtimei>>4; num+;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論