基于8086的電子萬年歷打印稿_第1頁
基于8086的電子萬年歷打印稿_第2頁
基于8086的電子萬年歷打印稿_第3頁
基于8086的電子萬年歷打印稿_第4頁
基于8086的電子萬年歷打印稿_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、軍械工程學院計算機硬件技術基礎課程創新型實驗設計報告題 目: 基于8086的電子萬年歷設計組長:吳明春組員:謝林峰,宋群奇,洪鑫強,加央旦增指導教員: 謝方方 起止時間: 2016年11月25日-2016年12月28日目 錄第一章 實驗簡介21.1 目的意義21.2 功能2第二章 相關硬件知識介紹22.1 可編程并行接口芯片8255A22.2 可編程計數器82533第三章 系統設計43.1 總體設計43.2 硬件電路設計53.3 軟件編程設計63.3.1 匯編程序流程圖63.3.2 程序解析7第四章 系統實現174.1 proteus仿真實驗17第五章 小結195.1 設計總結195.2 設計

2、存在的問題195.3 心得體會19第一章 實驗簡介1.1 目的意義學習和掌握計算機中常用接口電路的應用和設計技術,學會針對不同的要求設計匯編程序代碼,充分認識理論知識對應用技術的指導性作用,進一步加強理論知識與應用相結合的實踐和鍛煉。通過這次設計實踐能夠進一步加深對專業知識和理論知識學習的認識和理解,使自己的設計水平和對所學知識的應用能力以及分析問題解決問題的能力得到全面提高。1.2 功能電子萬年歷是人們生活中不可或缺的一種生活用品,對人們的生活起到了極大的幫助,我們通過它來知道今夕是何年、何月、何日、何時。本課題要設計一個電子萬年歷,以8086芯片組成的最小系統為基礎,來設計一個電子萬年歷。

3、該電子萬年歷實現了以下幾個功能:(1) 自動定時,該功能為電子萬年歷的基本功能,這里不做贅述;(2) 自動計算星期,在程序中引用蔡勒公式實現了自動計算星期。(3) 整點報時,該電子萬年歷實現了整點報時功能,極大地豐富了我們的生活。第2章 相關硬件知識介紹2.1 可編程并行接口芯片8255A 可編程并行接口芯片8255A是一種可編程并行I/O接口芯片,通過對它進行編程,選擇不同的工作方式,可將其應用于基本輸入輸出、鍵盤接口等。本實驗中,我們用了2片8255A芯片,將8255A作為時鐘輸入接口和數碼管的輸出接口。8255A的整體結構圖如圖1所示。圖1 8255A連接圖1.與CPU連接部分8255A

4、能并行傳送8位數據,其數據線為D0D7,對應連接8086CPU的低八位;8086CPU數據線低八位與8255A相連,所以8255A內部各個端口使用偶地址,即8255A的A0、A1分別接8086CPU的A1、A2。此外CPU要對8255A進行讀、寫與片選操作,所以控制線為片選、復位、讀、寫信號。2.與外設接口部分8255A有3個并行接口A、B、C與外設連接,每個并行接口又有8根線與外設連接,所以8255A可以用24根線與外設連接,各并行接口的引腳編號如下:A口:編號為PA0PA7,用于8255A向外設輸出8位并行數據B口:編號為PB0PB7,用于8255A向外設輸出8位并行數據。C口:編號為PC

5、0PC7,用于8255A從外設讀取8位并行數據。2.2 可編程計數器82531.與CPU連接部分8253能并行傳送8位數據,其數據線為D0D7,對應連接8086CPU的低八位;8086CPU數據線低八位與8253相連,所以8253內部各個端口使用偶地址,即8253的A0、A1分別接8086CPU的A1、A2。此外CPU要對8253進行寫入控制字和初值與片選操作,所以控制線為片選、寫信號。2. 與外設連接部分8253的數據線D0D7與CPU的低八位數據線相連,傳送8253的相關控制字,用來設定8253各端口的工作狀態和輸入計數初值。在本項目中,我們使用了8253的A口和B口,其中,A口CLK0與

6、信號源鏈接,工作于方式三,OUT0輸出所需頻率,與8255(U10)芯片的C口相連,實現定時;B口CLK1同樣與信號源相連,工作于方式一,用以產生整點報時的信號。8253的整體結構圖如圖2所示。圖2 8253連接圖第三章 系統設計3.1 總體設計系統總設計圖見圖3。數碼管8255A 8 0 8 6 CPU 時間數據數據8253 CLK(定時)圖3 總體設計圖系統運行后,由8253產生時鐘信號,輸入8255A(U10)的C口,掃描C口的狀態,當掃描到一個時鐘信號的時候,控制秒加一,這樣就實現了定時。3.2 硬件電路設計8086CPU與三片74LS373和兩片74LS245組成最小系統,使8086

