1、基于單片機的電子鐘的設計學 院: 班 級: 姓 名: 學 號: 小組成員:姓 名: 學 號: 指導老師: 目 錄 一、設計要求 2二、設計方案和論證 2(一)總設計原理圖 2(二)設計方案的選擇 2(3) 硬件部分 4(4) 軟件部分 8三、設計總結26四、參考文獻26一、設計要求1、準確計時,以數字形式顯示時、分、秒的時間。2、小時以24小時計時形式,分秒計時為60進位。 3、校正時間功能,即能隨意設定走時時間。4、設計5v直流電源,系統時鐘電路、復位電路。 二、設計方案和論證本次設計時鐘電路,使用了atc89c51單片機芯片控制電路,單片機控制電路簡單且省去了很多復雜的線路,使得電路簡明易
2、懂,使用鍵盤鍵上的按鍵來調整時鐘的時、分、秒,用一揚聲器來進行定時提醒,同時使用匯編語言程序來控制整個時鐘顯示,使得編程變得更容易,這樣通過四個模塊:鍵盤、芯片、揚聲器、led顯示即可滿足設計要求。(一) 總設計原理框圖如下圖所示:微型控制器時鐘電路聲光報時校時輸入數據顯示(二)設計方案的選擇1.計時方案 方案1:采用實時時鐘芯片現在市場上有很多實時時鐘集成電路,如ds1287、ds12887、ds1302等。這些實時時鐘芯片具備年、月、日、時、分、秒計時功能和多點定時功能,計時數據的更新每秒自動進行一次,不需要程序干預。因此,在工業實時測控系統中多采用這一類專用芯片來實現實時時鐘功能。 方案
3、2:使用單片機內部的可編程定時器。利用單片機內部的定時計數器進行中端定時,配合軟件延時實現時、分、秒的計時。該方案節省硬件成本,但程序設計較為復雜。2.顯示方案對于實時時鐘而言,顯示顯然是另一個重要的環節。通常led顯示有兩種方式:動態顯示和靜態顯示。靜態顯示的優點是程序簡單、顯示亮度有保證、單片機cpu的開銷小,節約cpu的工作時間。但占有i/o口線多,每一個led都要占有一個i/o口,硬件開銷大,電路復雜。需要幾個led就必須占有幾個并行口,比較適用于led數量較少的場合。當然當led數量較多的時候,可以使用單片機的串行口通過移位寄存器的方式加以解決,但程序編寫比較麻煩。led動態顯示硬件
4、連接簡單,但動態掃描的顯示方式需要占有cpu較多的時間,在單片機沒有太多實時測控任務的情況下可以采用。本系統需要采用6位led數碼管來分別顯示時、分、秒,因數碼管個數較多,故本系統選擇動態顯示方式。(三)硬件部分1、stc89c51單片機介紹stc89c51單片機是由深圳宏晶公司代理銷售的一款mcu,是由美國設計生產的一種低電壓、高性能cmos 8位單片機,片內含8kbytes的可反復寫的flashrom和128bytes的ram,2個16位定時計數器5。 stc89c51單片機內部主要包括累加器acc(有時也簡稱為a)、程序狀態字psw、地址指示器dptr、只讀存儲器rom、隨機存取存儲器r
5、am、寄存器、并行i/o接口p0p3、定時器/計數器、串行i/o接口以及定時控制邏輯電路等。這些部件通過內部總線聯接起來,構成一個完整的微型計算機。其管腳圖如圖所示。stc89c51單片機管腳結構圖vcc:電源。gnd:接地。p0口:p0口為一個8位漏級開路雙向i/o口,每腳可吸收8ttl門電流。當p1口的管腳第一次寫1時,被定義為高阻輸入。p0能夠用于外部程 序數據存儲器,它可以被定義為數據/地址的第八位。在fiash編程時,p0 口作為原碼輸入口,當fiash進行校驗時,p0輸出原碼,此時p0外部必須被拉高。 p1口:p1口是一個內部提供上拉電阻的8位雙向i/o口,p1口緩沖器能接收輸出4
6、ttl門電流。p1口管腳寫入1后,被內部上拉為高,可用作 輸入,p1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在flash編程和校驗時,p1口作為第八位地址接收。 p2口:p2口為一個內部上拉電阻的8位雙向i/o口,p2口緩沖器可接收,輸出4個ttl門電流,當p2口被寫“1”時,其管腳被內部上拉電阻 拉高,且作為輸入。并因此作為輸入時,p2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。p2口當用于外部程序存儲器或16位地址外部數據存 儲器進行存取時,p2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,p2口輸出其特殊
7、功能寄存器 的內容。p2口在flash編程和校驗時接收高八位地址信號和控制信號。 p3口:p3口管腳是8個帶內部上拉電阻的雙向i/o口,可接收輸出4個ttl門電流。當p3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,p3口將輸出電流(ill)這是由于上拉的緣故。p3口也可作為at89c51的一些特殊功能口,如下表所示:口管腳 備選功能p3.0 rxd(串行輸入口)p3.1 txd(串行輸出口)p3.2 /int0(外部中斷0)p3.3 /int1(外部中斷1)p3.4 t0(記時器0外部輸入)p3.5 t1(記時器1外部輸入)p3.6 /wr(外部數據存儲
8、器寫選通)p3.7 /rd(外部數據存儲器讀選通)p3口同時為閃爍編程和編程校驗接收一些控制信號。rst:復位輸入。當振蕩器復位器件時,要保持rst腳兩個機器周期的高電平時間。ale/prog:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在flash編程期間,此引腳用于輸入編程脈沖。在平時,ale 端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器 時,將跳過一個ale脈沖。如想禁止ale的輸出可在sfr8eh地址上置0。此時, ale只有在執行movx,movc指令是ale才起
9、作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ale禁止,置位無效。 psen:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/psen有效。但在訪問外部數據存儲器時,這兩次有效的/psen信號將不出現。ea/vpp:當/ea保持低電平時,則在此期間外部程序存儲(0000h-ffffh),不管是否有內部程序存儲器。注意加密方式1時, /ea將內部鎖定為reset;當/ea端保持高電平時,此間內部程序存儲器。在flash編程期間,此引腳也用于施加12v編程電源(vpp)。2、上電按鈕復位電路 本設計采用上電按鈕復位電路:首先經過上電復位,當按下按鍵時,rst直接
10、與vcc相連,為高電平形成復位,同時電解電容被電路放電;按鍵松開時,vcc對電容充電,充電電流在電阻上,rst依然為高電平,仍然是復位,充電完成后,電容相當于開路,rst為低電平,單片機芯片正常工作。其中電阻r2決定了電容充電的時間,r2越大則充電時間長,復位信號從vcc回落到0v的時間也長。3、晶振電路本設計晶振電路采用12m的晶振。晶振的作用是給單片機正常工作提供穩定的時鐘信號。單片機的晶振并不是只能用12m,只要不超過20m就行,在準許的范圍內,晶振越大,單片機運行越快,還有用12m的就是好算時間,因為一個機器周期為1/12時鐘周期,所以這樣用12m的話,一個時鐘周期為12us,那么定時
11、器計一次數就是1us了,電容范圍在20-40pf之間,這里連接的是30pf的電容。機器周期=10*晶振周期=12*系統時鐘周期4.下載端口設計用到的stc89c52單片機芯片的isp下載線是通過單片機的txd,rxd引腳把程序燒進去的。管腳txd和rxd用于異步串行通信。其實stc89c52單片機的isp下載線就是一個max232芯片連接stc和計算機的串行通信口。計算機把程序從九針串口送到max232芯片,電平轉換后送進單片機的串行口,也就是txd和rxd。然后單片機的串行模塊把數據送到程序區。5、顯示電路 就時鐘而言,通常可采用液晶顯示或數碼管顯示。由于一般的段式液晶屏,需要專門的驅動電路
12、,而且液晶顯示作為一種被動顯示,可視性相對較差;對于具有驅動電路和微處理器接口的液晶顯示模塊(字符或點陣),一般多采用并行接口,對微處理器的接口要求較高,占用資源多。另外,89c2051本身無專門的液晶驅動接口,因此,本時鐘采用數碼管顯示方式。數碼管作為一種主動顯示器件,具有亮度高、價格便宜等優點,而且市場上也有專門的時鐘顯示組合數碼管。對于實時時鐘而言,顯示顯然是另一個重要的環節。通常led顯示有兩種方式:動態顯示和靜態顯示。靜態顯示的優點是程序簡單、顯示亮度有保證、單片機cpu的開銷小,節約cpu的工作時間。但占有i/o口線多,每一個led都要占有一個i/o口,硬件開銷大,電路復雜。需要幾
13、個led就必須占有幾個并行口,比較適用于led數量較少的場合。當然當led數量較多的時候,可以使用單片機的串行口通過移位寄存器的方式加以解決,但程序編寫比較麻煩。led動態顯示硬件連接簡單,但動態掃描的顯示方式需要占有cpu較多的時間,在單片機沒有太多實時測控任務的情況下可以采用。本系統需要采用6位led數碼管來分別顯示時、分、秒,因數碼管個數較多,故本系統選擇動態顯示方式。6、 時鐘顯示校正電路本設計利用按鍵開關來校正時鐘顯示的數字。當按鈕按下時,將在相應的端口輸入一個低電平,通過相應的程序來改變時鐘顯示。其中s1按鍵開關用來選擇要修改的數字;s2按鍵用來增加所選數字的數值;s3按鍵用來減少
14、所選數字的數值。7、蜂鳴器電路電路接法:三極管選定pnp型,基極b連接5v電壓,發射極e連接一個1k左右的電阻后接i/o口,集電極c連接蜂鳴器后接地。單片機在復位后的個i/o口是高電平,此時三極管是截止的,編寫程序使選定的i/o為低電平,此時三極管導通,導通后蜂鳴器與電源正極連通,構成一個工作回路,從而發出滴滴的響聲。其中電阻r1在電路里起分壓限流的作用,pnp三極管起到模擬開關的作用。8、外接電源電路外接電源電路用于連接外部5v電源與電子時鐘電路,通過自鎖開關控制電路的導通與斷開,當開關閉合時,電路導通,外部電源給電路正常供電,電子時鐘正常工作。當開關斷開時,電路停止工作。9、總電路原理圖(
15、五) 軟件部分 根據上述電子時鐘的工作流程,軟件設計可分為以下幾個功能模塊:(1)主程序模塊。主程序主要用于系統初始化:設置計時緩沖區的位置及初值,設置8155的工作方式、定時器的工作方式和計數初值等參數。主程序流程如下圖所示。開始定義堆棧區8155、 t0、數據緩沖區、標志位初始化調用鍵盤掃描程序 否是c/r鍵? 是地址指針指向計時緩沖區 調用時間設置程序 主程序流程圖(2)計時模塊。即定時器0中斷子程序,完成刷新計時緩沖區的功能。系統使用6mhz的晶振,假設定時器0工作在方式1,則定時器的最大定時時間為65.536ms,這個值遠遠小于1s。因此本系統采用定時器與軟件循環相結合的定時方法。設
16、定時器0工作在方式1,每隔50ms溢出中斷一次,則循環中斷20次延時時間是1s,上述過程重復60次為1分,分計時60次為1小時,小時計時24次則時間重新回到00:00:00。因定時器0工作在方式1,則50ms定時對應的定時器初值為:6553650ms/2us=40536=9e58h,即th0=9eh,th0=58h。但應當指出:cpu從響應t0中斷到完成定時器初值重裝這段時間,定時器t0并不停止工作,而是繼續計數。因此,為了確保t0能準確定時50ms,重裝的定時器初值必須加以修正,修正的定時器初值必須考慮到從原定時器初值中扣除計數器多計的脈沖個數。由于定時器計數脈沖的周期恰好和機器周期吻合,因
17、此修正量等于cpu從響應中斷到重裝完tl0為止所用的機器周期數。cpu響應中斷通常要38個機器周期。經過測試,定時器0重裝的計數初值設為9e5fh9e67h,可以滿足精度要求。另外,mcs-51單片機只有二進制加法指令,而時間是按十進制遞增,因此用加法指令后必須進行二-十進制轉換。計時模塊流程圖如下圖所示。保護現場重裝定時器初值循環次數減1否滿20次?是秒單元加1否60s到?是秒單元清0,分單元加1否60分到?是分單元清0,時單元加1否24小時到?是時單元清0恢復現場返回計時模塊流程圖(3)時間設置模塊。該模塊由鍵盤輸入相應的數據來設置當前時間。程序通過調用一個鍵盤設置子程序通過鍵盤掃描將鍵入
18、的6位時間值送入顯示緩沖區。設置時間后,時鐘要從這個時間開始計時,而時分秒單元各占一個字節,鍵盤占6個字節。因此程序中要調用一個合字子程序將顯示緩沖區中的6位bcd碼合并為3位壓縮bcd碼,并送入計時緩沖區,作為當前計時起始時間。該程序同時要檢測輸入時間值的合法性,若鍵盤輸入的小時值大于23,分、秒值大于59,則不合法,將取消本次設置,清零重新開始計時。時間設置和鍵盤設置子程序的流程圖如下圖所示。保護現場調用鍵盤設置子程序ketin調用合字子程序comb恢復現場返回時間設置流程圖保護現場顯示緩沖區首地址送r0鍵盤輸入次數送r7調用鍵盤掃描程序keyscan鍵號送r0顯示緩沖區地址加1循環次數減
19、1否循環結束?是恢復現場返回鍵盤設置子程序流程圖 (4)顯示模塊。該模塊完成時分秒6位led的動態顯示。因為顯示為6位,二計時是3個字節單元,為此,必須將3字節計時緩沖區中的時分秒壓縮bcd碼拆分為6字節bcd碼,并送入顯示緩沖區中。當按下調整時間鍵后,在6位設置完成之前,這6個led應該顯示鍵人的數據,不顯示當前的時間。為此,我們設置了一個計時顯示允許標志位f0,在時間設置期間f0=1,不調用刷新顯示緩沖區的子程序。顯示程序流程圖如下圖所示。保護現場否允許顯示? 調用拆字程序 是動態掃描顯示返回顯示程序流程圖掃描鍵盤否調用顯示程序 有鍵按下?是調用顯示程序否有鍵按下?是求取鍵號返回鍵盤掃描程
20、序流程圖程序:#include <reg52.h>unsigned char code dispcode=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned char dispbitcode=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char dispbuf8=0,0,16,0,0,16,0,0; unsigned char dispbitcnt; unsigned char se
21、cond; unsigned char minite; unsigned char hour; unsigned int tcnt; unsigned char mstcnt; unsigned char i,j; sbit p3_0=p30;sbit p3_1=p31;sbit p3_2=p32;void main(void) p2=0x00;tmod=0x02; th0=0x06; tl0=0x06; tr0=1; et0=1; ea=1; while(1) if(p3_0=0) for(i=5;i!=0;i-) for(j=248;j!=0;j-); if(p3_0=0) second+
22、; if(second=60) econd=0; dispbuf0=second%10 ; dispbuf1=second/10; while(p3_0=0); if(p3_1=0) for(i=5;i!=0;i-) for(j=248;j!=0;j-); if(p3_1=0) minite+; if(minite=60) minite=0; dispbuf3=minite%10 ; dispbuf4=minite/10; while(p3_1=0); if(p3_2=0) for(i=5;i!=0;i-) for(j=248;j!=0;j-); if(p3_2=0) hour+; if(ho
23、ur=24) hour=0; dispbuf6=hour%10 ; dispbuf7=hour/10; while(p3_2=0); void t0(void) interrupt 1 using 0 mstcnt+; if(mstcnt=8) mstcnt=0; p0=dispcodedispbufdispbitcnt; p2=dispbitcodedispbitcnt; dispbitcnt+; if(dispbitcnt=8) dispbitcnt=0; tcnt+; if(tcnt=4000) tcnt=0; second+; if(second=60) second=0; minit
24、e+; if(minite=60) minite=0; hour+; if(hour=24) hour=0; dispbuf0=second%10 ; dispbuf1=second/10; dispbuf3=minite%10 ; dispbuf4=minite/10; dispbuf6=hour%10 ; dispbuf7=hour/10; 3、 設計總結做了兩周的課程設計,有很多的心得體會,有關于單片機的,也有關于模電數電等基礎科目的。因為單片機已經很久沒復習,剛拿到題目,不知道從哪入手,后來通過對書本的回顧,加深了對單片機的記憶。有些知識會遷移和聯系模電數電。課堂教學考慮到大多數同學的需求,主要強調“基本”基本知識、基本理論、基本方法、基本技能。而這次設計正是為我們提供了一個深入學習、探索的機會,成為課堂教學的有益補充。我們正面臨就業問題,這次課設給了我們一個機會去試驗。單片機理論的學習是為課程的設計作
評論
0/150
提交評論