課程設(shè)計(jì)---單片機(jī)簡(jiǎn)易計(jì)算器設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  一、設(shè)計(jì)要求</b></p><p>  1.設(shè)計(jì)4*4的鍵盤,其中10個(gè)數(shù)字鍵0~9,其余6個(gè)為“+” “-” “*”“/” “=”和“C”</p><p>  2.設(shè)計(jì)2位LED接口電路</p><p>  3.實(shí)現(xiàn)1位數(shù)的簡(jiǎn)單運(yùn)算</p><p><b>  二、硬件系統(tǒng)設(shè)計(jì)

2、</b></p><p><b>  1、LED接口電路</b></p><p>  簡(jiǎn)易計(jì)算器需要2位8段碼LED顯示電路。用8031單片機(jī)經(jīng)8255A擴(kuò)展2位8段碼LED顯示器,用8255A的A口作為段碼(字形代碼)數(shù)據(jù)口,PB0和PB1作為位控制端口。在位控制口加集電極開路的反相高壓驅(qū)動(dòng)器74LS06以提供驅(qū)動(dòng)LED顯示器所需的足夠大的電流,然后接至

3、各數(shù)碼顯示器的共陰極端。同理,在段碼數(shù)據(jù)口集電極開路的正相高壓驅(qū)動(dòng)器74LS07提供足夠大的電流,然后接到數(shù)碼顯示器的各段。邏輯電路結(jié)構(gòu)如下:</p><p><b>  2、鍵盤接口電路</b></p><p>  簡(jiǎn)易計(jì)算器需要4*4的行列式鍵盤。用8031單片機(jī)經(jīng)8255A擴(kuò)展4*4行列式鍵盤,8255A的B口和C口用于擴(kuò)展鍵盤接口,B口高4位作為輸出口,C口低

4、4位作為輸入口。邏輯電路結(jié)構(gòu)如下:</p><p>  3、計(jì)算器邏輯電路圖</p><p>  將LED接口電路和鍵盤接口電路結(jié)合到一起就是簡(jiǎn)易計(jì)算器的邏輯電路圖,如下:</p><p><b>  三、軟件設(shè)計(jì)</b></p><p>  1、LED顯示程序設(shè)計(jì)</p><p>  LED顯示

5、器由七段發(fā)光二極管組成,排列成8字形狀,因此也成為七段LED顯示器,器排列形狀如下圖所示:</p><p>  為了顯示數(shù)字或符號(hào),要為L(zhǎng)ED顯示器提供代碼,即字形代碼。七段發(fā)光二極管,再加上一個(gè)小數(shù)點(diǎn)位,共計(jì)8段,因此提供的字形代碼的長(zhǎng)度正好是一個(gè)字節(jié)。簡(jiǎn)易計(jì)算器用到的數(shù)字0~9的共陰極字形代碼如下表:</p><p>  0~9七段數(shù)碼管共陰級(jí)字形代碼</p><p

6、>  2位LED顯示的程序框圖如下:</p><p>  2、讀鍵輸入程序設(shè)計(jì)</p><p>  為了實(shí)現(xiàn)鍵盤的數(shù)據(jù)輸入功能和命令處理功能,每個(gè)鍵都有其處理子程序,為此每個(gè)鍵都對(duì)應(yīng)一個(gè)碼——鍵碼。為了得到被按鍵的鍵碼,現(xiàn)使用行掃描法識(shí)別按鍵。其程序框圖如下:</p><p><b>  3、主程序設(shè)計(jì)</b></p>&l

7、t;p>  (1)數(shù)值送顯示緩沖程序設(shè)計(jì)</p><p>  簡(jiǎn)易計(jì)算器所顯示的數(shù)值最大位兩位。要顯示數(shù)值,先判斷數(shù)值正負(fù),如果是負(fù)值,則符號(hào)位顯示“-”,然后將數(shù)值除以10,余數(shù)送顯最最低位,判斷商是否為0,若為0則返回,若不為0,則將商除以10,將余數(shù)送顯高位。程序框圖如下:</p><p> ?。?)運(yùn)算主程序設(shè)計(jì)</p><p>  首先初始化參數(shù),送

