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

下載本文檔

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

文檔簡介

1、- PAGE 33 - 單片機課程設計說明書 萬年歷電子時鐘(shzhng)設計院 、 部: 電氣(dinq)與信息工程學院 學生(xu sheng)姓名: 指導教師: 職稱 專 業(yè): 電氣工程及其自動化 班 級: 完成時間: 2014年6月 摘 要單片機應用技術(shù)飛速發(fā)展,縱觀我們現(xiàn)在生活的各個領(lǐng)域,從導彈的導航(dohng)裝置到飛機上的各種儀表的控制,從計算機的網(wǎng)絡通訊與數(shù)據(jù)傳輸,到工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,以及我們生活中廣泛使用的各種智能IC卡等,這些都離不開單片機。單片機是集CPU、RAM、ROM、定時、計數(shù)和多種接口于一體的微控制器。它體積小,成本低,功能強,廣泛應用于智能

2、產(chǎn)業(yè)和工業(yè)自動化上。而51系列單片機是各單片機中最為典型和最有代表性的一種。萬年歷在日常生活中最常見,應用(yngyng)也最廣泛。本次(bn c)課程設計主要就是設計一款數(shù)字鐘,以80C51單片機為核心,配備數(shù)碼管,按鍵,蜂鳴器。數(shù)字鐘采用24小時制方式顯示時間,年、月、日、秒及毫秒。 文章的核心主要從硬件設計和軟件編程兩個大的方面。硬件電路設計主要包括中央處理單元電路、時鐘電路、人機接口電路、信號處理電路、執(zhí)行電路等幾部分組成。軟件用C語言來實現(xiàn),主要包括主程序、時間設置子程序,按鍵切換程序,校時程序等軟件模塊。關(guān)鍵字 : 單片機;時間;小時;分鐘;秒 目 錄 第一章 緒論(xln) TO

3、C o 1-3 h z u HYPERLINK l _Toc298942946 PAGEREF _Toc298942946 h 3 HYPERLINK l _Toc298942947 1.1引言(ynyn)及設計思路 PAGEREF _Toc298942947 h 3 HYPERLINK l _Toc298942948 第二章 系統(tǒng)(xtng)設計 PAGEREF _Toc298942948 h 4 HYPERLINK l _Toc298942949 2.1 設計任務 PAGEREF _Toc298942949 h 4 HYPERLINK l _Toc298942950 2.2 系統(tǒng)硬件設計

4、PAGEREF _Toc298942950 h 4 HYPERLINK l _Toc298942951 2.2.1系統(tǒng)總體框架 PAGEREF _Toc298942951 h 4 HYPERLINK l _Toc298942952 2.2.2模塊二 PAGEREF _Toc298942952 h 5 HYPERLINK l _Toc298942953 2.3系統(tǒng)軟件設計 PAGEREF _Toc298942953 h 5 HYPERLINK l _Toc298942954 2.4設計說明書: PAGEREF _Toc298942954 h 6 HYPERLINK l _Toc298942955

5、 2.4.1模塊劃分: PAGEREF _Toc298942955 h 6 HYPERLINK l _Toc298942956 2.5使用說明書: PAGEREF _Toc298942956 h 6 HYPERLINK l _Toc298942957 2.6元件清單: PAGEREF _Toc298942957 h 6 HYPERLINK l _Toc298942958 第三章課程設計總結(jié) PAGEREF _Toc298942958 h 7 HYPERLINK l _Toc298942959 3.1設計過程 PAGEREF _Toc298942959 h 7 HYPERLINK l _Toc2

6、98942960 3.2心得體會 PAGEREF _Toc298942960 h 7 HYPERLINK l _Toc298942961 附錄 PAGEREF _Toc298942961 h 8第一章 緒論(xln)1.1引言(ynyn)及設計思路萬年歷是采用(ciyng)數(shù)字電路實現(xiàn)對年、月、日,時、分、秒數(shù)字顯示的計時裝置,廣泛用于個人家庭,車站, 碼頭辦公室等公共場所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵?由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應用,使得數(shù)字鐘的精度,遠遠超過老式鐘表, 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按