7、工作在最小系統模式,三片74LS373的輸出作為8086的地址總線(A0-A19),兩片74LS245的輸出作為8086的數據總線(D0-D15)。以一片74LS138作為片選,74LS138的輸入是A12-A15,輸出為,分別作為兩片8255A和8253的片選信號。第一片8255A(U10)的A口和B口和C口都工作在方式0(基本輸入輸出模式),其中A口和B口輸出,C口輸入(掃描時鐘信號),A口作為年月日輸出數碼管的片選信號,B口輸出年月日到八位數碼管。第二片8255A(U8)的A口和B口和C口都工作在方式0(基本輸入輸出模式),其中A口不用,B口和C口輸入,C口用來作為時分秒和星期輸出數碼管

8、的片選信號,B口用來輸出時分秒和星期到數碼管。8253的0口輸出時鐘信號連接到第一片8255A(U10)的C口,工作在方式3,用以定時。1口用以產生鬧鐘信號,工作在方式0,驅動蜂鳴器發聲。八位數碼管用以顯示年月日,片選信號接入8255A(U10)的A口,顯示信號接入8255A(U10)的B口。三個兩位數碼管和一個單位數碼管用來顯示時分秒和星期,片選信號都接入8255A(U8)的C口,顯示信號接入8255A(U8)的B口。硬件電路連接圖:3.3 軟件編程設計開始3.3.1 匯編程序流程圖初始化兩片8255和8253 寫入數據產生片選信號和時間信號送入數碼管顯示判斷閏年、月大、月小,時間處理圖3

9、匯編程序流3.3.2 程序解析/第一片8255#define IOCON 8006H#define IOA 8000H#define IOB 8002H#define IOC 8004H/第二片8255#define IOCON1 9006H#define IOA1 9000H#define IOB1 9002H#define IOC1 9004H/8253#define A_0 0xA000#define A_1 0xA002#define A_2 0xA004#define A_CON 0xA006int table10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82

10、,0xf8,0x80,0x90; /共陽極編碼0.9int xqing=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8;/星期1.7int shuma8=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;/變量聲明int n1;/年份的千位int n2;/年份的百位int n3;/年份的十位int n4;/年份的個位int nianx;int y1;/月份的十位int y2;/月份的個位int yuex;int t1;/天的十位int t2;/天的個位int tianx;int s1;/小時的十位int s2;/小時的個位int f1;/分鐘

11、的十位int f2;/分鐘的個位int fenx;int m1;/秒的十位int m2;/秒的個位int miaox;int xq;/星期int btn;/io接口int count=0;void outp(unsigned int addr, char data)/ Output byte to port _asm mov dx, addr mov al, data out dx, al char inp(unsigned int addr)/ Input byte from port char result; _asm mov dx, addr in ax, dx mov result,

12、ax return result; void delay() /延遲函數 int t=0; for(t=0;t9) y2=x%10; x=x-y2; y1=x/10; else y2=x;y1=0; void tian(int x)/對日進行處理 t2=x%10; x=x-t2; t1=x/10; void shi(int x)/對時進行處理 s2=x%10; x=x-s2; s1=x/10; void fen(int x)/對分進行處理 f2=x%10;x=x-f2;f1=x/10; void miao(int x)/對秒進行處理 m2=x%10; x=x-m2; m1=x/10; void

13、 xingqi(void)/對星期處理 if(y2=1&y1=0) y1=1; y2=3; else if(y2=2&y1=0) y1=1; y2=4; xq=(10*n1+n2)/4-2*(10*n1+n2)+(10*n3+n4)+(10*n3+n4)/4+13*(10*y1+y2+1)/5+10*t1+t2+1)%7; void xienian()/寫年到數碼管 int i=0; outp(IOA,shumai); outp(IOB,tablen1); i+; delay(); outp(IOA,shumai); outp(IOB,tablen2); i+; delay(); outp(I

14、OA,shumai); outp(IOB,tablen3); i+; delay(); outp(IOA,shumai); outp(IOB,tablen4); delay(); void xieyue()/寫月到數碼管 int i=4; outp(IOA,shumai); outp(IOB,tabley1); i+; delay(); outp(IOA,shumai); outp(IOB,tabley2); i+; delay(); void xietian()/寫天到數碼管 int i=6; outp(IOA,shumai); outp(IOB,tablet1); i+; delay();