8、LED低位顯示“0”,高位不顯示。然后掃描鍵盤看是否有鍵輸入,若有,讀取鍵碼。判斷鍵碼是數(shù)字鍵、清零鍵還是功能鍵(“+”“-”“*”“/”“=” ),是數(shù)值鍵則送LED顯示并保存數(shù)值,是清零鍵則做清零處理,是功能鍵則又判斷是“=”還是運(yùn)算鍵,若是“=”則計(jì)算最后結(jié)果并送LED顯示,若是運(yùn)算鍵則保存相對(duì)運(yùn)算程序的首地址。運(yùn)算主程序框圖如下所示:</p><p>  4、簡(jiǎn)易計(jì)算器源程序</p><

9、;p>  OUTBIT equ 07FFDh ; 位控制口</p><p>  OUTSEG equ 07FFCh ; 段控制口</p><p>  IN equ 07FFEh ; 鍵盤讀入口</p><p>  data1 equ 70h</p><p>  data2 equ 71h</p

10、><p>  dizhi1 equ 72h</p><p>  dizhi2 equ 73h</p><p>  LEDBuf equ 60h ; 顯示緩沖</p><p>  ljmp Start</p><p>  LEDMAP: ; 八段管顯示碼</p>

11、<p>  db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h</p><p>  db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h</p><p>  Delay: ; 延時(shí)子程序</p><p>  mov r7, #0</p>

12、<p>  DelayLoop:</p><p>  djnz r7, DelayLoop</p><p>  djnz r6, DelayLoop</p><p><b>  ret</b></p><p>  DisplayLED:</p><p>  mov r0, #LE

13、DBuf</p><p>  mov r1, #2 ; 共2個(gè)八段管</p><p>  mov r2, #00000010b ; 從左邊開始顯示</p><p><b>  Loop:</b></p><p>  mov dptr, #OUTBIT</p><p>

14、;  mov a, #0</p><p>  movx @dptr, a ; 關(guān)所有八段管</p><p>  mov a, @r0</p><p>  mov dptr, #OUTSEG</p><p>  movx @dptr, a</p><p>  mov dptr, #OUT

15、BIT</p><p>  mov a, r2</p><p>  movx @dptr, a ; 顯示一位八段管</p><p>  mov r6, #1</p><p>  call Delay</p><p>  mov a, r2 ; 顯示下一位</p&g

16、t;<p><b>  rr a</b></p><p>  mov r2, a</p><p><b>  inc r0</b></p><p>  djnz r1, Loop</p><p><b>  ret</b></p>&

17、lt;p><b>  TestKey:</b></p><p>  mov dptr, #OUTBIT</p><p>  mov a, #0</p><p>  movx @dptr, a ; 輸出線置為0</p><p>  mov dptr, #IN</p><

18、p>  movx a, @dptr ; 讀入鍵狀態(tài)</p><p><b>  cpl a</b></p><p>  anl a, #0fh ; 高四位不用</p><p><b>  ret</b></p><p>  KeyTable:

19、 ; 鍵碼定義</p><p>  db 0dh, 0ch, 0bh, 0ah</p><p>  db 0eh, 03h, 06h, 09h</p><p>  db 0fh, 02h, 05h, 08h</p><p>  db 00h, 01h, 04h, 07h</p>

20、<p><b>  GetKey:</b></p><p>  mov dptr, #OUTBIT</p><p>  mov P2, dph</p><p>  mov r0, #Low(IN)</p><p>  mov r1, #00100000b</p><p>

21、  mov r2, #4</p><p><b>  KLoop:</b></p><p>  mov a, r1 ; 找出鍵所在列</p><p><b>  cpl a</b></p><p>  movx @dptr, a</p><p&g

22、t;<b>  cpl a</b></p><p><b>  rr a</b></p><p>  mov r1, a ; 下一列</p><p>  movx a, @r0</p><p><b>  cpl a</b></p&

23、gt;<p>  anl a, #0fh</p><p>  jnz Goon1 ; 該列有鍵入</p><p>  djnz r2, KLoop</p><p>  mov r2, #0ffh ; 沒(méi)有鍵按下, 返回 0ffh</p><p>  sjmp Exit</p&

24、gt;<p><b>  Goon1:</b></p><p>  mov r1, a ; 鍵值 = 列 X 4 + 行</p><p>  mov a, r2</p><p><b>  dec a</b></p><p><b>  rl

25、 a</b></p><p><b>  rl a</b></p><p>  mov r2, a ; r2 = (r2-1)*4</p><p>  mov a, r1 ; r1中為讀入的行值</p><p>  mov r1, #4</p

26、><p><b>  LoopC:</b></p><p>  rrc a ; 移位找出所在行</p><p>  jc Exit</p><p>  inc r2 ; r2 = r2+ 行值</p><p>  djnz r1,

