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

下載本文檔

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

文檔簡介

1、3.1 硬件連接  圖3-1所示為簡易計算器的電路原理圖。P3口用于鍵盤輸入,接4*4矩陣鍵盤,鍵值與鍵盤的對應表如表-所示,p0口和p2口用于顯示,p2口用于顯示數值的高位,po口用于顯示數值的低位。圖3-1 簡易計算器電路原理圖鍵值與功能對應表鍵值0123456789+-×/=ON/C1 / 25功能0123456789+-×÷=清零表3-13.2 計算器的軟件設計#include<reg51.h>   /頭文件#define uint unsigned int / #define uchar unsigne

2、d charsbit lcden=P23; /定義引腳sbit rs=P24;sbit rw=P20;sbit busy=P07;char i,j,temp,num,num_1;long a,b,c;     /a,第一個數 b,第二個數 c,得數float a_c,b_c;uchar flag,fuhao;/flag表示是否有符號鍵按下,fuhao表征按下的是哪個符號uchar code table=7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0;uchar code table1=7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,

3、1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30;void delay(uchar z) / 延遲函數uchar y;for(z;z>0;z-)   for(y=0;y<110;y+);void check() / 判斷忙或空閑do    P0=0xFF;    rs=0;     /指令    rw=1;     /讀    lcden=

4、0;     /禁止讀寫    delay(1); /等待,液晶顯示器處理數據    lcden=1;     /允許讀寫    while(busy=1); /判斷是否為空閑,1為忙,0為空閑void write_com(uchar com) / 寫指令函數P0=com;    /com指令付給P0口rs=0;rw=0;lcden=0;check();lcden=1;void write_date(uchar date) /

5、 寫數據函數    P0=date;rs=1;rw=0;lcden=0;check();lcden=1;void init() /初始化    num=-1;lcden=1; /使能信號為高電平write_com(0x38); /8位,2行write_com(0x0c); /顯示開,光標關,不閃爍*/write_com(0x06); /增量方式不移位 顯竟獗暌貧 柚?write_com(0x80); /檢測忙信號write_com(0x01); /顯示開,光標關,不閃爍num_1=0;i=0;j=0;a=0;   

6、  /第一個參與運算的數b=0;     /第二個參與運算的數c=0;flag=0; /flag表示是否有符號鍵按下, fuhao=0; / fuhao表征按下的是哪個符號void keyscan() / 鍵盤掃描程序P3=0xfe; if(P3!=0xfe)   delay(20); 延遲20ms   if(P3!=0xfe)       temp=P3&0xf0;    switch(temp)  

7、60;      case 0xe0:num=0;       break;     case 0xd0:num=1;       break;      case 0xb0:num=2;       break;     case 0x70:num=3;&#

8、160;      break;          while(P3!=0xfe);   if(num=0|num=1|num=2)/如果按下的是'7','8'或'9          if(j!=0)            &#

9、160;     write_com(0x01);          j=0;                if(flag=0)/沒有按過符號鍵         a=a*10+tablenum;       

10、  else/如果按過符號鍵         b=b*10+tablenum;           else/如果按下的是'/'       flag=1;    fuhao=4;/4表示除號已按      i=table1num;   write_date(0x30+i);P3=0xfd;i

11、f(P3!=0xfd)   delay(5);   if(P3!=0xfd)       temp=P3&0xf0;    switch(temp)         case 0xe0:num=4;         break;        

12、;   case 0xd0:num=5;         break;           case 0xb0:num=6;         break;           case 0x70:num=7; 

13、        break;          while(P3!=0xfd);   if(num=4|num=5|num=6&&num!=7)/如果按下的是'4','5'或'6'       if(j!=0)          

14、60;       write_com(0x01);          j=0;                if(flag=0)/沒有按過符號鍵         a=a*10+tablenum;     &

15、#160;   else/如果按過符號鍵         b=b*10+tablenum;           else/如果按下的是'/'       flag=1;    fuhao=3;/3表示乘號已按      i=table1num;   write_date(0x30+i

16、);P3=0xfb;if(P3!=0xfb)   delay(5);   if(P3!=0xfb)       temp=P3&0xf0;    switch(temp)         case 0xe0:num=8;         break;      

17、     case 0xd0:num=9;         break;           case 0xb0:num=10;         break;           case 0x70:

18、num=11;         break;          while(P3!=0xfb);   if(num=8|num=9|num=10)/如果按下的是'1','2'或'3'       if(j!=0)           

19、;       write_com(0x01);          j=0;               if(flag=0)/沒有按過符號鍵         a=a*10+tablenum;      

