版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課 題 :電子鐘溫度計的設計 </p><p><b> 摘要:</b></p><p> 該設計實現了24小時制的時間顯示及設定、年、月、日、星期的顯示及設定、溫度的檢測及顯示等功能。設計共分為四大部分,分別是控制部分、時鐘部分、溫度檢測部分和人機交互部分。</p><p> 本設計采用的
2、是STC89C51RC單片機,內部帶有8KB的ROM,能夠存儲大量的程序,最突出特點是具有ISP在系統燒寫功能,使得燒寫程序更加方便。</p><p> 計時采用DS1302時鐘芯片實現,該芯片通過簡單的串行通信與單片機進行通信,時鐘/日歷電路能夠實時提供年、月、星期、日、時分、秒信息,采用雙電源供電,當外部電源掉電時能夠利用后備電池準確計時。</p><p> 溫度檢測采用DALLA
3、S公司的數字化溫度傳感器DS18B20,該芯片采用的是獨特的“一線總線”的方式與單片機進行通信,一線總線獨特而且經濟的特點,是用戶可以輕松的組建傳感器網絡,為測量系統的構建引入全新的概念。實時溫度采用一線總線的方式傳輸大大的提高了信號的抗干擾性,分辨率可通過軟件設置,其小巧的體積為各種環(huán)境下測量溫度提供了方便。</p><p> 顯示器件采用通用型1602液晶,可顯示32個字符,如果使用數碼管來做顯示器件需消耗
4、大量的系統資源,因此采用低功耗的1602液晶,該液晶顯示方便,功能強大,完全能滿足數字萬年歷的顯示要求。</p><p><b> 關鍵詞:</b></p><p> 單片機AT89C51 溫度傳感器DS18B20 時鐘芯DS1302 液晶1602</p><p><b> 目錄</b></p>&l
5、t;p> 第一章 設計任務—————————————————————-4</p><p><b> 第二章 電路設計</b></p><p> 2.1設計方案比較 ———————————————————4</p><p> 2.1.1 時鐘電路的設計————————————————4</p><p> 2
6、.1.2 溫度電路的設計————————————————5 </p><p> 2.2根據設計繪制整體方框圖及硬件圖——————————6</p><p> 2.2.1整體方框圖——————————————————6 </p><p> 2.2.2總體硬件圖——————————————————6</p><p><b>
7、程序流程圖</b></p><p> 3.1主程序流程圖———————————————————7</p><p> 3.2 鍵盤服務程序流程圖————————————————7</p><p> 3.3 溫度采集與顯示程序流程圖————————————--8</p><p> 第四章 模塊設計及說明</p>
8、<p> 4.1 液晶顯示模塊 </p><p> 4.1.1 DS1602簡介———————————————-——8</p><p> 4.1.2 DS1602相應功能特性介紹—————————-——8</p><p> 4.1.3 DS1602液晶與單片機接口電路——————————9</p><p><
9、b> 4.2計數模塊</b></p><p> 4.2.1 DS1302特性介紹————————————————9</p><p> 4.2.2 DS1302引腳介紹————————————————9</p><p> 4.2.3 DS1302與單片機接口電路————————————10</p><p> 4
10、.3實時環(huán)境溫度采集模塊</p><p> 4.3.1 DS18B2O簡介—————————————————10</p><p> 4.3.2 單總線介紹——————————————————10</p><p> 4.3.3 DS18B20管腳介紹———————————————10</p><p> 4.3.4 DS18B20時
11、序介紹————————————————10</p><p> 4.3.5 DS18B20與單片機的接口電路——-————————-11</p><p> 4.4 設置模塊——————————————————————11</p><p> 第五章 調試與驗證————————————————————11</p><p><b>
12、 第一章 設計任務</b></p><p> ?。?)能夠實現時間的正確顯示,并且可以對表進行調整。</p><p> ?。?)能夠實現年月日及星期的顯示,并且可以對日期進行調整。</p><p> ?。?)能夠實現對溫度的及時檢測,并且可以正確顯示。</p><p> (4)用protues實現對設計的仿真。</p&g
13、t;<p><b> 第二章 電路設計</b></p><p> 2.1電路方案的比較</p><p> 2.1.1時鐘電路的設計</p><p> 方案一:時鐘電路可由555定時器組成,通過555定時器構成1Hz脈沖發(fā)生電路(如圖2-1),然后將脈沖機輸入單片機,經單片機計算生成時鐘。脈沖信號從555的3號引腳輸出,通
14、過電阻和電容可以得到不同頻率的脈沖。其計算方法為tpl=R2C2ln2;tph=(R1+R2)C2ln2。</p><p> 圖2-1 555秒脈沖發(fā)生電路</p><p> 方案二:用單片機控制專用時鐘芯片DS1302(如圖2-2),通過對時鐘芯片的初始化設置、寫數據、讀數據等操作,實現對時鐘信息的獲取。</p><p> 圖2-3 DS1302與單片機連接
15、圖</p><p> 比較:兩個方案雖然都能實現時鐘的功能,但是方案一由于電阻電容 及其自身的精度影響,其生成的秒脈沖精度相對差一些,且將秒脈沖信號換算成時鐘的編程也相對復雜,而方案二能夠較好地彌補方案一的不足。所以本設計中的時鐘電路采用方案二的設計。</p><p> 2.1.2溫度檢測電路的設計</p><p> 方案一:利用熱敏電阻對溫度特殊的溫度效
16、應,可以通過一個比較簡單的電路將溫度信號轉換成相應的電壓信號,為了使電壓信號更便于精確測量,可以利用運放將電壓信號放大,再經模數轉換將電壓信號送入單片機,最后通過單片機的計算得出溫度值,送入數碼管顯示。</p><p> 方案二:利用單片機對溫度傳感器DS18B20的控制,獲取溫度傳感器所采集的溫度信號(如圖2-3)。</p><p> 圖2-3 DS18B20與單片機連接圖</
17、p><p> 比較:方案一原理容易理解,但實際操作很有難度。不僅自己設計電路精度不能保證,而且外圍電路復雜,成本也較高。而由圖2-3可以直觀看出方案二簡單方便,且精度較高,所以本設計中的溫度檢測電路采用方案二。</p><p> 2.2根據設計繪制整體方框圖及硬件圖</p><p> 2.2.1整體方框圖</p><p> 2.2.2總體
18、硬件圖</p><p><b> 第三章 程序流程圖</b></p><p><b> 3.1主程序流程圖</b></p><p> 3.2 鍵盤服務程序流程圖</p><p> 3.3 溫度采集與顯示程序流程圖</p><p> 第四章 模塊設計及說明</
19、p><p> 4.1 液晶顯示模塊</p><p> 4.1.1 DS1602簡介</p><p> 1602液晶也叫1602字符型液晶 它是一種專門用來顯示字母、數字、符號等的點陣型液晶模塊 它有若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符。每位之間有一個點距的間隔,每行之間也有也有間隔,起到了字符間距和行間距的作用。1602的驅
20、動電路帶有11條指令,可以很方便的控制液晶的現實效果如:清屏、左移右移、光標顯示。而且1602顯示的字符在下一條指令為到來之前不會改變,也就是能夠維持顯示的字符,1602液晶占用的系統資源也少。</p><p> 在編程時必須注意1602的初始化和三個控制口的編寫,確保從DS1302和18B20中讀出的數據正確輸入。</p><p> 4.1.2 DS1602相應功能特性介紹<
21、/p><p> +5V電壓,對比度可調</p><p><b> 內含復位電路</b></p><p> 提供各種控制命令,如:清屏、字符閃爍、光標閃爍、顯示移位等多種功能</p><p> 有80字節(jié)顯示數據存儲器DDRAM</p><p> 內建有160個5X7點陣的字型的字符發(fā)生器CG
22、ROM</p><p> 8個可由用戶自定義的5X7的字符發(fā)生器CGRAM</p><p> 4.1.3 DS1602液晶與單片機接口電路 </p><p><b> 4.2計數模塊</b></p><p> 4.2.1 DS1302特性介紹</p><p> DS1302是美國D
23、ALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數據。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。</p><p>
24、 4.2.2 DS1302引腳介紹</p><p><b> 各引腳的功能為:</b></p><p> Vcc2:5V電源。當Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當Vcc2< </p><p> Vcc1時,由Vcc1向DS1302供電。 </p><p> 2、3、X
25、1、X2 是外接晶振腳 (32.768KHZ的晶振)</p><p><b> 4、地(GND)</b></p><p> 5、CE/RST:復位腳</p><p> 6、I/O:數據輸入輸出口;</p><p> 7、SCLK:串行時鐘,輸入; </p><p> 8、Vc
26、c1:備用電池端;</p><p> DS1302通過三根口線實現與單片機的通信,因DS1302功耗很小,即使電源掉電后通過3V的紐扣電池仍能維持DS1302精確走時。</p><p> 4.2.3 DS1302與單片機接口電路</p><p> 4.3實時環(huán)境溫度采集模塊</p><p> 4.3.1 DS18B2O簡介<
27、/p><p> DS18B20是美國DALLAS公司生產的數字溫度傳感器,采用單總線的接口方式與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20 的雙向通訊。 單總線具有經濟性好,抗干擾能力強,適合于惡劣環(huán)境的現場溫度測量,使用方便等優(yōu)點,使用戶可輕松地組建傳感器網絡,為測量系統的構建引入全新概念。測量溫度范圍寬,測量精度高 ,在使用中不需要任何外圍元件,支持多點組網功能 多個 DS18B20 可以并聯
28、在惟一的單線上,實現多點測溫,供電方式靈活 DS18B20 可以通過內部寄生電路從數據線上獲取電源。因此,當數據線上的時序滿足一定的要求時,可以不接外部電源,從而使系統結構更趨簡單,可靠性更高。因此非常適合本系統使用。</p><p> 4.3.2 單總線介紹</p><p> 單總線即只有一根數據線,系統中的數據交換,控制都由這根線完成。</p><p>
29、 單總線通常要求外接一個約為 4.7K—10K 的上拉電阻,這樣,當總線閑置時其狀態(tài)為高電平。</p><p> 4.3.3 DS18B20管腳介紹</p><p> 1 GND為電源 地;</p><p> 2 DQ為數字信號輸入/輸出端</p><p> 3 VDD為外接供電電源輸入端,在寄生電源</p>
30、<p> 4.3.4 DS18B20時序介紹</p><p> DS18B20的一線工作協議流程是:</p><p> 初始化→ROM操作指令→存儲器操作指令→數據傳輸。</p><p><b> 其工作時序包括:</b></p><p><b> 初始化時序</b><
31、/p><p><b> 寫時序</b></p><p><b> 讀時序</b></p><p> 4.3.5 DS18B20與單片機的接口電路 </p><p><b> 4.4 設置模塊</b></p><p> 采用4個獨立按鍵,接口電路如下
32、;</p><p> 第五章 調試與驗證</p><p> 本設計采用protues軟件進行仿真,經過反復的調試最終仿真通過??梢詫崿F預期的功能。部分功能演示如圖5-1所示</p><p><b> 附錄一:程序</b></p><p> #include<reg51.h></p>&
33、lt;p> #include"DS18B20_3.H"</p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;<
34、/p><p> //flag用于讀取頭文件中的溫度值,和顯示溫度值</p><p> #define yh 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)</p><p> #define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)</p>
35、<p> //液晶屏的與C51之間的引腳連接定義(顯示數據線接C51的P0口)</p><p> sbit rs=P2^5;</p><p> sbit rw=P2^6; //如果硬件上rw接地,就不用寫這句和后面的rw=0了</p><p> sbit en=P2^7;</p><p> sbit SCLK = P1^
36、6; /*實時時鐘時鐘線引腳 */</p><p> sbit IO = P3^5; /*實時時鐘數據線引腳 */</p><p> sbit RST = P1^7; /*實時時鐘復位線引腳 */</p><p> sbit ACC0=ACC^0;</p><p> sbit ACC7=ACC^7;</p><p&
37、gt; //校時按鍵與C51的引腳連接定義</p><p> sbit key1=P3^2; //設置鍵</p><p> sbit key2=P3^3; //加鍵</p><p> sbit key3=P3^4; //減鍵</p><p> uchar code tab1[]={"20 - - "
38、}; //年顯示的固定字符</p><p> uchar code tab2[]={" : : "};//時間顯示的固定字符</p><p> //延時函數,后面經常調用</p><p> void delay(uint xms)//延時函數,有參函數</p><p><b> {</b>
39、;</p><p><b> uint x,y;</b></p><p> for(x=xms;x>0;x--)</p><p> for(y=110;y>0;y--);</p><p><b> }</b></p><p> /********液晶寫入
40、指令函數與寫入數據函數,以后可調用**************/</p><p> write_1602com(uchar com)//****液晶寫入指令函數****</p><p><b> {</b></p><p> rs=0;//數據/指令選擇置為指令</p><p> rw=0; //讀寫選擇置為寫&
41、lt;/p><p> P0=com;//送入數據</p><p><b> delay(1);</b></p><p> en=1;//拉高使能端,為制造有效的下降沿做準備</p><p><b> delay(1);</b></p><p> en=0;//en由高變
42、低,產生下降沿,液晶執(zhí)行命令</p><p><b> }</b></p><p> write_1602dat(uchar dat)//***液晶寫入數據函數****</p><p><b> {</b></p><p> rs=1;//數據/指令選擇置為數據</p><
43、;p> rw=0; //讀寫選擇置為寫</p><p> P0=dat;//送入數據</p><p><b> delay(1);</b></p><p> en=1; //en置高電平,為制造下降沿做準備</p><p><b> delay(1);</b></p>
44、<p> en=0; //en由高變低,產生下降沿,液晶執(zhí)行命令</p><p><b> }</b></p><p> lcd_init()//***液晶初始化函數****</p><p><b> {</b></p><p> write_1602com(0x38);//設置
45、液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據</p><p> write_1602com(0x0c);//開顯示不顯示光標</p><p> write_1602com(0x06);//整屏不移動,光標自動右移</p><p> write_1602com(0x01);//清顯示</p><p> write_1602c
46、om(yh+1);//日歷顯示固定符號從第一行第1個位置之后開始顯示</p><p> for(a=0;a<14;a++)</p><p><b> {</b></p><p> write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分</p><p> //delay(3);&l
47、t;/p><p><b> }</b></p><p> write_1602com(er+2);//時間顯示固定符號寫入位置,從第2個位置后開始顯示</p><p> for(a=0;a<8;a++)</p><p><b> {</b></p><p> wr
48、ite_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號</p><p> //delay(3);</p><p><b> }</b></p><p><b> }</b></p><p> /***************DS1302有關子函數*************
49、*******/</p><p> void write_byte(uchar dat)//寫一個字節(jié)</p><p><b> {</b></p><p><b> ACC=dat;</b></p><p><b> RST=1;</b></p><
50、;p> for(a=8;a>0;a--)</p><p><b> {</b></p><p><b> IO=ACC0;</b></p><p><b> SCLK=0;</b></p><p><b> SCLK=1;</b>&l
51、t;/p><p> ACC=ACC>>1;</p><p><b> }</b></p><p><b> }</b></p><p> uchar read_byte()//讀一個字節(jié)</p><p><b> {</b></p
52、><p><b> RST=1;</b></p><p> for(a=8;a>0;a--)</p><p><b> {</b></p><p><b> ACC7=IO;</b></p><p><b> SCLK=1;<
53、/b></p><p><b> SCLK=0;</b></p><p> ACC=ACC>>1;</p><p><b> }</b></p><p> return (ACC);</p><p><b> }</b><
54、;/p><p> void write_1302(uchar add,uchar dat)//向1302芯片寫函數,指定寫入地址,數據</p><p><b> {</b></p><p><b> RST=0;</b></p><p><b> SCLK=0;</b>&l
55、t;/p><p><b> RST=1;</b></p><p> write_byte(add);</p><p> write_byte(dat);</p><p><b> SCLK=1;</b></p><p><b> RST=0;</b>
56、;</p><p><b> }</b></p><p> uchar read_1302(uchar add)//從1302讀數據函數,指定讀取數據來源地址</p><p><b> {</b></p><p> uchar temp;</p><p><b&
57、gt; RST=0;</b></p><p><b> SCLK=0;</b></p><p><b> RST=1;</b></p><p> write_byte(add);</p><p> temp=read_byte();</p><p>&l
58、t;b> SCLK=1;</b></p><p><b> RST=0;</b></p><p> return(temp);</p><p><b> }</b></p><p> uchar BCD_Decimal(uchar bcd)//BCD碼轉十進制函數,輸入B
59、CD,返回十進制</p><p><b> {</b></p><p> uchar Decimal;</p><p> Decimal=bcd>>4;</p><p> return(Decimal=Decimal*10+(bcd&=0x0F));</p><p>&
60、lt;b> }</b></p><p> //--------------------------------------</p><p> void ds1302_init() //1302芯片初始化子函數(2010-01-07,12:00:00,week4)</p><p><b> {</b></p>
61、<p><b> RST=0;</b></p><p><b> SCLK=0;</b></p><p> write_1302(0x8e,0x00); //允許寫,禁止寫保護 </p><p> //write_1302(0x80,0x00); //向DS1302內寫秒寄存器80H寫入初始秒數據00
62、</p><p> //write_1302(0x82,0x00);//向DS1302內寫分寄存器82H寫入初始分數據00</p><p> //write_1302(0x84,0x12);//向DS1302內寫小時寄存器84H寫入初始小時數據12</p><p> //write_1302(0x8a,0x04);//向DS1302內寫周寄存器8aH寫入初始周
63、數據4</p><p> //write_1302(0x86,0x07);//向DS1302內寫日期寄存器86H寫入初始日期數據07</p><p> //write_1302(0x88,0x01);//向DS1302內寫月份寄存器88H寫入初始月份數據01</p><p> //write_1302(0x8c,0x10);//向DS1302內寫年份寄存器8c
64、H寫入初始年份數據10</p><p> write_1302(0x8e,0x80); //打開寫保護</p><p><b> }</b></p><p><b> //溫度顯示子函數</b></p><p> void write_temp(uchar add,uchar dat)//向
65、LCD寫溫度數據,并指定顯示位置</p><p><b> {</b></p><p> uchar gw,sw;</p><p> gw=dat%10;//取得個位數字</p><p> sw=dat/10;//取得十位數字</p><p> write_1602com(er+add)
66、;//er是頭文件規(guī)定的值0x80+0x40</p><p> write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼</p><p> write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼</p><p> write_1602dat(0xdf);//顯示溫度的小圓圈符號,0xdf
67、是液晶屏字符庫的該符號地址碼</p><p> write_1602dat(0x43);//顯示"C"符號,0x43是液晶屏字符庫里大寫C的地址碼</p><p><b> }</b></p><p> //時分秒顯示子函數</p><p> void write_sfm(uchar a
68、dd,uchar dat)//向LCD寫時分秒,有顯示位置加、現示數據,兩個參數</p><p><b> {</b></p><p> uchar gw,sw;</p><p> gw=dat%10;//取得個位數字</p><p> sw=dat/10;//取得十位數字</p><p>
69、; write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40</p><p> write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼</p><p> write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼</p><p><b> }<
70、;/b></p><p> //年月日顯示子函數</p><p> void write_nyr(uchar add,uchar dat)//向LCD寫年月日,有顯示位置加數、顯示數據,兩個參數</p><p><b> {</b></p><p> uchar gw,sw;</p><
71、p> gw=dat%10;//取得個位數字</p><p> sw=dat/10;//取得十位數字</p><p> write_1602com(yh+add);//設定顯示位置為第一個位置+add</p><p> write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼</p><p>
72、 write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼</p><p><b> }</b></p><p> void write_week(uchar week)//寫星期函數</p><p><b> {</b></p><p> write_
73、1602com(yh+0x0c);//星期字符的顯示位置</p><p> switch(week)</p><p><b> {</b></p><p> case 1:write_1602dat('M');//星期數為1時,顯示</p><p> write_1602dat('O
74、9;);</p><p> write_1602dat('N');</p><p><b> break;</b></p><p> case 2:write_1602dat('T');//星期數據為2時顯示</p><p> write_1602dat('U');
75、</p><p> write_1602dat('E');</p><p><b> break;</b></p><p> case 3:write_1602dat('W');//星期數據為3時顯示</p><p> write_1602dat('E');<
76、/p><p> write_1602dat('D');</p><p><b> break;</b></p><p> case 4:write_1602dat('T');//星期數據為4是顯示</p><p> write_1602dat('H');</p&g
77、t;<p> write_1602dat('U');</p><p><b> break;</b></p><p> case 5:write_1602dat('F');//星期數據為5時顯示</p><p> write_1602dat('R');</p>
78、<p> write_1602dat('I');</p><p><b> break;</b></p><p> case 6:write_1602dat('S');//星期數據為6時顯示</p><p> write_1602dat('T');</p><
79、p> write_1602dat('A');</p><p><b> break;</b></p><p> case 7:write_1602dat('S');//星期數據為7時顯示</p><p> write_1602dat('U');</p><p>
80、; write_1602dat('N');</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> //****************鍵盤掃描有關函數*******
81、***************</p><p> void keyscan()</p><p><b> {</b></p><p> if(key1==0)//---------------key1為功能鍵(設置鍵)--------------------</p><p><b> {</b&g
82、t;</p><p> delay(9);//延時,用于消抖動</p><p> if(key1==0)//延時后再次確認按鍵按下</p><p><b> {</b></p><p> while(!key1);</p><p><b> key1n++;</b>
83、</p><p> if(key1n==9)</p><p> key1n=1;//設置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環(huán)</p><p> switch(key1n)</p><p><b> {</b></p><p> case 1: TR0=0;//關閉定時
84、器</p><p><b> //TR1=0;</b></p><p> write_1602com(er+0x09);//設置按鍵按動一次,秒位置顯示光標</p><p> write_1602com(0x0f);//設置光標為閃爍</p><p> temp=(miao)/10*16+(miao)%10;//
85、秒數據寫入DS1302</p><p> write_1302(0x8e,0x00);</p><p> write_1302(0x80,0x80|temp);//miao</p><p> write_1302(0x8e,0x80);</p><p><b> break;</b></p><
86、;p> case 2: write_1602com(er+6);//按2次fen位置顯示光標</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 3: write_1602com(er+3);//按動3次,shi</p><
87、;p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 4: write_1602com(yh+0x0e);//按動4次,week</p><p> //write_1602com(0x0f);</p><p><b>
88、break;</b></p><p> case 5: write_1602com(yh+0x0a);//按動5次,ri</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 6: write_1602com(yh+
89、0x07);//按動6次,yue</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 7: write_1602com(yh+0x04);//按動7次,nian</p><p> //write_1602com(0x0f);&
90、lt;/p><p><b> break;</b></p><p><b> case 8:</b></p><p> write_1602com(0x0c);//按動到第8次,設置光標不閃爍</p><p> TR0=1;//打開定時器</p><p> temp=(
91、miao)/10*16+(miao)%10;</p><p> write_1302(0x8e,0x00);</p><p> write_1302(0x80,0x00|temp);//miao數據寫入DS1302</p><p> write_1302(0x8e,0x80);</p><p> break;}</p
92、><p><b> }</b></p><p><b> }</b></p><p> //------------------------------加鍵key2----------------------------</p><p> if(key1n!=0)//當key1按下以下。再按
93、以下鍵才有效(按鍵次數不等于零)</p><p><b> {</b></p><p> if(key2==0) //上調鍵</p><p><b> {</b></p><p> delay(10);</p><p> if(key2==0)</p>
94、<p><b> {</b></p><p> while(!key2);</p><p> switch(key1n)</p><p><b> {</b></p><p> case 1:miao++;//設置鍵按動1次,調秒</p><p>
95、if(miao==60)</p><p> miao=0;//秒超過59,再加1,就歸零</p><p> write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設定好的秒數</p><p> temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼</p><
96、;p> write_1302(0x8e,0x00); //允許寫,禁止寫保護 </p><p> write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼</p><p> write_1302(0x8e,0x80); //打開寫保護</p><p> write_1602com(er+0x09);/
97、/因為設置液晶的模式是寫入數據后,光標自動右移,所以要指定返回</p><p> //write_1602com(0x0b);</p><p><b> break;</b></p><p> case 2:fen++;</p><p> if(fen==60)</p><p><b
98、> fen=0;</b></p><p> write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設定好的分數據</p><p> temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁
99、止寫保護 </p><p> write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置</p&g
100、t;<p><b> break;</b></p><p> case 3:shi++;</p><p> if(shi==24)</p><p><b> shi=0;</b></p><p> write_sfm(2,shi);//令LCD在正確的位置顯示"加&
101、quot;設定好的小時數據</p><p> temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p><p> write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼&l
102、t;/p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(er+3);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 4:week++;</p>
103、;<p> if(week==8)</p><p><b> week=1;</b></p><p> write_1602com(yh+0x0C);//指定'加'后的周數據顯示位置</p><p> write_week(week);//指定周數據顯示內容</p><p> te
104、mp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p><p> write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼</p><p> write_1302(0x8e,0
105、x80);//打開寫保護</p><p> write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 5:ri++;</p><p> if(ri==32)</p>&
106、lt;p><b> ri=1;</b></p><p> write_nyr(9,ri);//令LCD在正確的位置顯示"加"設定好的日期數據</p><p> temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00)
107、;//允許寫,禁止寫保護</p><p> write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(yh+10);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位&
108、lt;/p><p><b> break;</b></p><p> case 6:yue++;</p><p> if(yue==13)</p><p><b> yue=1;</b></p><p> write_nyr(6,yue);//令LCD在正確的位置顯示&
109、quot;加"設定好的月份數據</p><p> temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護</p><p> write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據
110、BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(yh+7);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 7:nian++;<
111、;/p><p> if(nian==100)</p><p><b> nian=0;</b></p><p> write_nyr(3,nian);//令LCD在正確的位置顯示"加"設定好的年份數據</p><p> temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1
112、302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護</p><p> write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> w
113、rite_1602com(yh+4);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }&
114、lt;/b></p><p> //------------------減鍵key3,各句功能參照'加鍵'注釋---------------</p><p> if(key3==0)</p><p><b> {</b></p><p> delay(10);//調延時,消抖動</p&
115、gt;<p> if(key3==0)</p><p><b> {</b></p><p> while(!key3);</p><p> switch(key1n)</p><p><b> {</b></p><p> case 1:miao-
116、-;</p><p> if(miao==-1)</p><p> miao=59;//秒數據減到-1時自動變成59</p><p> write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數</p><p> temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼
117、</p><p> write_1302(0x8e,0x00); //允許寫,禁止寫保護 </p><p> write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼</p><p> write_1302(0x8e,0x80); //打開寫保護</p><p> write_160
118、2com(er+0x09);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置</p><p> //write_1602com(0x0b);</p><p><b> break;</b></p><p> case 2:fen--;</p><p> if(fen==-1)</p&
119、gt;<p><b> fen=59;</b></p><p> write_sfm(5,fen);</p><p> temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p>
120、<p> write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置</p><p><
121、;b> break;</b></p><p> case 3:shi--;</p><p> if(shi==-1)</p><p><b> shi=23;</b></p><p> write_sfm(2,shi);</p><p> temp=(shi)/10*
122、16+(shi)%10;//十進制轉換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p><p> write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護
123、</p><p> write_1602com(er+3);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 4:week--;</p><p> if(week==0)</p><p><
124、b> week=7;</b></p><p> write_1602com(yh+0x0C);//指定'加'后的周數據顯示位置</p><p> write_week(week);//指定周數據顯示內容</p><p> temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼<
125、;/p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p><p> write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(y
126、h+0x0e);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 5:ri--;</p><p><b> if(ri==0)</b></p><p><b> ri=31;</b&
127、gt;</p><p> write_nyr(9,ri);</p><p> temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護</p><p> write_1302(0x86,temp);//向DS1302
128、內寫日期寄存器86H寫入調整后的日期數據BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(yh+10);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p&g
129、t; case 6:yue--;</p><p> if(yue==0)</p><p><b> yue=12;</b></p><p> write_nyr(6,yue);</p><p> temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼</p>
130、<p> write_1302(0x8e,0x00);//允許寫,禁止寫保護</p><p> write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(yh+7);//
131、因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 7:nian--;</p><p> if(nian==-1)</p><p><b> nian=99;</b></p><p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論