7、時自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關(guān)烘箱、通斷動力設備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數(shù)字化為基礎的。因此,研究數(shù)字鐘及擴大其應用,有著非?,F(xiàn)實的意義。一開始接觸到實驗箱的時候大家都很陌生,因為是第一次使用,所以實驗箱很多模塊的功能及使用方法都要我們自己去掌握。在沒有實質(zhì)說明書的情況下,我們先后使用萬用表測電壓、電阻的方法得到了實驗箱主芯片與單片機P口的引腳對應圖,為接下來的軟件編程和硬件接口連接打下了基礎。萬年歷電子時鐘的實現(xiàn)主要硬件模塊是單片機,本實驗箱使用的的AT80C51單片機,此外還有顯示模塊四位數(shù)碼管,還有時間切換和調(diào)整模塊按鈕和鬧鈴模

8、塊蜂鳴器。起初我們想用實驗箱上原有的HD7279芯片來驅(qū)動數(shù)碼管顯示和鍵盤控制,但由于對這款芯片的認識不足,雖然從網(wǎng)上找到了很多關(guān)于HD7279的資料,但仍不能正確的使用它,于是我們想到通過對TFT彩屏液晶顯示器的控制來顯示時間,但對于它的顯示原理也不能掌握,最后我們想到了用單片機直接控制數(shù)碼管來顯示時間。單片機P0的八個口分別接到數(shù)碼管的八個段選位。通過按下按鈕1,可以實現(xiàn)從年月日時分秒毫秒的顯示切換,按下按鈕2,可實現(xiàn)年份、月份日期,時分的加減,以實現(xiàn)時間的校正。第二章 系統(tǒng)(xtng)設計2.1設計(shj)任務:設計一個萬年歷,主要以單片機和數(shù)碼管為硬件基礎,載入用C語言編寫的程序,設

9、計出功能完善的萬年歷。該萬年歷通過按鍵可切換顯示時間與日期、月份、日期、年份;能自動準確的計時;能通過判斷年份和月份來顯示相應的天數(shù)(tinsh)(即能判斷閏年,大月和小月)。2.2 系統(tǒng)硬件設計和顯示2.2.1系統(tǒng)(xtng)總體框架單片機數(shù)碼管切換及調(diào)整按鈕蜂鳴器(鬧鐘)2.2.2 模塊(m kui)二萬年歷的原理圖2.3系統(tǒng)軟件(x tn run jin)設計3、1數(shù)字電子鐘設計用到很多子程序,它們的流程圖如下所示。 主程序是先開始,然后啟動(qdng)定時器,定時器啟動后在進行按鍵檢測,檢測完后,就可以顯示時間。 開始啟動定時器鍵切換和校時時間顯示2.4設計(shj)說明書:2.4.1

10、模塊(m kui)劃分:1、顯示(xinsh)模塊利用單片機來控制數(shù)碼管的顯示。通過單片機P0口來控制數(shù)碼管的八段,P1口來控制4位數(shù)碼管。本程序采用方式0譯碼。在主程序中進行。2、切換模塊主要靠按鍵來切換顯示時間和日期,采用中斷方式來進行。3、計時模塊本程序采用定時計數(shù)器T0,定時10ms,即50ms進一次中斷,100次后達到1秒,秒位加一,達到60秒后分位加一,一次類推周而復始的進行計數(shù)。該模塊也是采用中斷方式進行采用12M的晶振。4、校時模塊該模塊也是通過按鍵來對時間和日期進行校時。先通過一個按鍵來選擇要校時的部分,再通過另外兩個按鍵來對該部分進行加減,調(diào)整到正確的時間和日期。日期在校時

