哈理工榮 單片機(jī)課設(shè)基于DS1302的實(shí)時(shí)時(shí)鐘顯示_第1頁
哈理工榮 單片機(jī)課設(shè)基于DS1302的實(shí)時(shí)時(shí)鐘顯示_第2頁
哈理工榮 單片機(jī)課設(shè)基于DS1302的實(shí)時(shí)時(shí)鐘顯示_第3頁
哈理工榮 單片機(jī)課設(shè)基于DS1302的實(shí)時(shí)時(shí)鐘顯示_第4頁
哈理工榮 單片機(jī)課設(shè)基于DS1302的實(shí)時(shí)時(shí)鐘顯示_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、哈 爾 濱 理 工 大 學(xué) 榮 成 學(xué) 院單片機(jī)原理課程設(shè)計(jì)題目:基于DS1302的實(shí)時(shí)時(shí)鐘顯示班級(jí): 姓名: 學(xué)號(hào): 年 月 號(hào)目錄一、 題目簡介二、 實(shí)現(xiàn)方案三、 電路SCH圖四、 軟件流程圖五、 軟件設(shè)計(jì)源程序六、 心得體會(huì)七、 參考文獻(xiàn)一、題目簡介本文采用單片機(jī)控制系統(tǒng)的基礎(chǔ)上綜合應(yīng)用時(shí)鐘芯片DSI302和Proteus軟件。單片機(jī)是一個(gè)基本微型計(jì)算機(jī),由AT89C52單片機(jī)一個(gè)芯片通過簡單的電路連接,便可組成最小的應(yīng)用系統(tǒng),利用集成在單片機(jī)內(nèi)部的接口,實(shí)現(xiàn)并行,串行數(shù)據(jù)傳輸,定時(shí)計(jì)數(shù)控制,中斷等功能,從而完成一定檢測控制功能。希望通過研究與設(shè)計(jì)了解DS1302芯片的內(nèi)部結(jié)構(gòu),工作方式

2、,各引腳功能及I/O接口的使用,用LCD顯示器代替顯示器代替指針顯示進(jìn)而顯示時(shí)間,減小了計(jì)時(shí)誤差,這種表有時(shí)、分、秒顯示時(shí)間的功能,還可以進(jìn)行時(shí)和分的校時(shí),片選的靈活性好。二、實(shí)現(xiàn)方案基于DS1302的電子萬年歷設(shè)計(jì)一、 系統(tǒng)硬件電路圖的設(shè)計(jì)按照系統(tǒng)設(shè)計(jì)功能的要求,初步確定設(shè)計(jì)系統(tǒng)由主控模塊,時(shí)鐘模塊,存儲(chǔ)模塊,鍵盤接口模塊,顯示模塊和鬧鈴模塊共6個(gè)模塊組成。主控芯片使用52系列STC89S52單片機(jī),時(shí)鐘芯片使用美國DALLAS公司推出的一種高性能,地功耗,帶RAM的時(shí)鐘芯片DS1302作為主要計(jì)時(shí)芯片,可以做到計(jì)時(shí)準(zhǔn)確。更重要的是,DS1302可以在很小電流的后備下繼續(xù)計(jì)時(shí),并可編程選擇多

3、種充電電流來對后備電源進(jìn)行慢速充電,可以保證后備電源基本不耗電。二、 系統(tǒng)核心部分-閃電存儲(chǔ)器件STC89C511、 STC89C51具有下列主要性能:8KB可編程序Flash存儲(chǔ)器全靜態(tài)工作:0HZ24MHZ三級(jí)程序存儲(chǔ)器保密128 X 8 字節(jié)內(nèi)部RAM32條可編程序I/O線2個(gè)16位定時(shí)器/計(jì)數(shù)器6個(gè)中斷源可編程序串行口片內(nèi)時(shí)鐘振蕩器2、 AT89C51的引腳及其功能AT89C51的管腳(1)主要電源引腳 (a)VCC電源端 (b)GND接地線(2)外接晶體引腳XTAL1和XTAL2(a)XTAL1:在單片機(jī)內(nèi)部,它是構(gòu)成片內(nèi)振蕩器的反相放大器的輸入端。當(dāng)采用外部振蕩器時(shí),該引腳接收振蕩

