欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2401|回復: 0
打印 上一主題 下一主題
收起左側

整數計算器 單片機開發技能訓練

[復制鏈接]
跳轉到指定樓層
樓主
ID:935432 發表于 2021-7-5 00:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
通過本次訓練的實施,增進對單片機的感性認識,加深對單片機理論方面的理解,掌握單片機的內部功能模塊的應用,如定時器/計數器、中斷、片內外存貯器、I/O口、串行口通訊等,了解和掌握單片機應用系統的軟硬件設計過程、方法及實現,為以后設計和實現單片機應用系統打下良好基礎。通過設計練習,以此達到鞏固、充實和綜合運用所學知識解決實際問題的目的。

(1)繪制系統原理圖;
(2)編制軟件框圖;
(3)完成詳細完整的程序清單和注釋;
(4)寫出設計小結,對在完成以上文件過程中所進行的有關步驟、設計思想、指標論證、方案確定、元器件選擇、原理分析等作出說明,并對所完成的設計作出評價,對自己整個設計工作中經驗教訓,總結收獲和今后的研修方向。
1.3設計課題選題及任務要求
本次單片機開發設計課題選題為:整數計算器
課題要求:1、實現整數的加減乘除運算;
用LCD1602顯示;
運算支持混合運算,考慮加減乘除的計算優先級;
使用Proteus軟件仿真實現
如圖1所示,選用單片機STC90C52RC作為本課題設計的核心元件,利用單片機靈活的編程設計和IO端口,及其控制的準確性。單片機的最小系統包括電源、時鐘電路、復位電路,搭建最小系統是實現單片操作的最基本的硬件電路要求。時鐘信號通常用兩種電路形式電路得到:內部震蕩方式和外部中斷方式。在引腳XTAL1和XTAL2外部接晶振電路器(簡稱晶振)或陶瓷晶振器,就構成了內部晶振方式。由于單片機內部有一個高增益反相放大器,當外接晶振后,就構成了自激振蕩器并產生振蕩時鐘脈沖。內部振蕩方式的外部電路的起振電容值一般在5~30pf, 晶振頻率的典型值為12MHz,采用6MHz的情況也比較多。由于程序上需要使用串口工作在11920的波特率,為了更好地匹配該波特率,晶振采用11.0592MHz的晶振而不是常用的12MHz晶振。內部振蕩方式所得的時鐘信號比較穩定實用。顯示部分則用用PO口接上拉電阻再接LCD液晶顯示器,用P2.0接使能端EN,P2. 1接讀寫信號RW, P2.2接寄存器選擇端口RS,再接.上一個滑動變阻器來調節LCD。按鍵部分實際上就是把每個按鍵所對應的值經過處理后發給單片機,再在單片機內把數字當作指針指向所對應的數字或運算符。

2.2 具體功能模塊電路設計

1)LCD1602液晶顯示電路

圖2 LCD液晶顯示電路

如圖2所示,為了便于計算器的計算過程以及結果的顯示,方案采用了LCD1602的液晶來顯示。使用液晶比數碼管的優勢很多,占用較少的I0口、更低的功耗、更簡單的控制過程、更強大的顯示能力。由于液晶顯示器每一一個點在收到信號后就一直保持那種色彩和亮度,恒定發光,而不像陰極射線管顯示器(CRT)那樣需要不斷刷新新亮點。因此,液晶顯示器畫質高且不會閃爍,通過顯示屏上的電極控制液晶分子狀態來達到顯示的目的,在重量上比相同顯示面積的傳統顯示器要輕得多,相對而言,液晶顯示器的功耗主要消耗在其內部的電極和驅動IC上,因而耗電量比其它顯示器也要要少得多。原理是利用液晶的物理特性,通過電壓對其顯示區域進行控制,有電就有顯示,這樣即可以顯示出圖形。

2)矩陣鍵盤輸入

圖3 矩陣鍵盤

鍵盤是單片機系統中最常用的人機對話輸入設備,用戶通過鍵盤向單片機輸入數據或指令。鍵盤控制程序需完成的任務有:監測是否有鍵按下,有鍵按下時,在無硬件去抖的動電路時,應用軟件延時方法消除按鍵抖動影響;當有多個鍵同時按下時,只處理一一個按鍵,不管一次按鍵持續多長時間,僅執行一次按鍵功能程序。

