版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 教學(xué)單位 </b></p><p> 學(xué)生學(xué)號 </p><p><b> XXX大學(xué)(學(xué)院)</b></p><p> 畢 業(yè) 設(shè) 計(jì) (論文)</p><p> 題 目: </p>
2、<p> 年 級: </p><p> 學(xué) 號: </p><p> 姓 名: </p><p> 專 業(yè): </p><p> 指導(dǎo)教師:
3、 </p><p> 2011 年 6 月 19 日</p><p><b> 摘 要</b></p><p> 單片機(jī),是集CPU ,RAM ,ROM ,計(jì)數(shù)和多種接口于一體的微控制器。自20世紀(jì)70年代問世以來,以其極高的性能價(jià)格比,受到人們的重視和關(guān)注。它體積小、重量輕、抗干擾能力強(qiáng)、環(huán)境要求
4、不高、價(jià)格低廉、可靠性高、靈活性好、開發(fā)較為容易,廣泛應(yīng)用于智能生產(chǎn)和工業(yè)自動(dòng)化上。</p><p> 本課題通過MCS-51單片機(jī)來設(shè)計(jì),采用匯編語言進(jìn)行編程,可以實(shí)現(xiàn)以下一些功能:小時(shí),分,秒和年,月,的顯示、定時(shí)報(bào)警功能。本次設(shè)計(jì)的電子時(shí)鐘系統(tǒng)由時(shí)鐘電路,LCD顯示電路,定時(shí)報(bào)警電路,按鍵調(diào)整電路四部分組成。51單片機(jī)通過軟件編程,在LCD1602液晶屏上實(shí)現(xiàn)小時(shí),分,秒和年,月,的顯示;利用時(shí)鐘芯片DS
5、1302來實(shí)現(xiàn)計(jì)時(shí),定時(shí)功能;通過兩個(gè)按鍵開關(guān),一個(gè)用于時(shí)鐘的調(diào)節(jié),一個(gè)用于鬧鐘的調(diào)節(jié),來實(shí)現(xiàn)參數(shù)設(shè)置和調(diào)節(jié)功能;到達(dá)設(shè)置的鬧鐘時(shí)間時(shí),由蜂鳴器發(fā)聲,起報(bào)警作用。本次設(shè)計(jì)的電子時(shí)鐘,經(jīng)過對比測試,發(fā)現(xiàn)實(shí)際計(jì)時(shí)的走時(shí)精度較高,可滿足多種場合的應(yīng)用需求。</p><p> 本文詳細(xì)介紹了AT89C51單片機(jī)的基本原理,分析了AT89C51各個(gè)管腳的功能及它在設(shè)計(jì)電路中的作用。本文論述了LCD1602液晶屏和時(shí)鐘芯片
6、DS1302的工作原理及其軟件設(shè)計(jì)過程。</p><p> 關(guān)鍵詞:單片機(jī);電子時(shí)鐘;時(shí)鐘芯片;LCD1602</p><p><b> 1 引 言</b></p><p> 單片機(jī),亦稱單片微電腦或單片微型計(jì)算機(jī)。它是把中央處理器(CPU)、隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、輸入/輸出端口 (I/0)等主要計(jì)算機(jī)功能部件都
7、集成在一塊集成電路芯片上的微型計(jì)算機(jī)。單片機(jī)是把主要計(jì)算機(jī)功能部件都集成在一塊芯片上的微型計(jì)算機(jī)。它是一種集計(jì)數(shù)和多中接口于一體的微控制器,被廣泛應(yīng)用在智能產(chǎn)品和工業(yè)自動(dòng)化上,而52單片機(jī)是個(gè)單片機(jī)中最為典型和最有代表性的一種。</p><p> 現(xiàn)在高精度的計(jì)時(shí)工具大多數(shù)都使用了石英晶體振蕩器,由于電子鐘、石英鐘、石英表都采用了石英技術(shù),因此走時(shí)精度高,穩(wěn)定性好,使用方便,不需要經(jīng)常調(diào)試,數(shù)字式電子鐘用集成電
8、路計(jì)時(shí)時(shí),譯碼代替機(jī)械式傳動(dòng),用LED顯示器代替指針顯示進(jìn)而顯示時(shí)間,減小了計(jì)時(shí)誤差,這種表具有時(shí)、分、秒顯示時(shí)間的功能,還可以進(jìn)行時(shí)和分的校對,片選的靈活性好。</p><p><b> 2 系統(tǒng)結(jié)構(gòu)</b></p><p> 整個(gè)電子時(shí)鐘系統(tǒng)電路可分為五大部分:中央處理單元(CPU)、顯示部分、鍵盤輸入部分、溫度采集部分。</p><p&g
9、t;<b> 1 中央處理單元</b></p><p> CPU選用AT89C52對整個(gè)系統(tǒng)進(jìn)行控制:</p><p> 1)它將定時(shí)數(shù)據(jù)輸出到LED,實(shí)現(xiàn)時(shí)間的顯示;</p><p> 2)根據(jù)鍵盤輸入調(diào)用相應(yīng)鍵處理子程序,實(shí)現(xiàn)時(shí)間的調(diào)整設(shè)定;</p><p> 3)接收溫度傳感器輸入的溫度數(shù)據(jù),進(jìn)行一定轉(zhuǎn)換
10、,輸出到LCD顯示器顯示。</p><p><b> 2.2 顯示部分</b></p><p> 顯示部分是整個(gè)電子時(shí)鐘最為重要的部分,它分為時(shí)間的顯示和溫度的顯示兩部分,采用動(dòng)態(tài)顯示方式,動(dòng)態(tài)顯示方式是時(shí)間數(shù)字在LED上逐個(gè)顯示,通過位選端控制在哪個(gè)LED上顯示數(shù)字,由于LED數(shù)字顯示之間的時(shí)間非常的短,人眼看來是一起顯示時(shí)間數(shù)字的,并且動(dòng)態(tài)顯示方式所用的接口少
11、,節(jié)省了CPU的管腳。由于端口的問題以及動(dòng)態(tài)顯示方式的優(yōu)越性,在此設(shè)計(jì)的連接方式上采用共陰級接法。</p><p><b> 2.3 鍵盤部分</b></p><p> 它是整個(gè)系統(tǒng)中最簡單的部分,根據(jù)功能要求,本系統(tǒng)共需四個(gè)按鍵:功能移位鍵、功能加鍵、功能減鍵、立刻跳出調(diào)整模式鍵采用獨(dú)立式按鍵。</p><p> 2.4 溫度采集部分&
12、lt;/p><p> 此部分選用DS18B20傳感器,主要由四部分組成:64位ROM、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。有三個(gè)管腳:DQ為數(shù)字信號輸入/輸出端;GND為電源地;VDD為外接供電電源輸入端。它是支持“一線總線”接口的溫度傳感器,測量溫度范圍為-55°C~+125°C,在-10~+85°C范圍內(nèi),可編程為9位—12位A/D轉(zhuǎn)換精度,工作電壓在3V—5
13、V之間。現(xiàn)場溫度直接以“一線總線”的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性。</p><p><b> 2.電路制作</b></p><p> 根據(jù)電路圖(如圖示1)將元器件布置在電路板上:</p><p><b> 如圖(1)</b></p><p><b> 系統(tǒng)程序設(shè)計(jì)<
14、;/b></p><p> #include <REG51.H></p><p> #include <intrins.h></p><p> //#include "LCD1602.h"</p><p> //#include "DS1302.h"</p&g
15、t;<p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sbit DS1302_CLK = P1^7; //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 </p><p> sbit DS1302_IO = P1^6;
16、 //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 </p><p> sbit DS1302_RST = P1^5; //實(shí)時(shí)時(shí)鐘復(fù)位線引腳</p><p> sbit wireless_1 = P3^0;</p><p> sbit wireless_2 = P3^1;</p><p> sbit wireless_
17、3 = P3^2;</p><p> sbit wireless_4 = P3^3;</p><p> sbit ACC0 = ACC^0;</p><p> sbit ACC7 = ACC^7;</p><p> char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_
18、month,hide_year; //秒,分,時(shí)到日,月,年位閃的計(jì)數(shù)</p><p> sbit Set = P2^0; //模式切換鍵</p><p> sbit Up = P2^1; //加法按鈕</p><p> sbit Down = P2^2; //減法按鈕</p><p> sbit
19、 out = P2^3; //立刻跳出調(diào)整模式按鈕</p><p> sbit DQ = P1^0; //溫度傳送數(shù)據(jù)IO口</p><p> char done,count,temp,flag,up_flag,down_flag;</p><p> uchar temp_value; //溫度值</p>&l
20、t;p> uchar TempBuffer[5],week_value[2];</p><p> void show_time(); //液晶顯示程序</p><p> /***********1602液晶顯示部分子程序****************/</p><p> //Port Definitions********************
21、**************************************</p><p> sbit LcdRs= P2^5;</p><p> sbit LcdRw= P2^6;</p><p> sbit LcdEn = P2^7;</p><p> sfr DBPort = 0x80;//P0=0x80,
22、P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口</p><p> //內(nèi)部等待函數(shù)***********************************************************</p><p> unsigned char LCD_Wait(void)</p><p><b> {</b></p&g
23、t;<p><b> LcdRs=0;</b></p><p> LcdRw=1;_nop_();</p><p> LcdEn=1;_nop_();</p><p><b> LcdEn=0;</b></p><p> return DBPort;</p>
24、;<p><b> }</b></p><p> //LCD寫入命令或數(shù)據(jù)******************************************************</p><p> #define LCD_COMMAND0 // Command</p><p> #define LCD_
25、DATA1 // Data</p><p> #define LCD_CLEAR_SCREEN0x01 // 清屏</p><p> #define LCD_HOMING 0x02 // 光標(biāo)返回原點(diǎn)</p><p> void LCD_Write(bit style, unsigned char input)<
26、;/p><p><b> {</b></p><p><b> LcdEn=0;</b></p><p> LcdRs=style;</p><p> LcdRw=0;_nop_();</p><p> DBPort=input;_nop_();//注意順序<
27、;/p><p> LcdEn=1;_nop_();//注意順序</p><p> LcdEn=0;_nop_();</p><p> LCD_Wait();</p><p><b> }</b></p><p> //設(shè)置顯示模***************************
28、*********************************</p><p> #define LCD_SHOW0x04 //顯示開</p><p> #define LCD_HIDE0x00 //顯示關(guān) </p><p> #define LCD_CURSOR0x02 //顯示光標(biāo)</p><p&
29、gt; #define LCD_NO_CURSOR0x00 //無光標(biāo) </p><p> #define LCD_FLASH0x01 //光標(biāo)閃動(dòng)</p><p> #define LCD_NO_FLASH0x00 //光標(biāo)不閃動(dòng)</p><p> void LCD_SetDisplay(unsigned cha
30、r DisplayMode)</p><p><b> {</b></p><p> LCD_Write(LCD_COMMAND, 0x08|DisplayMode);</p><p><b> }</b></p><p> //設(shè)置輸入模*************************
31、***********************************</p><p> #define LCD_AC_UP0x02</p><p> #define LCD_AC_DOWN0x00 // default</p><p> #define LCD_MOVE0x01 // 畫面可平移</p>&
32、lt;p> #define LCD_NO_MOVE0x00 //default</p><p> void LCD_SetInput(unsigned char InputMode)</p><p><b> {</b></p><p> LCD_Write(LCD_COMMAND, 0x04|InputMode)
33、;</p><p><b> }</b></p><p> //初始化LCD************************************************************</p><p> void LCD_Initial()</p><p><b> {</b>&
34、lt;/p><p><b> LcdEn=0;</b></p><p> LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣</p><p> LCD_Write(LCD_COMMAND,0x38);</p><p> LCD_SetDisplay(L
35、CD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)</p><p> LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動(dòng)</p><p><b> }&
36、lt;/b></p><p> //液晶字符輸入的位置****************************************************</p><p> void GotoXY(unsigned char x, unsigned char y)</p><p><b> {</b></p>&l
37、t;p><b> if(y==0)</b></p><p> LCD_Write(LCD_COMMAND,0x80|x);</p><p><b> if(y==1)</b></p><p> LCD_Write(LCD_COMMAND,0x80|(x-0x40));</p><p>
38、<b> }</b></p><p> void Print(unsigned char *str)</p><p><b> {</b></p><p> while(*str!='\0')</p><p><b> {</b></p>
39、<p> LCD_Write(LCD_DATA,*str);</p><p><b> str++;</b></p><p><b> }</b></p><p><b> }</b></p><p> /***********DS1302時(shí)鐘部分子程序*
40、*****************/</p><p> typedef struct __SYSTEMTIME__</p><p><b> {</b></p><p> unsigned char Second;</p><p> unsigned char Minute;</p><p&g
41、t; unsigned char Hour;</p><p> unsigned char Week;</p><p> unsigned char Day;</p><p> unsigned char Month;</p><p> unsigned char Year;</p><p> unsig
42、ned char DateString[11];</p><p> unsigned char TimeString[9];</p><p> }SYSTEMTIME;//定義的時(shí)間類型</p><p> SYSTEMTIME CurrentTime;</p><p> #define AM(X)X</p><
43、p> #define PM(X)(X+12) // 轉(zhuǎn)成24小時(shí)制</p><p> #define DS1302_SECOND0x80 //時(shí)鐘芯片的寄存器位置,存放時(shí)間</p><p> #define DS1302_MINUTE0x82</p><p> #define DS1302_HOUR
44、0x84 </p><p> #define DS1302_WEEK0x8A</p><p> #define DS1302_DAY0x86</p><p> #define DS1302_MONTH0x88</p><p> #define DS1302_YEAR0x8C </p><p>
45、 void DS1302InputByte(unsigned char d) //實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù))</p><p><b> { </b></p><p> unsigned char i;</p><p><b> ACC = d;</b></p><p> for(i=8
46、; i>0; i--)</p><p><b> {</b></p><p> DS1302_IO = ACC0; //相當(dāng)于匯編中的 RRC</p><p> DS1302_CLK = 1;</p><p> DS1302_CLK = 0;</p><p>
47、 ACC = ACC >> 1; </p><p><b> } </b></p><p><b> }</b></p><p> unsigned char DS1302OutputByte(void) //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))</p><p><b>
48、{ </b></p><p> unsigned char i;</p><p> for(i=8; i>0; i--)</p><p><b> {</b></p><p> ACC = ACC >>1; //相當(dāng)于匯編中的 RRC </p>&
49、lt;p> ACC7 = DS1302_IO;</p><p> DS1302_CLK = 1;</p><p> DS1302_CLK = 0;</p><p><b> } </b></p><p> return(ACC); </p><p><b> }<
50、/b></p><p> void Write1302(unsigned char ucAddr, unsigned char ucDa) {</p><p> DS1302_RST = 0;</p><p> DS1302_CLK = 0;</p><p> DS1302_RST = 1;</p
51、><p> DS1302InputByte(ucAddr); // 地址,命令 </p><p> DS1302InputByte(ucDa); // 寫1Byte數(shù)據(jù)</p><p> DS1302_CLK = 1;</p><p> DS1302_RST = 0;</p><p>&
52、lt;b> } </b></p><p> unsigned char Read1302(unsigned char ucAddr)//讀取DS1302某地址的數(shù)據(jù)</p><p><b> {</b></p><p> unsigned char ucData;</p><p> DS13
53、02_RST = 0;</p><p> DS1302_CLK = 0;</p><p> DS1302_RST = 1;</p><p> DS1302InputByte(ucAddr|0x01); // 地址,命令 </p><p> ucData = DS1302OutputByte(); // 讀
54、1Byte數(shù)據(jù)</p><p> DS1302_CLK = 1;</p><p> DS1302_RST = 0;</p><p> return(ucData);</p><p><b> }</b></p><p> void DS1302_GetTime(SYSTEMTIME *T
55、ime) //獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)</p><p><b> {</b></p><p> unsigned char ReadValue;</p><p> ReadValue = Read1302(DS1302_SECOND);</p><p> Time->Second = ((ReadValue
56、&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_MINUTE);</p><p> Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><
57、;p> ReadValue = Read1302(DS1302_HOUR);</p><p> Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_DAY);</p><p> Ti
58、me->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_WEEK);</p><p> Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&
59、0x0F);</p><p> ReadValue = Read1302(DS1302_MONTH);</p><p> Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_YEAR);&
60、lt;/p><p> Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p><b> }</b></p><p> void DateToStr(SYSTEMTIME *Time) //將時(shí)間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯
61、示字符串,放到數(shù)組里DateString[]</p><p> { if(hide_year<2) //這里的if,else語句都是判斷位閃爍,<2顯示數(shù)據(jù),>2就不顯示,輸出字符串為 2007/07/22</p><p> { </p><p>
62、 Time->DateString[0] = '2';</p><p> Time->DateString[1] = '0'; </p><p> Time->DateString[2] = Time->Year/10 + '0';</p><p> Time->DateStrin
63、g[3] = Time->Year%10 + '0';</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> Time->DateString[0] = &
64、#39; ';</p><p> Time->DateString[1] = ' '; </p><p> Time->DateString[2] = ' ';</p><p> Time->DateString[3] = ' ';</p><p><b
65、> }</b></p><p> Time->DateString[4] = '/';</p><p> if(hide_month<2)</p><p><b> {</b></p><p> Time->DateString[5] = Time->M
66、onth/10 + '0';</p><p> Time->DateString[6] = Time->Month%10 + '0';</p><p><b> }</b></p><p><b> else</b></p><p><b>
67、; {</b></p><p> Time->DateString[5] = ' ';</p><p> Time->DateString[6] = ' ';</p><p><b> }</b></p><p> Time->DateString[
68、7] = '/';</p><p> if(hide_day<2)</p><p><b> {</b></p><p> Time->DateString[8] = Time->Day/10 + '0';</p><p> Time->DateString
69、[9] = Time->Day%10 + '0';</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> Time->DateString[8] = '
70、; ';</p><p> Time->DateString[9] = ' '; </p><p><b> }</b></p><p> if(hide_week<2)</p><p><b> {</b></p><p>
71、; week_value[0] = Time->Week%10 + '0'; //星期的數(shù)據(jù)另外放到 week_value[]數(shù)組里,跟年,月,日的分開存放,因?yàn)榈纫幌乱谧詈箫@示</p><p><b> }</b></p><p><b> else</b></p><p><b&g
72、t; {</b></p><p> week_value[0] = ' ';</p><p><b> }</b></p><p> week_value[1] = '\0';</p><p> Time->DateString[10] = '\0
73、9;; //字符串末尾加 '\0' ,判斷結(jié)束字符</p><p><b> }</b></p><p> void TimeToStr(SYSTEMTIME *Time) //將時(shí),分,秒數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符{ if(hide_hour<2)</p><p><b> {</b><
74、;/p><p> Time->TimeString[0] = Time->Hour/10 + '0';</p><p> Time->TimeString[1] = Time->Hour%10 + '0';</p><p><b> }</b></p><p>&
75、lt;b> else</b></p><p><b> {</b></p><p> Time->TimeString[0] = ' ';</p><p> Time->TimeString[1] = ' ';</p><p><b> }
76、</b></p><p> Time->TimeString[2] = ':';</p><p> if(hide_min<2)</p><p><b> {</b></p><p> Time->TimeString[3] = Time->Minute/10
77、+ '0';</p><p> Time->TimeString[4] = Time->Minute%10 + '0';</p><p><b> }</b></p><p><b> else</b></p><p><b> {<
78、;/b></p><p> Time->TimeString[3] = ' ';</p><p> Time->TimeString[4] = ' ';</p><p><b> }</b></p><p> Time->TimeString[5] =
79、39;:';</p><p> if(hide_sec<2)</p><p><b> {</b></p><p> Time->TimeString[6] = Time->Second/10 + '0';</p><p> Time->TimeString[7]
80、= Time->Second%10 + '0';</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> Time->TimeString[6] = '
81、 ';</p><p> Time->TimeString[7] = ' ';</p><p><b> }</b></p><p> Time->DateString[8] = '\0';</p><p><b> }</b></p
82、><p> void Initial_DS1302(void) //時(shí)鐘芯片初始化</p><p><b> { </b></p><p> unsigned char Second=Read1302(DS1302_SECOND);</p><p> if(Second&0x80) //判
83、斷時(shí)鐘芯片是否關(guān)閉 </p><p><b> {</b></p><p> Write1302(0x8e,0x00); //寫入允許</p><p> Write1302(0x8c,0x07);//寫入初始化值07/07/25.星期:3.時(shí)間: 23:59:55</p><p> Write1302(0x8
84、8,0x07);</p><p> Write1302(0x86,0x25);</p><p> Write1302(0x8a,0x07);</p><p> Write1302(0x84,0x23);</p><p> Write1302(0x82,0x59);</p><p> Write1302(0x8
85、0,0x55);</p><p> Write1302(0x8e,0x80); //禁止寫入</p><p><b> }</b></p><p><b> }</b></p><p> /***********ds18b20子程序*************************/<
86、/p><p> /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/ </p><p> void delay_18B20(unsigned int i)</p><p><b> {</b></p><p> while(i--);</p><p><b
87、> }</b></p><p> /**********ds18b20初始化函數(shù)**********************/</p><p> void Init_DS18B20(void) </p><p><b> {</b></p><p> unsigned char x=0;<
88、;/p><p> DQ = 1; //DQ復(fù)位</p><p> delay_18B20(8); //稍做延時(shí)</p><p> DQ = 0; //單片機(jī)將DQ拉低</p><p> delay_18B20(80); //精確延時(shí) 大于 480us</p><p> DQ
89、= 1; //拉高總線</p><p> delay_18B20(14);</p><p> x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗</p><p> delay_18B20(20);</p><p><b> }</b></p>
90、<p> /***********ds18b20讀一個(gè)字節(jié)**************/ </p><p> unsigned char ReadOneChar(void)</p><p><b> {</b></p><p> uchar i=0;</p><p> uchar dat = 0
91、;</p><p> for (i=8;i>0;i--)</p><p><b> {</b></p><p> DQ = 0; // 給脈沖信號</p><p><b> dat>>=1;</b></p><p> DQ = 1; // 給脈沖信
92、號</p><p><b> if(DQ)</b></p><p> dat|=0x80;</p><p> delay_18B20(4);</p><p><b> }</b></p><p> return(dat);</p><p>&
93、lt;b> }</b></p><p> /*************ds18b20寫一個(gè)字節(jié)****************/ </p><p> void WriteOneChar(uchar dat)</p><p><b> {</b></p><p> unsigned char
94、i=0;</p><p> for (i=8; i>0; i--)</p><p><b> {</b></p><p><b> DQ = 0;</b></p><p> DQ = dat&0x01;</p><p> delay_18B20(5);
95、</p><p><b> DQ = 1;</b></p><p><b> dat>>=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> /*****
96、*********讀取ds18b20當(dāng)前溫度************/</p><p> void ReadTemp(void)</p><p><b> {</b></p><p> unsigned char a=0;</p><p> unsigned char b=0;</p><p&
97、gt; unsigned char t=0;</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換</p><p> delay_18B20(100);
98、 // this message is wery important</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器兩個(gè)就是溫度</p><p> delay_18B2
99、0(100);</p><p> a=ReadOneChar(); //讀取溫度值低位</p><p> b=ReadOneChar(); //讀取溫度值高位</p><p> temp_value=b<<4;</p><p> temp_value+=(a&0xf0)>>4;
100、 </p><p><b> }</b></p><p> void temp_to_str() //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p><p><b> {</b></p><p> TempBuffer[0]=temp_value/10+'0';
101、//十位</p><p> TempBuffer[1]=temp_value%10+'0'; //個(gè)位</p><p> TempBuffer[2]=0xdf; //溫度符號</p><p> TempBuffer[3]='C';</p><p> TempBuffer[4]='\0
102、9;;</p><p><b> }</b></p><p> void Delay1ms(unsigned int count)</p><p><b> {</b></p><p> unsigned int i,j;</p><p> for(i=0;i<
103、;count;i++)</p><p> for(j=0;j<120;j++);</p><p><b> }</b></p><p><b> /*延時(shí)子程序*/</b></p><p> void mdelay(uint delay)</p><p><
104、;b> {uint i;</b></p><p> for(;delay>0;delay--)</p><p> {for(i=0;i<62;i++) //1ms延時(shí).</p><p><b> {;}</b></p><p><b> }</b></
105、p><p><b> }</b></p><p> void outkey() //跳出調(diào)整模式,返回默認(rèn)顯示</p><p> { uchar Second;</p><p> if(out==0||wireless_1==1) </p><
106、p> { mdelay(8); </p><p><b> count=0;</b></p><p> hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;</p><p> Second=Read1302(DS1302
107、_SECOND);</p><p> Write1302(0x8e,0x00); //寫入允許</p><p> Write1302(0x80,Second&0x7f);</p><p> Write1302(0x8E,0x80); //禁止寫入</p><p> done=0; <
108、/p><p> while(out==0);</p><p> while(wireless_1==1);</p><p><b> }</b></p><p><b> }</b></p><p> void Upkey()//升序按鍵</p><
109、p><b> { </b></p><p><b> Up=1;</b></p><p> if(Up==0||wireless_2==1)</p><p><b> {</b></p><p> mdelay(8);</p><p&g
110、t; switch(count)</p><p><b> {case 1:</b></p><p> temp=Read1302(DS1302_SECOND);//讀取秒數(shù)</p><p> temp=temp+1; //秒數(shù)加1</p><p> up_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志<
111、/p><p> if((temp&0x7f)>0x59) //超過59秒,清零</p><p> temp=0; </p><p><b> break;</b></p><p><b> case 2:</b></p><p> t
112、emp=Read1302(DS1302_MINUTE);//讀取分?jǐn)?shù)</p><p> temp=temp+1; //分?jǐn)?shù)加1</p><p> up_flag=1;</p><p> if(temp>0x59) //超過59分,清零</p><p><b> temp=0;</b>&l
113、t;/p><p><b> break;</b></p><p><b> case 3:</b></p><p> temp=Read1302(DS1302_HOUR);//讀取小時(shí)數(shù)</p><p> temp=temp+1; //小時(shí)數(shù)加1</p><p> u
114、p_flag=1;</p><p> if(temp>0x23) //超過23小時(shí),清零</p><p><b> temp=0;</b></p><p><b> break;</b></p><p><b> case 4:</b></p>
115、<p> temp=Read1302(DS1302_WEEK);//讀取星期數(shù)</p><p> temp=temp+1; //星期數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x7) </p><p><b> temp=1;</b></p>
116、;<p><b> break;</b></p><p><b> case 5:</b></p><p> temp=Read1302(DS1302_DAY); //讀取日數(shù)</p><p> temp=temp+1; //日數(shù)加1</p><p> up_flag=1
117、;</p><p> if(temp>0x31)</p><p><b> temp=1;</b></p><p><b> break;</b></p><p><b> case 6:</b></p><p> temp=Read13
118、02(DS1302_MONTH);//讀取月數(shù)</p><p> temp=temp+1; //月數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x12)</p><p><b> temp=1;</b></p><p><b> b
119、reak;</b></p><p><b> case 7:</b></p><p> temp=Read1302(DS1302_YEAR); //讀取年數(shù)</p><p> temp=temp+1; //年數(shù)加1</p><p> up_flag=1;</p><p>
120、 if(temp>0x85)</p><p><b> temp=0;</b></p><p><b> break;</b></p><p> default:break;</p><p><b> }</b></p><p> whi
121、le(Up==0);</p><p> while(wireless_2==1);</p><p><b> }</b></p><p><b> }</b></p><p> void Downkey()//降序按鍵</p><p><b> {
122、 </b></p><p><b> Down=1;</b></p><p> if(Down==0||wireless_3==1)</p><p><b> {</b></p><p> mdelay(8);</p><p> switch(count
123、)</p><p><b> {case 1:</b></p><p> temp=Read1302(DS1302_SECOND);//讀取秒數(shù)</p><p> temp=temp-1;//秒數(shù)減1</p><p> down_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志</p>
124、<p> if(temp==0x7f) //小于0秒,返回59秒</p><p> temp=0x59;</p><p><b> break;</b></p><p><b> case 2:</b></p><p> temp=Read1302(DS1302_MINU
125、TE);//讀取分?jǐn)?shù)</p><p> temp=temp-1; //分?jǐn)?shù)減1</p><p> down_flag=1;</p><p> if(temp==-1)</p><p> temp=0x59; //小于0秒,返回59秒</p><p><b> break;</b&g
126、t;</p><p><b> case 3:</b></p><p> temp=Read1302(DS1302_HOUR);//讀取小時(shí)數(shù)</p><p> temp=temp-1; //小時(shí)數(shù)減1</p><p> down_flag=1;</p><p> if(temp==-
127、1)</p><p> temp=0x23;</p><p><b> break;</b></p><p><b> case 4:</b></p><p> temp=Read1302(DS1302_WEEK);//讀取星期數(shù)</p><p> temp=tem
128、p-1; //星期數(shù)減1</p><p> down_flag=1;</p><p> if(temp==0)</p><p> temp=0x7;;</p><p><b> break;</b></p><p><b> case 5:</b></p&g
129、t;<p> temp=Read1302(DS1302_DAY); //讀取日數(shù)</p><p> temp=temp-1; //日數(shù)減1</p><p> down_flag=1;</p><p> if(temp==0)</p><p><b> temp=31;</b></p>
130、;<p><b> break;</b></p><p><b> case 6:</b></p><p> temp=Read1302(DS1302_MONTH); //讀取月數(shù)</p><p> temp=temp-1; //月數(shù)減1</p><p> down_fla
131、g=1;</p><p> if(temp==0)</p><p><b> temp=12;</b></p><p><b> break;</b></p><p><b> case 7:</b></p><p> temp=Read130
132、2(DS1302_YEAR); //讀取年數(shù)</p><p> temp=temp-1; //年數(shù)減1</p><p> down_flag=1;</p><p> if(temp==-1)</p><p> temp=0x85;</p><p><b> break;</b><
133、;/p><p> default:break;</p><p><b> }</b></p><p> while(Down==0);</p><p> while(wireless_3==1);</p><p><b> }</b></p><p&
134、gt;<b> }</b></p><p> void Setkey()//模式選擇按鍵</p><p><b> {</b></p><p><b> Set=1;</b></p><p> if(Set==0||wireless_4==1)</p>
135、<p><b> {</b></p><p> mdelay(8);</p><p> count=count+1; //Setkey按一次,count就加1</p><p> done=1; //進(jìn)入調(diào)整模式</p><p> while(Set==0);</p><p&
136、gt; while(wireless_4==1);</p><p><b> }</b></p><p><b> }</b></p><p> void keydone()//按鍵功能執(zhí)行</p><p> { uchar Second;</p><p&
137、gt; if(flag==0) //關(guān)閉時(shí)鐘,停止計(jì)時(shí)</p><p> { Write1302(0x8e,0x00); //寫入允許</p><p> temp=Read1302(0x80);</p><p> Write1302(0x80,temp|0x80);</p><p> Write1302(0x8e,0x80);
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于at89c51單片機(jī)的電子時(shí)鐘設(shè)計(jì)
- 畢業(yè)論文-基于at89c51單片機(jī)電子時(shí)鐘的設(shè)計(jì)與實(shí)現(xiàn)(完稿)
- 基于單片機(jī)at89c51的電子時(shí)鐘的課程設(shè)計(jì)
- 基于89c51單片機(jī)電子時(shí)鐘課程設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)-基于at89c51單片機(jī)的數(shù)字時(shí)鐘設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)論文----單片機(jī)電子時(shí)鐘
- 單片機(jī)電子時(shí)鐘 畢業(yè)設(shè)計(jì)論文
- 畢業(yè)設(shè)計(jì)(論文) 單片機(jī)電子時(shí)鐘設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)基于51單片機(jī)的電子時(shí)鐘設(shè)計(jì)
- 單片機(jī)電子時(shí)鐘畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)--單片機(jī)電子時(shí)鐘
- 基于at89c51單片機(jī)的數(shù)字時(shí)鐘設(shè)計(jì)
- 單片機(jī)電子時(shí)鐘畢業(yè)設(shè)計(jì)
- 單片機(jī)電子時(shí)鐘設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 基于89c51單片機(jī)電子數(shù)字時(shí)鐘設(shè)計(jì)
- 2017畢業(yè)論文-基于at89c51單片機(jī)數(shù)字時(shí)鐘的設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)基于單片機(jī)at89c51電子血壓計(jì)的設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)基于at89c51單片機(jī)數(shù)控電源
- 基于c語言單片機(jī)電子時(shí)鐘設(shè)計(jì)
- 單片機(jī)電子時(shí)鐘畢業(yè)設(shè)計(jì) (2)
評論
0/150
提交評論