《單片微機原理與接口技術》課程設計報告 《可調數字時鐘設計》 目錄
一、選題意義 3
二、實現方案選擇 3
三、設計原理 4
四,時鐘的實現 6
A.電路設計 6
B 程序設計 11
五、程序調試及仿真 12
六、設計中遇到的問題 14
七、設計中可以改進的地方 14
八、心得體會 14
參考文獻 15
附錄 16
一、選題意義 從古至今,人類以各式各樣的方法來記錄時間,上至水滴計時、日冕觀測,下至擺鐘,機械表。人類無時無刻都在關注著時間,以調節自身日常生活的安排與進展。 1957年,Ventura發明了世界上第一個電子表,從而奠定了電子時鐘的基礎,電子時鐘開始迅速發展起來。現代的電子時鐘是基于單片機的一種計時工具,采用延時程序產生一定的時間中斷,用于一秒的定義,通過計數方式進行滿六十秒分鐘進一,滿六十分小時進一,滿二十四小時小時清零。從而達到計時的功能,是人民日常生活補課缺少的工具。現在高精度的計時工具大多數都使用了石英晶體振蕩器,由于電子鐘、石英鐘、石英表都采用了石英技術,因此走時精度高,穩定性好,使用方便,不需要經常調試,數字式電子鐘用集成電路計時時,譯碼代替機械式傳動,用LED顯示器代替指針顯示進而顯示時間,減小了計時誤差,這種表具有時、分、秒顯示時間的功能,還可以進行時和分的校對,片選的靈活性好。 二、實現方案選擇 本文基于51單片機設計的可調數字時鐘,具有傳統意義上的鐘表的特點,可以顯示當前時間,并且還是以時-分-秒的形式來顯示當前時間。再者通過相應按鍵來實現分別對時、分、秒的調節。運用單片微機原理與接口技術和C語言程序設計以及數字電子技術,通過兩塊四位七段數碼管和鍵盤來顯示并調節時間。需要使用的電路分別是以下模塊:單片機最小系統、2塊四位七段數碼管以及鍵盤電路三部分組成。使用單 片機作為控制核心可以簡化硬件電路采用軟件編程控制單片機實現硬件電路的功能降低能耗降低成本。軟件采用C語言編程方便靈活大大加快了軟件開發速度縮短了開發周期并且便于移植。為提高開發效率和硬件穩定性采用了功能強大的硬件 仿真軟件Proteus依托該軟件提供的仿真環境搭配Keil作為軟件開發調試環境進行仿 真調試成功。 三、設計原理 AT895S52單片機的內部16位定時器/計數器是一個可編程定時/計數器,它既可以工作在13位定時方式,也可以工作在16位定時方式或8位定時方式,只要通過設置特殊功能寄存器TMOD即可完成。定時/計數器核實工作也可以通過TCON特殊功能寄存器來設置的。在此設計中,選擇16位定時工作方式。對于T0來說,系統時鐘位12MHz,最大定時也只有65536us,無法達到所需的1s的定時,因此必須通過軟件來處理這個問題,假設取T0的最大定時為50ms,即要定時1s需要經過20次的50ms的定時。T0定時器/計數器的TH0、TL0的初值設定可以通過以下公式計算: TH0=(2^16-50000)/256 TL0=(2^16-50000)%256 為了將時間在LED數碼管上顯示,可采用靜態顯示法和動態顯示法,由于靜態顯示法需要譯碼器,數據鎖存器等較多硬件,可采用動態顯示法實現LED顯示,通過對每位數碼管的依次掃描,使對應數碼管亮,同時向該數碼管送對應的字碼,使其顯示數字。由于數碼管掃描周期很短,由于人眼的視覺暫留效應,使數碼管看起來總是亮的,從而實現了各種顯示。 針對要實現的功能,采用AT89S52單片機進行設計,AT89S52 單片機是一款低功耗,高性能CMOS8位單片機,片內含4KB在線可編程(ISP)的可反復擦寫1000次的Flash只讀程序存儲器,器件采用高密度、非易失性存儲技術制造,兼容標準MCS- 51指令系統及80C51引腳結構。這樣,既能做到經濟合理又能實現預期的功能。 在程序方面,采用分塊設計的方法,這樣既減小了編程難度、使程序易于理解,又能便于添加各項功能。程序可分為鬧鐘的聲音程序、時間顯示程序、日期顯示程序,秒表顯示程序,時間調整程序、鬧鐘調整程序、定時調整程序,延時程序等。運用這種方法,關鍵在于各模塊的兼容和配合,若各模塊不匹配會出現意想不到的錯誤。 首先,在編程之前必須了解硬件結構尤其是各引腳的用法,以及內部寄存器、存儲單元的用法,否則,編程無從下手,電路也無法設計。這是前期準備工作。第二部分是硬件部分:依據想要的功能分塊設計設計,比如輸入需要開關電路,輸出需要顯示驅動電路和數碼管電路等。第三部分是軟件部分:先學習理解匯編語言的編程方法再根據設計的硬件電路進行分塊的編程調試,最終完成程序設計。第四部分是軟件畫圖部分:設計好電路后進行畫圖,包括電路圖和仿真圖的繪制。第五部分是軟件仿真部分:軟硬件設計好后將軟件載入芯片中進行仿真,仿真無法完成時檢查軟件程序和硬件電路并進行修改直到仿真成功。第六部分是硬件實現部分:連接電路并導入程序檢查電路,若與設計的完全一樣一般能實現想要的功能。最后進行功能擴展,在已經正確的設計基礎上,添加額外的功能. 四,時鐘的實現 A.電路設計 1. 整體設計 此次設計主要是應用單片機來設計電子時鐘,硬件部分主要分以下電路模塊:顯示電路用2個四位共陰數碼管分別顯示時、分、秒,通過動態掃描進行顯示,從而避免了譯碼器的使用,同時節約了I/0端口,使電路更加簡單。單片機采用AT89S52系列,這種單片機應用簡單,適合電子鐘設計。 電路的總體設計框架如下:  2. 分塊設計 模塊電路主要分為:單片機最小系統、2塊四位七段數碼管以及鍵盤電路三部分組成 2.1 單片機最小系統部分 對51系列單片機來說,最小系統一般應該包括:單片機、晶振電路、復位電路.分四個部分:
1.晶振,至于大小由所用單片機時鐘周期要求而決定(用于計時,與兩個電容并聯使用,電容大小由所用晶振決定,一般用22pF)
2.復位電路(用于復位)
3.電源(用于供電,一般用電腦的USB口供電)
4.燒制程序的口(可用串口配合MAX232配合使用,也可以做個并口輸入,這個要根據所使用單片機的種類決定,比如ATC可用并口,STC一般只用串口輸入等等) 以下為輸入部分樣例: 
其中晶振與復位電路 本實驗單片機時鐘用內部時鐘,模塊如下: 
復位電路為手動復位構成,模塊如下: 
2.2 四位七段數碼管 本電路的輸出信號為7段數碼管的位選和段選信號(其中位選信號由P2口輸出,段選信號由P0口輸出),時間提醒指示燈(LED燈,由P3.2口輸出) 本實驗的數碼管是共陰的,為了防止段選信號不能驅動數碼管,故在P0口連接上拉電阻后,再送段選信號,以提高驅動,位選信號直接從P2口接入,如下圖: 
時間提醒燈由P3.2端輸出,模塊如下: 
2.3 鍵盤電路 鍵盤電路采用4個四腳輕觸開關來搭建鍵盤電路,分別用來對時、分、秒、復位時間的控制與調節,以下是有關于四腳輕觸開關的一些參數以及鍵盤電路的原理圖 四腳輕觸開關參數: 
鍵盤電路的原理圖 
分別由P1.0,P1.1,P1.2,P1.3讀取四個四腳開關的值,并由單片機做出相應的響應 由于四腳輕觸開關按動時抖動現象,由此可以通過編寫延時程序來實現“消抖”。延時程序可參考如下程序段: 
各模塊拼接組合,電路總體設計圖如下: 
B 程序設計 B.1 程序總體設計 本實驗用匯編程序完成. 程序總的流程圖如下: 
B.2 程序主要模塊 B.2.1 延時模塊 數碼管顯示動態掃描時,用到延時程序,這里使用延遲1ms的程序,此程序需反復調,除數碼管動態掃描外. B.2.2中斷服務程序 本實驗中,T0中斷為時鐘定時所用,T1中斷用于音樂播放。T0的定時長度為0.01s,工作于方式0,計數1次,時長1us,故計數器計數10000次,進入中斷,計數初值為65536-10000=55536=#0D8F0,裝滿定時器需要0.01s的時間,從而100次中斷為一秒,一秒之后,判斷是否到60秒,若不到則秒加一,然后返回,若到,則秒賦值為0,分加一,依次類推。 B.2.3 顯示子程序 8個數碼管輪流進行顯示,分別顯示50ms,依賴人的視覺 暫留效應,給人以數碼管持續高亮的錯覺。 B.2.4掃描鍵盤程序 通過讀取P1口的P1.0,P1.2,P1.3的0或1值來判斷哪個按鍵被按下,同時添加“消抖”程序來防止單片機誤判。 B.2.5主程序 主程序只要是對定時/計數器裝載初值,初始化定時/計數器以及啟動定時/計數器,同時調用以上子程序來完成要求和設計時間提醒燈程序來實現LED的亮滅。 五、程序調試及仿真 1、程序軟件編譯器使用uVision4。這里使用Proteus7進行電路仿真。該軟件具有模擬電路仿真、數字電路仿真、單片機及其外圍電路組成的系統仿真、RS232動態仿真、I2C調試器、SPI調試器、鍵盤和LED點陣系統仿真的功能,同時有各種虛擬儀器,如示波器、邏輯分析儀、信號發生器等。 2、先在Proteus上繪制硬件電路,電路設計完成后就可以進行仿真。先雙擊單片機,把用keiluVision4編譯生成的HEX文件指定為下載文件,點擊PLAY鍵即可進行仿真。當出現ANALYSER ERRORS時,表示電路有錯誤,列表中說明了具體的錯誤,必須要先排錯才可以進行仿真。 軟件調試及Proteus仿真完成后就進行硬件的安裝。本設計按照原先設計好的電路圖進行總體上的布置,采用人工搭電路的方法進行硬件的安裝。 
3、安裝時要考慮受熱、穩固等多方面的影響使用電烙鐵時要控制好焊接的時間,電烙鐵停留的時間太短,焊錫不易完全熔化,形成“虛焊”,而焊接時間太長又容易損壞元器件,每一兩秒內要焊好一個焊點,若沒完成,寧愿等一會兒再焊一次。其次芯片的擺置要方便連線,焊接時要先把芯片拔出,等線接好了再插上去。在焊接時要考慮電路的抗干擾能力同時要充分考慮電源對單片機的影響。每焊接完一個模塊,要用萬能表根據電路圖檢查有沒有接錯、短路等現象,確認正確后再繼續下一個模塊。為了防止在焊接過程中由于過熱對AT89S52單片機芯片以及其他芯片造成損壞,建議先將相應的芯片底座焊接在電路板上,然后在焊接完畢后在插進芯片。在焊接的過程中,在安全可靠可正常工作的情況下,力保電路板接線簡潔。防止被電烙鐵燙傷。 六、設計中遇到的問題 1、 第一次上電時,數碼管沒顯示,用萬用表測得單片機VCC接口無電壓。 解決方法:將萬用表打到直流電壓檔來測量USB電源口發現將USB口的正負極性弄反了。最后重新接線。 2、單片機正常工作時,時間提醒燈沒有按照設定的時間區間來亮滅。 解決方法:由于采用C語言來編寫程序時,使用了if()指令來控制LED亮滅,并且在使用多條件時不注意if()格式,導致了實際運行結果不符合期望結果。所以改寫程序后,運行正常,符合要求。 七、設計中可以改進的地方 1、可以增設年份、月份以及星期的顯示 2、可以增設調節電路來實現可以任意時間提醒 八、心得體會 本文先從整體論述了設計電子鐘的大致思路,然后再采用劃分模塊的方法,將硬件電路劃分為開關電路,顯示驅動電路,以及數碼管電路等,而軟件部分,則依據要實現的功能,劃分為:秒表顯示程序,時間調整程序。最后將各模塊集成為一個整體,合成一個多功能的電子鐘。在程序編寫的過程中,通過查閱不少的書籍以及參考一下網上一些可用的程序,我更加加深了對單片機定時/計數器的工作原理以及使用方法。同時,通過對實際的單片機最小系統的搭建與焊接,我更加掌握了單片機最小系統的硬件要求和焊接技術。 再者,通過可調數字時鐘設計我使用學會了如何使用單片機做出自己想要做的產品同時也提高了我使用單片機方面的能力和經驗。同時使我能夠更加熟練的使用proteus 電路仿真軟件和keill程序編寫軟件。 參考文獻 【1】宋躍,《單片微機原理與接口技術》,電子工業出版社 【2】周潤景,劉曉霞,《單片機實用系統設計與仿真經典實例》,電子工業出版社 附錄 附錄1:整體電路仿真圖 
附錄2:電路實物圖 