矩陣按鍵掃描程序是一種節省I0口的方法,按鍵數目越多節省I0口就越可觀,思路:先判斷某一列(行)是否有按鍵按下,再判斷該行(列)是那-一只鍵按下。但是,在程序的寫法上,采用了最簡單的方法,使得程序效率最高。本程序中,如果檢測到某鍵按下了,就不再檢測其它的按鍵,這完全能滿足絕大多數需要,又能節省大量的CPU時間。

本鍵盤掃描程序的優點在于:不用專門的按鍵延時程序,提高了CPU 效率,也不用中斷來掃描鍵盤,節省了硬件資源。另外,本鍵盤掃描程序,每次掃描占用CPU時最短,不論有鍵按下或者無鍵按下都可以在很短的時間完成一次掃描。

6)最小單片機系統

圖4 最小單片機系統

STC89C52單片機性能穩定,擁有1.4KBytc程序存儲器,內置兩個16位定時計數器,利用單片機周期工作,方便控制且可靠性高,無需再擴展外部存儲器,并且可將4個并行口全部作為輸入/輸出接口使用。CPU模塊主要依靠 AT89C52單片機強大的I/O口讀寫功能通過地址線和數據線實現對其他各模塊工作的管理。包含了全雙工串行接口,方便與電腦或其它終端通信。STC89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2 個讀寫口線,AT89C52可以按照常規方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的 Flash存儲器可有效地降低開發成本。

3. 程序設計
3.1 程序結構
圖5 程序結構框圖
程序過程為:開始時,LCD初始化,LCD右邊顯示“0.”,接下來向液晶屏輸入命令子函數以及數據子函數,通過在液晶屏上顯示數組元素和字符串子函數,把數據顯示出來,然后判斷數據是否顯示完,若顯示完則返回,若沒有則繼續傳送命令和數據。該系統程序主要由輸入模塊、運算模塊和顯示模塊組成。編程是分模塊來調試,這樣方便調試方面修改,最后把各個模塊集合起來聯調。這也是編程調試中最重要的一個環節也是最耗時的。

3.2具體功能程序設計
1)主程序

圖6 主程序結構框圖

系統主程序主要處理各模塊程序,開始時先執行初始化,將顯示模塊和按鍵模塊初始化。接著當按鍵按下去時進行判斷如果有按鍵按下則一方面輸出按下的數字一方面將信息傳遞給數字、字符處理模塊,接著由處理模塊輸出給顯示器。

  • 運算模塊
7 運算子程序結構框圖
運算模塊是根據你輸入的運算符來運算你輸入數據的結果。此系統有三個運算符(平方、開方和階乘)只要就按下運算符就直接得到運算結果,剩下的運算都是等“=”按下之后才顯示出結果。其中開方和X的n次方是調用了集成環境的math函數。此系統的運算只在整數的基礎上運算。流程圖如上。
4.系統運行或調試
4.1功能電路調試
1)加法的運算調式

圖8 加法運算示例

當正常開機后直接按鍵依次輸入“15+6=”之后即可顯示“=21”的字樣。如果輸入錯誤需要重新輸入的話按鍵盤上對應的“C”鍵即可清除。

  • 乘法的運算調試
圖9 乘法運算示例

和加法的運算過程相同,當正常開機后直接按鍵依次輸入“56*8=”之后即可顯示“=448”的字樣。如果輸入錯誤需要重新輸入的話按鍵盤上對應的“C”鍵即可清除。


4.2系統綜合調試

圖10 實物圖
由于只支持整數的運算,當在進行除法時運算結果為小數時會報錯顯示“ERROR”的字樣。這是一個不足之處,此后需要再代碼中完善此功能。當給此單片機輸入hex工程文件后單片機內的ROM會將程序保存下來。也就是說第一次運行成功之后每次需要用時只需接通電源即可自動運行。
                              總結
