萬年歷課程設(shè)計_第1頁
萬年歷課程設(shè)計_第2頁
萬年歷課程設(shè)計_第3頁
萬年歷課程設(shè)計_第4頁
萬年歷課程設(shè)計_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、萬年歷課程設(shè)計-作者 : _-日期 : _基于 51 單片機的萬年歷的設(shè)計學(xué)生姓名學(xué)號所在專業(yè)電子信息工程所在班級電子 1111小組成員指導(dǎo)教師完成日期基于 51 單片機的萬年歷的設(shè)計需求分析1.1 “需“的分析萬年歷是一個可以顯示當(dāng)前時間、日歷、溫度信息以及設(shè)置鬧鐘報警的應(yīng)用系統(tǒng),其具有以下功能:1)可以顯示當(dāng)前的時間信息;2)可以顯示當(dāng)前的溫度;3)可以手動修改時間;4)可以設(shè)置鬧鐘,并且達(dá)到設(shè)置的時間點發(fā)出音響信號。1.2“求“的分析設(shè)計萬年歷,需要考慮以下幾方面的內(nèi)容:1)如何獲取當(dāng)前的時間信息,這些時間信息包括時、分、秒、年、月、日、和星期;2)如何獲得當(dāng)前的溫度信息,精確到 1C即

2、可;3)提供必要的用戶輸入設(shè)置通道;4)提供相應(yīng)的顯示和報警部件;5)需要寫出合適的軟件應(yīng)用代碼。方案設(shè)計與論證2.1時間獲取方法的方案設(shè)計與論證方案一:使用單片機的內(nèi)部定時器進(jìn)行定時,使用軟件算法來計算當(dāng)前的時間信息。此種方案雖然可以不使用時鐘芯片,節(jié)約成本,但是時間的精準(zhǔn)度一般,軟件代碼復(fù)雜。方案二:采用外部擴展實時時鐘芯片DS12C887的方式來獲取相應(yīng)的時間信息。DS12C887是一種高性能的芯片,能自動產(chǎn)生年、月、日、時、分、秒等信息,并有閏年修正功能。采用雙電源供電方式,可設(shè)置備用電源充電方式,提供了對后備電源進(jìn)行涓細(xì)電流的充電的能力,在能滿足精度要求的同時價格也比較便宜,性價比較

3、高。所以采用方案二。2.2顯示模塊的方案設(shè)計與論證方案一:采用LED數(shù)碼管動態(tài)掃描。 LED數(shù)碼管價格適中 , 但只能顯示數(shù)字和簡單的字符,且其的接口線少。方案二:采用點陣式數(shù)碼管顯示。點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,并不太適合于對數(shù)字跟字母進(jìn)行顯示,其主要用于漢字的顯示。方案三:采用 LED液晶顯示屏。液晶顯示屏的顯示功能強大, 可顯示大量文字 , 圖形 , 顯示多樣, 清晰可見,雖然價格稍微貴了點,但其接口線多。所以采用方案三。2.3溫度采集的方案設(shè)計與論證方案一:使用 PT鉑電阻采集。 PT鉑電阻根據(jù)溫度變化的只是其電阻值,在實際使用過程,需要額外的輔助器件將其轉(zhuǎn)化為電壓信號,

4、并且通過調(diào)整后送到模/ 數(shù)字轉(zhuǎn)換器件才能讓 51 單片機進(jìn)行處理。方案二:使用數(shù)字溫度傳感器采集。溫度傳感器雖然、精度采樣速度等性能比不上 PT鉑電阻,但是其沒有額外的附加器件,且能滿足系統(tǒng)對采集精度的要求。所以采用數(shù)字溫度傳感器。硬件設(shè)計3.1萬年歷的硬件模塊顯示模塊聲音報警模塊51單片用戶輸入模塊機溫度傳感器模塊時鐘日歷模塊圖 3-1萬年歷的硬件模塊3.2 萬年歷的電路圖 3-2 萬年歷的電路3.3 硬件基礎(chǔ)DS1302的硬件基礎(chǔ):時鐘芯片 DS1302的工作原理:DS1302在每次進(jìn)行讀、寫程序前都必須初始化,先把SCLK端置 “0”,接著把RST端置“1”,最后才給予SCLK脈沖。圖

