標題: 51單片機之4位數(shù)加法計算器的設計文檔 [打印本頁]
作者: yumozhang 時間: 2018-7-12 20:41
標題: 51單片機之4位數(shù)加法計算器的設計文檔
名稱 4位數(shù)加法計算器的設計
一、設計任務及要求:
設計任務:
1、通過4*4矩陣鍵盤輸入數(shù)字及運算符;
2、可以進行4位十進制數(shù)以內(nèi)的加法預算。如果計算結(jié)果超出四位數(shù),則全部顯示“E”;
3、可以進行加減乘除所有運算;
4、添加其他功能。
要 求:
首先進行預設計,根據(jù)設計的任務要求,先確定設計的硬件電路方案,然后進行硬件電路的初步設計,在計算機上畫出硬件電路圖,在老師的指導下進行修正硬件電路圖,并對所涉及的參數(shù)進行計算。
在確定硬件的基礎上,要進行軟件的總體設計,包括軟件主流程的設計以及各子程序的設計,同時,要寫出詳細的操作說明,如時間的調(diào)整方法,顯示窗口的時間切換等,以配合軟件的設計。
然后進入硬件的調(diào)試及編程工作,設計組內(nèi)的同學可根據(jù)任務分工,有調(diào)試硬件各功能模塊的,如鍵盤子程序、顯示子程序等,有進行整體程序的編制的,各模塊的編制過程中要注意資源的銜接。
最后進入聯(lián)機調(diào)試,聯(lián)機調(diào)試的原則也要采用分步走的原則,各個功能模塊要逐步套入,通過一個再增加一項功能,從而達到設計的總體要求,不要上來編制個最大的程序,最后無法查找錯誤。
最后寫出設計文檔。
目 錄
一、 緒 言1
二、系統(tǒng)設計1
2.1設計任務1
2.2方案比較與論證1
2.2.1系統(tǒng)整體流程圖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蜂鳴器驅(qū)動電路的設計4
3.5主要元器件選擇4
四、程序流程圖5
五、c語言程序設計5
六、計算器的仿真19
6.1 Keil調(diào)試19
6.2 Proteus調(diào)試19
7、結(jié)束語20
參考文獻21
一、緒 言 近年來隨著科技的飛速發(fā)展,單片機的應用正在不斷地走向深入,同時帶動傳統(tǒng)控制檢測日新月異更新。在實時檢測和自動控制的單片機應用系統(tǒng)中,單片機往往是作為一個核心部件來使用,僅單片機方面知識是不夠的,還應根據(jù)具體硬件結(jié)構(gòu),以及針對具體應用對象特點的軟件結(jié)合,加以完善。 電子時鐘是現(xiàn)代社會中的主要計時工具之一,廣泛應用于手機,電腦,汽車等社會生活需要的各個方面,及對時間有要求的場合。本設計采用AT89C52單片機作為主要核心部件,附以上電復位電路,時鐘電路及按鍵調(diào)時電路組成。數(shù)字鐘已成為人們?nèi)粘I钪校?必不可少的必需品, 廣泛用于個人家庭以及車站、 碼頭、劇場、辦公室等公共場所,給人們的生活、學習、工作、娛樂帶來極大的方便。 由于數(shù)字集成電路技術(shù)的發(fā)展和采用了先進的石英技術(shù),使數(shù)字鐘具有走時準確、性 能穩(wěn)定、攜帶方便等優(yōu)點,它還用于計時、自動報時及自動控制等各個領域。
二、系統(tǒng)設計2.1 設計任務 1、通過4*4矩陣鍵盤輸入數(shù)字及運算符;
2、可以進行4位十進制數(shù)以內(nèi)的加法預算。如果計算結(jié)果超出四位數(shù),則全部顯示“E”;
3、可以進行加減乘除所有運算;
4、添加其他功能。
2.2 方案比較與論證2.2.1 系統(tǒng)整體流程圖