27、LoopC</p><p><b>  Exit:</b></p><p>  mov a, r2 ; 取出鍵碼</p><p>  mov dptr, #KeyTable</p><p>  movc a, @a+dptr</p><p>  mov r2, a

28、</p><p>  WaitRelease:</p><p>  mov dptr, #OUTBIT ; 等鍵釋放</p><p><b>  clr a</b></p><p>  movx @dptr, a</p><p>  mov r6, #10</p>&

29、lt;p>  call Delay</p><p>  call TestKey</p><p>  jnz WaitRelease</p><p>  mov a, r2</p><p><b>  ret</b></p><p><b>  Start:</b

30、></p><p>  mov sp, #40h</p><p>  mov LEDBuf+0, #0</p><p>  mov LEDBuf+1, #03fh</p><p>  mov dptr, #7FFFh</p><p>  mov a, #89h</p><

31、p>  movx @dptr, a</p><p><b>  MLoop:</b></p><p>  call DisplayLED ; 顯示</p><p>  call TestKey ; 有鍵入?</p><p>  jz MLoop ;

32、無(wú)鍵入, 繼續(xù)顯示</p><p>  call GetKey ; 讀入鍵碼</p><p><b>  Jisuan:</b></p><p>  mov r3, a</p><p>  cjne r3, #0fh, Qita ;判斷是否為清零鍵?</p><p>

33、;  mov r3, #00h ;清零</p><p>  mov r4, #00h</p><p>  mov r5, #00h</p><p>  mov data1, #00h</p><p>  mov data2, #00h</p><p>  mov dizhi1

34、, #00h</p><p>  mov dizhi2, #00h</p><p>  mov LEDBuf+0, #0</p><p>  mov LEDBuf+1, #03fh</p><p>  ljmp MLoop</p><p>  Qita: clr c</p><p

35、>  cjne r3, #0ah ,follow ;判斷是數(shù)字鍵還是功能鍵?</p><p><b>  follow:</b></p><p>  jc Shuzi</p><p><b>  ljmp Gn</b></p><p>  Shuzi: mov a, r4

36、 ;判斷是否已有運(yùn)算符輸入,沒(méi)有就將數(shù)值存在</p><p>  jnz Shuzi2 data1,有就將數(shù)值存在data2</p><p>  mov a, r3</p><p>  mov data1, a</p><p>  ljmp Xs ;顯示第一次輸入的

37、數(shù)值</p><p><b>  Shuzi2:</b></p><p>  mov a, r3</p><p>  mov data2, a</p><p>  ljmp Xs ;顯示第二次輸入的數(shù)值</p><p>  Gn: mov r4, #

38、01h ;將01h給r4,說(shuō)明已有運(yùn)算符輸入</p><p>  cjne r3, #0eh, Ja ;判斷鍵值是否為“=”?</p><p>  mov r4, #00h ;將r4清零</p><p>  mov a, dizhi1 ;執(zhí)行“=”</p><p>  mov dph

39、, a</p><p>  mov a, dizhi2</p><p>  mov dpl, a</p><p>  mov a, #00h</p><p>  jmp @a+dptr ;轉(zhuǎn)到本次輸入的算法程序</p><p>  Ja: cjne r3, #0ah, Jn

40、 ;若鍵值為“+”則將“+”的程序首地址存在</p><p>  mov dptr, #Jia dizhi1和dizhi2中</p><p>  mov a, dph</p><p>  mov dizhi1, a</p><p>  mov a, dpl</p><p>  m

41、ov dizhi2, a</p><p>  ljmp MLoop </p><p>  Jn: cjne r3, #0bh, Ce ;若鍵值為“-”則將“-”的程序首地址存</p><p>  mov dptr, #Jian dizhi1和dizhi2中</p><p>  mov

42、a, dph</p><p>  mov dizhi1, a</p><p>  mov a, dpl</p><p>  mov dizhi2, a</p><p>  ljmp MLoop </p><p>  Ce: cjne r3, #0ch, Cu ;若鍵值

43、為“*”則將“*”的程序首地址存在</p><p>  mov dptr, #Cheng dizhi1和dizhi2中</p><p>  mov a, dph</p><p>  mov dizhi1, a</p><p>  mov a, dpl</p><p>  mov diz

44、hi2, a</p><p>  ljmp MLoop </p><p>  Cu: cjne r3, #0dh, Zhuan ;若鍵值為“/”則將“/”的程序首地址存在</p><p>  mov dptr, #chu dizhi1和dizhi2中</p><p>  mov a, dp

