




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目錄1、引言·····················································32、總體設計···············································43、詳細設計············································5···········································5 ··········································104、實驗結果分析············································265、心得體會·················································276、參考文獻·················································27摘
要
單片機自20世紀70年代問世以來,以其極高的性能價格比,受到人們的重視和關注,應用很廣、開展很快。單片機體積小、重量輕、抗干擾能力強、環境要求不高、價格低廉、可靠性高、靈活性好、開發較為容易。由于具有上述優點,在我國,單片機已廣泛地應用在工業自動化控制、自動檢測、智能儀器儀表、家用電器、電力電子、機電一體化設備等各個方面,而51單片機是各單片機中最為典型和最有代表性的一種。這次畢業設計通過對它的學習、應用,以AT89S51芯片為核心,輔以必要的電路,設計了一個簡易的電子時鐘,它由4.5V直流電源供電,通過數碼管能夠準確顯示時間,調整時間,從而到達學習、設計、開發軟、硬件的能力。
關鍵詞:單片機AT89C5120世紀末,電子技術獲得了飛速的開展,在其推動下,現代電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的開展和社會信息化程度的提高,同時也使現代電子產品性能進一步提高,產品更新換代的節奏也越來越快。
時間對人們來說總是則珍貴,工作的忙碌性和繁雜性容易使人忘記當前的時間。忘記了要做的事情,當事情不是很重要的時候,這種遺忘無傷大雅。但是,一旦重要事情,一時的耽誤可能釀成大禍。
目前,單片機正朝著高性能和多品種方向開展趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內裝化等幾個方面開展。下面是單片機的主要開展趨勢。單片機應用的重要意義還在于,它從根本上改變了傳統的控制系統設計思想和設計方法。從前必須由模擬電路或數字電路實現的大局部功能,現在已能用單片機通過軟件方法來實現了。這種軟件代替硬件的控制技術也稱為微控制技術,是傳統控制技術的一次革命。
單片機模塊中最常見的是數字鐘,數字鐘是一種用數字電路技術實現時、分、秒計時的裝置,與機械式時鐘相比具有更高的準確性和直觀性,且無機械裝置,具有更更長的使用壽命,因此得到了廣泛的使用.數字鐘是采用數字電路實現對.時,分,秒.數字顯示的計時裝置,廣泛用于個人家庭,車站,
碼頭辦公室等公共場所,成為人們日常生活中不可少的必需品,由于數字集成電路的開展和石英晶體振蕩器的廣泛應用,使得數字鐘的精度,遠遠超過老式鐘表,
鐘表的數字化給人們生產生活帶來了極大的方便。1、準確計時,以數字形式顯示時、分、秒的時間。2、小時以24小時計時形式,分秒計時為60進位。3、校正時間功能,即能隨意設定走時時間。4、設計5V直流電源,系統時鐘電路、復位電路。本次設計時鐘電路,使用了ATC89C51單片機芯片控制電路,單片機控制電單且省去了很多復雜的線路,使得電路簡明易懂,使用鍵盤鍵上的按鍵來調整時鐘的時、分、秒,采用實時時鐘芯片現在市場上有很多實時時鐘集成電路,如DS1287、DS12887、DS1302等。實時時芯片具備年、月、日、時、分、秒計時功能和多點定時功能,計時數據的更新每秒自動進展一次,不需要程序干預。因此,在工業實時測控系統中多采用這一類專用芯片來實現實時時鐘功能。總設計原理框圖如下列圖所示:微型控制器微型控制器時鐘電路時間可調時鐘芯片數據顯示3.詳細設計3.1.1、STC89C51單片機介紹STC89C51單片機內部主要包括累加器ACC(有時也簡稱為A)、程序狀態字PSW、地址指示器DPTR、只讀存儲器ROM、隨機存取存儲器RAM、存放器、并行I/O接口P0~P3、定時器/計數器、串行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口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1〞時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進展存取時,P2口輸出地址的高八位。在給出地址“1〞時,它利用內部上拉優勢,當對外部八位地址數據存儲器進展讀寫時,P2口輸出其特殊功能存放器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1〞后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流〔ILL〕這是由于上拉的緣故。P3口也可作為AT89C51的一些特殊功能口,如下表所示:口管腳備選功能P3.0RXD〔串行輸入口〕P3.1TXD〔串行輸出口〕P3.2/INT0〔外部中斷0〕P3.3/INT1〔外部中斷1〕P3.4T0〔記時器0外部輸入〕P3.5T1〔記時器1外部輸入〕P3.6/WR〔外部數據存儲器寫選通〕P3.7/RD〔外部數據存儲器讀選通〕P3口同時為閃爍編程和編程校驗接收一些控制信號。RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想制止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE制止,置位無效。PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲〔0000H-FFFFH〕,不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源〔VPP〕。3.1.2、上電按鈕復位電路本設計采用上電按鈕復位電路:首先經過上電復位,當按下按鍵時,RST直接與VCC相連,為高電平形成復位,同時電解電容被電路放電;按鍵松開時,VCC對電容充電,充電電流在電阻上,RST依然為高電平,仍然是復位,充電完成后,電容相當于開路,RST為低電平,單片機芯片正常工作。其中電阻R2決定了電容充電的時間,R2越大則充電時間長,復位信號從VCC回落到0V的時間也長。3.1.3、晶振電路本設計晶振電路采用12M的晶振。晶振的作用是給單片機正常工作提供穩定的時鐘信號。單片機的晶振并不是只能用12M,只要不超過20M就行,在準許的范圍內,晶振越大,單片機運行越快,還有用12M的就是好算時間,因為一個機器周期為1/12時鐘周期,所以這樣用12M的話,一個時鐘周期為12us,則定時器計一次數就是1us了,電容范圍在20-40pF之間,這里連接的是30pF的電容。機器周期=10*晶振周期=12*系統時鐘周期設計用到的STC89C52單片機芯片的ISP下載線是通過單片機的TXD,RXD引腳把程序燒進去的。管腳TXD和RXD用于異步串行通信。其實STC89C52單片機的ISP下載線就是一個max232芯片連接STC和計算機的串行通信口。計算機把程序從九針串口送到max232芯片,電平轉換后送進單片機的串行口,也就是TXD和RXD。然后單片機的串行模塊把數據送到程序區。3.1.5、顯示電路就時鐘而言,通常可采用液晶顯示或數碼管顯示。由于一般的段式液晶屏要專門的驅動電路,而且液晶顯示具有亮度高、價格廉價等優點。本設計利用按鍵開關來校正時鐘顯示的數字。當按鈕按下時,將在相應的端口輸入一個低電平,通過相應的程序來改變時鐘顯示。其中S1按鍵開關用來選擇要修改的數字;S2按鍵用來增加所選數字的數值;S3按鍵用來減少所選數字的數值。主程序主要用于系統初始化:設置計時緩沖區的位置及初值,設置8155的工作方式、定時器的工作方式和計數初值等參數。主程序流程如下列圖所示。開場定義堆棧區T0、數據緩沖區、標志位初始化調用鍵盤掃描程序否是C/R鍵?是地址指針指向計時緩沖區調用時間設置程序主程序流程圖即定時器0中斷子程序,完成刷新計時緩沖區的功能。系統使用6MHz的晶振,假設定時器0工作在方式1,則定時器的最大定時時間為65.536ms,這個值遠遠小于1s。因此本系統采用定時器與軟件循環相結合的定時方法。設定時器0工作在方式1,每隔50ms溢出中斷一次,則循環中斷20次延時時間是1s,上述過程重復60次為1分,分計時60次為1小時,小時計時24次則時間重新回到00:00:00。因定時器0工作在方式1,則50ms定時對應的定時器初值為:65536-50ms/2us=40536=9E58H,即TH0=9EH,TH0=58H。但應當指出:CPU從響應T0中斷到完成定時器初值重裝這段時間,定時器T0并不停頓工作,而是繼續計數。因此,為了確保T0能準確定時50ms,重裝的定時器初值必須加以修正,修正的定時器初值必須考慮到從原定時器初值中扣除計數器多計的脈沖個數。由于定時器計數脈沖的周期恰好和機器周期吻合,因此修正量等于CPU從響應中斷到重裝完TL0為止所用的機器周期數。CPU響應中斷通常要3~8個機器周期。經過測試,定時器0重裝的計數初值設為9E5FH~9E67H,可以滿足精度要求。另外,MCS-51單片機只有二進制加法指令,而時間是按十進制遞增,因此用加法指令后必須進展二-十進制轉換。計時模塊流程圖如下列圖所示。保護現場重裝定時器初值循環次數減1否滿20次?是秒單元加1否60s到?是秒單元清0,分單元加1否60分到?是分單元清0,時單元加1否24小時到?是時單元清0恢復現場返回該模塊由鍵盤輸入相應的數據來設置當前時間。程序通過調用一個鍵盤設置子程序通過鍵盤掃描將鍵入的6位時間值送入顯示緩沖區。設置時間后,時鐘要從這個時間開場計時,而時分秒單元各占一個字節,鍵盤占6個字節。因此程序中要調用一個合字子程序將顯示緩沖區中的6位BCD碼合并為3位壓縮BCD碼,并送入計時緩沖區,作為當前計時起始時間。該程序同時要檢測輸入時間值的合法性,假設鍵盤輸入的小時值大于23,分、秒值大于59,則不合法,將取消本次設置,清零重新開場計時。時間設置和鍵盤設置子程序的流程圖如下列圖所示。保護現場調用鍵盤設置子程序KETIN調用合字子程序COMB恢復現場返回時間設置流程圖保護現場顯示緩沖區首地址送R0鍵盤輸入次數送R7調用鍵盤掃描程序KEYSCAN鍵號送@R0顯示緩沖區地址加1循環次數減1否循環完畢?是恢復現場返回鍵盤設置子程序流程圖3.2.4顯示。連接電源后,調整時間,lcd屏上會顯示出年月日時分秒。顯示程序流程圖如下列圖所示。保護現場否允許顯示?調用拆字程序是動態掃描顯示返回顯示程序流程圖掃描鍵盤否調用顯示程序有鍵按下?是調用顯示程序否有鍵按下?是求取鍵號返回鍵盤掃描程序流程圖3.2.5程序:#include<reg52.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedchar#definePINP0sbitLCDE=P2^7;sbitRW=P2^5;sbitRS=P2^6;sbitk1=P1^0;sbitk2=P1^1;sbitk3=P1^2;sbitsck=P3^6;sbitio=P3^4;sbitRST=P3^5;uintw[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//寫地址uintr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//讀地址charnum1[10]="0123456789";unsignedchartime1[7]={0x50,0x59,0x23,0x04,0x11,0x02,0x14};uintsecond,hour,min,num,a,time[7];uintnian,yue,ri,shi,fen,miao,zhou;voiddelay(uintz) //延時程序 uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);voidwritecom(ucharcom) //LCD寫命令 LCDE=0; RS=0; RW=0; PIN=com; delay(10); LCDE=1; delay(10); LCDE=0;voidwritedata(uchardat) //LCD寫數據 LCDE=0; RS=1; RW=0; PIN=dat; delay(10); LCDE=1; delay(10); LCDE=0; RS=0;voidLCDINIT() //初始化LCD delay(1000); LCDE=0; RW=0; writecom(0x38);設置顯示模式 writecom(0x0c);不顯示光標,光標不閃爍 writecom(0x06);寫一個指針加1 writecom(0x01);清屏 writecom(0x80);設置數據指針起點voidds1302writebyte(uintdat) //ds1302寫單個數據 uinti; sck=0; _nop_(); _nop_(); for(i=0;i<8;i++) io=dat&0x01; dat>>=1; _nop_(); _nop_(); sck=1; _nop_(); _nop_(); sck=0; _nop_(); _nop_(); uintds1302readbyte() //1302讀單個數據 uinti,value; sck=0; _nop_(); _nop_(); for(i=0;i<8;i++) value>>=1; if(io) value=value|0x80; sck=1; _nop_(); _nop_(); sck=0; _nop_(); _nop_(); returnvalue;voidds1302wr(uintadd,uintdat) //多個字節寫入 RST=0; _nop_(); sck=0; _nop_(); RST=1; _nop_(); ds1302writebyte(add); ds1302writebyte(dat); RST=0; _nop_();uintds1302rd(uintadd) //讀取多個數據 uintks; RST=0; _nop_(); sck=0; _nop_(); RST=1; _nop_(); ds1302writebyte(add); ks=ds1302readbyte(); RST=0; _nop_(); io=0; //此條語句必不可少。如果少了這條語句的話,液晶顯示會不完全。 _nop_(); io=1; _nop_(); returnks;voidDs1302Init() unsignedcharn; ds1302wr(0x8E,0X00); //制止寫保護,就是關閉寫保護功能 for(n=3;n<7;n++)//寫入7個字節的時鐘信號:分秒時日月周年 ds1302wr(w[n],time1[n]); ds1302wr(0x8E,0x80); //翻開寫保護功能voidrdtime() //1302讀初始時間 miao=ds1302rd(r[0]); fen=ds1302rd(r[1]); shi=ds1302rd(r[2]); zhou=ds1302rd(r[5]); ri=ds1302rd(r[3]); yue=ds1302rd(r[4]); nian=ds1302rd(r[6]); voiddisplay() //顯示函數 inti,j,a[8]; writecom(0x80); a[0]=(num1[(nian)/16]); // 年 a[1]=(num1[(nian)%16]); a[2]=0X3A; a[3]=num1[yue/16]; //月 a[4]=num1[yue%16]; a[5]=0X3A; a[6]=num1[ri/16]; //日 a[7]=num1[ri%16]; for(i=0;i<8;i++) writedata(a[i]); delay(10); writecom(0x80+0x40+7); a[0]=(num1[(shi)/16]); //小時 a[1]=(num1[(shi)%16]); a[2]=0X3A; a[3]=num1[fen/16]; //分鐘 a[4]=num1[fen%16]; a[5]=0X3A; a[6]=num1[miao/16]; //秒鐘 a[7]=num1[miao%16]; for(j=0;j<8;j++) writedata(a[j]);voidshowtime(uintaddress,uinttime) delay(500); writedata(num1[time%16]); writecom(0x80+0x40+address); writedata(num1[time/16]); writecom(0x80+0x40+1+address); writecom(0x0f);voidkeyscan() //鍵盤掃描函數 if(0==k1) //K1時間停頓 delay(10); if(0==k1) num++; while(num>0&&num<=8) if(0==k1) if(0==k1) { num++; while(!k1) switch(num) case2: uinti; num++; a=1; writecom(0x80+0x40+0x0e); writecom(0x0f); for(i=0;i<7;i++) time1[i]=ds1302rd(r[i]);; break; case4: num++; writecom(0x80+0x40+0x0b); writecom(0x0f); break; case6: num++; writecom(0x80+0x40+0x08); writecom(0x0f); break; case8: num=0; a=0; Ds1302Init(); delay(10); writecom(0x0c); break; if(0==k2) delay(5); if(0==k2) while(!k2) switch(num) //K2,時,分,秒加數 case3: if(9==time1[0]%16) time1[0]+=6; time1[0]++; if(time1[0]==0x60) time1[0]=0; showtime(0xd,time1[0]); break; case5: if(9==time1[1]%16) time1[1]+=6; ++time1[1]; while(0x60==time1[1]) time1[1]=0; showtime(0xa,time1[1]); break; case7: if(9==time1[2]%16) time1[2]+=6; ++time1[2]; while(0x24==time1[2]) time1[2]=0; Ds1302Init(); showtime(7,time1[2]); break; if(0==k3) delay(5); if(0==k3) while(!k3) switch(num) //K3,時,分,秒減數 case3: if(0==time1[0]%16) time1[0]-=6; if((0-6)==time1[0]) time1[0]=0x5a; --time1[0]; showtime(0x0d,time1[0]); break; case5: if(0==time1[1]%16) time1[1]-=6; if((0-6)==time1[1])
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司爬長城團建登山活動方案
- 公司節假日內部活動方案
- 公司標準化體系策劃方案
- 公司策劃端午節活動方案
- 公司組織年終滑雪活動方案
- 公司激勵活動方案
- 公司組織打球活動方案
- 公司節能減排活動方案
- 公司花樣慶祝活動方案
- 公司策劃小活動方案
- 機房施工方案及技術措施
- 員工培訓矩陣表
- 摜蛋大賽招商方案
- 電影特效制作課件
- 304不銹鋼管焊接工藝
- 網絡安全教育安全教育
- 醫療器械經銷商和代理商法規義務
- 糖尿病專科護士培訓學習匯報課件
- 心理健康教育C證面試20個題目參考答案
- 危險化學品庫房貯存規定培訓課件
- Part 3-4 Unit 7 Invention and Innovation教案-【中職專用】高一英語精研課堂(高教版2021·基礎模塊2)
評論
0/150
提交評論