數字時鐘設計開發(fā)項目報告_第1頁
數字時鐘設計開發(fā)項目報告_第2頁
數字時鐘設計開發(fā)項目報告_第3頁
數字時鐘設計開發(fā)項目報告_第4頁
數字時鐘設計開發(fā)項目報告_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、常州工程職業(yè)技術學院計算機技術系項目工作報告課程名稱單片機與接ii技術(c51)班級計算機1213學號姓名項目序號項目一項目名稱數字時鐘設計開發(fā)實訓日期/時間2014.2 2014.5地點指導教師同組成員儀器設備 (參考資料)計算機、keil uvision2、proteus isis實訓內容 (任務安排)1-1需求分析、硬件設計方案確定1-2軟件開發(fā)與實現(xiàn)1-3軟硬件聯(lián)調1-4項目驗收總結一、項目概述以單片機stc89c52rc作為主控芯片,利用按鍵、數碼管顯示模塊,結合中斷、定吋器功 能,構成一個數字時鐘,通過項目實訓掌握單片機基木輸入輸出系統(tǒng)的設計與應用。二、項h要求針對每個項目,教師給

2、出所需背景知識、參考資料、師生交流平臺、項目要求、相關案 例、開發(fā)流程、注意事項等指導學生。根據項0開發(fā)流程組成學生開發(fā)團隊,創(chuàng)建協(xié)作學習 環(huán)境。每個團隊由6-8人組成,分別擔當不同角色。這種模擬教學法的做法模擬了企業(yè)中真 實開發(fā)情景,使學生在學習過程中感受到公司工作的氣氛。具體要求如下:1、能夠簡單分析實際項目的功能需求;2、能夠進行10接口電路設計與元器件選型;3、能夠使用proteus繪制電路原理圖并仿真;4、能用c51設計應用程序;5、能夠對系統(tǒng)進行測試與優(yōu)化;6、能夠編制規(guī)范的技術文檔;7、能對系統(tǒng)軟硬故障進行檢測與排除;8、培養(yǎng)自主學習能力、收集分析、處理信息能力、團隊協(xié)作能力;9

3、、培養(yǎng)職業(yè)道德素質、心理素質、溝通、組織和執(zhí)行任務的能力;10、培養(yǎng)匯報發(fā)言時,條理清晰,表達清楚,體現(xiàn)出認真細致、全而的思維習慣。11、培養(yǎng)學生良好的工作設計習慣。12、培養(yǎng)實事求是、客觀公正的評價自己,體現(xiàn)在社會交往中的承受挫折與迎接挑戰(zhàn)的 意識。三、系統(tǒng)設計1、框圖設計2、知識點1)單片機型號的選擇89c51是最理想的電子時鐘開發(fā)芯片。89c51是一種帶4k字節(jié)閃爍可編程可擦除只讀存儲 器的低電壓,高性能cm0s8位微處理器,器件采用atmel高密度非易失存儲器制造技術制造, 與工業(yè)標準的mcs-51指令集和輸出管腳相兼容。由于將多功能8位cpu和閃爍存儲器組合在 單個芯片中,atmel

4、的89c51是一種高效微控制器,而且它與mcs-51兼容,且具有4k字節(jié)可 編程閃爍存儲器和1000寫/擦循環(huán),數據保留時間為10年等特點,是最好的選擇。2)數碼管顯示工作原理數碼管是一種把多個led顯示段集成在一起的顯示設備。有兩種類型,一種是共陽型, 一種是共陰型。共陽型就是把多個led顯示段的陽極接在一起,乂稱為公共端。共陰型就是 把多個led顯示段的陰極接在一起。陽極即為二極管的正極,又稱為正極,陰極即為二極管 的負極,又稱為負極。通常的數碼管又分為8段,即8個led顯示段,這是為工程應用方便如設計的,分別為a、b、c、d、e、f、g、dp,其中dp是小數點位段。而多位數碼管,除 某一