15、 outp(IOA,shumai); outp(IOB,tablet2); i+; delay(); void xieshi()/寫小時到數碼管 int i=0; outp(IOC1,shumai); outp(IOB1,tables1); delay(); i+; outp(IOC1,shumai); outp(IOB1,tables2); delay(); void xiefen()/寫分鐘到數碼管 int i=3; outp(IOC1,shumai); i+; outp(IOB1,tablef1); delay(); outp(IOC1,shumai); outp(IOB1,tablef

16、2); delay(); void xiemiao()/寫秒到數碼管 int i=6; int x=0; outp(IOC1,shumai); i+; outp(IOB1,tablem1); delay(); outp(IOC1,shumai); outp(IOB1,tablem2); delay(); void xiexingqi()/寫星期到數碼管 int i=2; outp(IOC1,shumai); outp(IOB1,xqing(xq+4)%7); delay(); void runnian()/判斷閏年 nianx=1000*n1+100*n2+10*n3+n4; tianx=10

17、*t1+t2; yuex=10*y1+y2; if(nianx%4=0)&(nianx%100!=0)|(nianx%400=0) if(yuex=2&tianx29) t1=0; t2=1; y2+; else if(yuex=2&tianx28) t1=0; t2=1; y2+; void yueda()/月大(31天) yuex=10*y1+y2; tianx=10*t1+t2; if(yuex=1|yuex=3|yuex=5|yuex=7|yuex=8|yuex=10|yuex=12) if(tianx31) t1=0; t2=1; y2+; if(yuex11) y1=0; y2=1

18、; n4+; if(n49) n4=0; n3+; if(n39) n3=0; n2+; if(n29) n2=0; n1+; void yuexiao()/月小(30天) yuex=10*y1+y2; tianx=10*t1+t2; if(yuex=4|yuex=6|yuex=9|yuex=11) if(tianx30) t1=0; t2=1; y2+; if(y29) y2=0; y1+; void zhengdian()/整點報時 fenx=10*f1+f2; miaox=10*m1+m2; if(fenx=0&miaox=0) outp(A_CON,0x51); outp(A_1,0x

19、04); void shijianchuli() /時間處理 yuex=10*y1+y2; tianx=10*t1+t2; count+; if(count=40) count=0; m2+; if(m29) m2=0; m1+; if(m15) m1=0; f2+; if(f29) f2=0; f1+; if(f15) f1=0; s2+; if(s29) s2=0; s1+; else if(s1=2&s2=4) s1=0; s2=0; f1=0; f2=0; m1=0; m2=0; t2+; xq+; runnian(); yuexiao(); yueda(); zhengdian();

20、 if(t29) t2=0; t1+; void main() outp(IOCON,0x89); outp(IOCON1,0x80); outp(A_CON,0x17); outp(A_0,0x02); btn=inp(IOC); nian(2017); yue(11); tian(30); xingqi(); shi(23); fen(59); miao(59); yue(11); while(1) xiexingqi(); xienian(); xieyue(); xietian(); xieshi(); xiefen(); xiemiao(); xiexingqi(); shijian

21、chuli(); 第四章 系統實現4.1 proteus仿真實驗圖4 Proteus仿真圖2.硬件部分遇到的困難及解決方法(1)在初次連接好后我們進行了調試,但不能正常工作,經檢查有連線錯誤,改正后可以顯示。(對于數碼管的動態顯示理解不夠深刻,傳輸數據的數據的時候有時候顯示不完全) (2)可以運行工作后,顯示亂碼,原因是只用了一片8255,用B口輸出年月日時分秒和星期,導致數據混亂,所以,之后改為了兩片8255。 第五章 小結5.1 設計總結通過對基于8086的電子萬年歷的設計,從電路到程序設計,再到對程序的調試,在整個的設計過程中學到了很多。用到了8255A的并行接口,將二進制的控制信息傳入8086CPU中處理。在使用8255A接口的時候,都要對其進行初始化,這初始化程序的編寫,有助于對這些接口芯片的工作原理的理解。總之,在實驗中自己動手,把理論知識用于實踐,從中能夠學到很多。5.2 設計存在的問題初次進行這個課題的設計,由

溫馨提示

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

評論

0/150

提交評論