5、5 為 DS1302的控制字的位 7 必須置 1,若為 0 則不能把對 DS1302進(jìn)行讀寫數(shù)據(jù)。對于位6,若對程序進(jìn)行讀 / 寫時 RAM=1,對時間進(jìn)行讀/ 寫時, CK=0。位 1 至位 5 指操作單元的地址。位0 是讀 / 寫操作位,進(jìn)行讀操作時,該位為 1;該位為 0 則表示進(jìn)行的是寫操作。控制字節(jié)總是從最低位開始輸入/ 輸出的。 DS1302的日歷、時間寄存器內(nèi)容:“ CH”是時鐘暫停標(biāo)志位,當(dāng)該位為 1 時,時鐘振蕩器停止, DS1302處于低功耗狀態(tài);當(dāng)該位為0 時,時鐘開始運行?!癢P”是寫保護位,在任何的對時鐘和RAM的寫操作之前, WP必須為 0。當(dāng)“WP”為1 時,寫保

6、護位防止對任一寄存器的寫操作。(2) DS1302 的控制字節(jié)DS1302的控制字如表 -1 所示??刂谱止?jié)的高有效位(位7)必須是邏輯 1,如果它為 0,則不能把數(shù)據(jù)寫入DS1302中,位 6 如果 0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取 RAM數(shù)據(jù);位 5 至位 1 指示操作單元的地址;最低有效位(位0)如為 0 表示要進(jìn)行寫操作,為1 表示進(jìn)行讀操作,控制字節(jié)總是從最低位開始輸出。表 3-1 DS1302 的控制字格式RAMRD1A4A3A2A1A0/CK/WR數(shù)據(jù)輸入輸出( I/O )在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位 0 開

7、始。同樣,在緊跟8 位的控制指令字后的下一個SCLK脈沖的下降沿讀出 DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0 位到高位 7。如下圖 3-3 所示:圖 3-3 DS1302 讀 / 寫時序圖(4) DS1302 的寄存器DS1302有 12 個寄存器,其中有7 個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式 , 其日歷、時間寄存器及其控制字見表3-2 。表 3-2 DS1302 的日歷、時間寄存器此外, DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS1302 與 RAM相關(guān)的

8、寄存器分為兩類:一類是單個RAM單元,共 31 個,每個單元組態(tài)為一個8 位的字節(jié),其命令控制字為C0H FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的 31個字節(jié),命令控制字為FEH(寫) 、FFH(讀) 。1602 液晶的硬件基礎(chǔ):1602 通常有 14 條引腳線或 16 條引腳線的 LCD,多出來的 2 條線是背光電源線VCC(15腳) 和地線 GND(16腳) ,其控制原理與14 腳的 LCD完全一樣,引腳定義如表3-所示:表 3-3 1602 的引腳及其對應(yīng)的功能1602 支持的一系列指令:( 1)清屏指令:表 3-4 清

9、屏指令歸零指令:表 3-5 歸零指令( 3)輸入方式選擇指令:表 3-6 輸入方式選擇指令( 4)顯示開關(guān)控制指令:表 3-7 顯示開關(guān)控制指令光標(biāo)和畫面移動指令:表 3-8 光標(biāo)和畫面移動指令( 6)功能設(shè)定指令:表 3-9 功能設(shè)定指令(7) CGRAM設(shè)置指令:表 3-10 CGRAM設(shè)置指令(8)DDRAM設(shè)置指令:表 3-11 DDRAM設(shè)置指令( 9)讀 BF和 AC指令:表 3-12 讀 BF 和 AC指令( 10)寫數(shù)據(jù)指令:表 3-13 寫數(shù)據(jù)指令( 11)讀數(shù)據(jù)指令:表 3-14 讀數(shù)據(jù)指令軟件設(shè)計系統(tǒng)初始化初始化時鐘芯片和液晶顯讀取 DS1302的時鐘數(shù)據(jù)讀取 DS18B

10、20數(shù)據(jù)并且顯示當(dāng)前的數(shù)據(jù)和溫度是驅(qū)動蜂鳴器報警時鐘數(shù)據(jù)否是設(shè)置鬧鐘按鍵被按圖 4-1 萬年歷的工作流程總結(jié)5.1仿真結(jié)果及分析經(jīng)過多次調(diào)試、修改程序,萬年歷終于在pruteus 正常運行起來了。前面由于初次寫的代碼有較多不完善的地方,所以調(diào)試的時候出了很多大的問題,第一次發(fā)現(xiàn)大的問題后,團隊認(rèn)真地討論并修改了程序,后面調(diào)試遇到的都是些小問題,無非是打漏或者打錯這類問題。5.2心得工程上的問題很多不是一個人的能力可以解決的,所以不能老是想著單干、蠻干,一定要發(fā)揮團隊的力量,多討論,討論往往可以碰撞出思想的火花來。做事的時候一定要靜下心來,保持專注,不能老想著快,不然會弄出很多本可以避免的問題,