通過這次單片機設計實訓,讓我更加深刻掌握了51單片機的原理和做實物PCB板的過程,同時也讓我學習了做一個完整的項目所需要的知識與技能。本次實訓我選擇的是計算器項目。剛拿到這項目時我還沒有太多的想法,后來查閱了一下相關資料,就慢慢地有自己的思路和想法。后來就開始著手于這次的設計。為了提高效率和成功率了,先通過軟件來仿真調試電路及軟件。在軟件.上就比較容易完成電路的連接和調試,編寫的程序也可以在仿真電路上調試,方便快捷。有了調好的仿真圖及程序,再做PCB板來,根據實物再調試。這樣會有事半功倍的效果。此項目的程序讓我最費時的是變化的顯示位數,即根據你輸入數的位數或運算出來的結果判定其數的位數來動態掃描顯示。經過反復的調試,最后發現問題出在兩行程序的位置處,只更換這兩行的位置就有不一樣的效果。所以,有些時候不單看程序的邏輯、指令等,也要換一下思維,從別的方面考慮考慮,要各方面都要想好,要嚴謹行事。調好了軟件就開始做硬件了,由于之前有過做硬件的檢驗,所以做起硬件來就很嫻熟。最后就是實物的調試了。有個很現實的問題,就是軟件仿真的板子不能完成仿真出實物的情況。所以最后面還是要結合實物來調一下程序。
這次實訓我真的學到了很多知識,也更清楚地知道實踐要有扎實的理論基礎,這樣才能引導實踐,更快地完成項目。
附錄A完整電路圖
圖11 完整電路圖
完整程序
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. sbit pinRS=P2^6;
  9. sbit pinRW=P2^5;
  10. sbit pinE=P2^7;
  11. #define pindata P0
  12. #define clearscreen() writeinstruc(0x01)
  13. #define cursorreturn() writeinstruc(0x02)
  14. #define inputmode(temp) writeinstruc(temp)
  15. #define dispcontrol(temp) writeinstruc(temp)
  16. #define dispshift(temp) writeinstruc(temp)
  17. #define functionset(temp) writeinstruc(temp)
  18. #define setCGRAM_Add(address) writeinstruc(0x40|address)
  19. #define setDDRAM_Add(address) writeinstruc(0x80|address)
  20. #define uchar unsigned char
  21. uchar k=0,result1;
  22. void shortdelay(uchar i)
  23. {
  24. for(;i>0;i--);
  25. }
  26. void longdelay(uint i)
  27. {
  28. uint j;
  29. for(;i>0;i--)
  30. {for(j=100;j>0;j--);}
  31. }
  32. void delay(int i)
  33. {int j;
  34. for(;i>0;i--)
  35.    for(j=0;j<100;j++);
  36. }
  37. void io_init()
  38. {P1=0xff;
  39. }
  40. unsigned char key_scan()
  41. { unsigned char key;
  42.   unsigned char temp;
  43.   uint flag;
  44.   io_init();
  45.    P1=0xf0;
  46.    flag=0;
  47. loop: temp=P1^0xf0;
  48.    while(temp)
  49.     {
  50.      P1=0xfe;
  51.      delay(1);
  52.      if((P1&0xfe)!=0xfe)
  53.      switch(P1)
  54.      {
  55.      case 0xee: key=0x11;flag=1;break;
  56.      case 0xde: key=0x12;flag=1;break;
  57.      case 0xbe: key=0x13;flag=1;break;
  58.      case 0x7e: key=0x14;flag=1;break;
  59.      }
  60.   if(flag)
  61.   goto exit;
  62.   else
  63.      P1=0xfd;
  64.      delay(1);
  65.      if((P1&0xfd)!=0xfd)
  66.      switch(P1)
  67.      {
  68.      case 0xed: key=0x21;flag=1;break;
  69.      case 0xdd: key=0x22;flag=1;break;
  70.      case 0xbd: key=0x23;flag=1;break;
  71.      case 0x7d: key=0x24;flag=1;break;
  72.      }
  73.      if(flag)
  74.   goto exit;
  75.   else
  76.      P1=0xfb;
  77.      delay(1);
  78.      if((P1&0xfb)!=0xfb)
  79.      switch(P1)
  80.      {
  81.      case 0xeb: key=0x31;flag=1;break;
  82.      case 0xdb: key=0x32;flag=1;break;
  83.      case 0xbb: key=0x33;flag=1;break;
  84.      case 0x7b: key=0x34;flag=1;break;
  85.      }
  86.      if(flag)
  87.   goto exit;
  88.   else
  89.   P1=0xf7;
  90.      delay(1);
  91.      if((P1&0xf7)!=0xf7)
  92.      switch(P1)
  93.      {
  94.      case 0xe7: key=0x41;flag=1;break;
  95.      case 0xd7: key=0x42;flag=1;break;
  96.      case 0xb7: key=0x43;flag=1;break;
  97.      case 0x77: key=0x44;flag=1;break;
  98.      }

  99. exit: return key;
  100.    }
  101.   if(temp==0)
  102.   goto loop;
  103.   }
  104. void initpindata(bit i)
  105. {
  106. if(i==1) pindata=0xff;
  107. else pindata=0X00;
  108. }
  109. void setRS(bit i)
  110. {
  111. ..........限于篇幅見word文檔..................
復制代碼

以上的Word格式文檔51黑下載地址:
單片機開發技能訓練51hei.doc (867.38 KB, 下載次數: 11)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表