5、位的公共端會連接在一起,不同位的數碼管的相同端也會連接在一起。數碼管顯示方法 可分為靜態(tài)顯示和動態(tài)顯示兩種。靜態(tài)顯示就是數碼管的8段輸入及其公共端電平一直有效。 動態(tài)顯示的原理是,各個數碼管的相同段連接在一起,共冋占用8位段引管線;每位數碼管 的陽極連在一起組成公共端。利用人眼的視覺暫留性,依次給出各個數碼管公共端加有效信 號,在此同時給出該數碼管加有效的數據信號,當全段掃描速度大于視覺暫留速度時,顯示 就會清晰顯示出來3)鍵盤電路設計該設計用到了個鍵盤,實現(xiàn)的功能比較完善,減少了硬件資源的損耗,該鍵 盤可以實現(xiàn)小時和分鐘的調節(jié)以及復位的控制。直接按下不松開,則可以通過按鍵實現(xiàn)分鐘 的累加,每

6、按一次分鐘加一;而連續(xù)兩次按下按鍵不放松,則可實現(xiàn)小時的調節(jié),同樣每按 一次小時加一。達到時間調節(jié)的目的。4)晶振振蕩器電路單片機系統(tǒng)里都有晶振,在單片機系統(tǒng)里晶振作用非常大,全程叫晶體振蕩器,他結合 單片機內部電路產生單片機所需的時鐘頻率,單片機晶振提供的時鐘頻率越高,那么單片機 運行速度就越快,單片接的一切指令的執(zhí)行都是建立在單片機晶振提供的時鐘頻率。在通常工作條件下,普通的晶振頻率絕對精度可達百萬分之五十。高級的精度更高。有些晶 振還可以由外加電壓在一定范圍內調整頻率,稱為壓控振蕩器(vco)。晶振用一種能把電能 和機械能相互轉化的晶體在共振的狀態(tài)下工作,以提供穩(wěn)定,精確的單頻振蕩。單片

7、機晶振的作用是為系統(tǒng)提供基木的時鐘信號。通常一個系統(tǒng)共用一個晶振,便于各 部分保持同步。有些通訊系統(tǒng)的基頻和射頻使用不同的晶振,而通過電子調整頻率的方法保 持同步。晶振通常與鎖相環(huán)電路配合使用,以提供系統(tǒng)所需的吋鐘頻率。如果不同子系統(tǒng)需要不 同頻率的時鐘信號,可以用與同一個晶振相連的不同鎖相環(huán)來提供。下面我就具體的介紹一下晶振的作用以及原理,晶振一般采用如圖la的電容三端式(考畢茲) 交流等效振蕩電路;實際的晶振交流等效電路如圖lb,其中cv是用來調節(jié)振蕩頻率,一般用 變容二極管加上不同的反偏電壓來實現(xiàn),這也是壓控作用的機理;把晶體的等效電路代替晶 體后如圖lc。其中co, cl,ll,rr是

8、晶體的等效電路。分析整個振蕩槽路可知,利用cv來改變頻率是有限的:決定振蕩頻率的整個槽路電容c=cbe,cce,cv三個電容串聯(lián)后和co并聯(lián)再和cl串聯(lián)。可以看出:c1越小,co越大,cv變 化時對整個槽路電容的作用就越小。因而能“壓控”的頻率范圍也越小。實際上,由于c1很 ?。?e-15量級),co不能忽略(1e-12量級,幾pf)。所以,cv變大時,降低槽路頻率的作用 越來越小,cv變小吋,升高槽路頻率的作用卻越來越大。這一方面引起壓控特性的非線性, 壓控范圍越大,非線性就越厲害;另一方面,分給振蕩的反饋電壓(cbe上的電壓)卻越來越小, 最后導致停振。通過晶振的原理圖你應該大致了解了晶振

9、的作用以及工作過程了吧。采用泛 音次數越高的晶振,其等效電容c1就越小;因此頻率的變化范圍也就越小。微控制器的時鐘源可以分為兩類:基于機械諧振器件的時鐘源,如晶振、陶瓷諧振槽路;rc (電阻、電容)振蕩器。一種是皮爾斯振蕩器配置,適用于晶振和陶瓷諧振槽路。另一種為 簡單的分立rc振蕩器。用萬用表測量晶體振蕩器是否工作的方法:測量兩個引腳電壓是否是芯片工作電壓的一 半,比如工作電壓是51單片機的+5v則是否是2. 5v左右。另外如果用鑷子碰晶體另外一個腳, 這個電壓有明顯變化,證明是起振了的。晶振的類型有smd和dtp型,即貼片和插腳型。5)單片機的復位電路在上電或復位過程中,控制cpu的復位狀

