




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、課 程 設 計題 目 名 稱 簡易計算器設計 課 程 名 稱 單片機原理及應用 學 生 姓 名 班 級 學 號 2021年 6 月20日19目錄一 設計目的2二 總體設計及功能介紹2三 硬件仿真圖3四 主程序流程圖4五 程序源代碼4六 課程設計體會17一 設計目的本設計是基于51系列單片機來進行的簡單數(shù)字計算器設計,可以完成計算器的鍵盤輸入,進行加、減、乘、除六位整數(shù)數(shù)范圍內(nèi)的根本四那么運算,并在LED上顯示相應的結果。軟件方面使用C語言編程,并用PROTUES仿真。二 總體設計及功能介紹 根據(jù)功能和指標要求,本系統(tǒng)選用MCS-51系列單片機為主控機,實現(xiàn)對計算器的設計。具體設計及功能如下:&
2、#160; 由于要設計的是簡單的計算器,可以進行四那么運算,為了得到較好的顯示效果,采用LED 顯示數(shù)據(jù)和結果; 另外鍵盤包括數(shù)字鍵09、符號鍵+、-、×、÷、去除鍵和等號鍵,故只需要16 個按鍵即可,設計中采用集成的計算鍵盤; 執(zhí)行過程:開機顯示零,等待鍵入數(shù)值,當鍵入數(shù)字,通過LED顯示出來,當鍵入+、-、*、/運算符,計算器在內(nèi)部執(zhí)行數(shù)值轉(zhuǎn)換和存儲,并等待再次鍵入數(shù)值,當再鍵入數(shù)值后將顯示鍵入的數(shù)值,按等號就會在LED上輸出運算結果。三 硬件仿真圖 硬件局部比擬簡單,當鍵盤按鍵按下時它的那一行、那一列的端口為低電平。因此,只
3、要掃描行、列端口是否都為低電平就可以確定是哪個鍵被按下。四 主程序流程圖 程序的主要思想是:將按鍵抽象為字符,然后就是對字符的處理。將操作數(shù)分別轉(zhuǎn)化為字符串存儲,操作符存儲為字符形式。然后調(diào)用compute()函數(shù)進行計算并返回結果。具體程序及看注釋還有流程圖五 程序源代碼#include <reg51.h>#include <intrins.h>#include <ctype.h> /* isdigit()函數(shù) */#include <stdlib.h> /* atoi()函數(shù) */#define uchar unsigned char#def
4、ine uint unsigned intuchar operand19, operand29; /* 操作數(shù) */uchar operator; /* 操作符 */void delay(uint);uchar keyscan();void disp(void);void buf(uint value);uint compute(uint va1,uint va2,uchar optor);uchar code table = 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff; /* 字符碼表 */uchar dbuf8 = 10,
5、10,10,10,10,10,10,10; /* 顯示緩存 */* 延時函數(shù) */ void delay(uint z)uint x,y;for(x=z;x>0;x-) for(y=110;y>0;y-);/* 鍵盤掃描程序 將按鍵轉(zhuǎn)化為字符并作為輸出 '$','#'分別表示清零鍵和沒有鍵按下 */uchar keyscan() uchar skey; /* 按鍵值標記變量 */* 掃描鍵盤第1行 */ P1 = 0xfe; while(P1 & 0xf0) != 0xf0) /* 有按鍵按下 */ delay(3); /* 去抖動延時 */
6、 while(P1 & 0xf0) != 0xf0) /* 仍有鍵按下 */ switch(P1) /* 識別按鍵并賦值 */ case 0xee: skey = '7' break; case 0xde: skey = '8' break; case 0xbe: skey = '9' break; case 0x7e: skey = '/' break; default: skey = '#' while(P1 & 0xf0) != 0xf0) /* 等待按鍵松開 */ ; /* 掃描鍵盤第2行
7、*/ P1 = 0xfd; while(P1 & 0xf0) != 0xf0) delay(3); while(P1 & 0xf0) != 0xf0) switch(P1) case 0xed: skey = '4' break; case 0xdd: skey = '5' break; case 0xbd: skey = '6' break; case 0x7d: skey = '*' break; default: skey = '#' while(P1 & 0xf0) != 0xf0)
8、 ; /* 掃描鍵盤第3行 */ P1 = 0xfb; while(P1 & 0xf0) != 0xf0) delay(3); while(P1 & 0xf0) != 0xf0) switch(P1) case 0xeb: skey = '1' break; case 0xdb: skey = '2' break; case 0xbb: skey = '3' break; case 0x7b: skey = '-' break; default: skey = '#' while(P1 &
9、0xf0) != 0xf0) ; /* 掃描鍵盤第4行 */ P1 = 0xf7; while(P1 & 0xf0) != 0xf0) delay(3); while(P1 & 0xf0) != 0xf0) switch(P1) case 0xe7: skey = '$' break; case 0xd7: skey = '0' break; case 0xb7: skey = '=' break; case 0x77: skey = '+' break; default: skey = '#' w
10、hile(P1 & 0xf0) != 0xf0) ; return skey;void main() uint value1, value2, value; /* 數(shù)值1,數(shù)值2,結果 */ uchar ckey, cut1 = 0, cut2 = 0; /* ckey鍵盤輸入字符 */ uchar operator; /* 運算符 */ uchar i, bool = 0;init: /* goto語句定位標簽 */ buf(0); /* 初始化 */ disp(); value = 0; cut1 = cut2 = 0; bool = 0; for(i = 0;i < 9;i
11、+) operand1i = '0' operand2i = '0' /* 初始化 */ while(1) ckey = keyscan(); /* 讀取鍵盤 */ if(ckey != '#') /* isdigit函數(shù),字符是阿拉伯數(shù)字返回非0值,否那么返回0 */ if(isdigit(ckey) switch(bool) case 0: operand1cut1 = ckey; operand1cut1+1 = '0' value1 = atoi(operand1); /* atoi函數(shù),將字符串轉(zhuǎn)化為,int整數(shù) */
12、cut1+; buf(value1); disp(); break; case 1: operand2cut2 = ckey; operand2cut2+1 = '0' value2 = atoi(operand2); cut2+; buf(value2); disp(); break; default: break; else if(ckey='+'|ckey='-'|ckey='*'|ckey='/') bool = 1; operator = ckey; buf(0); dbuf7 = 10; disp();
13、 else if(ckey = '=') value = compute(value1,value2,operator); buf(value); disp(); while(1) /* 計算結束等待清零鍵按下 */ ckey = keyscan(); if(ckey = '$') /* 如果有清零鍵按下跳轉(zhuǎn)到開始 */ goto init; else buf(value); disp(); else if(ckey = '$') goto init; disp(); /* 運算函數(shù) 輸入:操作數(shù)和操作符 輸出:計算結果*/uint comput
14、e(uint va1,uint va2,uchar optor) uint value; switch(optor) case '+' : value = va1+va2; break; case '-' : value = va1-va2; break; case '*' : value = va1*va2; break; case '/' : value = va1/va2; break; default : break; return value;/* 更新顯示緩存輸入:無符號整數(shù)輸出:將輸入送入顯示緩存*/void buf
15、(uint val) uchar i; if(val = 0) dbuf7 = 0; i = 6; else for(i = 7; val > 0; i-) dbufi = val % 10; val /= 10; for( ; i > 0; i-) dbufi = 10;/* 顯示函數(shù) */void disp(void) uchar bsel, n; bsel=0x01; for(n=0;n<8;n+) P2=bsel; P0=tabledbufn; bsel=_crol_(bsel,1); delay(3); P0=0xff; 六 課程設計體會接到這個課題以后,我先是學習
16、了PROTEUS軟件的使用,按照題目所要求來進行分析,設計,連接電路圖,調(diào)試,最終完成計算器的仿真。接到題目后,我先是分析了題目中所涉及到的知識以及器件,然后按照分析,到圖書館和互聯(lián)網(wǎng)上搜索了相關的內(nèi)容,按照自己的設想和圖書資料的提示,我初步設計了計算器的原理結構,然后進行反復驗證實驗,完善了設計,然后通過學習PROTEUS軟件,讓我很輕松的就掌握了如何在軟件中建立原件,連線,并進行編程,調(diào)試,仿真等工作。軟件的強大功能使得在連接電路圖時很順利,程序編譯階段,通過提示的錯誤,我也進行了修改,聽取同學的建議,最終無錯誤,并對所設計的計算器電路進行了仿真。最終順利的實現(xiàn)了任務要求的所有功能,并且電路設計簡單易讀,構造巧妙,計算速度快。本次課程設計中,另我最難忘的是編程環(huán)節(jié),真的是很難,開始的時候感覺自己啥也不會,然后決定重新學習課本,但是編程不像課本習題那樣簡單的幾行來實現(xiàn)簡單的功能,本次任務是實現(xiàn)一個簡易功能的計算器,雖
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 興唐小學文明交通綠色出行活動總結模版
- 學員培訓心得分享
- 《藥品銷售技巧寶典》課件
- 學校落實“雙減”政策工作總結模版
- 鈑金生產(chǎn)安全培訓
- 2025廣州市房屋買賣中介服務合同(賣方出租方使用)
- 2025設備租賃合同(1) 設備租賃合同
- Python編程入門實踐:從零基礎到實戰(zhàn)應用 課件 random隨機數(shù)開發(fā)猜數(shù)字游戲
- 2022-2023學年七年級下冊科學第一章第三節(jié)測試卷及答案浙教版
- 低顱壓綜合征診療總結模版
- 新技術、新工藝、對提高工程質(zhì)量、縮短工期、降低造價的可行性
- 金屬礦床地下開采復習題及答案
- GB 5009.34-2022食品安全國家標準食品中二氧化硫的測定
- 教學課件《斷裂力學》
- 慢阻肺的管理課件
- 電工基本知識培訓資料課件
- 北師大版《相遇問題》公開課課件
- 鄰補角、對頂角、同位角、內(nèi)錯角、同旁內(nèi)角經(jīng)典習題-一對一專用
- HP系列培訓手冊
- 畢業(yè)論文-原油電脫水方法與機理的研究
- 陜西省2022年普通高中學業(yè)水平考試(真題)
評論
0/150
提交評論