版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 單片機原理及應用課程設計</p><p> 設計題目: 時間控制器設計</p><p> 學 院: </p><p> 專 業(yè): 自動化 </p><p> 班 級: 091 </p><p>
2、 學 號: </p><p> 學生姓名: </p><p> 指導教師: </p><p> 2012年 6 月 22 日</p><p><b> 設計任務書</b></p>&
3、lt;p><b> 設計目的</b></p><p> 1、熟悉硬件電路設計的基本流程,初步掌握印制電路板設計制作的方法;</p><p> 2、熟悉程序設計和調(diào)試的基本流程;</p><p> 3、熟悉微控制器系統(tǒng)設計的流程和調(diào)試方法;</p><p> 4、鍛煉團隊協(xié)作的能力;</p>
4、<p><b> 設計任務</b></p><p> 設計一個基于DS1302計時、DS18B20測溫和LCD1602液晶顯示模塊顯示的時間控制系統(tǒng),能顯示年、月、日、時、分、秒和實時溫度,具有時間調(diào)整功能并能根據(jù)設定時間控制一路220伏負載的通斷(繼電器);計時誤差不大于±10分鐘/天;能夠自動判別大小月和閏年。</p><p> ?。?)、
5、能夠調(diào)整年、月、日、時和分,調(diào)整“日”時,“周”能自動跟隨自動調(diào)整,調(diào)整“日”時,“日”能自動根據(jù)大小月及是否閏年改變最大值;</p><p> (2)、斷電數(shù)據(jù)不丟失;</p><p> ?。?)、以1分鐘為步進,能夠在1~30分鐘內(nèi)設置定時,控制一路220伏負載(電阻性,不大于800W)的通斷;</p><p><b> 具體要求</b>
6、;</p><p> 1、根據(jù)任務設計出程序(程序語言不限),經(jīng)調(diào)試后能實現(xiàn)任務書中要求的功能;</p><p> 2、用PROTEUS仿真,在仿真軟件中系統(tǒng)能夠正常運行;</p><p> 3、根據(jù)仿真結果,將程序加載到實際電路板,經(jīng)調(diào)試后能正常運行;</p><p> 4、撰寫課程設計任務書; </p><p&
7、gt;<b> 目 錄</b></p><p><b> 摘要II</b></p><p> 第一章 設計方案1</p><p> 1.1 設計任務書分析1</p><p> 1.2 設計思路1</p><p> 1.3 設計方案1</p>
8、<p> 第二章 硬件設計2</p><p> 2.1 功能模塊設計2</p><p> 2.2 芯片介紹2</p><p> 2.2.1 微控制器AT89C522</p><p> 2.2.2 實時時鐘芯片DS13025</p><p> 2.2.3 溫度傳感器DS18B207&l
9、t;/p><p> 第三章 程序設計10</p><p> 3.1 程序設計思路10</p><p> 3.2 程序設計工具簡介10</p><p> 3.3 程序流程框圖12</p><p> 第四章 系統(tǒng)調(diào)試13</p><p> 4.1 調(diào)試思路13</p>
10、<p> 4.2 調(diào)試方法及過程13</p><p> 4.3 問題及解決措施13</p><p><b> 第五章 總結13</b></p><p><b> 5.1硬件14</b></p><p><b> 5.2 程序14</b><
11、/p><p><b> 心得體會15</b></p><p><b> 參考文獻16</b></p><p> 附錄一 電路原理圖17</p><p> 附錄二 源程序清單18</p><p><b> 時間控制系統(tǒng)設計</b></p
12、><p><b> 摘要</b></p><p> 基于DS1302計時、DS18B20測溫和LCD1602液晶顯示模塊顯示的時間控制系統(tǒng),能顯示年、月、日、時、分、秒和實時溫度,具有時間調(diào)整功能并能根據(jù)設定時間控制一路220伏負載的通斷(繼電器);計時誤差不大于±10分鐘/天;能夠自動判別大小月和閏年。</p><p> ?。?)、
13、能夠調(diào)整年、月、日、時和分,調(diào)整“日”時,“周”能自動跟隨自動調(diào)整,調(diào)整“月”時,“日”能自動根據(jù)大小月及是否閏年改變最大值;</p><p> ?。?)、斷電數(shù)據(jù)不丟失;</p><p> ?。?)、以1分鐘為步進,能夠在1~30分鐘內(nèi)設置定時,控制一路220伏負載(電阻性,不大于800W)的通斷</p><p> 關鍵詞:單片機,時間控制</p>
14、<p><b> 第一章 設計方案</b></p><p> 1.1 設計任務書分析</p><p> 根據(jù)任務書要求實現(xiàn)的功能來看,主要有實時時間的顯示,溫度的顯示,通過按鍵調(diào)整時間與選擇定時功能。由此可知,系統(tǒng)所需包含的部件應有單片機、單片機外圍電路(時鐘電路、溫度采集電路、顯示電路),按鍵調(diào)時電路。它們之間的關系方框圖如設計方案所示。<
15、/p><p><b> 1.2 設計思路</b></p><p> 本次設計采用AT89C52作為主控制器,DS1302輸入時間信息,DS18B20采集溫度信息,LCD1602作為顯示輸出設備,通過四個按鍵實現(xiàn)時間設置。</p><p><b> 1.3 設計方案</b></p><p> 中央
16、處理單元:采用AT89C52對整個系統(tǒng)進行控制,</p><p> 它將定時數(shù)據(jù)輸出到LED,實現(xiàn)時間的顯示;</p><p> 根據(jù)鍵盤輸入調(diào)用相應鍵處理子程序,實現(xiàn)時間的調(diào)整設定;</p><p> 接收溫度傳感器輸入的溫度數(shù)據(jù),進行一定轉換,輸出到LCD顯示器顯示。</p><p> 時鐘電路:時間的的讀寫輸入。</p&g
17、t;<p> 溫度采集模塊:采集溫度信息輸送到單片機。</p><p> 液晶顯示電路:是對單片內(nèi)數(shù)據(jù)視化,讓設計的功能通過它能夠直觀的體現(xiàn)出來,使用戶方便觀察結果及對功能的設置。</p><p> 按鍵調(diào)時模塊:通過按鍵設置,改變芯片內(nèi)數(shù)據(jù)達到調(diào)時的效果,設置定時等功能。</p><p><b> 第二章 硬件設計</b>
18、;</p><p> 2.1 功能模塊設計</p><p><b> 2.2 芯片介紹</b></p><p> 2.2.1 微控制器AT89S52</p><p> AT89S52為 ATMEL 所生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,具有8K在系統(tǒng)可編程Flsah存儲器。</p><
19、;p> 1 AT89S52主要功能列舉如下:</p><p> 1)擁有靈巧的8位CPU和在系統(tǒng)可編程Flash;2)晶片內(nèi)部具時鐘振蕩器(傳統(tǒng)最高工作頻率可至 12MHz);3)內(nèi)部程序存儲器(ROM)為 8KB;4)內(nèi)部數(shù)據(jù)存儲器(RAM)為 256字節(jié);5)32 個可編程I/O 口線;6)8 個中斷向量源;7)三個 16 位定時器/計數(shù)器;8)三級加密程序存儲器;9)全雙工UART串行通道。<
20、;/p><p> 2 AT89S52各引腳功能介紹:</p><p> VCC:AT89S52電源正端輸入,接+5V。</p><p><b> VSS:電源地端。</b></p><p> XTAL1:單芯片系統(tǒng)時鐘的反相放大器輸入端。</p><p> XTAL2:系統(tǒng)時鐘的反相放大器輸
21、出端,一般在設計上只要在 XTAL1 和 XTAL2 上接上</p><p> 一只石英振蕩晶體系統(tǒng)就可以動作了,此外可以在兩引腳與地之間加入一 20PF 的小電</p><p> 容,可以使系統(tǒng)更穩(wěn)定,避免噪聲干擾而死機。</p><p> RESET:AT89S52的重置引腳,高電平動作,當要對晶片重置時,只要對此引腳電平提升</p><
22、;p> 至高電平并保持兩個機器周期以上的時間,AT89S51便能完成系統(tǒng)重置的各項動作,使</p><p> 得內(nèi)部特殊功能寄存器之內(nèi)容均被設成已知狀態(tài),并且至地址0000H處開始讀入程序代</p><p><b> 碼而執(zhí)行程序。</b></p><p> EA/Vpp:"EA"為英文"Extern
23、al Access"的縮寫,表示存取外部程序代碼之意,低電平</p><p> 動作,也就是說當此引腳接低電平后,系統(tǒng)會取用外部的程序代碼(存于外部EPROM中)</p><p> 來執(zhí)行程序。因此在8031及8032中,EA引腳必須接低電平,因為其內(nèi)部無程序存儲器</p><p> 空間。如果是使用 8751 內(nèi)部程序空間時,此引腳要接成高電平。此
24、外,在將程序代碼</p><p> 燒錄至8751內(nèi)部EPROM時,可以利用此引腳來輸入21V的燒錄高壓(Vpp)。</p><p> PSEN:此為"Program Store Enable"的縮寫,其意為程序儲存啟用,當8051被設成為</p><p> 讀取外部程序代碼工作模式時(EA=0),會送出此信號以便取得程序代碼,通常這支腳&
25、lt;/p><p> 是接到EPROM的OE腳。AT89S52可以利用PSEN及RD引腳分別啟用存在外部的RAM與</p><p> EPROM,使得數(shù)據(jù)存儲器與程序存儲器可以合并在一起而共用64K的定址范圍。</p><p> PORT0(P0.0~P0.7):端口0是一個8位寬的開路汲極(Open Drain)雙向輸出入端口,</p><p
26、> 共有8個位,P0.0表示位0,P0.1表示位1,依此類推。其他三個I/O端口(P1、P2、</p><p> P3)則不具有此電路組態(tài),而是內(nèi)部有一提升電路,P0在當做I/O用時可以推動8個</p><p> LS的TTL負載。如果當EA引腳為低電平時(即取用外部程序代碼或數(shù)據(jù)存儲器),P0</p><p> 就以多工方式提供地址總線(A0~A7)
27、及數(shù)據(jù)總線(D0~D7)。設計者必須外加一鎖存</p><p> 器將端口0送出的地址栓鎖住成為A0~A7,再配合端口2所送出的A8~A15合成一完整</p><p> 的16位地址總線,而定址到64K的外部存儲器空間。</p><p> PORT2(P2.0~P2.7):端口2是具有內(nèi)部提升電路的雙向I/O端口,每一個引腳可以推</p><
28、;p> 動4個LS的TTL負載,若將端口2的輸出設為高電平時,此端口便能當成輸入端口來</p><p> 使用。P2除了當做一般I/O端口使用外,若是在AT89S52擴充外接程序存儲器或數(shù)據(jù)存</p><p> 儲器時,也提供地址總線的高字節(jié)A8~A15,這個時候P2便不能當做I/O來使用了。</p><p> PORT1(P1.0~P1.7):端口1
29、也是具有內(nèi)部提升電路的雙向I/O端口,其輸出緩沖器可以推動4個LS TTL負載,同樣地若將端口1的輸出設為高電平,便是由此端口來輸入數(shù)據(jù)。如果是使用8052或是8032的話,P1.0又當做定時器2的外部脈沖輸入腳,而P1.1可以有T2EX功能,可以做外部中斷輸入的觸發(fā)腳位。</p><p> PORT3(P3.0~P3.7):端口3也具有內(nèi)部提升電路的雙向I/O端口,其輸出緩沖器可以</p>&l
30、t;p> 推動4個TTL負載。其引腳分配如下:</p><p> P3.0:RXD,串行通信輸入。</p><p> P3.1:TXD,串行通信輸出。</p><p> P3.2:INT0,外部中斷0輸入。</p><p> P3.3:INT1,外部中斷1輸入。</p><p> P3.4:T0,計時
31、計數(shù)器0輸入。</p><p> P3.5:T1,計時計數(shù)器1輸入。</p><p> P3.6:WR:外部數(shù)據(jù)存儲器的寫入信號。</p><p> P3.7:RD,外部數(shù)據(jù)存儲器的讀取信號。</p><p> RST:復位輸入。當振蕩器復位器件時要保持RST腳兩個機器周期的高電平。</p><p> ALE
32、/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地</p><p> 位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不</p><p> 變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對</p><p> 外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數(shù)據(jù)存儲器</p>
33、<p> 時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此</p><p> 時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微</p><p> 拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。</p><p> /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,
34、每個機</p><p> 器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信</p><p><b> 號將不出現(xiàn)。</b></p><p> /EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),</p><p> 不管是否有內(nèi)部程序存儲器。注意加密
35、方式1時,/EA將內(nèi)部鎖定為RESET;</p><p> 當/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也</p><p> 用于施加12V編程電源(VPP)。</p><p> 2.2.2 實時時鐘芯片DS1302</p><p> DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片
36、,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后背電源進行涓細電流充電的能力。DS1302的外部引腳分配如圖1所示</p><p> 圖1
37、60; DS1302的外部引腳分配</p><p><b> 1各引腳的功能為:</b></p><p> Vcc1:主電源;Vcc2:備份電源。當Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當Vcc2< Vcc1時,由Vcc1向DS1302供電。</p><p> SCLK:串行時鐘,輸入;
38、160;</p><p> I/O:三線接口時的雙向數(shù)據(jù)線;</p><p> CE:輸入信號,在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個功能:第一,CE開始控制字訪問移位寄存器的控制邏輯;其次,CE提供結束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒ā?lt;/p><p> 2 DS1302有下列幾組寄存器:</p><p> 1)DS1302有關日歷、
39、時間的寄存器共有12個,其中有7個寄存器(讀時81h~8Dh,寫時80h~8Ch),存放的數(shù)據(jù)格式為BCD碼形式,如圖2所示。</p><p> 圖 2 DS1302有關日歷、時間的寄存器</p><p> 小時寄存器(85h、84h)的位7用于定義DS1302是運行于12小時模式還是24小時模式。當為高時,選擇12小時模式。在12小時模式時,位5是,當為1時,
40、表示PM。在24小時模式時,位5是第二個10小時位。</p><p> 秒寄存器(81h、80h)的位7定義為時鐘暫停標志(CH)。當該位置為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當該位置為0時,時鐘開始運行。</p><p> 控制寄存器(8Fh、8Eh)的位7是寫保護位(WP),其它7位均置為0。在任何的對時鐘和RAM的寫操作之前,WP位必須為0。當WP位為1時,寫保護
41、位防止對任一寄存器的寫操作。</p><p> 2) DS1302的工作模式寄存器</p><p> 所謂突發(fā)模式是指一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。突發(fā)模式寄存器如圖3所示。</p><p><b> 圖3</b></p><p><b> 3 讀寫時序說明</b></p&g
42、t;<p> DS1302是SPI總線驅動方式。它不僅要向寄存器寫入控制字,還需要讀取相應寄存器的數(shù)據(jù)。DS1302的控制字如圖4。</p><p> 圖4 控制字(即地址及命令字節(jié))</p><p> 控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。位6如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)
43、據(jù);位5至位1(A4~A0):指示操作單元的地址;位0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作。</p><p> 控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從最低位(0位)開始。同樣,在緊跟8位的控制字指令后的下一個SCLK脈沖的下降沿,讀出DS1302的數(shù)據(jù),讀出的數(shù)據(jù)也是從最低位到最高位。數(shù)據(jù)讀寫時序如圖5 。<
44、/p><p> 圖5 數(shù)據(jù)讀寫時序</p><p><b> 3 電路原理圖</b></p><p> 電路原理圖如圖8,DS1302與單片機的連接也僅需要3條線:CE引腳、SCLK串行時鐘引腳、I/O串行數(shù)據(jù)引腳,Vcc2為備用電源,外接32.768kHz晶振,為芯片提供計時脈沖。</p><p><
45、;b> 圖8</b></p><p> 2.2.3 溫度傳感器DS18B20</p><p> TO-92封裝的DS18B20的引腳排列見下圖,其引腳功能描述見表1。(底視圖)</p><p> 表1 DS18B20詳細引腳功能描述</p><p> DS18B20的性能特點如下:1)獨特的單線接口僅需要一個端口引
46、腳進行通信;2)多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點組網(wǎng)功能;3)無須外部器件;4)可通過數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;5)零待機功耗;6)溫度以9或12位數(shù)字;7)用戶可定義報警設置;8)報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件;9)負電壓特性,電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作; </p><p> 64位ROM的結構開始8位是產(chǎn)品類型的編號,
47、接著是每個器件的惟一的序號,共有48位,最后8位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。溫度報警觸發(fā)器TH和TL,可通過軟件寫入戶報警上下限。</p><p> DS18B20溫度傳感器的內(nèi)部存儲器還包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8字節(jié)的存儲器,結構如圖3所示。頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)TH和TL的拷貝
48、,是易失的,每次上電復位時被刷新。第5個字節(jié),為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉換分辨率。DS18B20工作時寄存器中的分辨率轉換為相應精度的溫度數(shù)值。該字節(jié)各位的定義如圖3所示。低5位一直為1,TM是工作模式位,用于設置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設置為0,用戶要去改動,R1和R0決定溫度轉換的精度位數(shù),來設置分辨率。</p><p> 圖3 DS18B20字
49、節(jié)定義</p><p> DS18B20的測溫原理是這這樣的,器件中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小,用于產(chǎn)生固定頻率的脈沖信號送給減法計數(shù)器1;高溫度系數(shù)晶振隨溫度變化其振蕩頻率明顯改變,所產(chǎn)生的信號作為減法計數(shù)器2的脈沖輸入。器件中還有一個計數(shù)門,當計數(shù)門打開時,DS18B20就對低溫度系數(shù)振蕩器產(chǎn)生的時鐘脈沖進行計數(shù)進而完成溫度測量。計數(shù)門的開啟時間由高溫度系數(shù)振蕩器來決定,每次測量前,首先將-5
50、5℃所對應的一個基數(shù)分別置入減法計數(shù)器1、溫度寄存器中,計數(shù)器1和溫度寄存器被預置在-55℃所對應的一個基數(shù)值。</p><p> 減法計數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行減法計數(shù),當減法計數(shù)器1的預置值減到0時,溫度寄存器的值將加1,減法計數(shù)器1的預置將重新被裝入,減法計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行計數(shù),如此循環(huán)直到減法計數(shù)器計數(shù)到0時,停止溫度寄存器的累加,此時溫度寄存器中的數(shù)值就
51、是所測溫度值。其輸出用于修正減法計數(shù)器的預置值,只要計數(shù)器門仍未關閉就重復上述過程,直到溫度寄存器值大致被測溫度值。</p><p> 表2 一部分溫度對應值表</p><p> 另外,由于DS18B20單線通信功能是分時完成的,它有嚴格的時隙概念,因此讀寫時序很重要。系統(tǒng)對DS18B20的各種操作按協(xié)議進行。操作協(xié)議為:初使化DS18B20(發(fā)復位脈沖)→發(fā)ROM功能命令→發(fā)存儲器操
52、作命令→處理數(shù)據(jù)。</p><p> 圖4 DS18B20與單片機的接口電路</p><p><b> 第三章 程序設計</b></p><p> 3.1 程序設計思路</p><p> 程序包括主程序若干子程序,系統(tǒng)每一個相應的功能都對應有一個子程序,在編寫程序時每一功能都分開編寫,通過主程序的調(diào)用使它們串聯(lián)
53、起來,實現(xiàn)其功能。在編寫程序前先畫出其流程圖,然后根據(jù)流程圖寫出其源程序,在編寫程序的過程中要有足夠的細心和耐心。</p><p> 3.2 程序設計工具簡介</p><p> 3.2.1 KEIL C51的功能和操作簡介</p><p> KEIL C51簡介</p><p> Keil uVision2是德國Keil Softwa
54、re公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),使用接近于傳統(tǒng)C語言的語法來開發(fā),與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學易用,而且大大的提高了工作效率和項目開發(fā)周期,他還能嵌入?yún)R編,您可以在關鍵的位置嵌入,使程序達到接近于匯編的工作效率。KEILC51標準C編譯器為8051微控制器的軟件開發(fā)提供了C語言環(huán)境,同時保留了匯編代碼高效,快速的特點。C51編譯器的功能不斷增強, 使你可以更加貼近CPU
55、本身,及其它的衍生產(chǎn)品。C51已被完全集成到uVision2的集成開發(fā)環(huán)境中,這個集成開發(fā)環(huán)境包含:編譯器,匯編器,實時操作系統(tǒng),項目管理器,調(diào)試器。KEILC51是一款非常優(yōu)秀的編譯器,受到廣大單片機設計者的廣泛使用。其主要特點如下:</p><p> 支持匯編語言、C語言等多種單片機設計語言;</p><p> 可視化的文件管理,界面友好;</p><p>
56、 支持豐富的產(chǎn)品線,除了51及其兼容內(nèi)核的單片機外,還增加了對ARM內(nèi)核產(chǎn)品的支持;</p><p> 具有完善的編譯連接工具;</p><p> 具有豐富的仿真調(diào)試功能,可以仿真串口、并口、A/D、D/A、定時器/計數(shù)器以及中斷等資源,同時也可以和外部仿真器聯(lián)合進行在線調(diào)試;</p><p> 內(nèi)嵌RTX-51實時多任務操作系統(tǒng);</p>&
57、lt;p> 支持在一個工作空間中進行多項目的程序設計;</p><p><b> 支持多級代碼優(yōu)化。</b></p><p> KEIL C51的入門操作</p><p> 第一步:雙擊Keil uVision2的桌面快捷方式,啟動Keil集成開發(fā)開發(fā)軟件。</p><p> 第二步:新建文本編輯窗。點擊
58、工具欄上的新建文件快捷按鍵,即可在項目窗口的右側打開一個新的文本編輯窗。</p><p> 第三步:輸入源程序。在新的文本編輯窗中輸入源程序,可以輸入C語言程序,也可以輸入?yún)R編語言程序。</p><p> 第四步:保存源程序。保存文件時必須加上文件的擴展名,如果你使用匯編語言編程,那么保存時文件的擴展名為“.asm”,如果是C語言程序,文件的擴展名使用“*.C ”。</p>
59、<p> 第五步:新建立Keil工程。點擊 "工程" → "新建工程" 命令,將出現(xiàn)保存對話框。</p><p> 第六步:選擇CPU型號。為工程選擇CPU型號,本次設計新建工程選擇了ATMEL公司的AT89C52單片機。</p><p> 第七步:加入源程序到工程中。在選擇好CPU型號后,點擊"確定"按鈕返回
60、主界面,此時可見到工程管理窗中出現(xiàn)“Target 1”,點擊“Target 1”前面的“+”號展開下一層的“Source Group 1”文件夾,此時的新工程是空的,“Source Group 1”文件夾中什么文件都沒有,必須把剛才輸入的源程序加入到工程當中。右擊工程管理窗中的“Source Group 1”,出現(xiàn)下拉菜單,點擊“增加文件到組'Source Group 1'”命令,將出現(xiàn)添加文件對話框。</p>
61、;<p> 第八步:工程目標'Target 1'屬性設置。如下圖14所示,在工程項目管理窗中的"Target 1"文件夾上右擊,出現(xiàn)下拉菜單,點擊“目標'Target 1'屬性”命令,就進入目標屬性設置界面。</p><p> 第九步:源程序的編譯與目標文件的獲得</p><p> 3.2.2 PROTUES的功能和
62、操作簡介</p><p> Proteus ISIS是英國Labcenter公司開發(fā)的電路分析與實物仿真軟件。它運行于Windows操作系統(tǒng)上,可以仿真、分析(SPICE)各種模擬器件和集成電路,該軟件的特點是:①實現(xiàn)了單片機仿真和SPICE電路仿真相結合。具有模擬電路仿真、數(shù)字電路仿真、單片機及其外圍電路組成的系統(tǒng)的仿真、RS232動態(tài)仿真、I2C調(diào)試器、SPI調(diào)試器、鍵盤和LCD系統(tǒng)仿真的功能;有各種虛擬儀
63、器,如示波器、邏輯分析儀、信號發(fā)生器等。②支持主流單片機系統(tǒng)的仿真。目前支持的單片機類型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片。③提供軟件調(diào)試功能。在硬件仿真系統(tǒng)中具有全速、單步、設置斷點等調(diào)試功能,同時可以觀察各個變量、寄存器等的當前狀態(tài),因此在該軟件仿真系統(tǒng)中,也必須具有這些功能;同時支持第三方的軟件編譯和調(diào)試環(huán)境,如Keil C51 u
64、Vision2等軟件。④具有強大的原理圖繪制功能??傊?,該軟件是一款集單片機和SPICE分析于一身的仿真軟件,功能極其強大。</p><p> Proteus基本操作</p><p> Proteus ISIS的工作界面是一種標準的Windows界面。包括:標題欄、主菜單、繪圖工具欄、狀態(tài)欄、對象選擇按鈕、預覽對象方位控制按鈕、仿真進程控制按鈕、預覽窗口、圖形編輯窗口。</p&g
65、t;<p> 運行Proteus程序后,進入軟件的主界面。通過左側的工具欄中的P(從庫中選擇元件命令),在Pick Devices左側窗口中選擇所需元件的關鍵字,然后放置元件并調(diào)整方向和位置以及參數(shù)設置,然后進行連線。</p><p> 最后載入hex文件后可以進行模擬仿真,可以全速運行也可以單步調(diào)試運行。</p><p> 3.3 程序流程框圖</p>
66、<p><b> 第四章 系統(tǒng)調(diào)試</b></p><p><b> 4.1 調(diào)試思路</b></p><p> 調(diào)試是檢驗系統(tǒng)功能的環(huán)節(jié),本次調(diào)試為軟件調(diào)試,在KEIL C51和PROTUES上進行,在KEIL C51平臺上程序無誤后,創(chuàng)立相關文件,打開PROTUES仿真軟件,通過顯示屏觀察功能實現(xiàn),邊調(diào)邊改,直至系統(tǒng)功能全部實
67、現(xiàn)。</p><p> 4.2 調(diào)試方法及過程</p><p> 此次設計由于時間因素,來不及硬件調(diào)試,所以只能通過KEIL C51和PROTUES仿真軟件進行軟件調(diào)試,在編譯好源程序并檢查無誤后,在KEIL C51創(chuàng)建生成相關文件,進入PROTUES仿真軟件打開原理圖,在AT89C52里選中工程模塊中output文件夾的.hex文件,點擊仿真開始按鈕,觀察其功能實現(xiàn),邊觀察邊修改程序
68、,每次修改程序后都必須重新在KEIL C51里創(chuàng)建新的文件,直至系統(tǒng)功能正常實現(xiàn)。</p><p> 4.3 問題及解決措施</p><p> 1.換屏時亂跳,有時顯示亂碼。</p><p> 解決措施:經(jīng)檢查是未加延時消抖和清屏,增加延時消抖和清屏函數(shù)后,問題解決。</p><p> 2.星期顯示比實際星期快一天。</p>
69、;<p> 解決措施:在DS1302子程序里把各星期逐一調(diào)換位置后,成功顯示實時星期。</p><p> 3.在調(diào)試修改過程序后,在仿真軟件上未有任何變化。</p><p> 解決措施:經(jīng)詢問老師,原來是在修改程序后未在KEIL C51上重新創(chuàng)建文件,重新創(chuàng)建后,新功能實現(xiàn)。</p><p><b> 第五章 總結</b>
70、</p><p><b> 5.1硬件</b></p><p> 設計中的硬件包括AT89C52單片機,DS1302時鐘芯片、DS18B20溫度傳感器和LCD1602液晶顯示屏。AT89C52單片機作為控制核心,具有在線編程,低功耗,能在3V超低電壓工作;時鐘電路由DS1302時鐘芯片提供,它是一種高性能、低功耗、帶RAM的實時時鐘電路,它可對年、月、日、時、分、
71、秒進行計時,具有閏年補償功能,同時具有掉電保護功能;溫度的采集由DS18B20溫度傳感器構成,顯示部分由LCD1602構成。</p><p><b> 5.2 程序</b></p><p> 程序由主程序和若干子程序構成,是實現(xiàn)時鐘控制器功能的重要組成部分,只有編譯調(diào)試好了程序,時鐘控制器的功能才能得以實現(xiàn)。在編寫程序時,一步一步著手,在寫每個程序前都要先畫出其相
72、應的流程圖,然后再根據(jù)流程圖寫出源程序。主程序主要有設備初始化,相關信息的讀寫與顯示及按鍵程序的調(diào)用。按鍵子程序主要實現(xiàn)時間調(diào)整與定時功能的選擇。</p><p><b> 心得體會</b></p><p><b> 參考文獻</b></p><p> 【1】肖婧.單片機系統(tǒng)設計與仿真—基于Proteus【M】.北京
73、:北京航空航天大學出版社,2010</p><p> 【2】樓然苗 李光飛.單片機課程設計指導【M】. 北京:北京航空航天大學出版社,2007</p><p> 【3】譚浩強.C程序設計(第三版)【M】.清華大學出版社,2005</p><p><b> 附錄一 電路原理圖</b></p><p><b>
74、; 附錄二 源程序清單</b></p><p><b> 主程序:</b></p><p> #include <reg52.h></p><p> #include "lcd1602_driver.h"</p><p> #include "ds1302_
75、driver.h"</p><p> #include "display.h"</p><p> #include "ds18b20_driver.h"</p><p> #include "anjian.h"</p><p><b> main()<
76、;/b></p><p> {init_lcd1602( );</p><p> init_ds1302( );</p><p> init_ds18b20( );</p><p> wr_realtime( );</p><p> wr_realdate( );</p><p
77、><b> while(1)</b></p><p><b> {</b></p><p> set_disp_position(1,1);</p><p> display_date( );</p><p> set_disp_position(2,1);</p>&
78、lt;p> display_time( );</p><p> set_disp_position(1,13);</p><p> display_week( );</p><p> set_disp_position(2,13);</p><p> read_temp();</p><p> dis
79、play_temp( );</p><p><b> scan();</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 按鍵掃描:</b></p><p> #i
80、nclude "anjian.h"</p><p> #include "delay.h"</p><p> #include "lcd1602_driver.h"</p><p> #include "ds1302_driver.h"</p><p>
81、#include "ds18b20_driver.h"</p><p> #include "display.h"</p><p> #include <reg52.h></p><p> unsigned char key_age_sure=0;</p><p> unsigned
82、 char key_age_up=0;</p><p> unsigned char key_age_down=0;</p><p> unsigned char key_age_next=0;</p><p> void scan( )</p><p><b> {</b></p><p&g
83、t; P1=P1|0xf0;</p><p> key_value=P1; </p><p> key_value=key_value&0xf0;</p><p> if(key_value==0xe0)</p><p><b> { </b></p><p> key_
84、age_sure++; </p><p><b> sure();</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 按鍵程序:</b></p><p> v
85、oid sure( )</p><p><b> { </b></p><p> switch(key_age_sure)</p><p><b> { </b></p><p> case 1:{clean_screen();</p><p><b&
86、gt; while(1)</b></p><p><b> {</b></p><p> set_disp_position(1,1);</p><p> display_menu(settime_menu);</p><p> set_disp_position(2,4);</p>
87、<p> display_time();</p><p> switch(key_age_next)</p><p><b> {</b></p><p> case 0:{set_disp_flash(2,4);</p><p> set_disp_flash(2,5);</p>&l
88、t;p><b> } break;</b></p><p> case 1:{set_disp_flash(2,7);</p><p> set_disp_flash(2,8);</p><p><b> }break;</b></p><p><b> }</b&g
89、t;</p><p> if(key_next==0)</p><p> key_age_next++;</p><p> if(key_age_next==2) </p><p> key_age_next=0;</p><p> if(key_plus==0&&key_age_next==
90、0) //調(diào)時加</p><p> {delay_ms(10);</p><p> while(key_plus==0)</p><p><b> {</b></p><p> rd_realtime();</p><p> real_time[0]=(real_time[0]/16)
91、*10+real_time[0]%16;</p><p> real_time[0]++;</p><p> if (real_time[0]==24)</p><p> real_time[0]=0;</p><p> real_time[0]=(real_time[0]/10)*16+real_time[0]%10;</p&
92、gt;<p> } wr_realtime( );</p><p><b> }</b></p><p> if(key_minus==0&&key_age_next==0)//調(diào)時減</p><p><b> {</b></p><p> while(k
93、ey_minus==0)</p><p><b> {</b></p><p> rd_realtime();</p><p> real_time[0]=(real_time[0]/16)*10+real_time[0]%16;</p><p> real_time[0]--;</p><p
94、> if (real_time[0]==-1)</p><p> real_time[0]=23;</p><p> real_time[0]=(real_time[0]/10)*16+real_time[0]%10; </p><p> }wr_realtime( );</p><p><b> }&
95、lt;/b></p><p> if(key_plus==0&&key_age_next==1)//調(diào)分加</p><p> {delay_ms(10);</p><p> while(key_plus==0)</p><p><b> {</b></p><p>
96、; rd_realtime();</p><p> real_time[1]=(real_time[1]/16)*10+real_time[1]%16;</p><p> real_time[1]++;</p><p> if (real_time[1]==60)</p><p> real_time[1]=0;</p>
97、<p> real_time[1]=(real_time[1]/10)*16+real_time[1]%10;</p><p> } wr_realtime( ); }</p><p> if(key_minus==0&&key_age_next==1) //調(diào)分減</p><p><b> {</b>
98、</p><p> while(key_minus==0)</p><p><b> {</b></p><p> rd_realtime();</p><p> real_time[1]=(real_time[1]/16)*10+real_time[1]%16;</p><p> re
99、al_time[1]--;</p><p> if (real_time[1]==-1)</p><p> real_time[1]=59;</p><p> real_time[1]=(real_time[1]/10)*16+real_time[1]%10; </p><p> }wr_realtime( );<
100、/p><p><b> }</b></p><p> if(key_sure==0)</p><p> key_age_sure++;</p><p> if(key_age_sure==2)break; </p><p> } } </p><p>&l
101、t;b> case 2:{</b></p><p> clean_screen();</p><p><b> while(1) </b></p><p><b> {</b></p><p> set_disp_position(1,1);</p><
102、;p> display_menu(setdate_menu);</p><p> set_disp_position(2,4);</p><p> display_date();</p><p> set_disp_position(1,14); </p><p> display_week();</p>&l
103、t;p> switch(key_age_next)</p><p><b> {</b></p><p> case 0:{set_disp_flash(2,6);</p><p> set_disp_flash(2,7);</p><p><b> } break;</b><
104、;/p><p> case 1:{set_disp_flash(2,9);</p><p> set_disp_flash(2,10);</p><p><b> } break;</b></p><p> case 2:{set_disp_flash(2,12);</p><p> se
105、t_disp_flash(2,13);</p><p><b> } break;</b></p><p><b> }</b></p><p> if(key_next==0)</p><p> key_age_next++;</p><p> if(key_a
106、ge_next==3) </p><p> key_age_next=0;</p><p> if(key_plus==0&&key_age_next==0) //調(diào)年加</p><p> {delay_ms(10);</p><p> while(key_plus==0)</p><p>&
107、lt;b> {</b></p><p> rd_realdate();</p><p> real_date[0]=(real_date[0]/16)*10+real_date[0]%16;</p><p> real_date[0]++;</p><p> if (real_date[0]==100)</p
108、><p> real_date[0]=0;</p><p> real_date[0]=(real_date[0]/10)*16+real_date[0]%10;</p><p> } wr_realdate( );</p><p><b> }</b></p><p> if(key_m
109、inus==0&&key_age_next==0) //調(diào)年減</p><p> {delay_ms(10);</p><p> while(key_minus==0)</p><p><b> {</b></p><p> rd_realdate();</p><p>
110、 real_date[0]=(real_date[0]/16)*10+real_date[0]%16;</p><p> real_date[0]--;</p><p> if (real_date[0]==-1)</p><p> real_date[0]=99;</p><p> real_date[0]=(real_date[
111、0]/10)*16+real_date[0]%10;</p><p> } wr_realdate( );</p><p><b> }</b></p><p> if(key_plus==0&&key_age_next==1) //調(diào)月加</p><p> {delay_ms(10);<
112、/p><p> while(key_plus==0)</p><p><b> {</b></p><p> rd_realdate();</p><p> real_date[1]=(real_date[1]/16)*10+real_date[1]%16;</p><p> real_da
113、te[1]++;</p><p> if (real_date[1]==13)</p><p> real_date[1]=1;</p><p> real_date[1]=(real_date[1]/10)*16+real_date[1]%10;</p><p> } wr_realdate( );</p><
114、p><b> }</b></p><p> if(key_minus==0&&key_age_next==1)//調(diào)月減</p><p> {delay_ms(10);</p><p> while(key_minus==0)</p><p><b> {</b>
115、</p><p> rd_realdate();</p><p> real_date[1]=(real_date[1]/16)*10+real_date[1]%16;</p><p> real_date[1]--;</p><p> if (real_date[1]==0)</p><p> real_d
116、ate[1]=12;</p><p> real_date[1]=(real_date[1]/10)*16+real_date[1]%10;</p><p> } wr_realdate( );</p><p><b> }</b></p><p> if(key_plus==0&&key_ag
117、e_next==2) //調(diào)日加</p><p> {delay_ms(10);</p><p> while(key_plus==0)</p><p><b> {</b></p><p> rd_realdate();</p><p> real_date[2]=(real_dat
118、e[2]/16)*10+real_date[2]%16;</p><p> real_date[2]++;</p><p> real_date[3]++; //周隨日加而變化 </p><p> if (real_date[3]==8)</p><p> real_date[3]=1;</p>
119、<p> if (real_date[1]==1||real_date[1]==3||real_date[1]==5||real_date[1]==7||real_date[1]==9||real_date[1]==11)</p><p> if (real_date[2]==32)</p><p> real_date[2]=1;</p><p>
120、 if (real_date[1]==4||real_date[1]==6||real_date[1]==8||real_date[1]==10||real_date[1]==12)</p><p> if (real_date[2]==31)</p><p> real_date[2]=1;</p><p> if (real_date[0]%4==0)&
121、lt;/p><p> if (real_date[1]==2)</p><p> if (real_date[2]==30)</p><p> real_date[2]=1;</p><p> if (real_date[0]%4!=0)</p><p> if (real_date[1]==2)</p&g
122、t;<p> if (real_date[2]==29)</p><p> real_date[2]=1;</p><p> real_date[2]=(real_date[2]/10)*16+real_date[2]%10;</p><p> } wr_realdate( );</p><p><b>
123、}</b></p><p> if(key_minus==0&&key_age_next==2) //調(diào)日減</p><p> {delay_ms(10);</p><p> while(key_minus==0)</p><p><b> {</b></p><
124、;p> rd_realdate();</p><p> real_date[2]=(real_date[2]/16)*10+real_date[2]%16;</p><p> real_date[2]--;</p><p> real_date[3]--;//周隨日加而變化</p><p> if (real_date[
125、3]==0)</p><p> real_date[3]=7;</p><p> if (real_date[1]==1||real_date[1]==3||real_date[1]==5||real_date[1]==7||real_date[1]==8||real_date[1]==10||real_date[1]==12)</p><p> if (re
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計-時間控制器
- 單片機作息時間控制器課程設計
- 單片機課程設計---單片機節(jié)日彩燈控制器
- 單片機課程設計---單片機原理及應用
- 單片機課程設計:彩燈控制器設計
- 單片機課間作息時間控制器課程設計
- 單片機課程設計-- 單片機原理及應用
- 單片機課程設計---基于單片機的定時控制器設計
- 單片機課程設計--步進電機控制器設計
- 單片機課程設計-- 彩燈控制器的設計
- 單片機課程設計---水溫控制器設計
- 彩燈控制器的設計 單片機課程設計
- 單片機課程設計--水溫控制器設計
- 單片機課程設計--溫度控制器的設計
- 單片機課程設計--步進電機控制器
- 單片機課程設計---基于單片機控制的時鐘控制器
- 單片機原理及應用課程設計
- 單片機課程設計——基于單片機的步進電機控制器設計
- 單片機課程設計--節(jié)日彩燈控制器設計
- 時鐘控制器單片機課程設計報告
評論
0/150
提交評論