名稱 4位數加法計算器的設計
一、設計任務及要求:
設計任務:
1、通過4*4矩陣鍵盤輸入數字及運算符;
2、可以進行4位十進制數以內的加法預算。如果計算結果超出四位數,則全部顯示“E”;
3、可以進行加減乘除所有運算;
4、添加其他功能。
要 求:
首先進行預設計,根據設計的任務要求,先確定設計的硬件電路方案,然后進行硬件電路的初步設計,在計算機上畫出硬件電路圖,在老師的指導下進行修正硬件電路圖,并對所涉及的參數進行計算。
在確定硬件的基礎上,要進行軟件的總體設計,包括軟件主流程的設計以及各子程序的設計,同時,要寫出詳細的操作說明,如時間的調整方法,顯示窗口的時間切換等,以配合軟件的設計。
然后進入硬件的調試及編程工作,設計組內的同學可根據任務分工,有調試硬件各功能模塊的,如鍵盤子程序、顯示子程序等,有進行整體程序的編制的,各模塊的編制過程中要注意資源的銜接。
最后進入聯機調試,聯機調試的原則也要采用分步走的原則,各個功能模塊要逐步套入,通過一個再增加一項功能,從而達到設計的總體要求,不要上來編制個最大的程序,最后無法查找錯誤。
最后寫出設計文檔。
目 錄
一、 緒 言1
二、系統設計1
2.1設計任務1
2.2方案比較與論證1
2.2.1系統整體流程圖2
2.2.2單片機的選擇方案論證2
2.2.3鍵盤選擇方案論證2
2.2.4顯示模塊的選擇方案論證2
2.2.5蜂鳴器的選擇方案論證2
三、硬件電路設計2
3.1計算器的控制電路圖2
3.2矩陣鍵盤的設計3
3.3 LCD1602顯示電路的設計3
3.4蜂鳴器驅動電路的設計4
3.5主要元器件選擇4
四、程序流程圖5
五、c語言程序設計5
六、計算器的仿真19
6.1 Keil調試19
6.2 Proteus調試19
7、結束語20
參考文獻21
一、緒 言 近年來隨著科技的飛速發展,單片機的應用正在不斷地走向深入,同時帶動傳統控制檢測日新月異更新。在實時檢測和自動控制的單片機應用系統中,單片機往往是作為一個核心部件來使用,僅單片機方面知識是不夠的,還應根據具體硬件結構,以及針對具體應用對象特點的軟件結合,加以完善。 電子時鐘是現代社會中的主要計時工具之一,廣泛應用于手機,電腦,汽車等社會生活需要的各個方面,及對時間有要求的場合。本設計采用AT89C52單片機作為主要核心部件,附以上電復位電路,時鐘電路及按鍵調時電路組成。數字鐘已成為人們日常生活中: 必不可少的必需品, 廣泛用于個人家庭以及車站、 碼頭、劇場、辦公室等公共場所,給人們的生活、學習、工作、娛樂帶來極大的方便。 由于數字集成電路技術的發展和采用了先進的石英技術,使數字鐘具有走時準確、性 能穩定、攜帶方便等優點,它還用于計時、自動報時及自動控制等各個領域。 二、系統設計2.1 設計任務 1、通過4*4矩陣鍵盤輸入數字及運算符; 2、可以進行4位十進制數以內的加法預算。如果計算結果超出四位數,則全部顯示“E”; 3、可以進行加減乘除所有運算; 4、添加其他功能。 2.2 方案比較與論證2.2.1 系統整體流程圖  圖1 系統整體流程圖 2.2.2 計算器的控制方案論證 用4*4的矩陣鍵盤組成0-9數字鍵及加、減、乘、除、等于、清零按鍵,LCD屏幕實時顯示輸入的數字和運算符號,每按下一個按鍵都有蜂鳴器發出的響聲。從矩陣鍵盤輸入一個數字,選擇運算符,再輸入一個數字,然后按下“等于”鍵,最后的計算結果會呈現在LCD屏幕上。 2.2.3 單片機的選擇方案論證 方案一:采用可編程邏輯期間CPLD 作為控制器。CPLD可以實現各種復雜的邏輯功能、規模大、密度高、體積小、穩定性高、I/O資源豐富、易于進行功能擴展。采用并行的輸入輸出方式,提高了系統的處理速度,適合作為大規模控制系統的控制核心。但本系統不需要復雜的邏輯功能,對數據的處理速度的要求也不是非常高,且從使用及經濟的角度考慮我們放棄了此方案 方案二:采用Atmel公司的AT89C52單片機作為控制器。AT89C52是一個低功耗,高性能的51內核的CMOS 8位單片機,片內含8k空間的可反復擦些1000次的Flash只讀存儲器,具有256 bytes的隨機存取數據存儲器(RAM),32個雙向I/O口,2個16位可編程定時計數器。 綜合考慮,選擇方案二,采用Atmel公司的AT89C52單片機作為控制器。 2.2.4 鍵盤選擇方案論證 方案一:采用獨立式鍵盤。由于各鍵相互獨立,每個按鍵各接一根輸入線,通過檢測輸入線的電平狀態可以很容易的判斷哪個按鍵被按下。此種鍵盤適用于按鍵較少或操作速度較高的場合。但本題發揮部分要求16個功能鍵,按鍵數目較多,這就需要較多的輸入口線,而且電路結構復雜。故此方案不可取。 方案二:采用矩陣鍵盤。它由行和列組成,按鍵位于行列的交叉點上,行線信號和列線信號分別通過兩個接口和CPU相連,通過行列掃描法判定按鍵的位置,此方案適用于按鍵較多的場合。 通過對4位數加法計算器項目的分析,采用4*4行列式鍵盤。 2.2.5 顯示模塊的選擇方案論證 方案一:采用帶字庫LCD模塊顯示。能顯示復雜的信息,具有質量輕,體積小,功耗低,指令功能強,接口簡單,可靠性強等優點,顯示內容豐富,圖形美觀,易于人機交流。但是價格昂貴。 方案二:采用LED數碼管顯示。數碼管能顯示數字和符號,但是占用I/O口資源較多,對于簡單的電路可以選用此方案。 計算器,需要較為強大的人機交互界面,故選用方案一,顯示所需信息。 2.2.6 蜂鳴器的選擇方案論證 方案一:采用有源蜂鳴器。有源蜂鳴器內部帶震蕩源,只要一通電就會發出響聲。 方案二:采用無源蜂鳴器。無源蜂鳴器內部不帶震蕩源,所以用直流信號無法令其鳴叫,必須用2K~5K的方波去驅動它。 綜合考慮,為了程序控制的方便,選用了方案一。
三 硬件電路設計
3.1 計算器控制電路圖
圖2 計算器控制線路圖 3.2 矩陣式鍵盤的設計鍵盤電路如圖3所示。設計數字鍵0~9 的鍵號依次為0~9,運算符號分別為“+”、“-”、“*”、“/”,以及“=”和清零“C”,通過逐行掃描函數來確定按下的鍵位。 
圖3 鍵盤電路 3.3 LCD1602顯示電路的設計LCD1602液晶屏采用LM016L型號元件,其電路如圖3所示。 
圖4 LCD1602顯示電路 3.4 蜂鳴器驅動電路的設計蜂鳴器的驅動采用PNP三極管來驅動,低電平有效。其電路如圖5 所示。 
圖5 蜂鳴器電路圖 3.5 主要元器件選擇主要元器件選用型號和數量如表1所示:
| | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | |
| | | 7
| | | | |
四、程序流程圖
6.計算器仿真在完成了計算器硬件設計和軟件設計以后,便進入系統的調試階段。系統的調試步驟和方法基本上是相同的,但具體細節和所采用的開發系統以及用戶系統選用的單片機型號有關,如可選用Keil軟件進行軟件調試,用Proteus軟件完成硬件調試。 6.1 Keil調試
 6.2 Proteus調試 7 結束語通過這次設計,使我們得到了一次用專業知識和專業技能去分析問題、解決問題全面系統的鍛煉。使我們在單片機的基本原理、單片機應用系統開發過程,以及用C語言設計程序的思路技巧等方面都能向前邁了一大步,為我們日后成為合格的應用型人才打下良好的基礎。
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit lcden=P2^1; //定義E口
- sbit lcdrs=P2^0; //定義RS口
- sbit beep=P2^2; //定義蜂鳴器
- uchar code table[]={'0','1','2','3','4','5','6', //創建鍵位數組,數字,運算符號,等于號,清零(小數點)
- '7','8','9','+','-','*','/','=','.'};
- uchar key,flag1,js,k1,k2;
- uchar a[20],b[20];
- float jieguo=0;
- void delay(uchar z) //延遲函數
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_cmd(uchar cmd) //寫命令函數
- {
- lcdrs=0;
- P1=cmd;
- delay(5);
- lcden=1;
- delay(4);
- lcden=0;
- }
- void write_data(uchar date) //寫數據函數
- {
- lcdrs=1;
- P1=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init() //LCD初始化函數
- {
- lcden=0;
- write_cmd(0x38); //設置16x2顯示,8位數據接口
- write_cmd(0x0c); //設置開顯示,不顯示光標(關顯示是0x08)
- write_cmd(0x06); //寫一個字符后地址指針加1
- write_cmd(0x01); //清屏
- }
- void keyscan()
- {
- uchar temp,uu=0xf7;
- uint i;
- for(i=0;i<4;i++)
- {
- uu=_crol_(uu,1); //左移
- P3=uu;
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- delay(10);
- temp=P3;
- temp=temp&0x0f;
- if(temp!=0x0f)
- {
- temp=P3;
- switch(temp)
- {
- case 0xee:key=1;beep=0;delay(200);beep=1;break; //延遲200響聲
- case 0xde:key=2;beep=0;delay(200);beep=1;break;
- case 0xbe:key=3;beep=0;delay(200);beep=1;break;
- case 0x7e:key=10;beep=0;delay(200);beep=1;break;
- case 0xed:key=4;beep=0;delay(200);beep=1;break;
- case 0xdd:key=5;beep=0;delay(200);beep=1;break;
- case 0xbd:key=6;beep=0;delay(200);beep=1;break;
- case 0x7d:key=11;beep=0;delay(200);beep=1;break;
- case 0xeb:key=7;beep=0;delay(200);beep=1;break;
- case 0xdb:key=8;beep=0;delay(200);beep=1;break;
- case 0xbb:key=9;beep=0;delay(200);beep=1;break;
- case 0x7b:key=12;beep=0;delay(200);beep=1;break;
- case 0xe7:key=0;beep=0;delay(200);beep=1;break;
- case 0xd7:key=15;beep=0;delay(200);beep=1;
- beep=0;delay(200);beep=1;beep=0;delay(200);beep=1;break; //清零長響聲
- case 0xb7:key=13;beep=0;delay(200);beep=1;break;
- case 0x77:key=14;beep=0;delay(180);beep=1;delay(100);
- beep=0;delay(180);beep=1;break; //等于按鍵兩聲短響,中間較短間隔
- }
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp&0x0f;
- }
- flag1=1;
- }
- }
- }
- }
- void jscl() //計算顯示函數
- {
- uchar i,j,n;
- float s,temp2;
- long int s1,s2,a1,b1,c1,temp1;
- a1=1;
- b1=1;
- s1=0;
- s2=0;
- s=0;
- if(k2!=0)
- {
- for(j=0;j<k1+1;j++) //存放第一操作數
- {
- for(i=0;i<k1-j;i++)
- a1=a1*10;
- s1=s1+a[j]*a1;
- a1=1;
- }
- for(j=k1+1;j<k2+1;j++) //存放第二操作數
- {
- for(i=0;i<k2-j;i++)
- b1=b1*10;
- s2=s2+a[j]*b1;
- b1=1;
- }
- if(js==10) //判斷運算符號
- {
- s=s1+s2;
- }
- if(js==11)
- {
- s=s1-s2;
- }
- if(js==12)
- {
- s=s1*s2;
- }
- if(js==13)
- {
- s=(s1*0.1)/(s2*0.1);
- }
- jieguo=s;
- }
- else
- s=jieguo;
- if(jieguo>9999||s>=9999)
- {
- write_data('E');
- }
- else //運算結果小數的處理
- {
- c1=(long int)(s*1000)%10;
- if(c1>=5)
- s=s+0.01;
- temp1=(long int)(s);
- temp2=s-temp1;
- n=0;
- while(temp1)
- {
- b[n]=temp1%10;
- temp1=temp1/10;
- n++;
- }
- b[n]=temp2*10;
- b[n+1]=(uchar)(temp2*100)%10;
- for(i=n;i>0;i--)
- {
- write_data(table[b[i-1]]);
- }
- if(jieguo<1)
- {
- write_data(table[0]);
- write_data(table[15]);
- write_data(table[b[n]]);
- write_data(table[b[n+1]]);
- }
- else
- {
- write_data(table[15]);
- write_data(table[b[n]]);
- write_data(table[b[n+1]]);
- }
- }
- }
- void main()
- {
- uchar i,j;
- init();
- write_cmd(0x80); //將液晶指針定位在第一行第一個單元
- key=15;
- i=0;
- flag1=0;
- while(1)
- {
- keyscan();
- if(flag1==1)
- {
- if(key==15) //判斷為清零操作
- {
- write_cmd(0x01);
- i=0;
- for(j=0;j<20;j++)
- {
- a[j]=0;
- b[j]=0;
- }
- k1=0;
- k2=0;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
本人初學,僅供參考,存在錯誤和不足之處,請大家回帖多多指教,不勝感激.切勿照搬,Word文檔下載:
4位數加法計算器.doc
(668.86 KB, 下載次數: 209)
2018-7-12 20:39 上傳
點擊文件名下載附件
單片機課程設計仿真圖
|