10、態(tài):這段時間內讓cpu保持復位狀態(tài),而不是 一上電或剛復位完畢就工作,防止cpu發(fā)出錯誤的指令、執(zhí)行錯誤操作,也可以提高電磁兼 容性能。無論用戶使用哪種類型的單片機,總要涉及到單片機復位電路的設計。而單片機復位電路 設計的好壞,直接影響到整個系統(tǒng)工作的可靠性。許多用戶在設計完單片機系統(tǒng),并在實驗室 調試成功后,在現(xiàn)場卻出現(xiàn)了 “死機”、“程序走飛”等現(xiàn)象,這主要是單片機的復位電路設計 不可靠引起的?;镜膹臀环绞絾纹瑱C在啟動吋都需要復位,以使cpu及系統(tǒng)各部件處于確定的初始狀 態(tài),并從初態(tài)開始工作。89系列單片機的復位信號是從rst引腳輸入到芯片內的施密特觸發(fā) 器中的。當系統(tǒng)處于正常工作狀態(tài)時

11、,且振蕩器穩(wěn)定后,如果rst引腳上有一個高電平并維 持2個機器周期(24個振蕩周期)以上,貝u cpu就可以響應并將系統(tǒng)復位。單片機系統(tǒng)的復位 方式有:手動按鈕復位和上電復位6)中斷中斷就是一個資源面對多項任務的處理方式,由于資源有限,面對多項任務同時要處理時,就會出現(xiàn)資源競爭的現(xiàn)象。中斷技術就是為了解決資源競爭的一個可行的方法,采用中 斷技術可使多項任務共享一個資源。cpu正在執(zhí)行原程序,突然,被意外事情打斷,轉去執(zhí)行 新程序。cpu執(zhí)行新程序結束后,又回到原程序屮繼續(xù)執(zhí)行。這樣的過程就叫屮斷。首先來了解程序的格式:void 函數名 0 interrupt m using n關鍵字inter

12、rupt m using n表示這是一個中斷函數m為中斷源的編號,有五個屮斷源,取值為0,1, 2, 3, 4,屮斷編號會告訴編譯器屮斷程序的入 u地址,執(zhí)行該程序吋,這個地址會傳個程序計數器pc,于是cpu開始從這里一條一條的執(zhí) 行程序指令。n為單片機工作寄存器組(又稱通用寄存器組)編號,共四組,取值為0,1,2, 3中斷號中斷 源0外部中斷01定吋器02外部中斷13定時器1中斷4串行口中斷這5個屮斷源的屮斷入口地址為:(在上一篇文章屮講到的rom前43個存儲單元就是他們, 這40個地址用來存放中斷處理程序的地址單元,每一個類中斷的存儲單元只有8b,顯然不是 中斷處理的程序,而是存放著中斷處

13、理程序的真正地址)into: 0003h 0to: 000bii 1inti: 0013h 2tl: 001bh 3串:0023h 4中斷向量(中斷入口地址)=中斷號x8 +3前面m意思很清楚,不同的m值表示這個函數是針對不同的屮斷源,比如m為1是表示它是 定時器0的中斷函數,如 void timeo () interrupt 1那么后面的using n又是什么意思呢?在正在執(zhí)行一個特定任務時,有更緊急的事情需要cpu 來處理,涉及到中斷優(yōu)先權。高優(yōu)先權中斷低優(yōu)先權正在處理的程序,所以最好給每個優(yōu)先 程序分配不同的寄存器組。cpu正在處理某個事件,突然另外一個事件需要處理,于是進入中斷后,而你

14、不想將現(xiàn)在執(zhí)行的程序的各寄存器狀態(tài)入棧,那么可以把這個中斷程序放入另一個寄存 器組,如切換到1組,然后退出中斷時,再切回到0組(原來的程序在0組)。為了更好的了解這里意思,你可以看看工作寄存器組的作用是什么。下面的注意事項(1) 中斷函數不能進行參數傳遞(2) 中斷函數沒有返回值(3) 在任何情況下都不能直接調用中斷函數(4) 中斷函數使用浮點運算要保存浮點寄存器的狀態(tài)。(5) 如果在屮斷函數屮調用丫其它函數,則被調用函數所使用的寄存器必須與屮斷函數相同, 被調函數最好設置為可重入的。(6) c51編譯器對中斷函數編譯時會自動在程序開始和結束處加上相應的內容,只體如下: 在程序開始處對acc、