11、過程中還要對年份和月份進行判斷是不是閏年,是大月還是小月。進過判斷后來顯示相應的日期。上述計時過程中也要進行判斷。該模塊也采用中斷方式。2.5使用說明書:打開電源,1602液晶屏顯示時間。按鍵S1用來控制切換,即按下S1就顯示日期,再按一次就顯示時間,依次循環(huán)。按鍵S2用來控制校時部分的選擇,第一次按下,分位或時位會閃爍,表示以選擇該位,同時計數(shù)器會停止計數(shù);第二次按下,月位或日位會閃爍;第三次按下,年的高位或年的低位會閃爍;第四次按下時,會退出選擇功能,計數(shù)器恢復計時,依次循環(huán)。按鍵S3和S4分別用來控制時間或日期的加、減,使用該功能時,按鍵S2必須先按下選擇某一位進行加減,按鍵S2第四次按

12、下時,也同時退出該功能。2.6元件(yunjin)清單:AT89S51單片機1602顯示屏一個、電阻電容(dinrng)若干,5個獨立按鍵,12M晶振一個,記憶電池一塊第三章 課程設計總結(jié)(zngji)3.1設計過程通過老師給我們講解了課程設計的內(nèi)容后,我們便投入了緊張的課設中,萬事開頭難,面對著完全陌生的實驗箱,我們首先要做的就是收集資料,以便弄清實驗箱各功能模塊及使用方法,第一天就這么過去了,對實驗箱的模塊有了大致的了解。星期二,我們開始對主芯片的串口進行測試,找到了它與單片機引腳對應圖。對于萬年歷,我們首先想到的是用單片機,89sc51芯片,液晶屏和按鍵來實現(xiàn),查閱了很多關(guān)于芯片的資料后

13、仍對其顯示原理搞不清楚,于是我們只好放棄使用該芯片,最后我們想到了直接用單片機控制液晶屏,采用動態(tài)掃描的方式來實現(xiàn)時間顯示,用按鍵切換來實現(xiàn)。但這樣的話,編程就相對來說復雜了很多。星期三,上午開始了編程,8個段選和4個位選就占了12個I/O口,定時和中斷占2個口,四個按鍵也占了4個口,這樣一來串行口就顯得很緊張。但這不是最主要的,編程是塊難啃的骨頭,連續(xù)編了三天的程序,周五晚上進行仿真調(diào)試通過,7月18號的周一來實驗室進行硬件調(diào)試,硬件調(diào)試也經(jīng)歷了數(shù)碼管顯示錯位,亂碼,按鍵不靈的問題,通過線路的重新連接,消抖的程序的修改,一一把這些問題解決了。經(jīng)過經(jīng)過一上午辛苦的調(diào)試,終于成功的把萬年歷設計出

14、來了!3.2 心得體會回顧起此次單片機課程設計,至今我仍感慨頗多,的確,從理論到實踐,在整整兩星期的日子里,可以說得是苦多于甜,但是可以學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(fw),從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學過的知識理解得不

15、夠深刻,掌握得不夠牢固,比如說單片機的動態(tài)(dngti)掃描原理,不懂分得(fn de)二極管的正負極,不知道數(shù)碼管是共陰極還是共陽極,對單片機匯編語言掌握得不好通過這次課程設計之后,一定把以前所學過的知識重新溫故。 本次課程設計,真可謂是感慨萬千,從一開始的一無所知,到后來的輕車熟路,其中所經(jīng)歷的波折真是無以言表。堅持到最后是我最大的收獲,在課設過程中我曾一度有想放棄的念頭,但理智戰(zhàn)勝了沖動,我還是堅持下來了,堅持就是勝利!同時也再一次讓我體會了團隊協(xié)作的重要性,我們分工協(xié)作,各顯神通,一起討論,一起攻關(guān),請別的組同學幫忙,向老師請教遇到不懂的問題,互相提問,互幫互助。這次課程設計終于順利完