20、60;  else/如果按過符號鍵         b=b*10+tablenum;           else if(num=11)/如果按下的是'-'       flag=1;    fuhao=2;/2表示減號已按      i=table1num;   write_date(0x3

21、0+i);P3=0xf7;if(P3!=0xf7)   delay(5);   if(P3!=0xf7)       temp=P3&0xf0;    switch(temp)         case 0xe0:num=12;         break;     &#

22、160;     case 0xd0:num=13;         break;           case 0xb0:num=14;         break;           case

23、0x70:num=15;         break;          while(P3!=0xf7);   switch(num)       case 12:write_com(0x01);a=0;b=0;flag=0;fuhao=0;/按下的是"清零"     break;   

24、case 13:                /按下的是"0"       if(flag=0)/沒有按過符號鍵               a=a*10;        wri

25、te_date(0x30);        P1=0;              else if(flag=1)/如果按過符號鍵               b=b*10;        write_date(

26、0x30);                   break;    case 14:j=1;           if(fuhao=1)write_com(0x80+0x4f);/按下等于鍵,光標前進至第二行最后一個顯示處       &

27、#160;   write_com(0x04);     /設置從后住前寫數據,每寫完一個數據,光標后退一格           c=a+b;           while(c!=0)              

28、60;         write_date(0x30+c%10);             c=c/10;                      write_date(0x3d);  

29、   /再寫"="           a=0;b=0;flag=0;fuhao=0;                 else if(fuhao=2)write_com(0x80+0x4f);/光標前進至第二行最后一個顯示處       

30、     write_com(0x04);     /設置從后住前寫數據,每寫完一個數據,光標后退一格(這個照理說順序不對,可顯示和上段一樣)           if(a-b>0)             c=a-b;       

31、    else              c=b-a;           while(c!=0)                     

32、0;  write_date(0x30+c%10);             c=c/10;                      if(a-b<0)         &

33、#160;   write_date(0x2d);           write_date(0x3d);     /再寫"="                      a=0;b=0;flag=0;fuhao=0;&

34、#160;               else if(fuhao=3)write_com(0x80+0x4f);            write_com(0x04);             c=a*b;  

35、0;          while(c!=0)                          write_date(0x30+c%10);          

36、0;  c=c/10;                          write_date(0x3d);               a=0;b=0;flag=0;fuhao=0;  &

37、#160;                else if(fuhao=4)write_com(0x80+0x4f);            write_com(0x04);            i=0;   

38、         c=(long)(float)a/b)*1000);            while(c!=0)                         &#

39、160;  write_date(0x30+c%10);               c=c/10;           i+;           if(i=3)       &

40、#160;       write_date(0x2e);                         if(a/b<=0)              write_dat

41、e(0x30);            write_date(0x3d);                                   

42、60;      a=0;b=0;flag=0;fuhao=0;                               break;     case 15:write_date(0x30+table1num);flag=1

43、;fuhao=1;     break;   main()init();while(1)   keyscan();第4章 仿真和調試下面用KEIL uVision與 porteus仿真軟件實現簡易計算器的仿真與調試。4.1 keil 軟件的介紹單片機開發中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變為CPU可以執行的機器碼有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。機器匯編是通過匯編軟件將源程序變為機器碼,用于MCS-51單片機的匯編軟件有早期的A51,隨著單片機開發

44、技術的不斷發展,從普遍使用匯編語言到逐漸使用高級語言開發,單片機的開發軟件也在不斷發展,Keil軟件是目前最流行開發MCS-51系列單片機的軟件,這從近年來各仿真機廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境(uVision)將這些部份組合在一起。運行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統。掌握這一軟件的使用對于使用51系列單片機的愛好者來說是十分必要的,如果你使用C語言編程

45、,那么Keil幾乎就是你的不二之選(目前在國內你只能買到該軟件、而你買的仿真機也很可能只支持該軟件),即使不使用C語言而僅用匯編語言編程,其方便易用的集成環境、強大的軟件仿真調試工具也會令你事半功倍。Keil C51開發系統基本知識Keil C51開發系統基本知識1. 系統概述Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。用過匯編語言后再使用C來開發,體會更加深刻。Keil C51軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面。另外重要的一

46、點,只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢。下面詳細介紹Keil C51開發系統各部分功能和使用。2. Keil C51單片機軟件開發系統的整體結構C51工具包的整體結構中,其中uVision與Ishell分別是C51 for Windows和for Dos的集成開發環境(IDE),可以完成編輯、編譯、連接、調試、仿真等整個開發流程。開發人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及A51編譯器編譯生成目標文件(.OBJ)。目標文件可由LIB51創