圖1 系統(tǒng)整體流程圖
2.2.2 計算器的控制方案論證
用4*4的矩陣鍵盤組成0-9數(shù)字鍵及加、減、乘、除、等于、清零按鍵,LCD屏幕實時顯示輸入的數(shù)字和運算符號,每按下一個按鍵都有蜂鳴器發(fā)出的響聲。從矩陣鍵盤輸入一個數(shù)字,選擇運算符,再輸入一個數(shù)字,然后按下“等于”鍵,最后的計算結(jié)果會呈現(xiàn)在LCD屏幕上。
2.2.3 單片機的選擇方案論證
方案一:采用可編程邏輯期間CPLD 作為控制器。CPLD可以實現(xiàn)各種復雜的邏輯功能、規(guī)模大、密度高、體積小、穩(wěn)定性高、I/O資源豐富、易于進行功能擴展。采用并行的輸入輸出方式,提高了系統(tǒng)的處理速度,適合作為大規(guī)模控制系統(tǒng)的控制核心。但本系統(tǒng)不需要復雜的邏輯功能,對數(shù)據(jù)的處理速度的要求也不是非常高,且從使用及經(jīng)濟的角度考慮我們放棄了此方案
方案二:采用Atmel公司的AT89C52單片機作為控制器。AT89C52是一個低功耗,高性能的51內(nèi)核的CMOS 8位單片機,片內(nèi)含8k空間的可反復擦些1000次的Flash只讀存儲器,具有256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),32個雙向I/O口,2個16位可編程定時計數(shù)器。
綜合考慮,選擇方案二,采用Atmel公司的AT89C52單片機作為控制器。
2.2.4 鍵盤選擇方案論證
方案一:采用獨立式鍵盤。由于各鍵相互獨立,每個按鍵各接一根輸入線,通過檢測輸入線的電平狀態(tài)可以很容易的判斷哪個按鍵被按下。此種鍵盤適用于按鍵較少或操作速度較高的場合。但本題發(fā)揮部分要求16個功能鍵,按鍵數(shù)目較多,這就需要較多的輸入口線,而且電路結(jié)構(gòu)復雜。故此方案不可取。
方案二:采用矩陣鍵盤。它由行和列組成,按鍵位于行列的交叉點上,行線信號和列線信號分別通過兩個接口和CPU相連,通過行列掃描法判定按鍵的位置,此方案適用于按鍵較多的場合。
通過對4位數(shù)加法計算器項目的分析,采用4*4行列式鍵盤。
2.2.5 顯示模塊的選擇方案論證
方案一:采用帶字庫LCD模塊顯示。能顯示復雜的信息,具有質(zhì)量輕,體積小,功耗低,指令功能強,接口簡單,可靠性強等優(yōu)點,顯示內(nèi)容豐富,圖形美觀,易于人機交流。但是價格昂貴。
方案二:采用LED數(shù)碼管顯示。數(shù)碼管能顯示數(shù)字和符號,但是占用I/O口資源較多,對于簡單的電路可以選用此方案。
計算器,需要較為強大的人機交互界面,故選用方案一,顯示所需信息。
2.2.6 蜂鳴器的選擇方案論證
方案一:采用有源蜂鳴器。有源蜂鳴器內(nèi)部帶震蕩源,只要一通電就會發(fā)出響聲。
方案二:采用無源蜂鳴器。無源蜂鳴器內(nèi)部不帶震蕩源,所以用直流信號無法令其鳴叫,必須用2K~5K的方波去驅(qū)動它。
綜合考慮,為了程序控制的方便,選用了方案一。
三 硬件電路設計
3.1 計算器控制電路圖
圖2 計算器控制線路圖
3.2 矩陣式鍵盤的設計鍵盤電路如圖3所示。設計數(shù)字鍵0~9 的鍵號依次為0~9,運算符號分別為“+”、“-”、“*”、“/”,以及“=”和清零“C”,通過逐行掃描函數(shù)來確定按下的鍵位。