4、器的信號(hào),即把此信號(hào)直接接到內(nèi)部時(shí)鐘發(fā)生器的輸入端。(b)XTAL2:它是上訴振蕩器的反相放大器的輸出端。采用外部振蕩器時(shí),此引腳懸浮不連接。(3)控制或與其它電源復(fù)用引腳RST、ALE/PROG/PSEN/EA/VPP(a)RST:復(fù)位輸入端(b)ALE/PROG:當(dāng)訪問外部存儲(chǔ)器時(shí),ALE(地址鎖存允許)的輸出用于鎖存地址的低位字節(jié)。(c)PSEN:程序存儲(chǔ)允許輸出是外部程序存儲(chǔ)器的讀選通信號(hào)。(d)EA/VPP:外部訪問允許端。(4)輸入/輸出引腳 P0.0 P0.7,P1.0 P1.7,P2.0 P2.7和 P3.0 P3.7 (a)PO端口(P0.0 P0.7) (b)P1端口(P1

5、.0 P1.7) (c)P2端口(P2.0 P2.7) (d)P3端口(P3.0 P3.7)3、 DS1302時(shí)鐘電路(1) DS1302的性能特征a、實(shí)時(shí)時(shí)鐘,可對秒、分、時(shí)、日、周、月以及帶閏年補(bǔ)償?shù)哪赀M(jìn)行比較。b、用于高速數(shù)據(jù)暫存的31X8位RAM。c、最少引腳的串行I/O。d、2.5-5.5V電壓工作范圍。e、2.5V時(shí)耗小于300mA。f、用于時(shí)鐘或RAM數(shù)據(jù)讀寫的單字節(jié)或多字節(jié)數(shù)據(jù)傳輸方式。g、簡單的3線接口。h、可選的慢速充電(至VCC1)的能力。(2)DS1302數(shù)據(jù)操作原理 DS1302在任何數(shù)據(jù)傳送時(shí)必須先初始化,把RST腳置為高電平,然后把8位地址和命令字裝入移位寄存器,

6、數(shù)據(jù)在SCLK的上升沿被輸入。無論是讀周期還是寫周期,開始8位指令40個(gè)寄存器中哪個(gè)被訪問到。在開始8個(gè)時(shí)鐘周期,把命令字節(jié)裝入移位寄存器之后,另外的時(shí)鐘周期在讀操作時(shí)輸出數(shù)據(jù),在寫操作時(shí)寫入數(shù)據(jù)。時(shí)鐘脈沖的個(gè)數(shù)在單字節(jié)方式下為8加8,再多字節(jié)方式下為8加字節(jié)數(shù),最大可達(dá)248字節(jié)數(shù)。24軟件流程圖一、時(shí)間程序的設(shè)計(jì)流程圖二、時(shí)間程序的設(shè)計(jì)流程圖三、 鬧鐘程序程序設(shè)計(jì)流程圖五.軟件設(shè)計(jì)源程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int#d

7、efine LCDIO P0sbit led=P36;sbit ge=P23;sbit shi=P24;sbit bai=P35;sbit qian=P34;sbit rs=P25; sbit rd=P26;sbit lcden=P27;sbit BEEP=P37;sbit menu=P20; /菜單sbit add=P22; /加一sbit dec=P21; /減一 uchar second,minute,hour,day,month,year,week,count=0; uchar second1,minute1,hour1; uchar ReadValue,num,time; uchar

8、 shi1;uchar fen1;uchar miao1;uchar shi2; uchar fen2;uchar miao2; uchar codetable=" 2013-12-01 MON "uchar code table1=" 12:00:00"uchar code table2= "THUFRISATSUNMONTUEWED"uchar code table3=" clock "uchar code table4=" 00:00:00"sbit DATA=P15; sbit RST=

9、P16; sbit SCLK=P13; void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void delay1(uint z)for(;z>0;z-);void delay2(uint z)uint x,y;for(x=z;x>0;x-)for(y=50;y>0;y-);/蜂鳴器程序void di()uchar i;for(i=0;i<20;i+)BEEP=0;delay2(10);BEEP=1;delay2(10); void write_com(uchar com)rs=0;rd=0

10、;lcden=0;LCDIO=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar date)rs=1;rd=0;lcden=0;LCDIO=date;delay(5);lcden=1;delay(5);lcden=0;void init()uchar num;lcden=0;qian=0;bai=0;shi=0;ge=0;led=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);delay(5);write_com