47、建生成庫文件,也可以與庫文件一起經L51連接定位生成絕對目標文件(.ABS)。ABS文件由OH51轉換成標準的Hex文件,以供調試器dScope51或tScope51使用進行源代碼級調試,也可由仿真器使用直接對目標板進行調試,也可以直接寫入程序存貯器如EPROM中。3. 采用KEIL 開發的89c51單片機應用程序一般需要以下步驟:(1) 在uVision 集成開發環境中創建新項目(Project),擴展文件名為.UV2,并為該項目選定合適的單片機CPU器件(本設計采用ATMEL 公司下的AT89C51)(2)用uVision 的文本編輯器編寫源文件,可以是匯編文件(.ASM),也可以使C語言

48、文件(擴展名.C),并將該文件添加到項目中去。一個項目文件可以包含多個文件,除了源程序文件外,還可以是庫文件、頭文件或文本說明文件。(3)通過uVision 2 的相關選擇項,配置編譯環境、連接定位器以及Debug調試器的功能。(4)對項目中的源文件進行編譯連接,生成絕對目標代碼和可選的HEX文件,如果出現編譯連接錯誤則返回到第2步,修改源文件中的錯誤后重構整個項目。(5)對沒有語法錯誤的程序進行仿真調試,調試成功后將HEX文件寫入到單片機應用系統的ROM中。4.2本設計的操作根據上述操作可得圖4-1編譯調試程序后,從Build一欄可以看到“ creating hex file from js

49、q”“jsq-0 Error(s),0 Warning(s).” 下一步就可以在Proteus 軟件了調用hex文件及燒入單片機。 圖4-1 keil 調試4.3 proteus 7.1 介紹    Proteus的ISIS是一款Labcenter出品的電路分析實物仿真系統,可仿真各種電路和IC,并支持單片機,元件庫齊全,使用方便,是不可多得的專業的單片機軟件仿真系統。該軟件的特點:(1) 全部滿足我們提出的單片機軟件仿真系統的標準,并在同類產品中具有明顯的優勢。(2)具有模擬電路仿真、數字電路仿真、單片機及其外圍電路組成的系統的仿真、RS一232動態仿真、1 C

50、調試器、SPI調試器、鍵盤和LCD系統仿真的功能;有各種虛擬儀器,如示波器、邏輯分析儀、信號發生器等。 目前支持的單片機類型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片。 支持大量的存儲器和外圍芯片。總之該軟件是一款集單片機和SPICE分析于一身的仿真軟件,功能極其強大 ,可仿真51、AVR、PIC。4.4 Proteus 對于本設計的仿真操作步驟如下:(1)進入proteus ISIS 集成環境,在工作前,在systerm菜單下設置界面的顏色、圖形界面大小等項目,我采用了系統默認值。  

51、60;      (2)通過工具欄中的(從庫中選擇元件命令)命令,在pick devices窗口中選擇電路所需的元件,放置元件到編輯區并調整其相對位置,進行元件參數設置,元器件間連線。器件庫如表4-1所示,選擇后如圖4-12所示。器件庫器件名稱Microprocessor ICs89C51Switches&RelaysBUTTONOptoelectronicsLM016LResistorsRESPACK-8ResistorsPOT-LINTerminals ModePOWER表4-1 器件庫及所選器件(3)連線并加上需要的說明

52、,并完成仿真原理圖,如圖4-3所示。操作說明:(1) 本計算器實現8位數的加、減、乘、除運算。(2)按下數值鍵,顯示按下的 “數字”按運算符,再,按第2個操作數,顯示,按“=”鍵,得到運算結果。(3)按“清零”鍵清除運算結果,可重新開始。圖 4-3 仿真原理(4)加載程序。將編譯調試完成的簡易計算器機器碼程序(hex文件)加載到AT89C51單片機中。(5)單擊仿真工具欄中的仿真鍵,觀察仿真結果??梢园磿和?、繼續、單步、等按鈕,查看效果。運行 單步運行 暫停    停止圖4-4 仿真工具欄(6)調試與思考圖4-2 器件列表第5章 Protel 作圖及PCB 制板5.1 Protel DXP 2004簡介    到現在許多PCB工程師們也許還在使用Protel99或者protel99se在他們所熟悉的編輯環境下進行PCB設計,他們都很有經驗,能夠在protel99或protel99se上設計出一塊很棒的PCB。但有的時候他們甚至不相信軟件的智能化給他們帶來的巨大方便。于是許多PCB工程師根本不使用軟件帶有的強大的自動布線功能,因為即使重復布上幾百次都不能得到他們

溫馨提示

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

評論

0/150

提交評論