15、b、dph、dpl和psw入棧,結束時出棧。中斷函數未加using n修飾符 的,開始時還要將ror1入桟,結束時出棧。如中斷函數加using n修飾符,則在開始將psw 入棧后還要修改psw屮的工作寄存器組選擇位。(7) c51編譯器從絕對地址8m+3處產生一個中斷向量,其中m為中斷號,也即interrupt 后面的數字。該向量含一個到中斷函數入口地址的絕對跳轉。(8) 中斷函數最好寫在文件的尾部,并且禁止使用extern存儲類型說明。防止其它程序調 用。(9) 在設計中斷吋,要注意的是哪些功能應該放在中斷程序中,哪些功能應該放在主程序中。 一般來說中斷服務程序應該做最少量的工作,這樣做有很

16、多好處。首先系統(tǒng)對中斷的反應面 更寬了,有些系統(tǒng)如果丟失中斷或對中斷反應太慢將產生十分嚴重的后果,這時有充足的時 間等待中斷是十分重要的。其次它可使中斷服務程序的結構簡單,不容易出錯。中斷程序中 放入的東西越多,他們之間越容易起沖突。簡化屮斷服務程序意味著軟件屮將有更多的代碼 段,但可把這些都放入主程序中。中斷服務程序的設計對系統(tǒng)的成敗有至關重要的作用,要 仔細考慮各中斷之間的關系和每個中斷執(zhí)行的時間,特別要注意那些對同一個數據進行操作的 isr.7)定時器實質是計數器,脈沖每一次k降沿,計數寄存器數值將加1。計數的脈沖如果來源于單片機內部的晶振,由于其周期極為準確,這時稱為定吋器。計數的脈沖

17、如果來源于單片機外部的引腳,由于其周期一般不準確,這時稱為計數器。定時器/計數器的結構定時器/計數器的實質是加1計數器(16位),由高8位和低8位兩個寄存器組成。tmod 是定時器/計數器的工作方式寄存器,確定工作方式和功能;tcon是控制寄存器,控制to、t1 的啟動和停止及設置溢出標志。定時器/計數器的工作原理計數器輸入的計數脈沖源 系統(tǒng)的時鐘振蕩器輸出脈沖經12分頻后產生;to或t1引腳輸入的外部脈沖源。計數過程每來一個脈沖計數器加1,當加到計數器為全1(即ffffh)時,再輸入一個脈沖就使計數器 回零,且計數器的溢出使tcon中tfo或tf1置1,向cpu發(fā)出中斷請求(定時器/計數器中

18、斷 允許時)。如果定時器/計數器工作于定時模式,則表示定時時間己到;如果工作于計數模式, 則表示計數值己滿。定時應用用作定時器:此時設置為定時器模式,加1計數器是對內部機器周期計數(1個機器周期等于 12個振蕩周期,即計數頻率為晶振頻率的1/12)。計數值n乘以機器周期tcy就是定時時間t。 計數運用用作計數器:此時設置為計數器模式,外部事件計數脈沖由to或t1引腳輸入到計數器。每 來一個外部脈沖,計數器加1。但單片機對外部脈沖有基本要求:脈沖的高低電平持續(xù)時間都 必須大于1個機器周期。工作方式寄存器(tmod)d7d6d5d4d3d2didogatec/tmlmogatec/tmlmo定時器

19、t1定時器togate:門控位。gate=o吋,只要用軟件使tcon中的tro或tr1為1,就可以啟動定吋器/計數器工作;(即需 要一個啟動條件)gate=1時,要用軟件使tro或tr1為1,同時外部中斷引腳也為高電平時,j能啟動定時器/ 計數器工作,即需要兩個啟動條件。c/t :定時/計數模式選擇位。c/t =0為定吋模式;c/t =1為計數模式。m1m0:工作方式設置位。計數器工作方式選擇ml m0工作方式功能說明0 0方式0 13位計數器0 1方式1 16位計數器1 0方式2自動重裝8位計數器1 1方式3定時器0:分成兩個8位定時器1:停止計數定時器/計數器的控制控制寄存器tcontco

