基于單片機簡易計算器的設計樣本_第1頁
基于單片機簡易計算器的設計樣本_第2頁
基于單片機簡易計算器的設計樣本_第3頁
基于單片機簡易計算器的設計樣本_第4頁
基于單片機簡易計算器的設計樣本_第5頁
已閱讀5頁,還剩37頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

《微機原理與單片機課程設計》課程設計報告基于51單片機的簡易計算器設計學生姓名卓國煥()專業電子信息工程所在班級1141學號指導老師歐觸靈日期2023.10.31——2023.11.4一、設計目的單片機的出現是計算機制造技術高速發展的產物,它是嵌入式控制系統的核心,如今,它已廣泛的應用到我們生活的各個領域,電子、科技、通信、汽車、工業等。本設計是基于51系列單片機來進行的簡樸數字計算器設計,可以完畢計算器的鍵盤輸入,進行加、減、乘、除六位整數數范圍內的基本四則運算,并在LED上顯示相應的結果。軟件方面使用C語言編程,并用PROTUES仿真。二、總體設計及功能介紹根據功能和指標規定,本系統選用MCS-51系列單片機為主控機,實現對計算器的設計。具體設計及功能如下:(1)由于要設計的是簡樸的計算器,可以進行四則運算,為了得到較好的顯示效果,采用LED顯示數據和結果。(2)此外鍵盤涉及數字鍵(0~9)、符號鍵(+、-、×、÷)、清除鍵和等號鍵,故只需要16個按鍵即可,設計中采用集成的計算鍵盤。(3)執行過程:開機顯示零,等待鍵入數值,當鍵入數字,通過LED顯示出來,當鍵入+、-、*、/運算符,計算器在內部執行數值轉換和存儲,并等待再次鍵入數值,當再鍵入數值后將顯示鍵入的數值,按等號就會在LED上輸出運算結果。(4)錯誤提醒:當計算器執行過程中有錯誤時,會在LED上顯示相應的提醒,如:當輸入的數值或計算得到的結果大于計算器的表達范圍時,計算器會在LED上顯示“CUO”,提醒溢出。三、系統模塊組成框圖:輸入模塊51單片機輸入模塊51單片機運算模塊運算模塊LED顯示模塊LED顯示模塊二、硬件設計(一)、總體硬件設計本設計選用AT89C51單片機為主控單元。顯示部分:采用LED動態顯示。按鍵部分:采用4*4集成計算鍵盤;總電路圖:4×4集成計算鍵盤集成計算鍵盤本質上是4×4矩陣鍵盤,矩陣鍵盤采用四條I/O線作為行線,四條I/O線作為列線組成鍵盤,在行線和列線的每個交叉點上設立一個按鍵。這樣鍵盤上按鍵的個數就為4×4個。這種行列式鍵盤結構能有效地提高單片機系統中I/O口的運用率。矩陣鍵盤的工作原理:計算器的鍵盤布局如圖2所示:一般有16個鍵組成,在單片機中正好可以用一個P口實現16個按鍵功能,這種形式在單片機系統中也最常用。矩陣鍵盤內部電路圖如圖所示:(三)、LED顯示模塊如圖本設計采用LED共陰數碼管來顯示輸出數據。共陰數碼管的每一位都是公共的陰極,只有輸入低電平的時候才有也許被點亮,所以位選的時候被選中的位必須是低電平。本設計采用兩個74HC573鎖存器來驅動數碼管,引腳如上圖所示。74HC573-1是控制段選的,74HC573-2是控制位選的,P2.6和P2.7端口是鎖存使能位,置高電平時鎖存器透明(即輸入和輸出相同),置低電平時鎖存。74HC573的八個鎖存器都是透明的D型鎖存器,當使能(G)為高時,Q輸出將隨數據(D)輸入而變。當使能為低時,輸出將鎖存在已建立的數據電平上。輸出控制不影響鎖存器的內部工作,即老數據可以保持,甚至當輸出被關閉時,新的數據也可以置入。這種電路可以驅動大電容或低阻抗負載,可以直接與系統總線接口并驅動總線,而不需要外接口。特別合用于緩沖寄存器,I/O通道,雙向總線驅動器和工作寄存器。HC573引腳功能:引腳號 符號名稱及功能1 OE 3態輸出使能輸入(低電平)2-9 D0-D7 數據輸入12-19 Q0-Q7 3態鎖存輸出11 LE 鎖存使能輸入10 GND 接地(0V)20 VCC 電源電壓(四)運算模塊(51單片機控制)51單片機是在一塊芯片中集成了CPU、RAM、ROM、定期器/計數器和多功能I/O等一臺計算機所需要的基本功能部件。假如按功能劃分,它由如下功能部件組成,即微解決器(CPU)、數據存儲器(RAM)、程序存儲器(ROM/EPROM)、并行I/O口、串行口、定期器/計數器、中斷系統及特殊功能寄存器(SFR)。單片機是靠程序運營的,并且可以修改。通過不同的程序實現不同的功能,特別是特殊的獨特的一些功能,通過使用單片機編寫的程序可以實現高智能,高效率,以及高可靠性!因此我們采用單片機作為計算器的重要功能部件,可以不久地實現運算功能。單片機最小系統復位時單片機的初始化操作,只要給RST引腳加上兩個機器周期以上的高電平信號,就可以使STC89C51單片機復位。本次采用的是12M晶振,按鈕復位電路。三、軟件設計現實生活中人們熟知的計算器,其功能重要如下:鍵盤輸入;數值顯示;加、減、乘、除四則運算;針對上述功能,計算器軟件程序要完畢以下程序的設計:鍵盤輸入檢測程序LED顯示程序算術運算程序1、程序流程圖系統總流程圖SHAPE開始初始化參數初始化LED顯示有鍵輸入?開始初始化參數初始化LED顯示有鍵輸入?讀取鍵碼LED顯示數字鍵清零鍵功能鍵狀態清零輸入數值數值送顯示緩沖YN等待數值輸入結果送顯示緩沖根據上次功能鍵和輸入的數據計算結果本次功能鍵?等待數值輸入結果送顯示緩沖等待數值輸入結果送顯示緩沖算術運算程序流程圖開始開始運算符是?加乘減除運算結果溢出?錯誤信息送顯示緩沖數值送顯示緩沖YYN2、程序清單#include<reg52.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlongsbitwela=P2^7; //定義端口sbitdula=P2^6;longin1,in2,out,x;intcnt,i,flag;ucharcodenum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //LED顯示字模,共陰voiddelay(uintxms)//延時函數{ uintj; for(i=xms;i>0;i--) for(j=114;j>0;j--);}voiddisplay() //顯示函數聲明{ ucharw1,w2,w3,w4,w5,w6,f=0; longy; if(x>=0)//顯示六位計時數 { if(x>=1e6) { P0=0xff; wela=1; P0=0xf7; wela=0; dula=1; P0=num[12]; dula=0; delay(2); P0=0xff; wela=1; P0=0xef; wela=0; dula=1; P0=0x3e; dula=0; delay(2); P0=0xff; wela=1; P0=0xdf; wela=0; dula=1; P0=num[0]; dula=0; delay(2); return; } w1=x%10;w2=x/10%10;w3=x/100%10;w4=x/1000%10;w5=x/10000%10;w6=x/100000%10; if(f==1||w6) { f=1; P0=0xff; wela=1; P0=0xfe; wela=0; dula=1; P0=num[w6]; dula=0; delay(2); } if(f==1||w5) { f=1; P0=0xff; wela=1; P0=0xfd; wela=0; dula=1; P0=num[w5]; dula=0; delay(2); } if(f==1||w4) { f=1; P0=0xff; wela=1; P0=0xfb; wela=0; dula=1; P0=num[w4]; dula=0; delay(2); } if(f==1||w3) { f=1; P0=0xff; wela=1; P0=0xf7; wela=0; dula=1; P0=num[w3]; dula=0; delay(2); } if(f==1||w2) { f=1; P0=0xff; wela=1; P0=0xef; wela=0; dula=1; P0=num[w2]; dula=0; delay(2); } P0=0xff; wela=1; P0=0xdf; wela=0; dula=1; P0=num[w1]; dula=0; delay(2); } else { y=labs(x); if(y>=1e5) { P0=0xff; wela=1; P0=0xf7; wela=0; dula=1; P0=num[12]; dula=0; delay(2); P0=0xff; wela=1; P0=0xef; wela=0; dula=1; P0=0x3e; dula=0; delay(2); P0=0xff; wela=1; P0=0xdf; wela=0; dula=1; P0=num[0]; dula=0; delay(2); return; } w1=y%10;w2=y/10%10;w3=y/100%10;w4=y/1000%10;w5=y/10000%10; if(f==1||w5) { if(f==0) { P0=0xff; wela=1; P0=0xfe; wela=0; dula=1; P0=0x40; dula=0; delay(2); } f=1; P0=0xff; wela=1; P0=0xfd; wela=0; dula=1; P0=num[w5]; dula=0; delay(2); } if(f==1||w4) { if(f==0) { P0=0xff; wela=1; P0=0xfd; wela=0; dula=1; P0=0x40; dula=0; delay(2); } f=1; P0=0xff; wela=1; P0=0xfb; wela=0; dula=1; P0=num[w4]; dula=0; delay(2); } if(f==1||w3) { if(f==0) { P0=0xff; wela=1; P0=0xfb; wela=0; dula=1; P0=0x40; dula=0; delay(2); } f=1; P0=0xff; wela=1; P0=0xf7; wela=0; dula=1; P0=num[w3]; dula=0; delay(2); } if(f==1||w2) { if(f==0) { P0=0xff; wela=1; P0=0xf7; wela=0; dula=1; P0=0x40; dula=0; delay(2); } f=1; P0=0xff; wela=1; P0=0xef; wela=0; dula=1; P0=num[w2]; dula=0; delay(2); } if(f==0) { P0=0xff; wela=1; P0=0xef; wela=0; dula=1; P0=0x40; dula=0; delay(2); } P0=0xff; wela=1; P0=0xdf; wela=0; dula=1; P0=num[w1]; dula=0; delay(2); }}voidkeyscan() //鍵盤掃描函數{ uchartemp; P1=0xfe; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delay(8); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case0xee: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+7; x=in1; } else { in2=in2*10+7; x=in2; } } break; case0xde: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+8; x=in1; } else { in2=in2*10+8; x=in2; } } break; case0xbe: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+9; x=in1; } else { in2=in2*10+9; x=in2; } } break; case0x7e: if(cnt!=0&&flag==0) { cnt=0; flag=4; } break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfd; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delay(8); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case0xed: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+4; x=in1; } else { in2=in2*10+4; x=in2; } } break; case0xdd: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+5; x=in1; } else { in2=in2*10+5; x=in2; } } break; case0xbd: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+6; x=in1; } else { in2=in2*10+6; x=in2; } } break; case0x7d: if(cnt!=0&&flag==0) { cnt=0; flag=3; } break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delay(8); //消除抖動 temp=P1; temp=temp&0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case0xeb: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+1; x=in1; } else { in2=in2*10+1; x=in2; } } break; case0xdb: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+2; x=in1; } else { in2=in2*10+2; x=in2; } } break; case0xbb: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+3; x=in1; } else { in2=in2*10+3; x=in2; } } break; case0x7b: if(cnt!=0&&flag==0) { cnt=0; flag=2; } break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xf7; temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delay(8); temp=P1; temp=temp&0xf0; if(temp!=0xf0)//證明有鍵按下,if語句是為了讓鍵盤松開 { temp=P1; switch(temp) { case0xe7: cnt=0; in1=0; in2=0; out=0; flag=0; x=0; break; case0xd7: if(cnt<6) { cnt++; if(flag==0) { in1=in1*10+0; x=in1; } else { in2=in2*10+0; x=in2; } } break; case0xb7: //假如得到符號位 switch(flag) { case1: out=in1+in2; //加 break; case2: out=in1-in2; //減 break; case3: out=in1*in2; //乘 break; case4: if(in2) out=in1/in2; //除 break; } x=out; in1=0; in2

溫馨提示

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

評論

0/150

提交評論