圖3 鍵盤電路
3.3 LCD1602顯示電路的設計LCD1602液晶屏采用LM016L型號元件,其電路如圖3所示。

圖4 LCD1602顯示電路
3.4 蜂鳴器驅(qū)動電路的設計蜂鳴器的驅(qū)動采用PNP三極管來驅(qū)動,低電平有效。其電路如圖5 所示。

圖5 蜂鳴器電路圖
3.5 主要元器件選擇主要元器件選用型號和數(shù)量如表1所示:
| | | | |
| | | | |
| | | | |
| | | | |
| | | |
|
| | | | |
| |
| | |
7
| | | | |
四、程序流程圖
6.計算器仿真在完成了計算器硬件設計和軟件設計以后,便進入系統(tǒng)的調(diào)試階段。系統(tǒng)的調(diào)試步驟和方法基本上是相同的,但具體細節(jié)和所采用的開發(fā)系統(tǒng)以及用戶系統(tǒng)選用的單片機型號有關,如可選用Keil軟件進行軟件調(diào)試,用Proteus軟件完成硬件調(diào)試。
6.1 Keil調(diào)試

6.2 Proteus調(diào)試
7 結(jié)束語通過這次設計,使我們得到了一次用專業(yè)知識和專業(yè)技能去分析問題、解決問題全面系統(tǒng)的鍛煉。使我們在單片機的基本原理、單片機應用系統(tǒng)開發(fā)過程,以及用C語言設計程序的思路技巧等方面都能向前邁了一大步,為我們?nèi)蘸蟪蔀楹细竦膽眯腿瞬糯蛳铝己玫幕A。
單片機源程序如下:
- #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', //創(chuàng)建鍵位數(shù)組,數(shù)字,運算符號,等于號,清零(小數(shù)點)
- '7','8','9','+','-','*','/','=','.'};
- uchar key,flag1,js,k1,k2;
- uchar a[20],b[20];
- float jieguo=0;
- void delay(uchar z) //延遲函數(shù)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_cmd(uchar cmd) //寫命令函數(shù)
- {
- lcdrs=0;
- P1=cmd;
- delay(5);
- lcden=1;
- delay(4);
- lcden=0;
- }
- void write_data(uchar date) //寫數(shù)據(jù)函數(shù)
- {
- lcdrs=1;
- P1=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init() //LCD初始化函數(shù)
- {
- lcden=0;
- write_cmd(0x38); //設置16x2顯示,8位數(shù)據(jù)接口
- 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() //計算顯示函數(shù)
- {
- 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++) //存放第一操作數(shù)
- {
- 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++) //存放第二操作數(shù)
- {
- 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 //運算結(jié)果小數(shù)的處理
- {
- 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位數(shù)加法計算器.doc
(668.86 KB, 下載次數(shù): 209)
2018-7-12 20:39 上傳
點擊文件名下載附件
單片機課程設計仿真圖
作者: 溪溪 時間: 2019-11-23 16:27
寫命令函數(shù)cmd哪錯了
作者: 仙女棒! 時間: 2019-12-5 09:24
蜂鳴器為什么不響呀
作者: yxwert 時間: 2019-12-26 12:59
大家可以多做參考
作者: 2478748692 時間: 2020-12-22 10:25
運行成功,蜂鳴器沒響
作者: zwj圓 時間: 2021-12-12 13:03
為什么我的代碼運行沒錯,連線也找不出錯誤,但是就是仿真不出來
作者: 菜鳥12345 時間: 2021-12-13 15:17
蜂鳴器是要單片機實物才能響吧
作者: 菜鳥12345 時間: 2021-12-13 15:19
生成了hex文件沒
作者: yuanpi 時間: 2022-11-8 16:19
應該是沒生成hex文件
作者: 滿天星辰 時間: 2023-5-31 15:32
zwj圓 發(fā)表于 2021-12-12 13:03
為什么我的代碼運行沒錯,連線也找不出錯誤,但是就是仿真不出來
我也仿真不出來,點按鍵沒反應
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |