




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上簡易計算器Simply Calculator1 設計思想此計算器有鍵盤部分、單片機、顯示部分三部分組成,鍵盤部分主要完成輸入功能;單片機主要完成數據處理功能,包括確定按鍵,完成運算,以及輸出數據;顯示器部分主要完成單片機輸出的顯示。本設計的思路是利用單片機性能好,穩定性強的優點來實現系統的運行。設計大致可以分為三個步驟:第一步,硬件的選取和設計;第二步,程序的設計和調試;第三步,Protues系統仿真。硬件是設計的骨骼,不僅關系到設計總體方向的確定,還要綜合考慮節能,環保,以及穩定性和經濟性等各種因素。因此需要花費大量的時間。硬件的選取最為重要,包括選用的芯片,顯示設
2、備的選取,輸入設備的選取等。本設計是通過單片機來實現的,因此選用了ATMEGA16單片機作為主體,輸入設備選用矩陣鍵盤。程序是硬件的靈魂,是實現設計的中心環節。本設計使用的程序語言是C語言,在“ICC AVR”中運行,調試,直到運行出正確結果,然后輸出后綴名為.HEX格式的文件,以備在Protues中仿真使用。程序是設計的關鍵,程序的調試需要大量的時間,耐心,還夠要有足的細心才能成功。本設計中就出現了大量的錯誤,經過認真修改,最終才能運行出正確結果。最后的系統仿真是設計是否成功的驗證,是設計不可缺少的重要環節。這就要求能掌握Protues的一些基本操作。2原理分析2.1矩陣鍵盤的掃描圖2.1
3、矩陣鍵盤圖如圖2.1所示,單片機的8個I/O口和矩陣鍵盤相連,用8個I/O口來控制矩陣鍵盤的16個按鍵是非常有意思的,首先我們設置單片機的PD0PD7為輸出,且PD0PD3依次設置為低電平,而PD4PD7設置為高電平,然后我們設置PD4PD7為輸入,而PD0PD3仍然為輸出,假如此時M1鍵按下,則PD0與PD4相連,因為PD0是低電平,而PD4是輸入,所以PD4會被拉為低電平,同理,如果M2被按下,則PD5會被拉低,M3按下,PD6會被拉低,M4按下,PD7被拉低。這是判斷有無鍵盤按下的過程,當我們判斷是那一個鍵盤按下時,我們首先設置8個I/O口為輸出,輸出為FE,即,PD0為低電平,其他全為
4、高電平,然后我們設置PD4PD7為輸入,如果M1被按下,則PD4會比被拉為低電平,此時會變成EE,同理可以知道M2被按下時會變為DE,M3被按下時會變為BE,M4被按下時會變為7E。同理我們可以設置8個I/O口輸出FD來檢測M5M8是否被按下,設置8個I/O口輸出FC來來檢測M9M12,設置8個I/O口輸出F7來檢測M13M16,如果M1M4沒有被按下,就繼續檢測M4M8,一次類推,就可以檢測出16個按鍵了。在這次設計中,16個按鍵M1M16所對應檢測值分別為:EE,DE,BE,7E,ED,DD,BD,7D,EB,DB,BB,7B,E7,D7,B7,77。2.2 數字顯示與計算本次設計選用的顯
5、示器是1602液晶顯示器,此液晶顯示器能顯示32個字符,VSS接地,VDD接電源正極,E為時使能信號,R/W為讀寫選擇端(H/L),RS為數據/命令選擇端(H/L),D0D7為數據I/O口。首先我們初始化液晶顯示器,然后顯示出第一個被按下的數,并且使光標右移,如果有第二個數按下,則據繼續顯示,以此類推,然后把所有顯示出來的數換算成一個數,如果按下“+”號,則顯示出“+”,并且同理顯示出“+”號后面按下的數字,然后調用加子程序,運算出結果,如果按下的是“-”,則調用減子程序,如果按下“*”,則調用乘子程序,如果按下“/”,則調用除子程序。然后再調用顯示結果子程序,顯示出結果。3程序設計與說明3.
6、1流程圖主程序流程圖和運算子程序流程圖為:圖3.1 主程序流程圖 圖3.2 運算子程序流程圖鍵盤掃描流程圖為:圖3.3 鍵盤掃描子程序流程圖3.2程序說明本次設計采用模塊化設計思想,包括主程序和初始化子程序、延時子程序、輸出數據子程序、檢測是否有按鍵按下子程序、確定按鍵子程序、清第二行屏與顯示“Welcome”子程序、換算第一個數子程序、運算子程序、顯示結果子程序等子程序。運行程序后,首先調用子程序清屏第二行并顯示“Welcome”,然后檢測是否有按鍵按下,如果沒有,繼續檢測,如果按下,則判斷是否是加減乘除鍵被按下,如果是加減乘除被按下,則顯示相應的字符并換算出字符前輸入的數據和字符后輸入的數
7、字,然后檢測是否有等號按下,如果有則完成相應的運算并顯示相應的結果,然后檢測是否有清屏鍵按下,如果有則清屏,相應的流程圖如圖2所示。其中運算子程序的流程圖如圖3所示。4調試4.1 Protues系統仿真打開Protues,按設計思想放相應的零部件并連好線,把HEX文件加載到單片機中運行,檢測結果是否正確。硬件連線圖如圖4.1所示。圖4.1 Protues仿真圖4.2 調式過程編寫完程序后保存程序,在“ICC AVR”中運行,調試,直到運行出正確結果,然后輸出后綴名為.HEX格式的文件。剛開始有錯誤,是一些語法規則上的錯誤,不過經過幾次的修改,最終輸出了后綴名為.HEX格式的文件。 把后綴名為.
8、HEX格式的文件加載到單片機后,剛開始只是顯示出“Welcome”的一部分字符,仔細觀察發現,程序的前后空格不對稱,經過修改,最終得到了預期結果,最終運行結果如圖4.1所示。5總結5.1優缺點分析本計算器能完成加減乘除運算,結構簡單,硬件較少,成本較低,另外本程序采用模塊化設計思想,可讀性強,具有很強的可移植性,便于調用。在處理多任務時,可以用中斷服務來實現多線程,通過設置中斷,啟動中斷服務子程序使其自己執行任務,而CPU可以做自己的工作,當有停止中斷的請求產生時,CPU再停下自己的工作做相應處理。但是也有很多不足之處。首先,程序有很多相同的代碼,本來可以用調用的方法實現,減少代碼長度,但是考
9、慮到本程序不是很長,而且用調用的方法必然會增加算法的復雜度和邏輯思維強度,所以在這里沒有采用!其次,為了節省空間,程序設計的注釋部分不夠詳細,使讀程序不是很方便。再次,本計算器不能完成小數運算,也不能完成科學計算器的一些功能,而要完成這些功能,需要設置更多的鍵盤,加更多的程序,比較復雜,因為我時間有限,在此不再處理。5.2 心得體會通過課程設計 ,我掌握了計算器的工作原理以及設計方法,我通過對計算器的幾個模塊的深入理解,我掌握了計算器的組成和制作過程,并通過自己的努力,制作出了自己的計算器,提高了我的動手能力和實踐能力,同時我對單片機有了更深入的理解,也學會了使用單片機的方法,加深了對課本知識
10、的進一步理解。加強了我思考和解決問題的能力,認識來源于實踐,實踐是認識的動力和最終目的,實踐是檢驗真理的唯一標準!在設計過程中,經常會遇到一些問題,就是心里想老著這樣的接法可以行得通,但實際接上電路,總是實現不了。所以這幾天不管是吃飯還是睡覺,腦子里總是想著如何解決這些問題,功夫不負有心人,我通過認真思考,請教同學,查找資料,最后終于熟練掌握了基本理論知識,而且領悟諸多平時學習難以理解掌握的較難知識,學會了如何思考的思維方式,找到了設計的靈感。在尋找答案的過程中,我學到了很多平時缺少的東西,對于理論知識學習不夠扎實的我深感“書到用時方恨少”!認真思考才能找到出路,當初沒有思路,誠如舉步維艱,茫
11、茫大地,不見道路。在對理論知識梳理掌握之后,茅塞頓開,柳暗花明,思路如泉涌,高歌“條條大路通羅馬”。頓悟,沒有思考便無出路,雨后才能見彩虹。 失敗是成功之母。不經歷多次調試,是不可能得到完好的程序的。至善至美,是人類永恒的追求。但是,不從忘卻“金無足赤,人無完人”,我們換種思維方式,去惡亦是至善,改錯亦為至美。在課程設計過程中,我們不斷發現錯誤,不斷改正,不斷領悟,不斷獲取。最終的調試環節,本身就是在踐行“過而能改,善莫大焉”的知行觀。實踐課誠然是一門專業課,給我很多專業知識以及專業技能上的提升,同時又是一門講道課,一門思辨課,給了我許多道,給了我很多思,給了我莫大的空間。至于建議,一言以蔽之
12、,大學教育當如此。我是一個急性子的人,看到那么復雜知識,我就不想做了,不過為了搞好課程設計,我硬是耐心完成每一個細節,我堅持一天呆在實驗室10多個小時,雖然晚上眼睛比較酸痛,但是我感覺值。這么多天的努力沒有白費,我最后很好的完成了任務,很有成就感!我相信我在以后的生活和學習中會更耐心,更認真的!參考文獻:1陳冬云 等.ATmega 128單片機原理與開發指導.機械工業出版社,20062李群芳 等.單片微型計算機及接口技術(第二版).電子工業出版社,20053周航慈.單片機程序設計基礎.北航出版社,20054何立民.MCS-51單片機應用系統設計.北航出版社,20025馬潮.高檔8位單片機ATm
13、ega128原理與開發應用指南.北京航空航天大學出版社,2004附錄 程序#include <iom16v.h>#include <macros.h>#include <math.h>const unsigned char tab1=" Welcome "const unsigned char tab3="+-*/= " unsigned char key10; unsigned int temp1=0,temp2=0; unsigned char count1 = 0; unsigned char wei;void
14、delay(unsigned int ms) unsigned int i,j; for(i=0;i<ms;i+) for(j=0;j<1141;j+);void int_port() DDRA=0XFF; DDRB=DDRB|0X07; PORTB&=BIT(PB0); DDRD=0XFF; PORTD=0XFF; DDRD=0XF0; PORTD=PORTD&0X0F;void com_lcd(unsigned char com) PORTB&=BIT(PB2); PORTB&=BIT(PB1); PORTA=com; PORTB|=BIT(PB
15、0); delay(1); PORTB&=BIT(PB0);void data_lcd(unsigned char data) PORTB|=BIT(PB2); PORTB&=BIT(PB1); PORTA=data; PORTB|=BIT(PB0); delay(1); PORTB&=BIT(PB0);unsigned char key_press() unsigned char i; DDRD=0XFF; PORTD=0XF0; DDRD=0X0F; i=PIND; if(i=0XF0) DDRD=0XFF;/沒鍵按下 return 0; else DDRD=0XF
16、F;/有鍵按下 return 1; unsigned char key_scan()/鍵檢測 unsigned char key1,i=0X7F,j; delay(10); if(key_press() do i=(i<<1|i>>7); PORTD=i; DDRD=0X0F; key1=PIND; j=key1&0XF0; while(j=0XF0);while(key_press();switch(key1) case 0xEE: key1=0x0;break; case 0xDE: key1=0x1;break; case 0xBE: key1=0x2;b
17、reak; case 0x7E: key1=0x3;break; case 0xED: key1=0x4;break; case 0xDD: key1=0x5;break; case 0xBD: key1=0x6;break; case 0x7D: key1=0x7;break; case 0xEB: key1=0x8;break; case 0xDB: key1=0x9;break; case 0xBB: key1=0xA;break; case 0x7B: key1=0xB;break; case 0xE7: key1=0xC;break; case 0xD7: key1=0xD;brea
18、k; case 0xB7: key1=0xE;break; case 0x77: key1=0xF;break; default: key1=16; else key1=16; return key1;void clear_lcd()unsigned char i; com_lcd(0x01);/清屏 delay(1); com_lcd(0x38);/5*7,2行顯示 delay(1); com_lcd(0x06);/文字不動,光標自動右移 delay(1); com_lcd(0x0C);/開顯示 delay(1); com_lcd(0x81);/第一行首地址 delay(1); for (i
19、=0;i<16;i+) data_lcd(tab1i); delay(5);void clear_lcd_2() /清第二行 unsigned char i; com_lcd(0xc0); delay(1);for (i=0;i<16;i+) data_lcd(tab11); delay(1);unsigned int qushu(unsigned char m)/第一個數 unsigned char i; unsigned int num; unsigned int temp = 0; wei=m-1;/位數 for (i=1;i<=wei;i+) if(keyi=9) n
20、um=0; elsenum=keyi+1; temp=temp*10+num; return temp;unsigned int result(unsigned int c,unsigned int d)/運算子程序 unsigned int result2; unsigned char k; k=keywei+1; switch(k) case 0x0a:result2=c+d; break; case 0x0b:result2=c-d; break; case 0x0c:result2=c*d; break; case 0x0d:result2=c/d; default: ; return
21、 result2;void disp_result(unsigned int result_num )/顯示結果子程序 unsigned char aa=0; unsigned char i,c; unsigned int n = result_num ; clear_lcd_2(); com_lcd(0xc0); delay(1); data_lcd(tab314); com_lcd(0x04); delay(1); com_lcd(0xcf); delay(1); if(n=0)aa=1; while(n!=0) /計算結果長度 n=n/10; aa+; for (i=1;i<=aa;i+) c=result_num%10; if(c=0) c=10; data_lcd(tab3c-1);/顯示結果 delay(1); result_num=resu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西經濟職業學院《材料化學基礎(二)》2023-2024學年第二學期期末試卷
- 成都工業職業技術學院《有機合成設計》2023-2024學年第二學期期末試卷
- 團圓創意美術課件
- 長春理工大學《翻譯與實踐》2023-2024學年第二學期期末試卷
- 貴州大學《聚合物成型加工原理》2023-2024學年第二學期期末試卷
- 貴陽職業技術學院《西藏近現代發展史》2023-2024學年第二學期期末試卷
- 濰坊職業學院《電子商務綜合》2023-2024學年第二學期期末試卷
- 內蒙古經貿外語職業學院《事故調查與案例分析》2023-2024學年第二學期期末試卷
- 鶴崗師范高等專科學校《逆向分析技術》2023-2024學年第二學期期末試卷
- 南京審計大學《廣播電視新聞報道》2023-2024學年第二學期期末試卷
- MOOC 引領世界的中國乒乓-西南交通大學 中國大學慕課答案
- 低碳示范區評價技術規范低碳景區
- 語法填空謂語和非謂語動詞解題技巧課件(共16張)
- 人教版七年級上冊數學《整式的加減》單元作業設計
- 咖啡文化與飲品調制智慧樹知到期末考試答案2024年
- (2024年)勞動法課件勞務派遣
- 兒童支氣管哮喘共患病診治專家共識
- 多源異構數據融合關鍵技術研究
- 小學語文-人教部編版四年級語文下冊第七單元測試卷(三)(有答案)
- 聚焦強軍目標投身強軍實踐課件
- 基于微信小程序的校園快遞代取互助平臺建設
評論
0/150
提交評論