11、(0x80);for(num=0;num<15;num+)write_date(tablenum);delay(5);write_com(0x80+0x40);for(num=0;num<10;num+)write_date(table1num);delay(5); void Write1302(uchar dat)uchar i; SCLK=0; /拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準(zhǔn)備delay1(2); /等待一會(huì),for(i=0;i<8;i+) /連續(xù)寫8個(gè)二進(jìn)制位數(shù)據(jù) DATA=dat&0x01; /取出dat的第0位數(shù)據(jù)寫入1302delay(2);

12、/等待一會(huì),是硬件做好準(zhǔn)備SCLK=1; /上升沿寫入數(shù)據(jù)delay1(2); /等待一會(huì),是硬件做好準(zhǔn)備SCLK=0; /重新拉低SCLK,形成脈沖dat>>=1; /將dat的各位數(shù)據(jù)位右移一位,準(zhǔn)備寫入下一個(gè)數(shù)據(jù)位void WriteSet1302(uchar Cmd,uchar dat)RST=0; /禁止數(shù)據(jù)傳遞SCLK=0; /確保寫數(shù)據(jù)前SCLK被拉低RST=1; /啟動(dòng)數(shù)據(jù)傳輸delay1(2); /等一會(huì)做好硬件準(zhǔn)備Write1302(Cmd); /寫入命令字Write1302(dat); /寫數(shù)據(jù)SCLK=1; /將時(shí)鐘電平置于已知狀態(tài)RST=0; /禁止數(shù)據(jù)傳