11、敲代碼的時候,為了求快,結(jié)果調(diào)試的遇到小問題花了可不少時間才解決。本次課程設(shè)計,讓我知道了要想解決工程上的問題,必須現(xiàn)將問題具體化、模塊化,然后再逐個擊破,這樣才能更有效率地解決整個工程設(shè)計再到實物的問題。附錄一:仿真圖附錄二:程序#include#include#define TIME (0X10000-50000)#define FLAG 0XEF/ 鬧鐘標(biāo)志引腳連接圖sbit rst=P35;sbit clk=P34;sbit dat=P33;sbit rs=P15;sbit rw=P16;sbit e=P17;sbit DQ=P14;/溫度輸入口sbit ACC_7=ACC7;全局變量

12、及常量定義unsigned char i=20,j,time116;unsigned char alarm2,time215,time3;unsigned char code Day=31,28,31,30,31,30,31,31,30,31,30,31;/12個月的最大日期 ( 非閏年 )音律表unsigned int code table1=64260,64400,64524,64580,64684,64777, 64820,64898,64968,65030,65058,65110,65157,65178,65217;發(fā)聲部分的延時時間unsigned char code table2=

13、0 x82,1,0 x81,0 xf4,0 xd4,0 xb4,0 xa4, 0 x94,0 xe2,1,0 xe1,0 xd4,0 xb4,0 xc4,0 xb4,4,0;/LCD 自建字unsigned char code tab=0 x18,0 x1b,5,4,4,5,3,0,0 x08,0 x0f,0 x12,0 x0f,0 x0a,0 x1f,0 x02,0 x02,/年0 x0f,0 x09,0 x0f,0 x09,0 x0f,0 x09,0 x11,0 x00,/月0 x0f,0 x09,0 x09,0 x0f,0 x09,0 x09,0 x0f,0 x00;/日/*溫度小數(shù)部分

14、用查表法 */unsigned char codeditab16=0 x00,0 x01,0 x01,0 x02,0 x03,0 x03,0 x04,0 x04,0 x05,0 x06,0 x06,0 x07,0 x08,0 x08,0 x09,0 x09;鬧鐘中用的全局變量unsigned char th1,tl1;unsigned char temp_data2=0 x00,0 x00;/讀出溫度暫放bit flag;/18b20存在標(biāo)志位/*11微秒延時函數(shù)*/delay(unsigned int t)for(;t0;t-);/*18B20復(fù)位函數(shù) */RST18B20(void)uns

15、igned char i;DQ=1;_nop_();_nop_();DQ=0;/delay(50); / 550usDQ=1;/delay(6); / 66usfor(i=0;i0; i-) /DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();/5usDQ=val&0 x01;/最低位移出delay(6);/66usval=val/2;/右移一位DQ=1;delay(1);/*18B20讀 1 個字節(jié)函數(shù) */從總線上讀取一個字節(jié)unsigned char Read1Byte18B20(void)unsigned

16、 char i;unsigned char value=0;for (i=8;i0;i-)DQ=1;_nop_();_nop_();value=1;DQ=0;/_nop_();_nop_();_nop_();_nop_();/4usDQ=1;_nop_();_nop_();_nop_();_nop_();/4usif(DQ)value|=0 x80;delay(6);/66usDQ=1;return(value);/*讀出溫度函數(shù) */Read18B20()RST18B20();/ 總線復(fù)位if(!flag)/ 判斷 ds1820 是否存在 ?若ds18b20 不存在則返回return;/Wr

17、ite1Byte18B20(0 xCC);/Write1Byte18B20(0 x44);/delay(70);/ Skip ROM/發(fā)轉(zhuǎn)換命令Write1Byte18B20(0 xCC);/ 發(fā)Skip ROM命令Write1Byte18B20(0 xBE);/ 發(fā)讀命令temp_data0=Read1Byte18B20();/溫度低8 位temp_data1=Read1Byte18B20();/溫度高8 位RST18B20();Write1Byte18B20(0 xCC);/ Skip ROMWrite1Byte18B20(0 x44);/發(fā)轉(zhuǎn)換命令/*溫度數(shù)據(jù)處理函數(shù) */DealTem

18、pData()unsigned char n=0,m;if(temp_data1127)/負(fù)溫度求補碼temp_data1=(256-temp_data1);temp_data0=(256-temp_data0);n=1;time213=ditabtemp_data0&0 x0f+0;time212=.;m=(temp_data0&0 xf0)4)|(temp_data1&0 x0f)4);/if(n)m-=16;time29=m/100+0;time211=m%100;time210=time211/10+0;time211=time211%10+0;if(time29=0)/最高位為 0

19、時都不顯示time29=0 x20;if(n)/負(fù)溫度時最高位顯示 -time29=-;if(time210=0)if(n)time210=-;time29=0 x20;elsetime210=0 x20;if(time211=0&time213=0)time211=time212=0 x20;delay1ms(unsigned char time)/ 延時 1msunsigned char i,j;for(i=0;itime;i+)for(j=0;j250;j+);/ 使能 1602EnableLCD()rs=0;rw=0;e=0;delay1ms(3);e=1;寫 LCD函數(shù)WriteLC