16、成了,在設計中遇到了很多編程問題,最后在陳鏵森同學的幫助下解決了難題,對給過我?guī)椭乃型瑢W和指導老師再次表示忠心的感謝!也感謝學校為我們課程設計提供了這么好的設備,這么好的環(huán)境。附錄(fl)#include #include /#include LCD1602.h/#include DS1302.h#define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P17; /實時(sh sh)時鐘時鐘線引腳 sbit DS1302_IO = P16; /實時(sh sh)時鐘數(shù)據(jù)線引腳 sbit DS1302_RST

17、= P15; /實時時鐘復位線引腳sbit wireless_1 = P30;sbit wireless_2 = P31;sbit wireless_3 = P32;sbit wireless_4 = P33;sbit ACC0 = ACC0;sbit ACC7 = ACC7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,時到日,月,年位閃的計數(shù)sbit Set = P20; /模式切換鍵sbit Up = P21; /加法按鈕sbit Down = P22; /減法按鈕sbit o

18、ut = P23; /立刻跳出調(diào)整模式按鈕sbit DQ = P10; /溫度傳送數(shù)據(jù)IO口char done,count,temp,flag,up_flag,down_flag; /uchar temp_value; /溫度值uchar TempBuffer5,week_value2; /void show_time(); /液晶顯示程序/*1602液晶顯示部分子程序*/Port Definitions*sbit LcdRs= P26;sbit LcdRw= P25;sbit LcdEn = P27;sfr DBPort = 0 x80;/P0=0 x80,P1=0 x90,P2=0 xA0

19、,P3=0 xB0.數(shù)據(jù)端口/內(nèi)部等待函數(shù)*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_(); LcdEn=0;return DBPort;/向LCD寫入命令(mng lng)或數(shù)據(jù)*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0 x01 / 清屏#define LCD_HOMING 0 x02 / 光標(un bio)返回原點void LCD_Write(bit style, unsigned c

20、har input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意(zh y)順序LcdEn=1;_nop_();/注意順序LcdEn=0;_nop_();LCD_Wait();/設置顯示模式*#define LCD_SHOW0 x04 /顯示開#define LCD_HIDE0 x00 /顯示關(guān) #define LCD_CURSOR0 x02 /顯示光標#define LCD_NO_CURSOR0 x00 /無光標 #define LCD_FLASH0 x01 /光標閃動#define LCD_NO_FLASH0 x0

21、0 /光標不閃動void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0 x08|DisplayMode);/設置輸入模式*#define LCD_AC_UP0 x02#define LCD_AC_DOWN0 x00 / default#define LCD_MOVE0 x01 / 畫面(humin)可平移#define LCD_NO_MOVE0 x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0 x04|