20、n的低4位用于控制外部中斷,己在前面介紹。tcon的高4位用于控制定時器/計數器的啟 動和中斷申請。其格式如下:位。7&432(k字節(jié)地址:88h,tfbtrltfotroj嗜tcon.,tf1 (tcon. 7): t1溢出中斷請求標志位。t1計數溢出吋由硬件自動置tf1為1。cpu響應中斷 后tf1由硬件自動清0。tri (tcon. 6): t1起/停控制位。1:啟動0:停止 tfo(tcon. 5): t0溢出中斷請求標志位,其功能與tf1類同。tro (tcon. 4): t0起/停控制位。1:啟動0:停止定時器/計數器的工作方式方式0方式0為13位計數,由tlo的低5位(高

21、3位未用)和tho的8位組成tlo的低5位溢出時向方式1方式1的計數位數是16位,由tlo(tll)作為低8位、tho(thl)作為高8位,組成了 16位加 1計數器。方式2方式2為自動重裝初值的8位計數方式。ton而)8醐器1h1重裝單元to引腳<j機翻醐引腳01 -gm?jlgate1)0)7在方式2下,當計數器計滿255(ffh)溢出吋,cpu自動把th的值裝入tl中,不需用戶干預。 因此特別適合于用作較精確的脈沖信號發(fā)生器。方式3方式3只適用于定時器/計數器to,定時器t1方式3時相當于tr1=o,停止計數。 工作方式3將to分成為兩個獨立的8位計數器tlo和t110。擴展閱讀:

22、計數器/定時器的c編程8) 最小化系統(tǒng)單片機要正常運行,必須具備一定的硬件條件,其中最主要的就是三個條件:(1) 電源正常;(2) 吋鐘正常;(3) 復位正常。在at89c51單片機的40個引腳中,電源引腳兩根,晶振引腳4根,可編程輸入輸出引 腳32根。(1) 工作電源電源是單片機工作的動力源泉,對應的接線方法為:40引腳(vcc)電源引腳, 工作是接+5v電源,20引腳(gnd)為接地線。(2) 時鐘電路時鐘電路為單片機產生時序脈沖,單片機所有運算與控制過程都是在同一時 序脈沖的驅動下進行的,時鐘電路就好比人的心臟一樣重要。當采用內部時鐘時,在晶振xtal(19引腳)和xtal (18引腳)

23、之間接入一個晶振,兩個引腳對地分別接入一個電容可產生所 需的時鐘信號,電容的容量一般取30pf。(3) 復位電路在復位引腳(9引腳)持續(xù)出現(xiàn)24個振蕩器脈沖周期(即2個機器周期) 的高平信號將使單片機復位。電容c和電阻r構成了單片機上電自動復位電路。復位后,單 片機從0000h單元開始執(zhí)行程序,并初始化一些專用寄存器為復位狀態(tài)值,受影響的專用寄 存器如表所示。(4) 控制引腳ea接法ea/vpp (31引腳)為內外程序存儲器選擇控制引腳,當ea為低電 位吋,單片機從外部存儲器取指令,當ea接高電平吋,從單片機內部程序存儲器取指令。 at89c51單片機內部有4kb可反復擦寫1000次以上的程序

24、存儲器,因此要把ea接+5v高電平, 讓單片機運行內部的程序,這樣就可以反復來驗證程序了。這就是at89c51單片機最小化系 統(tǒng)的連接,只要把編寫好的程序燒寫到單片機內部,并接上5v電源就可以正常運行了,在17 引腳上街上的發(fā)光二極管可以用來驗證系統(tǒng)是否正常。9) c語言單片機產生于19世紀70年代,80年代人們開始使用c語言作為單片機的開發(fā)語言,在1985 年許多公司都推出51系列單片機的c語言編輯器,我們把面向51單片機的c語言簡稱為c51。 目前c51軟件中最為流行的就是keil c。一、c語言編程與匯編語言編程相比的優(yōu)勢1 編程調試靈活方便。因為它是一門高級語言,高級語言的特點就是編程