20、D(unsigned char i)P0=i;rs=1;rw=0;e=0;delay1ms(2);e=1;寫 LCD內(nèi)部地址函數(shù)WriteLCDRAM(unsigned char data *address,m)unsigned char i,j;for(i=0;im;i+,address+)j=*address;WriteLCD(j);/LCD 顯示LCDSHOW()P0=0XC;/ 顯示器開、光標(biāo)關(guān)EnableLCD();P0=0 x80;/ 寫入顯示起始地址EnableLCD();WriteLCDRAM(time1,16);P0=0 xc1;/ 寫入顯示起始地址EnableLCD();W

21、riteLCDRAM(time2,15);自建字函數(shù)庫DesignHZ()unsigned char i;P0=0 x40;EnableLCD();for(i=0;i32;i+)WriteLCD(tabi);delay1ms(2);/ 寫 DS1302子程序WriteDS1302(unsigned char address)unsigned char i;clk=0;_nop_();rst=1;_nop_();for(i=0;i=1;clk=0;/ 讀 DS1302子程序unsigned char ReadDS1302()unsigned char i,j=0;for(i=0;i=1;_nop

22、_();clk=0;_nop_();if(dat)j|=0 x80;_nop_();clk=1;return(j);部分顯示數(shù)據(jù)初始化TimeInit()time11=time113=time28=time29=time210=0 x20,time214=0; time16=1,time19=2,time112=3,time12=2,time13=0;time114=W,time22=time25=:;WriteDS1302(0 xc1);alarm0=ReadDS1302();rst=0;WriteDS1302(0 xc3);alarm1=ReadDS1302();rst=0;WriteDS

23、1302(0 xc5);time10=ReadDS1302();rst=0;讀取時間ReadTime()unsigned char i,m,n;WriteDS1302(0 x8d);/ 讀取年份m=ReadDS1302();rst=0;time14=m/16+0 x30;time15=m%16+0 x30;WriteDS1302(0 x8b);/ 讀取星期m=ReadDS1302();rst=0;time115=m+0 x30;for(i=7,n=0 x89;i11;i+=3,n-=2)/ 讀取月份和日期WriteDS1302(n);m=ReadDS1302();rst=0;time1i=m/

24、16+0 x30;time1i+1=m%16+0 x30;for(m=0,i=0,n=0 x85;i7;i+=3,n-=2,m+)/ 讀取時 , 分, 秒WriteDS1302(n);timem=ReadDS1302();rst=0;time2i=timem/16+0 x30;time2i+1=timem%16+0 x30;time0() interrupt 1 using 1i-;if(i=0)if(j!=0)j-;i=20;TH0=TIME/256,TL0=TIME%256;鬧鐘部分intime1() interrupt 3TH1=th1,TL1=tl1;P3_2=!P3_2;顯示鬧鐘設(shè)置

25、數(shù)據(jù)showalarm()unsigned char i,j,a,b,n;ET1=1;for(j=0;j=4;if(a=0)TR1=0;goto D1;D1:a=(-a)1)/2;TH1=th1=table1a/256,TL1=tl1=table1a%256;TR1=1;dob-;for(n=0;n2)i+;j=(time110&0 xf)*10+(time111&0 xf);i+=j;i%=7;if(i=0)i=7;return(i);設(shè)置時間settime()unsigned char i=0 x85,year,month,day,n;time26=time27=0 x30,time114

26、=time115=0 x20;LCDSHOW();while(1)P0=0 xe;/ 顯示器開、光標(biāo)開EnableLCD();P0=i;/ 定光標(biāo)EnableLCD();P2=0 xf7;if(P2!=0XF7)if(P2!=0XF7)j=7;if(P2=0X77)i+=3;if(i=0 x8e)i=0 xc2;else if(i0 xc5)i=0 x85;else if(P2=0 xb7)year=(time14&0 xf)*10+(time15&0 xf);month=(time17&0 xf)*10+(time18&0 xf);day=(time110&0 xf)*10+(time111

27、&0 xf);if(i=0 x85)year+;if(year99)year=0;if(year%4)!=0)if(month=2&day=29)day=28;else if(i=0 x88)month+;if(month12)month=1;if(dayDaymonth-1)day=Daymonth-1;if(month=2&(year%4)=0)day=29;else if(i=0 x8b)day+;if(dayDaymonth-1)if(month=2&(year%4)=0)if(day29)day=1;if(month!=2)day=1;else if(i=0 xc2)n=(time20&0 xf)*10+(time21&0 xf);n+;if(n23)

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論