13、輸uchar Read1302(void)uchar i,dat;delay(2); /等一會(huì)做好硬件準(zhǔn)備for(i=0;i<8;i+) /連續(xù)讀8個(gè)二進(jìn)制位數(shù)據(jù)dat>>=1; /將dat的各數(shù)據(jù)位右移1位,因?yàn)橄茸x出的字節(jié)的最低位if(DATA=1) /如果讀出的數(shù)據(jù)是1dat|=0x80; /將1取出,寫在dat的最高位SCLK=1; /將SCLK置于高電平,為下降沿讀出delay1(2); /稍微等待SCLK=0; /拉低SCLK,形成下降沿delay1(2); /稍微等待 return dat; /將讀出的數(shù)據(jù)返回uchar ReadSet1302(uchar Cm

14、d)uchar dat;RST=0; /拉低RSTSCLK=0; /確保寫數(shù)據(jù)前SCLK被拉低RST=1; /啟動(dòng)數(shù)據(jù)傳輸Write1302(Cmd); /寫入命令字dat=Read1302(); /讀出數(shù)據(jù)SCLK=1; /將時(shí)鐘電平置于已知狀態(tài)RST=0; /禁止數(shù)據(jù)傳輸return dat; /將讀出的數(shù)據(jù)返回void Init_DS1302(void) WriteSet1302(0x8E,0x00); /根據(jù)寫狀態(tài)寄存器命令字,寫入不保護(hù)指令WriteSet1302(0x80,(0/10)<<4|(0%10); /根據(jù)寫秒寄存器命令字,寫入秒的初始值WriteSet1302

15、(0x82,(0/10)<<4|(20%10); /根據(jù)寫分寄存器命令字,寫入分的初始值WriteSet1302(0x84,(12/10)<<4|(12%10); /根據(jù)寫小時(shí)寄存器命令字,寫入小時(shí)的初始值WriteSet1302(0x86,(01/10)<<4|(01%10); /根據(jù)寫日寄存器命令字,寫入日的初始值WriteSet1302(0x88,(11/10)<<4|(12%10); /根據(jù)寫月寄存器命令字,寫入月的初始值WriteSet1302(0x8c,(11/10)<<4|(13%10); /nianWriteSet13

16、02(0x8a,(4/10)<<4|(4%10);void DisplaySecond(uchar x)uchar i,j; i=x/10;j=x%10;write_com(0xca); write_date(0x30+i); write_date(0x30+j); void DisplayMinute(uchar x)uchar i,j; i=x/10;j=x%10; write_com(0xc7); write_date(0x30+i); write_date(0x30+j); void DisplayHour(uchar x)uchar i,j; i=x/10;j=x%10;

17、write_com(0xc4); write_date(0x30+i); write_date(0x30+j); void DisplayDay(uchar x)uchar i,j; i=x/10;j=x%10; write_com(0x89); write_date(0x30+i); write_date(0x30+j); void DisplayMonth(uchar x)uchar i,j; i=x/10;j=x%10; write_com(0x86); write_date(0x30+i); write_date(0x30+j); void DisplayYear(uchar x)uc

18、har i,j; i=x/10;j=x%10; write_com(0x83); write_date(0x30+i);write_date(0x30+j); void DisplayWeek(uchar x)uchar i;x=x*3;write_com(0x8c); for(i=0;i<3;i+)write_date(table2x);x+; void read_date(void)ReadValue = ReadSet1302(0x81); second=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadVal

19、ue = ReadSet1302(0x83); minute=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x85); hour=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x87); day=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(

20、0x89); month=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x8d); year=(ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue=ReadSet1302(0x8b); /讀星期week=ReadValue&0x07;DisplaySecond(second); DisplayMinute(minute); DisplayHour(hour); DisplayDay(da

21、y); DisplayMonth(month); DisplayYear(year); DisplayWeek(week); void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num)newval=ReadSet1302(newaddr); /讀取當(dāng)前時(shí)間newval=(newval&0x70)>>4)*10+(newval&0x0f); /將bcd轉(zhuǎn)成十進(jìn)制if(flag) /判斷加一還是減一 newval+;switch(s1num) case 1: if(newval>99) newva

22、l=0;DisplayYear(newval); break;case 2: if(newval>12) newval=1;DisplayMonth(newval); break;case 3: if(newval>31) newval=1;DisplayDay(newval); break;case 4: if(newval>6) newval=0;DisplayWeek(newval); break;case 5: if(newval>23) newval=0;DisplayHour(newval); break;case 6: if(newval>59) n

23、ewval=0;DisplayMinute(newval); break;case 7: if(newval>59) newval=0;DisplaySecond(newval); break;default:break; elsenewval-;switch(s1num) case 1: if(newval=0) newval=99;DisplayYear(newval); break;case 2: if(newval=0) newval=12;DisplayMonth(newval); break;case 3: if(newval=0) newval=31;DisplayDay(

24、newval); break;case 4: if(newval<0) newval=6;DisplayWeek(newval); break;case 5: if(newval<0) newval=23;DisplayHour(newval); break;case 6: if(newval<0) newval=59;DisplayMinute(newval); break;case 7: if(newval<0) newval=59;DisplaySecond(newval);break;default:break;WriteSet1302(newaddr-1),(

25、newval/10)<<4)|(newval%10); /蔣新數(shù)據(jù)寫入寄存器 /鍵盤掃描/*void key_scan(void)uchar miao,s1num=0;uchar shi21,shi22,miao21,miao22,fen21,fen22;if(menu=0) delay(5);if(menu=0)di();while(!menu); s1num+;while(1)if(menu=0) delay(5);if(menu=0) di();while(!menu);s1num+;rd=0;miao=ReadSet1302(0x81);second=miao;WriteS

26、et1302(0x80,miao|0x80);write_com(0x0f);/光標(biāo)閃爍if(s1num=1)year=ReadSet1302(0x8d); write_com(0x80+4);/年光標(biāo)if(add=0)delay(3);if(add=0) di();while(!add);turn_val(year,1,0x8d,1);if(dec=0)delay(3);if(dec=0)di();while(!dec);turn_val(year,0,0x8d,1); if(s1num=2)month=ReadSet1302(0x89);write_com(0x80+7);/月光標(biāo)if(a

27、dd=0)delay(3);if(add=0) di();while(!add);turn_val(month,1,0x89,2);if(dec=0)delay(3);if(dec=0) di();while(!dec);turn_val(month,0,0x89,2);if(s1num=3)day=ReadSet1302(0x87);write_com(0x80+10);/日光標(biāo)if(add=0)delay(3);if(add=0) di();while(!add);turn_val(day,1,0x87,3);if(dec=0)delay(3);if(dec=0)di();while(!d

28、ec);turn_val(day,0,0x87,3);/寫入日寄存器if(s1num=4) week=ReadSet1302(0x8b);write_com(0x80+14);/星期光標(biāo)if(add=0)delay(3);if(add=0) di();while(!add);turn_val(week,1,0x8b,4);if(dec=0)delay(3);if(dec=0) di();while(!dec);turn_val(week,0,0x8b,4);if(s1num=5)hour=ReadSet1302(0x85);write_com(0x80+0x40+5);/時(shí)光標(biāo)if(add=0

29、)delay(3);if(add=0) di();while(!add);turn_val(hour,1,0x85,5);if(dec=0)delay(3);if(dec=0) di();while(!dec);turn_val(hour,0,0x85,5);if(s1num=6)/調(diào)時(shí)間分 minute=ReadSet1302(0x83);write_com(0x80+0x40+8);if(add=0)delay(5);if(add=0) di();while(!add);turn_val(minute,1,0x83,6);/寫入分寄存器 if(dec=0)delay(3);if(dec=0

30、) di();while(!dec);turn_val(minute,0,0x83,6);/寫入分寄存器 if(s1num=7)/調(diào)整時(shí)間秒second=ReadSet1302(0x81);write_com(0x80+0x40+11);/秒光標(biāo)if(add=0)delay(3);if(add=0) di();while(!add);if(second=0x60)second=0x00;turn_val(second,1,0x81,7);if(dec=0)delay(3);if(dec=0) di();while(!dec);turn_val(second,0,0x81,7);if(s1num

31、=8)miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,second&0x7f);s1num=0;/s1num清零/write_com(0x0c);/光標(biāo)不閃爍/break;if(add=0) /naozhong while(1)write_com(0x80);for(num=0;num<15;num+)write_date(table3num);delay(5);write_com(0x80+0x40+4);/時(shí)光標(biāo)write_date(shi21+0x30);write_com(0x80+0x40+5);/時(shí)光標(biāo)writ

32、e_date(shi22+0x30);write_com(0x80+0x40+7);/FEN光標(biāo)write_date(fen21+0x30);write_com(0x80+0x40+8);/write_date(fen22+0x30); write_com(0x80+0x40+10);/miao光標(biāo)write_date(miao21+0x30);write_com(0x80+0x40+11);/write_date(miao22+0x30);s1num=4;delay(5);if(add=0)di();while(!add); s1num+;while(1)if(add=0) delay(5)

33、;if(add=0) di();while(!add);s1num+;rd=0;shi1=ReadSet1302(0x81);second1=miao1;/ WriteSet1302(0x80,miao1|0x80);write_com(0x0f);/光標(biāo)閃爍if(s1num=5)write_com(0x80+0x40+5);/時(shí)光標(biāo)if(dec=0)delay(3);if(dec=0) di();while(!dec);shi2+;if(shi2=24)shi2=0;shi21=shi2/10;shi22=shi2%10;write_com(0x80+0x40+4);/時(shí)光標(biāo)write_da

34、te(shi21+0x30);write_com(0x80+0x40+5);/時(shí)光標(biāo)write_date(shi22+0x30);if(menu=0)delay(3);if(menu=0) di();while(!menu);shi2-;if(shi2=255)shi2=23;shi21=shi2/10;shi22=shi2%10;write_com(0x80+0x40+4);/時(shí)光標(biāo)write_date(shi21+0x30);write_com(0x80+0x40+5);/時(shí)光標(biāo)write_date(shi22+0x30);if(s1num=6)/調(diào)時(shí)間分 write_com(0x80+0

35、x40+8);if(dec=0)delay(5);if(dec=0) di();while(!add);fen2+;if(fen2=60)fen2=0;fen21=fen2/10;fen22=fen2%10;write_com(0x80+0x40+7);/FEN光標(biāo)write_date(fen21+0x30);write_com(0x80+0x40+8);/write_date(fen22+0x30);/寫入分寄存器 if(menu=0)delay(5);if(menu=0) di();while(!menu);fen2-;if(fen2=255)fen2=59;fen21=fen2/10;f

36、en22=fen2%10;write_com(0x80+0x40+7);/FEN光標(biāo)write_date(fen21+0x30);write_com(0x80+0x40+8);/write_date(fen22+0x30);/寫入分寄存器 if(s1num=7)/調(diào)整時(shí)間秒write_com(0x80+0x40+11);/秒光標(biāo)if(dec=0)delay(3);if(dec=0) di();while(!dec);miao2+;if(miao2=60)miao2=0;miao21=miao2/10;miao22=miao2%10;write_com(0x80+0x40+10);/miao光標(biāo)write_date(miao21+0x30);write_com(0x80+0x40

溫馨提示

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

評論

0/150

提交評論