25、方式靈活,同時,當前所有的單片機都有相應的c語言級別的仿真調試系統(tǒng),使得它的調試十分方便。2 生成的代碼編譯效率高。尤其是用于較為復雜的單片機系統(tǒng),用c語言開發(fā)更具明顯 優(yōu)勢,當前較好的c語言編輯系統(tǒng)的編譯效率己經基本達到中高級程序人員的開發(fā)水平。3 完全模塊化。c語言的基本構成單位是函數,其本身就是模塊化的開發(fā)方式。程序的 模塊化可以最大程度地實現(xiàn)資源共享,十分有利于多人協(xié)作,進行大系統(tǒng)項目的開發(fā)。4 可移植性好。當對c語言程序進行移植時,只需將部分與硬件相關的地方進行適度修 改,如:頭文件。完全是算法類的程序無需修改就可以直接從一種單片機移植到另外一種單 片機上。5 便于項目維護管理。用c

26、語言開發(fā)的代碼便于開發(fā)小組計劃項目、靈活管理、分工合 作以及后期維護,基本上可以杜絕因開發(fā)人員變化而給項目進度或后期維護或升級所帶來的 影響,從而保證了整個系統(tǒng)的高品質、高可靠性及可升級性。二、與ansi c的區(qū)別1 c51針對的是硬件系統(tǒng),所以在程序的最開始應加載關于該系列芯片的頭文件,如 reg51. h或reg52. h,頭文件中定義了各種sfr和sfr中可尋址位的信息。2 從數據類型上講,c51多了一種位類型,可以使得單片機的位操作更加方便。3 從數據的存儲類型上說,c51可分為data、code、bdata、idata、pdata、xdata等類 型,不同的數據存儲類型有著不同的執(zhí)行

27、效率。4 由于單片機系統(tǒng)資源有限,所以編譯系統(tǒng)不允許有太多的程序嵌套。5 c51不支持擴展16位字符,同時不支持遞歸特性。6 printf和scanf函數在c51中不再是用于屏幕打印和接收字符,而是用于串行口通信 時數據的收發(fā)。三、c51的關鍵字關鍵字是編程語言保留的特殊標識符,在程序中不允許男做他用。ansi c中有32個關鍵 字,c51 在此基礎上又擴展了20個,包括 at,alien, bdata, bit, code, compact, data, idata, interrupt, large, pdata, _priority , reentrant, sbit, sfr, sfr

28、l6, small, _task , using,xdata。四、c51的數據類型ansi c 包括的數據類型有 char、int、short、long、float、double、指針型,在 c51 中, short等同于int,double等同于float,除此之外,還增加了 bit、sfr、sfrl6、sbit這些 特殊的數據類型。char (ib)、 int (2b)、 long (4b)、 float (4b)obit用于定義一個位標量,該位標量的值不是0就是1,類似某些高級語言中的boolean類 型數據。sfr可以訪問51單片機內所有的sfr,用于聲明一個8位的sfr。如sfr p

29、l=0x90;sfrl6用于定義存在于51單片機內部ram的16位的特殊功能寄存器。如sfrl6 t0=0x8c;sbit用于訪問位地址空間中的可尋址位或sfr中的可尋址位。如:sbit ov=oxd2;sbit cy=0xd7;xjx xtx xtx xtx xfx xfx xfx xfx xfx xfx xfx xfx xfx xfx xfx xfx xfx xfx xfx xjx xtxsfr sc0n=0x98;sbit ri=sc0o;sbit rb8=scon2;xjx xtx xtx xtx xfx xfx xfx xfx xfx xfx xfx xfx xfx xfx xfx