45、h</p><p>  mov dizhi1, a</p><p>  mov a, dpl</p><p>  mov dizhi2, a</p><p>  Zhuan: ljmp MLoop </p><p>  Jia: mov a, data1 ;加法

46、程序</p><p>  add a, data2</p><p><b>  ljmp Xs</b></p><p>  Jian: mov a, data1 ;減法程序</p><p>  subb a, data2</p><p><b>  ljm

47、p Xs</b></p><p>  Cheng: mov a, data1 ;乘法程序</p><p>  mov b, data2</p><p><b>  mul ab</b></p><p><b>  ljmp Xs</b></p>

48、<p>  Chu: mov a, data1 ;除法程序</p><p>  mov b, data2</p><p><b>  div ab</b></p><p>  Xs: mov b, #10 ;顯示個(gè)位數(shù)字</p><p><b

49、>  div ab</b></p><p>  mov r5, a</p><p>  mov a, b</p><p>  mov dptr,#LEDMap</p><p>  movc a, @a+dptr</p><p>  mov LEDBuf+1,a</p>

50、;<p>  mov a, r5</p><p><b>  First:</b></p><p>  cjne a,#0,Next</p><p>  ljmp MLoop ;運(yùn)算完后繼續(xù)掃描鍵盤</p><p><b>  Next:</b></p

51、><p>  mov b,#10 ;顯示十位數(shù)字</p><p><b>  div ab</b></p><p>  mov r5, a</p><p>  mov a, b</p><p>  mov dptr, #LEDMap</p><

52、;p>  movc a, @a+dptr</p><p>  mov LEDBuf+0, a</p><p>  mov a, r5</p><p>  ljmp First</p><p><b>  end</b></p><p>  四、系統(tǒng)調(diào)試與存在的問(wèn)題</p&

53、gt;<p>  1.在打開一個(gè)程序要進(jìn)行編譯運(yùn)行時(shí),要在項(xiàng)目中打開它,而不是單單以一個(gè)文件的形式打開。</p><p>  2.打開WAVE6000后,需要對(duì)仿真器進(jìn)行設(shè)置,然后才能用其對(duì)所編程序進(jìn)行編譯并執(zhí)行。</p><p>  3.試驗(yàn)箱上提供的6位的LED顯示器和4*6的鍵盤,而簡(jiǎn)易計(jì)算器只用兩位LED顯示器和4*4鍵盤,所以必須用軟件方法把前4位LED和鍵盤后2列

54、屏蔽掉。</p><p>  4. 十位上的LED顯示管有數(shù)字時(shí)才顯示,沒(méi)有數(shù)字時(shí)不顯示,而不是顯示“0”,做清零操作后LED顯示器個(gè)位顯示“0”,而全部關(guān)閉不顯示。</p><p><b>  五、心得體會(huì)</b></p><p>  課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn)、提出、分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)學(xué)生實(shí)際工作

55、能力的具體訓(xùn)練和考察過(guò)程。隨著科學(xué)技術(shù)發(fā)展的日新日異,單片機(jī)已經(jīng)成為當(dāng)今計(jì)算機(jī)應(yīng)用中空前活躍的領(lǐng)域, 在生活中可以說(shuō)得是無(wú)處不在。因此作為電子信息工程專業(yè)的學(xué)生來(lái)說(shuō)掌握單片機(jī)的開發(fā)技術(shù)是十分重要的。 我的題目是簡(jiǎn)易計(jì)算器,對(duì)于我們這些實(shí)踐中的新手來(lái)說(shuō),這是一次考驗(yàn)。怎么才能找到課堂所學(xué)與實(shí)際應(yīng)用的最佳結(jié)合點(diǎn)?怎樣讓自己的業(yè)余更接近專業(yè)?怎樣讓自己的計(jì)劃更具有序性,而不會(huì)忙無(wú)一用?這都是我們所要考慮和努力的。這次課程設(shè)計(jì)我學(xué)到很多

56、很多的東西,學(xué)會(huì)了怎么樣去制定計(jì)劃,怎么樣去實(shí)現(xiàn)這個(gè)計(jì)劃,并掌握了在執(zhí)行過(guò)程中怎么樣去克服心理上的不良情緒。不僅鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書本上所沒(méi)有學(xué)到過(guò)的知識(shí),掌握了一種系統(tǒng)的研究方法,可以進(jìn)行一些簡(jiǎn)單的編程。通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。同時(shí)在設(shè)計(jì)的

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論