單片機源程序如下: - #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit s_set=P1^0;
- sbit m_set=P1^1;
- sbit h_set=P1^2;
- sbit reset=P1^3;
- sbit led=P3^2;
- unsigned char second,minute,hour,tcnt,restar=0;
- uchar code scan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar code table[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39,0x00};
- uchar dispbuf[8];
-
- void delay(unsigned int us)
- {
- while(us--);
- }
- void scandisp()
- {
- unsigned char i,value;
- for(i=0;i<8;i++)
- {
- P2=0xff;
- value=table[dispbuf[i]];
- P0=value;
- P2=scan[i];
- delay(50);
- }
- }
-
- void Timer0(void)interrupt 1 using 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- tcnt++;
- if(tcnt==20)
- {
- second++;
- tcnt=0;
- if(second==60)
- {
- minute++;
- second=0;
- if(minute==60)
- {
- hour++;
- minute=0;
- if(hour==24)
- {
- hour=0;
- minute=0;
- second=0;
- tcnt=0;
- }
- }
- }
- }
- }
-
- void display()
- {
- scandisp();
- dispbuf[6]=second/10;
- dispbuf[7]=second%10;
- dispbuf[5]=10;
- dispbuf[3]=minute/10;
- dispbuf[4]=minute%10;
- dispbuf[2]=10;
- dispbuf[0]=hour/10;
- dispbuf[1]=hour%10;
- }
-
- void key_test()
- {
- display();
- P1=0xff;
- restar=0;
- if(s_set==0)
- {
- delay(100);
- if(s_set==0)
- {
- second++;
- if(second==60)
- {
- second=0;
- }
- while(s_set==0) display();
- }
- }
- if(m_set==0)
- {
- delay(100);
- if(m_set==0)
- {
- minute++;
- if(minute==60)
- {
- minute=0;
- }
- while(m_set==0) display();
- }
- }
- if(h_set==0)
- {
- delay(100);
- if(h_set==0)
- {
- hour++;
- if(hour==24)
- {
- hour=0;
- }
- while(h_set==0) display();
- }
- }
- if(reset==0)
- {
- delay(100);
- if(reset==0)
- {
- restar=1;
- }
- }
- }
-
- void main()
- {
- while(1)
- {
- P3=0x00;
- hour=0;
- minute=0;
- second=0;
- tcnt=0;
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
單片機課程設計報告.docx
(1.37 MB, 下載次數: 253)
2018-6-28 16:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|