30、xfx xfx xfx xfx xfx xfx xfx xjx xtxsbit ov=oxd(f2;五、數據的存儲器類型data存儲在可直接尋址的片內低128b的ram中,訪問速度最快。bdata存儲在可位尋址的內部ram中(20h-2fh),允許位和字節(jié)混合訪問。idata存儲在可間接尋址的片內ram的256b。允許訪問全部片內地址。pdata存儲在可分頁尋址的外部ram的256b空間內,相當于movx ri指令。xdata存儲在可尋址的片外ram的全部64kb空間,相當于movx dptr指令。code存儲在全部64kb的程序存儲區(qū),相當于movc a+dptr指令。六、絕對地址的訪問方法

31、1 使用指針。char data 氺dp;dp二0x61;*dp=0x23;2 使用預定義宏(需包含absacc. h)gbytedbytepbytrxbytrcworddwordpwordxword例如: val2=xbyte0x7fdd;3 使用關鍵字_at_unsigned char xdata com8255 _at_ oxffef;com8255=0x90;七、中斷服務程序格式:void 函數名()interrupt n using mn是中斷號,取值為04, using m指明該中斷服務程序對應的工作寄存器組,取值范圍: 03。使用c51編寫中斷服務程序,無需關心acc、b、dph

32、、dpl、psw等寄存器的保護,c51 會自動增加入棧和出棧對這些寄存器進行保護。八、c51的運算符和表達式1 賦值運算符:=2 算術運算符:+ - */ %3 關系運算符:<=<=! =4 邏輯運算符:&&| |!5 位運算符:&|"<<>>6 復合運算符:+= >>= %= &=等7 指針和地址運算符:*&九、c51庫函數:需包含intrins. hn);n);n);1 本征函數注意:調用這些函數時,crol(x,n);cror(x,iror(x,n);irol(x,irol(x,n);iro

33、r(x,_nop_ ();testbit(bitbar);chkfloat(fltbar);2 非本征函數reg51. h或reg52. h,其中包括了所有sfr的定義。absacc. h該文件中定義了兒個宏,以確定各存儲空間的絕對地址。string, h 包括復制、比較、移動等函數如:memccpy, memchr, memcmp, memcpy, memmove, memset 等。stdio.h通過51單片機的串口或用戶定義的1/0 口讀寫數據,默認為串口,如需修改,可 以修改lib目錄中的getkey. c及putchar. c源文件。maths, h各種數學函數如:sqrt、exp等

34、。十、c51語法結構1 單分支結構:if (條件)else2 多分支結構:switch (變量)case 值1:case 值2:case 值 n:default:3 for循環(huán):for (起始條件;循環(huán)條件;變量遞增) 4 while 循環(huán):while (條件)5 do while 循環(huán):dowhile (條件);6 goto 標號7 死循環(huán):while (1); here: goto here; forh一、c51應用技巧1 靈活選擇變量的存儲器類型。由于單片機系統(tǒng)的存儲器資源有限,為了提高執(zhí)行效率,對存儲器類型的設定應該根據以 下原則:只要條件滿足,盡量先使用內部直接尋址存儲器(data)

35、,其次設定變量為間接尋址 存儲器(idata),在內部存儲器數量不夠的情況下,冰使用外部存儲器,而且在外部存儲器, 優(yōu)先選擇pdata,最后方是xdata,而且,在內部和外部存儲器共同使用的情況下,要合理分 配存儲器,對經常使用和計算頻繁的數據,應該使用內部存儲器,其他的則使用外部存儲器。2 另一個提高代碼效率的方法就是減小變量的長度,51單片機是8位的,若使用int型的 無簸是空間上的極大浪費。應盡可能選擇的char、unsigned char、或bit,它們只占用ib 或1位。3 再一個提高代碼效率的方法是使用無符號類型,原因是51單片機指令不支持符號運算。 若使用有符號類型的變量,c51

36、編譯器將耍增加相應的庫函數去處理符號運算。4 盡量避免使用浮點變量。浮點數占用4個字節(jié),對單片機的存儲器資源來說就是極大的 浪費。浮點運算應盡量通過提高數值數量級或使用整型運算代替浮點運算。盡量減少乘除法 運算,如*2或/2,可以使用移位操作代替,這樣不僅可以減少代碼量,同時還能大大提高程 片;執(zhí)行效率。5 盡量使用庫函數。c51的庫函數提供的許多調令,尤其是本征函數,直接對應著匯編指 令,編譯效率較高。6 使用宏替換。宏替換可以使程序具有更好的可讀性,且當需要修改宏時,只要修改宏 定義處即可。7 靈活設置變量,高效利用存儲器。對于標志位要使用bit或sbit定義,而不耍使用unsigned

37、char。這樣可以大量節(jié)省內 存,編寫c51程序時,不是特別必要的地方一般不要使用全局變量,盡量使用局部變量。四、硬件設計1、電路原理圖1電路原理圖采用定吋器0的工作方式1定吋500ms,等待20次定時is進行吋鐘計數。通過定吋器1 的工作方式1定時500ms,用來調整數碼管閃爍的時間。k1是用來選中時分秒,按一下選中 時,再按一下選中分,再按一下選中秒,再按一下退出選中狀態(tài)。k2按一下數加一,k3按一 下數減一。在調整時間時,時鐘停走。2、元件清單表1元件清單元件清單名稱型號數量芯片at89c511數碼管7seg-mpx6-ca1鎖存器74hc3731電容ceramc 33p2晶振cryst

38、al 12mhz1電容gen-elec1二極管led-blue1電阻min-res2排阻respack-8 ik1button3五、軟件設計1.程序流程2主程序流程e開始sec+sec=60sec=osec=o;min+;一秒單元清零分單元加一分單元清零時單元加一min>=60min=o; hour+時單元清零hour=0hour>=24、 中斷返冋 y3調整時間流程display (tablefhour/101, tablehour%10, tablemin/l 0,tablemi n%l 0,tablesec/l 0,ta blelsec%10,0xff)開始秒個位計算顯示1秒

39、十位計算撾示1分個位計算顯示1分十位計算顯示i時個位計算顯示4時間顯示流程|時十位計算顯示1、程序清單總程序實現(xiàn)數字時鐘的計時,功能是數碼管通過動態(tài)掃描顯示時間,時間可設定,調整時間吋吋鐘不走.(1) 主程序void niain() p2=0xff; hour=12; min=0; sec=0;tm0d=0xll; /工作方式tho= (65536-50000)/256; /定時器初始值tlo=(65536-50000)%256; th1=(65536-50000)/256;tl1=(65536-50000)%256; ea=1; eto=1;et1=1; /允許定時器1中斷tro=1;/啟動

40、定時器 tr1=1; aa=0xff; while (1)time_change();/顯示時,分,秒的各位和十 display(tablehour/10, tablehour%10, tablemin/10,tablemin%10,tablesec/10, tablesec%10, oxff);(2) 定時器中斷程序void timero() interrupt 1/控制次數/秒計時tho= (65536-50000) /256;/定時器重新賦初值/tlo=(65536-50000)%256; temp+;void timerl() interrupt 3 th1=(65536-50000)

41、/256; tl1=(65536-50000)%256; count+;if(count>=20) count=0;(3) 時間控制void time change()read_key ():if (temp=20)/等待大于等于20次/temp=0;sec+十;if (sec=60)/直到大于 60 秒/ sec=0;min+;/分開始加/wl'ajisaif (min=60)/直到大于等于60分/ min=0;hour+;/小時開始加/if (hour>=24)/小時大于 24/hour=0;/小吋清零/(4) 顯示函數void display(uchar a,ucha

42、r b,uchar c,uchar d,uchar e,uchar f,uchar aa) if(num=l)pl=0x01&aa;p0=a;delay(2);elsepl=0x01;p0=a;delay(2); /hourif(num=l)pl=0x02&aa;p0=b;delay(2);elsepl=0x02;p0=b;delay (2); /hourif(num=2)pl=0x04&aa;p0=c;delay(2);elsepl=0x04;p0=c;delay(2); /minif(nura=2)pl=0x08&aa;p0=d;delay(2);elsep

43、l=0x08;p0=d;delay(2): /minif(num=3)pl=0xl0&aa;p0=e;delay(2);elsepl=0xl0;p0=e;delay (2); /secif(num=3)pl=0x20&aa;p0=f;delay(2);elsepl=0x20;p0=f;delay(2); /sec(5) 按鍵控制void read_key() if (keyl=0) led=0; del ay(100);if(keyl=0) delay(100); _led=l; num+; if(num>3)num=0; while (1) if(keyl=0) _le

44、d=0; delay(10); if(keyl=0) num+;if (num>3)num=0;break;while(!keyl); delay (10);while(!keyl); jed=l; if(key2=0) led=0; delay (80); if (key2=0)if(num二二1)hour+;if(hour=24)hour=0;if (num2) min+; if (min60)min=0; if (num=3) sec+; if (sec=60)sec=0;wh i1e(!keyl); delay (10); while(!keyl); jed=l;if(key3=0) led=0; delay(80); if(key3=0) if (numl) hour; if (hour=0) hour=23: if (num2) min; if (min0)min=59; i f (num3) sec; i f (sec59) sec=59;while (!keyl); delay (10); while(!keyl); _led=l; if(count<=15)display (tablehour/10, table hour%10, tabl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論