22、InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0 x38); /8位數(shù)據(jù)(shj)端口,2行顯示,5*7點陣LCD_Write(LCD_COMMAND,0 x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /開啟(kiq)顯示, 無光標LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC遞增, 畫面不動/液晶字符輸入的位置*void GotoXY(uns

23、igned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0 x80|x);if(y=1)LCD_Write(LCD_COMMAND,0 x80|(x-0 x40);/將字符輸出到液晶顯示void Print(unsigned char *str)while(*str!=0)/while(*str!=0)LCD_Write(LCD_DATA,*str);str+;/*DS1302時鐘(shzhng)部分子程序*/typedef struct SYSTEMTIMEunsigned char Second;unsigned char Mi

24、nute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString11;unsigned char TimeString9;SYSTEMTIME;/定義(dngy)的時間類型SYSTEMTIME CurrentTime; /#define AM(X)X#define PM(X)(X+12) / 轉(zhuǎn)成24小時(xiosh)制#define DS1302_SECOND0 x80 /時鐘芯片的寄存器位置,存放時間#def

25、ine DS1302_MINUTE0 x82#define DS1302_HOUR0 x84 #define DS1302_WEEK0 x8A#define DS1302_DAY0 x86#define DS1302_MONTH0 x88#define DS1302_YEAR0 x8C void DS1302InputByte(unsigned char d) /實時時鐘寫入一字節(jié)(內(nèi)部函數(shù)) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相當于匯編中的 RRC DS1302_CLK = 1; DS1302_CLK

26、= 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /實時時鐘讀取一字節(jié)(內(nèi)部函數(shù)) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相當于匯編(hubin)中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址(dzh), ucData: 要寫的數(shù)據(jù) DS13

27、02_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址(dzh),命令 DS1302InputByte(ucDa); / 寫1Byte數(shù)據(jù) DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/讀取DS1302某地址的數(shù)據(jù) unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr

28、|0 x01); / 地址,命令 ucData = DS1302OutputByte(); / 讀1Byte數(shù)據(jù) DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /獲取時鐘芯片的時鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time-Second = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read130

29、2(DS1302_MINUTE);Time-Minute = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (Rea

30、dValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);void DateToStr(SYSTEMTIME *Time) /將時間年,月,日,星期(xngq)數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里DateString i

31、f(hide_year2) /這里的if,else語句都是判斷(pndun)位閃爍,2就不顯示,輸出字符串為 2007/07/22 Time-DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10 + 0; Time-DateString3 = Time-Year%10 + 0; else Time-DateString0 = ; Time-DateString1 = ; Time-DateString2 = ; Time-DateString3 = ;Time-DateString4 = /;if(hide

32、_monthDateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7 = /;if(hide_dayDateString8 = Time-Day/10 + 0; Time-DateString9 = Time-Day%10 + 0; else Time-DateString8 = ; Time-DateString9 = ; if(hide_weekWeek%10 + 0; /星期的數(shù)

33、據(jù)另外放到 week_value數(shù)組里,跟年,月,日的分開存放,因為(yn wi)等一下要在最后顯示 else week_value0 = ; week_value1 = 0;Time-DateString10 = 0; /字符串末尾加 0 ,判斷(pndun)結(jié)束字符void TimeToStr(SYSTEMTIME *Time) /將時,分,秒數(shù)據(jù)(shj)轉(zhuǎn)換成液晶顯示字符放到數(shù)組 TimeString; if(hide_hourTimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; else Time-T

34、imeString0 = ; Time-TimeString1 = ;Time-TimeString2 = :; if(hide_minTimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; else Time-TimeString3 = ; Time-TimeString4 = ; Time-TimeString5 = :; if(hide_secTimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10 + 0; else T

35、ime-TimeString6 = ; Time-TimeString7 = ; Time-DateString8 = 0;void Initial_DS1302(void) /時鐘(shzhng)芯片初始化 unsigned char Second=Read1302(DS1302_SECOND);if(Second&0 x80) /判斷時鐘(shzhng)芯片是否關(guān)閉 Write1302(0 x8e,0 x00); /寫入允許(ynx)Write1302(0 x8c,0 x07); /以下寫入初始化時間 日期:07/07/25.星期: 3. 時間: 23:59:55Write1302(0 x

36、88,0 x07);Write1302(0 x86,0 x25);Write1302(0 x8a,0 x07); /xingqiWrite1302(0 x84,0 x23);Write1302(0 x82,0 x59);Write1302(0 x80,0 x55);Write1302(0 x8e,0 x80); /禁止寫入/*ds18b20子程序*/*ds18b20延遲子函數(shù)(晶振12MHz )*/ void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函數(shù)(hnsh)*/void Init_DS18B20(void) unsigned c

37、har x=0; DQ = 1; /DQ復位(f wi) delay_18B20(8); /稍做延時 DQ = 0; /單片機將DQ拉低 delay_18B20(80); /精確(jngqu)延時 大于 480us DQ = 1; /拉高總線 delay_18B20(14); x=DQ; /稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20);/*ds18b20讀一個字節(jié)*/ unsigned char ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DQ = 0; / 給脈沖信號 dat=1;

38、 /數(shù)據(jù)右移一位 DQ = 1; / 給脈沖信號 if(DQ) dat|=0 x80; /按位或,取最高位 delay_18B20(4); return(dat);/*ds18b20寫一個字節(jié)*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0 x01; /取最低位 delay_18B20(5); DQ = 1; /上升(shngshng)沿將數(shù)據(jù)送入 dat=1; /*讀取ds18b20當前(dngqin)溫度*/void ReadTemp(void)unsigned c

39、har a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0 xCC); / 跳過讀序號列號的操作(cozu)WriteOneChar(0 x44); / 啟動溫度轉(zhuǎn)換delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0 xCC); /跳過讀序號列號的操作WriteOneChar(0 xBE); /讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度delay_18B20(100);a=ReadOneCh

40、ar(); /讀取溫度值低位b=ReadOneChar(); /讀取溫度值高位temp_value=b4;/取溫度值的地位的高四位,右移四位后與溫度的高四位相加得到溫度值 void temp_to_str() /溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示 TempBuffer0=temp_value/10+0; /十位 TempBuffer1=temp_value%10+0; /個位 TempBuffer2=0 xdf; /溫度符號 TempBuffer3=C; TempBuffer4=0;void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;ic

41、ount;i+)for(j=0;j0;delay-) for(i=0;i0 x59) /超過(chogu)59秒,清零 temp=0; break; case 2: temp=Read1302(DS1302_MINUTE); /讀取分數(shù)(fnsh) temp=temp+1; /分數(shù)(fnsh)加1 up_flag=1; if(temp0 x59) /超過59分,清零 temp=0; break; case 3: temp=Read1302(DS1302_HOUR); /讀取小時數(shù) temp=temp+1; /小時數(shù)加1 up_flag=1; if(temp0 x23) /超過23小時,清零 t

42、emp=0; break; case 4: temp=Read1302(DS1302_WEEK); /讀取星期數(shù) temp=temp+1; /星期數(shù)加1 up_flag=1; if(temp0 x7) temp=1; break; case 5: temp=Read1302(DS1302_DAY); /讀取日數(shù) temp=temp+1; /日數(shù)加1 up_flag=1; if(temp0 x31) temp=1; break; case 6: temp=Read1302(DS1302_MONTH); /讀取月數(shù) temp=temp+1; /月數(shù)加1 up_flag=1; if(temp0 x1

43、2) temp=1; break; case 7: temp=Read1302(DS1302_YEAR); /讀取年數(shù)(nin sh) temp=temp+1; /年數(shù)(nin sh)加1 up_flag=1; if(temp0 x85) temp=0; break; default:break; while(Up=0); /while(wireless_2=1); /void Downkey()/降序按鍵(n jin) Down=1; if(Down=0)/if(Down=0|wireless_3=1) mdelay(8); switch(count) case 1: temp=Read13

44、02(DS1302_SECOND); /讀取秒數(shù) temp=temp-1; /秒數(shù)減1 down_flag=1; /數(shù)據(jù)調(diào)整后更新標志 if(temp=0 x7f) /小于0秒,返回59秒 temp=0 x59; break; case 2: temp=Read1302(DS1302_MINUTE); /讀取分數(shù) temp=temp-1; /分數(shù)減1 down_flag=1; if(temp=-1) temp=0 x59; /小于0秒,返回59秒 break; case 3: temp=Read1302(DS1302_HOUR); /讀取小時數(shù) temp=temp-1; /小時數(shù)減1 down

45、_flag=1; if(temp=-1) temp=0 x23; break; case 4: temp=Read1302(DS1302_WEEK); /讀取星期(xngq)數(shù) temp=temp-1; /星期(xngq)數(shù)減1 down_flag=1; if(temp=0) temp=0 x7; break; case 5: temp=Read1302(DS1302_DAY); /讀取日數(shù) temp=temp-1; /日數(shù)減1 down_flag=1; if(temp=0) temp=31; break; case 6: temp=Read1302(DS1302_MONTH); /讀取月數(shù)

46、temp=temp-1; /月數(shù)減1 down_flag=1; if(temp=0) temp=12; break; case 7: temp=Read1302(DS1302_YEAR); /讀取年數(shù)(nin sh) temp=temp-1; /年數(shù)減1 down_flag=1; if(temp=-1) temp=0 x85; break; default:break; while(Down=0); /while(wireless_3=1); void Setkey()/模式選擇(xunz)按鍵Set=1;if(Set=0)/if(Set=0|wireless_4=1) mdelay(4);

47、count=count+1; /Setkey按一次,count就加1 done=1; /進入調(diào)整(tiozhng)模式 while(Set=0); /while(wireless_4=1); void keydone()/按鍵功能(gngnng)執(zhí)行 uchar Second; if(flag=0) /關(guān)閉時鐘,停止計時 Write1302(0 x8e,0 x00); /寫入允許 temp=Read1302(0 x80); Write1302(0 x80,temp|0 x80); Write1302(0 x8e,0 x80); /禁止寫入 flag=1; Setkey(); /掃描模式切換按鍵

48、 switch(count) case 1:do /count=1,調(diào)整秒 outkey(); /掃描跳出按鈕 Upkey(); /掃描加按鈕 Downkey(); /掃描減按鈕 if(up_flag=1|down_flag=1) /數(shù)據(jù)更新,重新寫入新的數(shù)據(jù) Write1302(0 x8e,0 x00); /寫入允許 Write1302(0 x80,temp|0 x80); /寫入新的秒數(shù) Write1302(0 x8e,0 x80); /禁止寫入 up_flag=0; down_flag=0; hide_sec+; /位閃計數(shù)(j sh) if(hide_sec3) hide_sec=0;

49、 show_time(); /液晶顯示數(shù)據(jù)(shj) while(count=2);break; case 2:do /count=2,調(diào)整(tiozhng)分 hide_sec=0; outkey(); Upkey(); Downkey(); if(temp0 x60) temp=0; if(up_flag=1|down_flag=1) Write1302(0 x8e,0 x00); /寫入允許 Write1302(0 x82,temp); /寫入新的分數(shù) Write1302(0 x8e,0 x80); /禁止寫入 up_flag=0; down_flag=0; hide_min+; if(

50、hide_min3) hide_min=0; show_time(); while(count=3);break; case 3:do /count=3,調(diào)整小時 hide_min=0; outkey(); Upkey(); Downkey(); if(up_flag=1|down_flag=1) Write1302(0 x8e,0 x00); /寫入允許 Write1302(0 x84,temp); /寫入新的小時數(shù) Write1302(0 x8e,0 x80); /禁止寫入 up_flag=0; down_flag=0; hide_hour+; if(hide_hour3) hide_ho

51、ur=0; show_time(); while(count=4);break; case 4:do /count=4,調(diào)整(tiozhng)星期 hide_hour=0; outkey(); Upkey(); Downkey(); if(up_flag=1|down_flag=1) Write1302(0 x8e,0 x00); /寫入允許(ynx) Write1302(0 x8a,temp); /寫入新的星期(xngq)數(shù) Write1302(0 x8e,0 x80); /禁止寫入 up_flag=0; down_flag=0; hide_week+; if(hide_week3) hid

52、e_week=0; show_time(); while(count=5);break; case 5:do /count=5,調(diào)整日 hide_week=0; outkey(); Upkey(); Downkey(); if(up_flag=1|down_flag=1) Write1302(0 x8e,0 x00); /寫入允許 Write1302(0 x86,temp); /寫入新的日數(shù) Write1302(0 x8e,0 x80); /禁止寫入 up_flag=0; down_flag=0; hide_day+; if(hide_day3) hide_day=0; show_time(); while(count=6);br

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論