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

標(biāo)題: 整數(shù)計算器 單片機(jī)開發(fā)技能訓(xùn)練 [打印本頁]

作者: ERWF    時間: 2021-7-5 00:08
標(biāo)題: 整數(shù)計算器 單片機(jī)開發(fā)技能訓(xùn)練
通過本次訓(xùn)練的實施,增進(jìn)對單片機(jī)的感性認(rèn)識,加深對單片機(jī)理論方面的理解,掌握單片機(jī)的內(nèi)部功能模塊的應(yīng)用,如定時器/計數(shù)器、中斷、片內(nèi)外存貯器、I/O口、串行口通訊等,了解和掌握單片機(jī)應(yīng)用系統(tǒng)的軟硬件設(shè)計過程、方法及實現(xiàn),為以后設(shè)計和實現(xiàn)單片機(jī)應(yīng)用系統(tǒng)打下良好基礎(chǔ)。通過設(shè)計練習(xí),以此達(dá)到鞏固、充實和綜合運用所學(xué)知識解決實際問題的目的。

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

2.2 具體功能模塊電路設(shè)計

1)LCD1602液晶顯示電路

圖2 LCD液晶顯示電路

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

2)矩陣鍵盤輸入

圖3 矩陣鍵盤

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

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

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

6)最小單片機(jī)系統(tǒng)

圖4 最小單片機(jī)系統(tǒng)

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

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

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

圖6 主程序結(jié)構(gòu)框圖

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

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

圖8 加法運算示例

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

圖9 乘法運算示例

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


4.2系統(tǒng)綜合調(diào)試

圖10 實物圖
由于只支持整數(shù)的運算,當(dāng)在進(jìn)行除法時運算結(jié)果為小數(shù)時會報錯顯示“ERROR”的字樣。這是一個不足之處,此后需要再代碼中完善此功能。當(dāng)給此單片機(jī)輸入hex工程文件后單片機(jī)內(nèi)的ROM會將程序保存下來。也就是說第一次運行成功之后每次需要用時只需接通電源即可自動運行。
                              總結(jié)
通過這次單片機(jī)設(shè)計實訓(xùn),讓我更加深刻掌握了51單片機(jī)的原理和做實物PCB板的過程,同時也讓我學(xué)習(xí)了做一個完整的項目所需要的知識與技能。本次實訓(xùn)我選擇的是計算器項目。剛拿到這項目時我還沒有太多的想法,后來查閱了一下相關(guān)資料,就慢慢地有自己的思路和想法。后來就開始著手于這次的設(shè)計。為了提高效率和成功率了,先通過軟件來仿真調(diào)試電路及軟件。在軟件.上就比較容易完成電路的連接和調(diào)試,編寫的程序也可以在仿真電路上調(diào)試,方便快捷。有了調(diào)好的仿真圖及程序,再做PCB板來,根據(jù)實物再調(diào)試。這樣會有事半功倍的效果。此項目的程序讓我最費時的是變化的顯示位數(shù),即根據(jù)你輸入數(shù)的位數(shù)或運算出來的結(jié)果判定其數(shù)的位數(shù)來動態(tài)掃描顯示。經(jīng)過反復(fù)的調(diào)試,最后發(fā)現(xiàn)問題出在兩行程序的位置處,只更換這兩行的位置就有不一樣的效果。所以,有些時候不單看程序的邏輯、指令等,也要換一下思維,從別的方面考慮考慮,要各方面都要想好,要嚴(yán)謹(jǐn)行事。調(diào)好了軟件就開始做硬件了,由于之前有過做硬件的檢驗,所以做起硬件來就很嫻熟。最后就是實物的調(diào)試了。有個很現(xiàn)實的問題,就是軟件仿真的板子不能完成仿真出實物的情況。所以最后面還是要結(jié)合實物來調(diào)一下程序。
這次實訓(xùn)我真的學(xué)到了很多知識,也更清楚地知道實踐要有扎實的理論基礎(chǔ),這樣才能引導(dǎo)實踐,更快地完成項目。
附錄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文檔..................
復(fù)制代碼

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





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1