《單片機應用技術》教材-任務1.1_第1頁
《單片機應用技術》教材-任務1.1_第2頁
《單片機應用技術》教材-任務1.1_第3頁
《單片機應用技術》教材-任務1.1_第4頁
《單片機應用技術》教材-任務1.1_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGE2單片機應用技術PAGE1目錄TOC\o"1-4"\h\z\u項目一流水燈控制 2任務1.1點亮最簡單的單片機系統(tǒng) 3子任務1.1.1系統(tǒng)硬件電路設計 3認識單片機 3認識單片機硬件系統(tǒng) 3分享單片機系統(tǒng)硬件電路設計經驗 4認識單片機的引腳概述 5單片機最小系統(tǒng)設計 6發(fā)光二極管外圍電路設計 8知識點小結 9課后練習 9子任務1.1.2系統(tǒng)軟件設計 10認識單片機軟件 10認識單片機匯編語言 13明確單片機如何控制P1.0口的電平 17系統(tǒng)軟件設計 18知識點小結 20課后練習 20子任務1.1.3軟件的編寫、編譯及仿真調試 21創(chuàng)建項目 21軟件仿真及調試 27知識點小結 31課后練習 31子任務1.1.4系統(tǒng)軟硬件聯(lián)合仿真 32原理圖的繪制 32軟件的添加 36軟硬件聯(lián)合仿真調試 37知識點小結 39課后練習 39PAGE2項目一流水燈控制本篇以點亮發(fā)光二極管、發(fā)光二極管閃爍及流動顯示控制等基本項目為依托,從簡單到復雜一步一步使同學掌握單片機的基本知識。通過本篇的學習要求同學能掌握單片機的引腳、存儲器結構、I/O控制、時序、中斷、內部定時器等基本概念、單片機系統(tǒng)的基本設計方法及步驟、keil及Protuse軟件的使用、匯編語言程序設計方法等入門知識。在此任務1.1點亮最簡單的單片機系統(tǒng)系統(tǒng)功能要求設計一個最簡單的單片機系統(tǒng),編程控制發(fā)光二極管的亮滅。具體要求完成:單片機最小系統(tǒng)的設計LED外圍電路的設計匯編程序的編寫軟硬件的仿真調試教學目標掌握單片機最小系統(tǒng)的概念及設計掌握單片機I/O口的控制方法掌握發(fā)光二極管發(fā)光原理及驅動電路設計掌握單片機特殊功能寄存器PC、ACC、P0~P3等的概念理解單片機指令的執(zhí)行過程掌握單片機軟件開發(fā)流程掌握單片機匯編程序設計的基本方法掌握部分單片機匯編指令及偽指令的使用熟悉Keil集成開發(fā)環(huán)境的基本使用方法熟悉Protues仿真軟件的基本使用方法子任務1.1.1系統(tǒng)硬件電路設計圖1-1-1單片機系統(tǒng)構成復位電路ISP下載電路電源電路晶振電路單片機圖1-1-1單片機系統(tǒng)構成復位電路ISP下載電路電源電路晶振電路單片機外圍電路認識單片機硬件系統(tǒng)在設計單片機應用系統(tǒng)之前,我們首先要搞清楚什么是單片機硬件系統(tǒng)以及它有哪幾部分電路構成。如圖1-1單片機單片機是系統(tǒng)的核心器件,系統(tǒng)功能的實現(xiàn)都是通過單片機執(zhí)行程序來完成的,它是整個系統(tǒng)的大腦,實現(xiàn)了系統(tǒng)的智能化。電源電路單片機要工作,首先應該能夠獲得能量,電源就像我們吃的食物,將給單片機源源不斷地提供工作所需能量。時鐘電路數(shù)字電路課程中學習移位寄存器、定時器等電路時我們就知道,這些電路必須在時鐘信號(一些列方波信號)的配合下才能完成移位、定時、計數(shù)等功能。同樣,作為典型的數(shù)字器件,單片機也必須在時鐘信號的配合下,才能完成相應的工作,它相當于人的脈搏。復位電路復位就是我們PC機的開機或重啟,當PC開機或重啟后程序會重新開始運行。復位電路包括上電復位電路和按鍵復位電路兩部分。當單片機上電時,上電復位電路將告訴單片機應該從哪開始執(zhí)行程序;單片機系統(tǒng)的工作環(huán)境往往比較復雜,這將會引起某些程序故障,此時按下復位鍵,按鍵復位電路將使單片機從新開始執(zhí)行程序,從而排除故障。ISP(InSystemProgramming)電路ISP即在系統(tǒng)編程,所謂編程,就是將寫好的程序存放到單片機系統(tǒng)的ROM中的過程。傳統(tǒng)的編程方法需要專門的編程器,必須將ROM從單片機系統(tǒng)板上取出并插到編程器上才能進行,非常麻煩且容易損壞器件。ISP是一種無需將程序存儲芯片(如FlashROM)從單片機系統(tǒng)板上取出就能對其進行編程的過程。系統(tǒng)板上需要制作專門的ISP電路才能完成在系統(tǒng)編程任務。外圍電路外圍電路主要指單片機的輸入、輸出電路,輸入電路相當于我們的眼睛、鼻子、耳朵等感知器官,而輸出電路相當于我們的手和腳,單片機可以通過輸入電路獲得不同的控制信號去控制輸出電路中輸出設備的動作。比如鍵盤就是一種典型的輸入設備,而我們本系統(tǒng)所要控制的發(fā)光二極管就是其中的一種輸出設備,當我們按不同的鍵時,設計好的單片機程序就可以根據(jù)我們的按鍵情況控制某些發(fā)光二極管的亮滅。輸入電路主要包括鍵盤電路、模擬信號采集電路、觸摸屏、攝像頭、GPS接收器、紅外線接收電路等等,輸出電路主要有顯示電路、發(fā)聲電路、電機控制電路、繼電器輸出電路、紅外線發(fā)射電路等等。其中,單片機、電源電路、時鐘電路和復位電路是每一個單片機系統(tǒng)所必須的基本電路,有了這些基本電路,單片機就可以工作了,它們共同構成單片機最小系統(tǒng)。外圍電路則根據(jù)不同的系統(tǒng)功能要求進行設計,比如本系統(tǒng)要點亮發(fā)光二極管,則發(fā)光二極管電路就是我們的外圍電路。分享單片機系統(tǒng)硬件電路設計經驗單片機系統(tǒng)是一個比較復雜的智能系統(tǒng),由硬件和軟件兩部分組成。作為硬件電路的設計相對簡單一些,但要設計出性能優(yōu)越的單片機系統(tǒng)還是比較困難。在此,就學習單片機系統(tǒng)設計過程中所體會的幾點經驗跟大家分享:1.具備模電、數(shù)電等基礎知識,知道如何查閱和設計一些基本電路;2.具備從簡單到復雜、模塊化設計的思路;3.認真學好單片機等所需芯片的原理及硬件特征;4.掌握至少一種硬件仿真軟件的使用;5.熟練掌握各種儀器儀表及工具的使用;6.最重要的一點就是一定要動手焊板子、調板子,在做的過程中體驗學習的快樂。認識單片機的引腳概述圖1-1-2AT89S51單片機引腳要搭建單片機系統(tǒng)硬件電路,首先應該掌握的就是單片機的引腳及其功能。但由于AT89S51單片機的引腳有40個之多(如圖圖1-1-2AT89S51單片機引腳電源引腳VCC(40腳)和GND(20腳),外部電源將從這兩個引腳送入單片機。我們將5V電源正極接到VCC,負極接到GND就構成了單片機系統(tǒng)的電源電路。2.時鐘引腳XTAL1(19腳)和XTAL2(18腳),晶體振蕩器或外部時鐘信號接到該引腳上就構成了單片機的時鐘電路。復位引腳RST(9腳),當該引腳上保持一段時間的高電平后,單片機就會產生復位。通用I/O(Input/Output)口P0口(32~39腳)、P1口(1~8腳)、P2口(21~28腳)、P3口(10~17腳),分為4組,每組8個I/O口,共32個引腳。數(shù)據(jù)可以在這些引腳上雙向傳遞,鍵盤等輸入設備可以通過這些引腳送信息到單片機,單片機也可以從這些引腳輸出高低電平去控制發(fā)光二極管等輸出設備的工作。當然,這些引腳的輸入輸出功能都要靠執(zhí)行程序才能實現(xiàn)。需要說明的是,P0~P3口除了作為通用I/O口使用外,大部分引腳都具有第二功能,其內部電路和連線方式也都不盡相同,在以后的設計中再進行詳述ISP引腳P1口的P1.5、P1.6及P1.7除了作為通用I/O口使用外,在對單片機系統(tǒng)進行編程時,還被用作ISP串行編程(實質就是數(shù)據(jù)的串行傳送)接口。其中P1.5為MOSI引腳(MasterOutSlaveIn),稱為輸入引腳,程序由主機PC經該引腳傳到單片機系統(tǒng)ROM中;P1.6為MISO引腳(MasterInSlaveOut),稱為輸出引腳,數(shù)據(jù)經該引腳由單片機傳到主機PC;P1.7為SCK引腳(serialclock),即串行時鐘引腳,提供串行通信所必須的時鐘信號。系統(tǒng)擴展輔助引腳(29腳)、(30腳)、(31腳),這三個引腳將輔助完成系統(tǒng)的擴展,擴展包括存儲器的擴展和外設擴展,在此不再細述,需要大家必須掌握的是引腳的含義。由第一章的內容我們知道,有些單片機內部有ROM,但有些沒有或是內部ROM不夠用,而需要擴展外部ROM用以存放程序,那么我們的程序放在內部還是外部ROM呢?CPU應該從內部還是外部ROM取指令呢?引腳上的電平會告訴單片機,當我們將該引腳接高電平時,單片機將從內部取指令,而接為低電平時,則會從外部ROM取指令。由于本書所選取的AT89S51單片機內部ROM已經足夠初學者使用,我們編寫的程序都是放在內部ROM中的,所以,我們所有項目的腳都接為高電平(+5V)。 以上就是所有40各引腳的基本功能介紹,其中,對于所有的單片機系統(tǒng),電源引腳、時鐘引腳、復位引腳及腳都會用到。在本系統(tǒng)中,我們還會用到P1口,它將作為發(fā)光二極管亮滅控制信號的輸出端,當然也可以用其它三組I/O口中的任一一組來實現(xiàn)這個功能。單片機最小系統(tǒng)設計在前面的介紹中我們說過,要搭建單片機系統(tǒng)使其完成要求的功能,我們應從簡單到復雜、分模塊一步一步完成整體系統(tǒng)的設計。單片機最小系統(tǒng)就是能讓單片機工作起來的最少電路組成,有了最小系統(tǒng)后,單片機就能運行起來,再根據(jù)系統(tǒng)功能要求設計外圍功能電路就能完成整個單片機系統(tǒng)的硬件設計。所以,我們將單片機最小系統(tǒng)作為一個基礎模塊來講解,并要求大家能熟練掌握它的設計方法及原理,在以后的學習中我們會發(fā)現(xiàn),每個單片機系統(tǒng)都需要完成最小系統(tǒng)的設計。電源電路設計1).單片機系統(tǒng)需要什樣的電源電源設計本身就是一個很大的課題,一般考慮三方面因素:電源電壓、電源功率及電源管理,作為入門章節(jié),本小節(jié)要求大家掌握單片機電源電路的基本原理及設計。首先考慮電源電壓,單片機系統(tǒng)的電壓包括單片機工作的5V電壓及相關外圍電路所需電壓,如某些ADC的2.5V基準電壓及GPS的12V基準電壓等。為了簡化分析,我們在此僅為大家介紹5V電源的設計,外圍電路也選擇5V器件進行搭建。其次是電源輸出功率的問題,單片機系統(tǒng)的功耗包括單片機功耗和外圍電路功耗兩部分。單片機功耗包括芯片電流及流入、流出電流,由Atmel公司提供參數(shù)表可知AT89S51單片機的最大功耗在100mA左右,正常工作時一般為幾十個mA;外圍電路要視系統(tǒng)功能而定,但整個單片機系統(tǒng)的總功耗基本都能控制在300mA以下。至于電源管理主要是為了延長電源的一次工作時間和使用壽命,在此我們暫不考慮。2).電源設計方案有哪些電源的獲取主要有以下幾種方式:市電轉5V電源+濾波電容市電轉9V電源+7805+濾波電容直接USB供電+濾波紐扣電池+7805+濾波電容3).典型電源電路設計圖1-1-3單片機電源電路原理圖在此我們采用9V電源供電方式,此方式在需要的時候可以給系統(tǒng)提供9V電源,在市面上購買一只9V/800mA電源適配器、一個電源插座、一片LM7805、一個電解電容、一個104瓷片電容即可,其電路原理如圖1-1圖1-1-3單片機電源電路原理圖①.9V電源由市電220V供電,輸出9V電源接入電源插座;②.LM7805為一三端線性穩(wěn)壓芯片,可將9V電壓轉換為5V電壓并穩(wěn)定輸出,其輸出功率可達1A,完全滿足一般單片機系統(tǒng)的要求;③.電容C1、C2起濾波作用,通過濾波后將使單片機得到一個抗干擾能力強的穩(wěn)定電源;圖1-1-4內部時鐘方式電路④.+5V端為電源的正極,接單片機的V圖1-1-4內部時鐘方式電路時鐘電路原理及設計在單片機XTAL1和XTAL2引腳上接接一石英晶體諧振器和兩只30pF±10pF諧振電容就搭建好了內部時鐘電路(如圖1-1-4復位電路原理及設計從前面的介紹我們知道,所謂復位就是讓單片機回到初始狀態(tài),重新開始執(zhí)行程序。而復位是通過給RST引腳一段時間的高電平來實現(xiàn)的,當復位后單片機正常工作時又要求RST引腳保持低電平。為達到這一時序要求,上電復位電路往往采用如圖1-1-5ISP電路設計ISP電路電路原理如圖2-7所示單片機最小系統(tǒng)原理圖AT89S51有了單片機、電源、時鐘、復位電路及ISP下載電路后,單片機就可以運行起來了,其電路原理圖如圖2-8,其中AT89S5發(fā)光二極管外圍電路設計發(fā)光二極管怎樣才會亮發(fā)光二極管是單片機系統(tǒng)中經常使用到的一種顯示器件,只要加在發(fā)光二極管的正向電壓超出其導通壓降時開始工作,發(fā)光二極管的導通壓降一般為1.7—1.9V,此外,流過的電流要滿足該二極管的工作要求。滿足電流和電壓的要求,發(fā)光二極管就可以發(fā)光了。單片機如何與發(fā)光二極管連接單片機可以通過四組I/O引腳(P0—P3口)與外部設備進行聯(lián)系,發(fā)光二極管的負極接到P1口的某個引腳(如P1.0),正極經一470Ω電阻連到+5V電源上(如圖2-9)。當P1.0口輸出低電平(0V)時,發(fā)光二極管就能達到發(fā)光電壓電流要求而發(fā)光,但當P1.0輸出高電平(5V)時,由于二極管上壓差為0V,不滿足發(fā)光電壓要求,因而不亮。為什么要接一個電阻發(fā)光二極管發(fā)光時正向電流一般為25mA,而P1.0口最大電流為10mA,25mA電流流經P1.0口時就會造成損壞,因而要加電阻以滿足端口對最大電流的限制。在5V驅動時,多采用470Ω限流電阻,將電流限制在5mA~10mA,若采用1k的電阻,電流也就3~5mA。當然,為了更亮一點,可以減小電阻值,但二極管的電流不要超出單片機的I/O口最大電流。這個問題也即是在以后硬件電路設計中應十分注意的驅動問題。知識點小結器件選擇及實驗板的手工制作上面介紹了單片機最小系統(tǒng)電路及發(fā)光二極管電路的基本原理,接著我們將在此基礎上讓大家親自動手搭建這個最簡單的單片機系統(tǒng),要求完成最小系統(tǒng)及8只發(fā)光二極管電路的制作,并能通過編程控制各管子的亮滅。系統(tǒng)電路圖如圖2-10所示,現(xiàn)就所需元器件作一簡單介紹?!?9S51:單片機,控制發(fā)光二極管的亮滅?!SC:晶振,在本例中選擇l2MHz的立式晶振。·Cl、C2:晶振電路的起振電容,容值為22pF。實驗板手工制作步驟課后練習子任務1.1.2認識單片機全稱為單片微型計算機,有了硬件電路還須編制相應的軟件才能完成特定的任務。軟件由一條條指令組成,軟件工程師根據(jù)工作任務借助計算機等工具把軟件編寫完成后,再將指令翻譯成二進制機器碼并寫入單片機系統(tǒng)的程序存儲器(ROM)中。系統(tǒng)工作時,單片機CPU在時鐘信號及程序地址寄存器的配合下,再一條一條按順序將指令從ROM中取出進行譯碼并執(zhí)行。總結任務軟件的編寫及執(zhí)行過程:任務分析——編寫程序——翻譯軟件——裝入軟件——執(zhí)行指令。編程語言單片機的編程語言有:機器語言、匯編語言和高級語言(主要是c語言)。1).機器語言單片機是一種大規(guī)模的數(shù)字集成電路,它只能識別0和1這樣的二進制代碼。以前在單片機開發(fā)過程中,人們用二進制代碼編寫程序,然后再把所編寫的二進制代碼程序寫入單片機,單片機執(zhí)行這些代碼程序就可以完成相應的程序任務。

用二進制代碼編寫的程序稱為機器語言程序。在用機器語言編程時,不同的指令用不同的二進制代碼代表,這種二進制代碼構成的指令就是機器指令。在用機器語言編寫程序的時候,由于需要記住大量的二進制代碼指令及這些代碼代表的功能,很不方便且容易出錯,現(xiàn)在基本上很少有人用機器語言對單片機進行編程了。2).匯編語言由于機器語言編程很不方便,人們便用一些有意義并且容易記憶的符號來表示不同的二進制代碼指令,這些符號稱為助記符。用助記符表示的指令稱為匯編語言指令,用助記符編寫出來的程序稱為匯編語言程序。

0111010000000010(機器語言)

MOVA,#02H(匯編語言)

這兩行程序的功能是一樣的,都是將二進制數(shù)據(jù)00000010送到累加器A中??梢钥闯觯瑱C器語言程序要比匯編語言難寫,并且很容易出錯。

但單片機只能識別機器語言,所以匯編語言程序要匯編(翻譯)成機器語言程序,再寫入單片機中。一般都是用軟件匯編自動將匯編語言翻譯成機器指令。3).高級語言

高級語言是依據(jù)數(shù)學語言設計的,在用高級語言編程時不用過多的考慮單片機的內部結構。與匯編語言相比,高級語言易學易懂,而且通用性很強。高級語言的種類很多,如:PL/M-51語言、B語言、Pascal語言、C語言和JAVA語言等。單片機常用C語言作為高級編程語言。

上面三種編程語言中,高級語言編程較為方便且容易實現(xiàn)復雜算法,但實現(xiàn)相同的功能,匯編語言代碼少,運行效率高,另外對于初學單片機的同學,學習匯編語言編程有利于更好的理解單片機的結構與原理,也能為以后學習高級語言編程打下扎實的基礎。而機器語言已不再使用,但單片機只認識機器語言,所以不管是匯編語言程序或是高級語言程序都必須用編譯軟件翻譯成機器語言才能被單片機CPU執(zhí)行。軟件編譯過程編譯即編寫翻譯,我們在明確任務的基礎上利用匯編或C語言編寫的程序稱為源程序;再利用翻譯軟件將源程序翻譯成機器語言的過程稱為匯編;匯編后再進行仿真運行,如有問題則進行調試,再匯編,再調試直到達到任務要求為止。源程序的編寫通常可以利用記事本、Word等文本編輯器進行,但文件后綴名須保存為.Asm(匯編語言)或.C(C語言);匯編須用專門的編譯軟件,如A51及C51等;仿真調試也需要專門的軟件才能完成。通常我們將源程序編寫、匯編、仿真調試等軟件做在一起稱為單片機集成開發(fā)環(huán)境,常用的有Keil、Wave、Medwin等。編譯過程:編寫源程序——匯編——調試——匯編——調試——……調試通過軟件下載匯編的結果是將匯編語言或高級語言源程序翻譯成為二進制機器代碼,接下來則要利用下載軟件將二進制代碼下載到單片系統(tǒng)的ROM中,這個過程稱為編程。單片機編程實際上就是將二進制代碼當著普通數(shù)據(jù),利用串行或并行通信接口和專門的通信軟件將數(shù)據(jù)送到單片機內部或外部ROM并固化。軟件執(zhí)行過程程序放在ROM中,由CPU逐條取出并執(zhí)行,執(zhí)行過程包括取指令、指令譯碼及執(zhí)行三個步驟。要掌握好單片機執(zhí)行程序的過程,首先應了解單片機的內部結構。1).單片機的內部結構單片機內部采用總線型結構,所有模塊通過地址總線、數(shù)據(jù)總線及控制總線組成的系統(tǒng)總線與CPU進行連接,稱為三總線結構,如圖2-11所示。圖2-1151系列單片機的基本結構圖圖2-1151系列單片機的基本結構圖PCATMP1PSWBSPDPTRSFR及RAMROMP1P2P3P0定時中斷串口IR控制器ID振蕩X1X2P0P1P2P3ALUPSENRSTALEEA內部系統(tǒng)總線ISPIn_1In_2Out整個單片機由CPU、片內ROM、片內RAM、功能模塊(串口、中斷、定時、I/O、ISP等)組成。圖中虛線框內為單片機的CPU,由算術邏輯單元ALU、累加器A(8位)、B寄存器(8位)、程序狀態(tài)字PSW(8位)、程序計數(shù)器PC(16位)、指令寄存器IR(8位)、指令譯碼器ID、控制器等部件組成。算術邏輯單元ALU(ArithmeticLogicUnit)算術和邏輯運算,可對半字節(jié)(一個字節(jié)是8位,半個字節(jié)就是4位)和單字節(jié)數(shù)據(jù)進行操作;加、減、乘、除、加1、減1、比較等算術運算;與、或、異或、求補、循環(huán)等邏輯運算;位處理功能(即布爾處理器)。由于ALU內部沒有寄存器,參加運算的操作數(shù),必須放在累加器A中。累加器A也用于存放運算結果。例如

執(zhí)行指令:ADDA,B

執(zhí)行這條指令時,累加器A中的內容通過輸入口In_1輸入ALU,寄存器B通過內部數(shù)據(jù)總線經輸入口In_2輸入ALU,A+B的結果通過ALU的輸出口Out、內部數(shù)據(jù)總線,送回到累加器A。累加器A(Accumulator)用來臨時存放運算的中間結果,輔助ALU完成相應的運算。B寄存器主要用于輔助CPU完成乘法和除法運算。程序計數(shù)器PC(ProgramCounter)PC用來存放將要執(zhí)行的指令地址(ROM的某個單元地址),CPU將從該地址進行取指;復位后PC指向ROM的0000H單元;16位,可對64KROM直接尋址,低8位經P0口輸出,高8位經P2口輸出;自動加1功能,從ROM中低地址到高地址順序取指;不能讀寫指令寄存器IR(InstructionRegister)用來存放即將執(zhí)行的指令代碼,CPU從PC所指向的ROM單元中取出指令并放入IR中指令譯碼器ID(Instructiondecoder)用于對送入IR中的指令進行譯碼,所謂譯碼就是把指令轉變成執(zhí)行此指令所需要的電信號。程序狀態(tài)字PSW(ProgramStatusWord)用于記錄運算過程中的狀態(tài),如是否溢出、進位等,其各位的定義如圖2-12所示??刂破髦噶钭g碼后,將在時鐘信號的配合下,由控制器對CPU各部件產生控制信號完成指令任務。功能模塊主要包括I/O、定時、中斷、串口、ISP等,由CPU通過程序對他們進行控制,在以后的章節(jié)中我們再詳細給讀者作介紹。在此僅對ISP進行說明。ISP(In-SystemProgramming),即為在系統(tǒng)編程,是將二進制代碼寫入單片機系統(tǒng)ROM的一種方法。傳統(tǒng)的編程方法要利用專門的編程器才能將程序下載到ROM,成本較高,而對于AT89S系列單片機,內部包含ISP模塊和FLASHROM,利用USB等下載線和一個簡單的下載軟件很容易就可以將程序下載到ROM中,并且可以多次擦寫。2).軟件執(zhí)行過程軟件編譯完成并利用ISP將二進制代碼下載到ROM后,單片機系統(tǒng)就可以工作了。系統(tǒng)上電后PC指向ROM的0000H單元,此時CPU便從ROM的0000H單元取出第一條指令并放入IR中(同時,PC自動加1指向ROM的0001H單元,為取下一條指令作好準備),IR中的指令經ID譯碼后再由定時與控制電路發(fā)出相應的控制信號,從而完成指令的功能。第一條指令執(zhí)行完后,CPU再從PC所指向的ROM的0001H單元取第二條指令譯碼并執(zhí)行,直到程序結束。認識學習匯編語言編程有利于更好的理解單片機的結構與原理,也能為以后學習高級語言編程打下扎實的基礎,而且對于某些實時控制系統(tǒng),匯編語言的優(yōu)勢也是不可取代的。因此,基礎篇部分我們采用匯編語言進行軟件設計,但不會陷入復雜算法。單片機存儲器結構匯編語言是和硬件聯(lián)系非常緊密的編程語言,由指令讀寫相關存儲單元的值來實現(xiàn)單片機系統(tǒng)的功能,因而對于存儲器的學習就顯得尤為重要。AT89S51單片機內部存儲器包括程序存儲器(ROM)、數(shù)據(jù)存儲器(RAM)和特殊功能寄存器(SFR)三部分。SFR用于配合單片機各內部電路完成某種特定任務(如,向特殊功能寄存器P1寫數(shù)據(jù),實際上就是控制P1引腳的電平)。1).ROM(Read-OnlyMemory)PSW.4(RS1)0011PSW.3(RS0)0101寄存器名0組地址1組地址2組地址3組地址R000H08H10H18HR101H09H11H19HR202H0AH12H1AHR303H0BH13H1BHR404H0CH14H1CHR505H0DH15H1DHR606H0EH16H1EHR707H0FH17H1FHROM即只讀存儲器(所謂只讀是相對于單片機CPU的),也稱程序存儲器,掉電不丟失,用于存放程序和表格。AT89S51片內具有4K字節(jié)的FlashROM(可擴展至64K字節(jié)),具有在系統(tǒng)下載(ISP)功能。需要說明的是,我們從0000H開始給ROM的每個字節(jié)按順序編了一個號,即地址,4K字節(jié)ROM的地址范圍是:0000H~0FFFH。2).RAM(RandomAccessMemory)RAM即隨機存儲器,也稱數(shù)據(jù)存儲器,單片機CPU可對其隨機讀寫,掉電數(shù)據(jù)丟失,主要用于臨時存放CPU運算的中間結果。AT89S51具有128字節(jié)的RAM(可擴展至64K),地址范圍為00H~7FH,分為通用寄存器、位尋址區(qū)和用戶區(qū),如圖2-13所示。通用寄存器區(qū)(00H~1FH)32個字節(jié),分為4組,每組8個字節(jié),每組的8個字節(jié)都以R0~R7命名,如圖2-14,也即是說有四個字節(jié)都用同樣的名字“R0”,到底是哪個地址則取決于當前用的是哪組通用寄存器,組別用狀態(tài)字寄存器PSW的RS0和RS1來區(qū)分,對應關系如圖所示位尋址區(qū)(20H~2FH)16個字節(jié),一個字節(jié)8位,共128位,位地址編號為00H~7FH,由專門的位操作指令進行讀寫。前面的R0~R7只能進行字節(jié)操作(8位),而所謂位尋址是指CPU可以對這128位中的任意一位進行讀寫(當然也可以進行字節(jié)操作)。表表2.5RAM中的位尋址區(qū)地址表用戶區(qū)(30H~7FH)該區(qū)域共80個字節(jié),沒有特殊的意義,就是共用戶使用的一般數(shù)據(jù)存儲區(qū),只能進行字節(jié)操作。3).SFR(SpecialFunctionRegister)特殊功能寄存器的地址位于80H~0FFH,AT89S51共26個SFR,占據(jù)了128個字節(jié)中的26個,各寄存器名稱及復位初始值如圖2-15所示,其中地址能被8整除的SFR可以進行位尋址。這些寄存器很重要,單片機功能的實現(xiàn)實際上就是通過讀寫這些特殊功能寄存器來實現(xiàn)的,但SFR很多,在此我們只需知道ACC叫累加器,P0~P3寄存器的數(shù)字對應著P0~P3引腳電平的高低等概念即可,即讀寫特殊功能寄存器P0~P3,實際就是對相應引腳P0~P3進行操作。匯編語言指令圖2-15AT89S51特殊功能寄存器及復位值匯編語言指令分為可執(zhí)行指令和偽指令兩大類??蓤?zhí)行指令指單片機CPU能執(zhí)行的指令,該類指令將被編譯軟件翻譯成對應的機器代碼并由單片機CPU執(zhí)行;偽指令則是由Keil等編譯軟件執(zhí)行,用于輔助編譯軟件進行源程序的編譯,而不被單片機CPU執(zhí)行。圖2-15AT89S51特殊功能寄存器及復位值1).可執(zhí)行指令可執(zhí)行指令共有111條,按字節(jié)長度分為單字節(jié)指令(49條)、雙字節(jié)指令(46條)及三字節(jié)指令(16條);按執(zhí)行時間分為單機器周期指(64條)、雙機器周期指令(45條)及四機器周期指令(2條);按用途又可分為數(shù)據(jù)傳送類指令、算術操作類指令、邏輯操作類指令、程序轉移類指令及位操作類指令。在編寫匯編語言源程序時有統(tǒng)一的格式:標號:指令助記符操作數(shù)1,操作數(shù)2,操作數(shù)3;注釋標號源程序寫好后編譯成二進制機器代碼存入ROM的某個地址單元,標號就是程序設計人員給這個地址單元起的名字,便于程序的轉移。由英文字母或數(shù)字組成,但須以英文字母打頭,再用“:”隔開,可以省略。指令助記符告訴CPU要完成的任務,比如助記符MOV就要求CPU進行一次數(shù)據(jù)的傳送。每個操作碼都有對應的機器代碼(見附錄),不可缺省。操作數(shù)指明操作碼所操作的對象,比如助記符MOV只告訴CPU要進行數(shù)據(jù)傳送,到底數(shù)據(jù)從哪來又傳到哪去呢,完整的寫法應是:MOVA,R0,這就告訴CPU應從通用寄存器R0取數(shù)據(jù)并送到累加器A中。在所有指令中,分為無操作數(shù)指令、單操作數(shù)指令、雙操作數(shù)指令和三操作數(shù)指令四種,MOV指令屬雙操作數(shù)指令,注意操作數(shù)與操作碼之間用空格隔開,而多個操作數(shù)之間必須用“,”隔開。注釋對該指令在程序中的作用進行解釋說明,便于程序的閱讀。書寫時須用“;”隔開,可以省略。注意,不管是注釋用的“;”,標號后的“:”還是操作數(shù)間的“,”都必須是英文半角狀態(tài)下輸入,否則編譯軟件不能識別。2).尋址方式指令中的操作數(shù)可以為RAM、SFR、ROM的某個地址單元或以“#”打頭寫在指令中的數(shù)據(jù),告訴CPU操作數(shù)所在地址單元的方式稱為尋址方式(見附錄)。例如:MOVR0,AMOV00H,A上面兩個指令實際上是一回事,都是將累加器A的內容送入通用寄存器R0,但采用的尋址方式卻有差異,一個給出寄存器的名字R0,稱為寄存器尋址;另一個則直接給出R0所在的內部RAM地址00H,這種稱為直接尋址。尋址方式包括立即數(shù)尋址、直接尋址、寄存器尋址、寄存器間接尋址、基址加變址尋址、相對尋址及位尋址等7種方式,我們將在項目程序中逐一給大家介紹。3).偽指令偽指令是告訴A51編譯軟件如何編譯源程序的指令。不被編譯成機器代碼,即不被單片機CPU執(zhí)行的指令,故稱為偽指令。在對源程序進行編譯時,偽指令會告訴編譯軟件定義了哪些數(shù)據(jù)、機器代碼放在ROM的什么地方以及程序編譯是否結束等信息。例如: ORG0030H MOVA,R0 END偽指令ORG0030H告訴A51編譯軟件:匯編指令MOVA,R0的機器代碼應從ROM的30H單元開始存放。而偽指令END則告訴A51編譯軟件:源程序編譯到此結束,即匯編結束偽指令。對于常用偽指令(見附錄)的使用,本書將在項目軟件中逐一給讀者介紹。匯編語言程序設計經驗與技巧明確軟件設計步驟;分析問題,明確所求解問題的意義及任務,并將實際問題轉化為單片機可以解決的問題,如該系統(tǒng)是控制發(fā)光二極管的亮滅,對于單片機來說就是控制單片機I/O引腳電平的高低。確定算法,根據(jù)實際問題和指令系統(tǒng)的特點所確定的計算公式和計算方法;繪制流程圖,根據(jù)算法制定的運算步驟和順序,把運算過程畫成流程圖,這樣使程序清晰、結構合理、便于調試。分配資源,根據(jù)程序區(qū)、數(shù)據(jù)區(qū)、暫存區(qū)、堆棧區(qū)等預計所占空間大小,對片內外存儲區(qū)進行合理分配并確定每個區(qū)域的首地址,便于編程使用。編寫程序,用匯編語言來實現(xiàn)上面已確定的算法。仿真調試,利用單片機各種開發(fā)工具對所編寫的程序進行測試,檢驗程序是否完成制定功能,測試過程盡可能詳細,要保證每條支路都能得到檢驗。程序固化,即將調試好的程序生成機器代碼后固化到FlashROM等程序存儲器中。熟練掌握單片機存儲器結構及功能特點;熟練掌握各匯編指令的格式及功能;掌握好各種器件的編程特點;熟練掌握單片機的尋址方式;具備由簡單到復雜及模塊化設計思路;掌握好子程序的設計方法上一節(jié)我們完成了系統(tǒng)的硬件設計,并且知道,通過控制P1口引腳電平的高低就可以控制發(fā)光二極管的亮滅,而P1電平的高低則是通過程序來進行控制的,在學習編程之前,首先應熟悉P1口的內部結構及操作特點。P1口的內部結構特點VCCP1。VCCP1。X鎖存器讀鎖存器D讀引腳寫鎖存器內部總線QQTP1。X內部上拉電阻圖2-16P1口的一位結構圖CLTS2TS1對P1口的讀可以讀鎖存器或外部引腳,由圖可知,要正確地從引腳上讀入外部信息,必須先使場效應管關斷,以便由外部輸入的信息確定引腳的狀態(tài),為此,在作引腳讀入前,必須先對該端口寫l,具有這種操作特點的輸入/輸出端口,稱為準雙向I/O口,P1、P2、P3都是準雙向口。P1口的編程本例要求控制P1口相關引腳的電平,即是對P1口的寫操作,由結構分析可知,寫引腳,實際就是將數(shù)據(jù)送入該引腳所對應的輸出鎖存器(即寄存器,寄存器名同引腳名),可采用數(shù)據(jù)傳送指令MOV來編程實現(xiàn)。1.1.2系統(tǒng)功能分析系統(tǒng)功能要求將控制8個二極管的亮滅,實際上就是控制P1口相應管腳電平的高低。算法確定開始點亮或熄滅P1口某引腳的燈開始點亮或熄滅P1口某引腳的燈循環(huán)等待匯編結束圖2-17亮滅控制LED流程圖流程圖繪制雖然系統(tǒng)功能很簡單,但軟件的編寫必須遵循相應的流程,流程圖如圖2-17,圖中點亮或熄滅某盞燈的功能只需一條指令就能實現(xiàn),循環(huán)等待實際上是一個死循環(huán),CPU在執(zhí)行完控制程序后會一直執(zhí)行這個死循環(huán)語句,它的主要作用是為了防止程序失控。如果沒有這個死循環(huán),在CPU執(zhí)行完控制程序后,還會繼續(xù)從ROM后面的單元一條條順序取指令并執(zhí)行,而后面單元并沒有存放我們的功能程序,而可能是一些隨機的二進制數(shù)據(jù),執(zhí)行后可能會產生意想不到的結果,這就是所謂的程序跑飛。請大家在以后的程序編寫中一定要注意這一點,即程序一定要受控,而不能跑飛。分配資源1).ROM存儲空間分配該系統(tǒng)程序只有幾個字節(jié),也即是說ROM只需幾個字節(jié)就能存放系統(tǒng)軟件,片內ROM有4K字節(jié),已足夠用(本書項目程序一般都比較小,全部采用內部ROM存放程序)。對于程序的存放地址有兩點必須注意:CPU復位后PC總是指向ROM的0000H單元,即CPU從0000H單元開始執(zhí)行程序,所以程序的第一條指令應放在0000H單元。ROM中0003H~0030H之間的存儲單元有特殊用途,一般不要占用,因此,功能程序都從0030H單元開始存放。這是一個矛盾,即程序的第一條指令必須放在0000H單元,但0003H~0030H單元又要預留它用。一般我們在0000H單元放一條跳轉指令,使CPU執(zhí)行完0000H單元的跳轉指令后馬上轉到0030H單元去執(zhí)行程序。2).RAM及SFR存儲空間分配本系統(tǒng)程序很小,沒有定義變量,也沒有臨時數(shù)據(jù)需要存放,因此不會用到RAM存儲單元。但會用到SFR中的P1寄存器。程序清單;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;點亮最簡單的單片機系統(tǒng);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORGOOOOH ;將后面程序定位到ROM的0000H單元LJMPSTART;跳轉指令,跳轉到START標號處執(zhí)行程序ORG0030H ;將后面程序定位到ROM的0030H單元START: MOVP1,#11111110B;將P1.0引腳清“0” LJMP$ ;死循環(huán),防止程序跑飛 END ;匯編結束1).可執(zhí)行指令格式及功能LJMP(長跳轉指令)指令格式:LJMP標號指令功能:該指令為一無條件跳轉指令,跳轉距離大,可在64K字節(jié)范圍內跳轉,因而稱為長跳轉指令,它可以改變PC值,從而使CPU轉到相應的標號處執(zhí)行程序。在此需要特別說明的是“$”符號,它是一個地址符號,其值為當前指令所在地址,即代表LJMP$這條指令被翻譯成機器代碼后所存放的ROM單元地址。比如這條指令的機器代碼放在ROM的0033H單元,則“$”符號就為0033H,但若放在0FFFH單元,則“$”符號就為0FFFH。所以一旦執(zhí)行LJMP$這條跳轉指令后PC仍指向這條指令,CPU將一直執(zhí)行這條指令,從而構成死循環(huán)。MOV(數(shù)據(jù)傳送類指令)指令格式:MOV目的操作數(shù),源操作數(shù)指令功能:將源操作數(shù)的數(shù)據(jù)送到目的操作數(shù)。該程序中,目的操作數(shù)為P1寄存器,源操作數(shù)為二進制數(shù)“#11111110B”,執(zhí)行指令后將P1.0口清0而將其它引腳置1,即點亮P1.0引腳上的LED,而熄滅其它7個LED。從而可以看出要控制哪個燈亮就將P1寄存器對應為清0即可,反之則應置12).尋址方式直接尋址在指令中,操作數(shù)直接以RAM或SFR的單元地址的形式給出,如程序中的P1就是特殊功能寄存器的名字,在指令中直接寫出就告訴CPU數(shù)據(jù)應送到SFR的90H單元。再如:MOV30H,#11111110B該指令中30H表示內部RAM的30H字節(jié)單元,存儲單元地址直接在指令中給出。直接尋址方式可以訪問內部RAM的低128字節(jié)和SFR,而且對于SFR的訪問用且只能用直接尋址方式。立即數(shù)尋址所操作數(shù)據(jù)在指令中直接給出,如MOV指令中的源操作數(shù)#11111110B,注意立即數(shù)必須以“#”打頭以區(qū)別于直接尋址,結尾的“B”表示二進制數(shù)(Binary),若以“H”結尾則表示十六進制數(shù)(Hexadecimal),“D”結尾或省略則表示十進制數(shù)(Decimal)。例如 MOV30H,#40H注意區(qū)別,“30H”代表RAM的30H字節(jié)單元,是一個存儲單元地址,屬直接尋址;而“#40H”則表示一個十六進制數(shù),屬立即數(shù)尋址。該指令的功能是將十六進制數(shù)40H送到RAM的30H存儲單元。注意立即數(shù)是一個數(shù),不能作為目的操作數(shù)。3).偽指令格式及功能ORG(程序定位偽指令)指令格式:ORGaddr16指令功能:該偽指令用在一段源程序的前面,編譯程序就會將緊跟其后的源程序機器代碼從ROM的addr16單元開始存放,此處的addr16為16位地址(4位十六進制數(shù))。程序中,LJMPSTART指令的機器代碼將從ROM的0000H單元開始存放,而MOVP1,#11111110B及其后面指令的機器代碼將順序從ROM的0030H單元開始存放。END(匯編結束偽指令)指令格式:END指令功能:匯編語言源程序的最后一條指令,告訴編譯軟件源程序編譯結束。即編譯軟件只對END指令前的指令進行編譯。知識點小結課后練習子任務1.1.3我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機器碼有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。機器匯編是通過匯編軟件將源程序變?yōu)闄C器碼,隨著單片機開發(fā)技術的不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機系統(tǒng)的軟件。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVision)將這些部份組合在一起。掌握這一軟件的使用對于51系列單片機系統(tǒng)開發(fā)人員來說是十分必要的,如果你使用C語言編程,那么Keil幾乎就是不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強大的軟件仿真調試工具也會令你事半功倍。初學者可以到Keil公司的官方網站下載keil軟件的評估版,它在某些方面的功能有一定的限制,比如目標代碼長度限制在2K字節(jié)內,不支持浮點運算等,但對于初學者來說,這種限制并不影響學習效果。在這一部份,我們將學習如何建立工程、對工程進行詳細的設置、輸入源程序、如何將源程序變?yōu)槟繕舜a、并體會仿真調試器的使用。1.1.3uVision2包括一個項目管理器,它可以使你的8051應用系統(tǒng)設計變得簡單。要創(chuàng)建一個應用,你需要按下列步驟進行操作啟動uVision2,新建一個項目文件并從器件庫中選擇一個器件。新建一個源文件并把它加入到項目中。針對目標硬件設置工具選項。編譯項目并生成可以編程PROM的HEX文件。下面將以本系統(tǒng)軟件的設計過程為例,一步一步的指引你去創(chuàng)建一個簡單的uVision2項目。啟動uVision2并創(chuàng)建一個項目uVision2是一個標準Windows應用程序,直接點擊程序圖標就可以啟動它。啟動后顯示如圖2-18所示界面。整個界面包括菜單欄、項目管理窗口、工具條、文件編輯窗口和輸出窗口五各部分。菜單欄包括文件、編輯、視圖、項目、調試等11個菜單;工具條實際就是菜單欄命令的圖標表示,點擊圖標可以完成相應的命令操作;項目管理窗口包括三個標簽:文件(File)、寄存器(Regs)及數(shù)據(jù)(Books);輸出窗口包括編譯信息(Build)、匯編命令(Command)和查找(FindinFiles)三個標簽;文件編輯窗口主要用于編輯源程序及調試設置等。圖2-19CPU選擇對話框圖2-18uVision2啟動后的界面項目管理窗口文件編輯窗口菜單欄工具條輸出窗口輸出窗口從uVision2的Project菜單中選擇NewProject來新建一個項目文件,這將打開一個標準的Windows對話框,此對話框要求你輸入項目文件名,建議新建文件夾及項目文件名為“Keil項目文件”\“點亮最簡單的單片機系統(tǒng)”\led1.uv2,點擊保存后,將會出現(xiàn)“SelectDeviceforTarget‘Target圖2-19CPU選擇對話框圖2-18uVision2啟動后的界面項目管理窗口文件編輯窗口菜單欄工具條輸出窗口輸出窗口圖2-21項目管理窗口Files標簽顯示項目文件信息圖2-20圖2-21項目管理窗口Files標簽顯示項目文件信息圖2-20啟動文件STARTUP.A51添加對話框圖2-22項目管理窗口Books標簽顯示手冊圖2-22項目管理窗口Books標簽顯示手冊創(chuàng)建源文件并加入到項目中用菜單選項File-New或直接點擊工具欄的圖標來新建一個源文件,這將打開一個空的編輯窗口。在該窗口輸入?yún)R編語言源代碼,并保存為led1.A,注意后綴名必須是“.A”,表明這是一個匯編語言源程序。保存后將出現(xiàn)如圖2-23所示文件窗口。圖2-23匯編源程序窗口在源程序中,Keil用不同顏色的文字來區(qū)分指令助記符、標號、操作碼及注釋文字,再次提醒:除了注釋文字外,不管是注釋打頭用的“;”,標號后的“:”還是操作數(shù)間的“,”都必須是在英文半角狀態(tài)下輸入,否則編譯軟件不能識別。圖2-23匯編源程序窗口源程序建好后,在項目窗口單擊Target1-SourceGroup1,并在區(qū)域內點右鍵出現(xiàn)如圖2-24所示菜單,單擊AddFilestoGroup‘SourceGroup1’圖2-24添加源程序到項目圖2-24添加源程序到項目圖2-25添加源程序后的項目窗口圖2-25添加源程序后的項目窗口針對目標硬件設置選項圖2-26點擊進入選項界面在將匯編語言源程序編譯成機器代碼之前,應該先設置目標硬件的相關選項。如圖2-26所示,點擊Target1-OptionsforTarget‘Target1’便進入如圖2-27所示的選項卡界面。為生成應用,先設置Target選項卡,參數(shù)的含義及設置情況如表2-?圖2-26點擊進入選項界面圖2-27目標硬件選項圖2-27目標硬件選項對話框條目描述設定值Xtal定義CPU時鐘,同系統(tǒng)所選時鐘頻率12MHzMemoryModel定義編譯器的存儲模式分別選Small、Large、NoneOff-chip…Memory定義目標硬件上所以外部存儲器區(qū)域采用內部存儲器,不填CodeBankingXdataBanking為代碼和數(shù)據(jù)的分段定義參數(shù),用于存儲器擴展至2M采用內部存儲器,不填編譯并生成HEX文件圖2-28編譯信息顯示(a)(b)通常情況下,在Options–Target對話框中的設置已經足夠使你開始一個新的應用。通過單擊工具條上的圖標,你可以編譯所有的源文件并生成應用,當你的應用有語法錯誤時,uVision2將在OutputWindow–圖2-28編譯信息顯示(a)(b)圖2-29OptionsforTarget–Output選項卡設置一旦成功生成應用,便可以進行調試,軟件的調試將在下一節(jié)講述。調試完成后,需要創(chuàng)建一個HEX文件(即機器代碼)來燒片子(即寫入ROM)或軟件模擬,當OptionsforTarget圖2-29OptionsforTarget–Output選項卡設置1.1.3上一講中我們學習了如何建立工程、匯編、連接工程,并獲得目標代碼,但是做到這一步僅僅代表你的源程序沒有語法錯誤,至于源程序中存在的其它錯誤,必須通過調試才能發(fā)現(xiàn)并解決,事實上,除了簡單的程序以外,絕大部分的程序都要通過反復調試才能得到正確的結果,因此,調試是軟件開發(fā)中重要的一個環(huán)節(jié),這一講將介紹常用的調試命令、利用在線匯編、各種設置斷點進行程序調試的方法,并通過實例介紹這些方法的使用。1.常用調試命令在對工程成功地進行匯編、連接后,按Ctrl+F5或者使用菜單Debug->Start/StopDebugSession即可進入調試狀態(tài),Keil內建了一個仿真CPU用來模擬執(zhí)行程序,該仿真CPU功能強大,可以在沒有硬件和仿真機的情況下進行程序的調試,下面將要學的就是該模擬調試功能。圖2-30調試工具條進入調試狀態(tài)后,界面與編輯狀態(tài)相比有明顯的變化,Debug菜單項中原來不能用的命令現(xiàn)在可以使用了,工具欄會多出一個用于運行和調試的工具條,如圖2-30,Debug菜單上的大部分命令可以在此找到快捷按鈕,從左到右依次是復位、全速運行、暫停、單步、過程單步、執(zhí)行完當前子程序、運行到當前行、下一狀態(tài)、打開跟蹤、觀察跟蹤、反匯編窗口、觀察窗口、代碼作用范圍分析、1#串行窗口、內存窗口、性能分析、工具按鈕等命令,以后的學習中逐一介紹。圖2-30調試工具條學習程序調試,首先必須明確下面幾個重要概念及用途:復位,點擊該按鈕,單片機個內部寄存器恢復到初始值;全速運行與單步執(zhí)行。全速運行是指一行程序執(zhí)行完后緊接著執(zhí)行下一行程序,中間不停止,這樣執(zhí)行程序的速度很快,并可以看到程序執(zhí)行的總體效果,即最終的結果是正確還是錯誤,但如果程序有錯,則難以確認錯誤出現(xiàn)在哪些程序行。單步執(zhí)行是每次執(zhí)行一行程序,執(zhí)行完該行程序以后即停止,等待命令執(zhí)行下一行程序,此時可以觀察該行程序執(zhí)行完以后得到的結果,是否與該行程序所想要得到的結果相同,借此可以找到程序中問題所在。程序調試中這兩種方法都要用到。圖2-31調試窗口(P1寄存器窗口、輸出窗口和存儲器窗口圖2-31調試窗口(P1寄存器窗口、輸出窗口和存儲器窗口)Keil軟件在調試程序時提供了多個窗口,當程序仿真運行時,可以利用這些窗口查看相關運行結果,從而判斷程序的正確與否。主要包括輸出窗口(OutputWindows)、外設窗口(Peripherals)、觀察窗口(Watch&CallStatckWindows)、存儲器窗口(MemoryWindow)、反匯編窗口(DissamblyWindow)、串行窗口(SerialWindow)等。進入調試模式后,可以通過菜單View和Peripherals下的相應命令打開或關閉這些窗口。圖2-31為P1寄存器窗口、輸出窗口和存儲器窗口,各窗口的大小可以使用鼠標調整。進入調試程序后,輸出窗口自動切換到Command頁。該頁用于輸入調試命令和輸出調試信息。對于初學者,可以暫不學習調試命令的使用方法。1).存儲器窗口圖3-32存儲器數(shù)值各種方式顯示選擇圖2-33儲器的值的修改存儲器窗口中可以顯示系統(tǒng)中各種內存中的值,通過在Address后的編緝框內輸入“圖3-32存儲器數(shù)值各種方式顯示選擇圖2-33儲器的值的修改2).工程窗口寄存器頁圖2-34工程窗口寄存器頁的內容,寄存器頁包括了當前的工作寄存器組和系統(tǒng)寄存器,系統(tǒng)寄存器組有一些是實際存在的寄存器如A、B、DPTR、SP、PSW等,有一些是實際中并不存在或雖然存在卻不能對其操作的如PC、Status等。每當程序中執(zhí)行到對某寄存器的操作時,該寄存器會以反色(藍底白字)顯示,用鼠標單擊然后按下F2鍵,即可修改該值。3).觀察窗口觀察窗口是很重要的一個窗口,如圖2-35工程窗口中僅可以觀察到工作寄存器和有限的寄存器如A、B、DPTR等,如果需要觀察其它的寄存器的值或者在高級語言編程時需要直接觀察變量,就要借助于觀察窗口了。一般情況下,我們僅在單步執(zhí)行時才對變量的值的變化感興趣。圖2-36調試狀態(tài)界面調試窗口寄存器頁文件編輯窗口輸出窗口程序執(zhí)行箭頭圖2-36調試狀態(tài)界面調試窗口寄存器頁文件編輯窗口輸出窗口程序執(zhí)行箭頭圖2-34工程窗口寄存器頁圖2-35觀察窗口3.項目的仿真調試為了進行調試,我們在源程序中制造一個錯誤,將MOVP1,#11111110B改成MOVP1,#00000001B,記住,項目本來的目的是要點亮P1.0引腳上的發(fā)光二極管,我們下面來看看如何利用Keil的仿真調試發(fā)現(xiàn)錯誤并進行修改。1).進入調試狀態(tài)進入調試狀態(tài)后,界面顯示如圖2-36示,界面顯示工程窗口文件編輯窗口和輸出窗口。調試窗口寄存器頁除顯示R0~R7、A、B、DPTR、SP、PSW、PC各寄存器的初始(即單片機復位時)值外,還包括states和sec兩個程序執(zhí)行狀態(tài),其中states顯示的是程序執(zhí)行的機器周期數(shù),sec表示程序執(zhí)行的時間累計。圖2-37P1及Memory窗口LJMPSTARTSTART:圖2-37P1及Memory窗口LJMPSTARTSTART:MOVP1,#00000001BLJMP$;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;點亮最簡單的單片機系統(tǒng);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG0000H ;將后面程序定位到ROM的0000H單元LJMPSTART ;使PC指向標號START所對應的存儲單元ORG0030H ;將后面程序定位到ROM的0030H單元START: MOVP1,#00000001B ;將P1.0引腳清"0",即點亮該引腳所接LEDLJMP$ ;死循環(huán),防止程序跑飛END ;匯編結束2).相關窗口調入程序執(zhí)行后的效果應該是將P1.0引腳(即P1寄存器的第0位)置“0”,點亮該引腳上的發(fā)光二極管,其它引腳置“1調入窗口后,P1各位為初始值“1”(各位為‘√’),存儲器窗口Address后輸入“c:0只有橢圓內的可執(zhí)行指令會被翻譯成機器代碼存放到ROM中讓單片機執(zhí)行;偽指令ORG、END不被翻譯成機器代碼,只是起代碼存儲定位及匯編結束等指示性作用,被Keil軟件執(zhí)行,LJMPSTART指令的機器代碼從0000H單元開始放,而MOVP1,#00000001B及其后面的程序代碼將從0030H單元開始存放。標號實際上就是為某個存儲單元起的名字,程序中“START”標號本質代表ROM的0030H單元地址?!癓JMPSTART”的機器代碼為“02H0030H”,其中,‘02H’對應‘LJMP’指令的機器碼,即執(zhí)行該指令后,將跳到0030H單元繼續(xù)執(zhí)行程序。“LJMP$”指令的機器代碼是“02H0033H”,其中,‘0033H’對應‘$’的機器代碼,表示要跳轉到ROM的0033H單元執(zhí)行指令,而該指令機器代碼正好是從0033H單元開始存放,所以‘$’代表當前指令所在單元起始地址。3).程序仿真調試圖2-38單步執(zhí)行結果按單步按鈕之一,直到程序執(zhí)行箭頭指向‘LJMP$’指令,如圖2-38所示。我們觀察到:圖2-38單步執(zhí)行結果寄存器頁的PC$(即PC當前值)由初始值0000H變?yōu)?033H,也即是,接下來將執(zhí)行0033H單元的指令代碼;States的值為4,表示單片機總共執(zhí)行了4個機器周期;Sec值表示程序執(zhí)行時間為0.00000400秒,即,(晶振為12MHz);最重要的是,觀察P1寄存器窗口可以發(fā)現(xiàn):P1各位(即P1口對應的8各引腳電平)由原來的初始值‘11111111’變成了‘00000001因此,需要對源程序進行修改,通過分析,應將MOVP1,#00000001B改成MOVP1,#11111110B。修改后,點擊Debug->Start/StopDebugSession退出仿真調試,進入編輯狀態(tài)重新進行編譯,再返回到仿真調試狀態(tài),單步運行至LJMP$指令后可發(fā)現(xiàn):P1寄存器中P1.0變?yōu)椤?’,其余位為‘1’,如果再單步執(zhí)行程序可以發(fā)現(xiàn),CPU將一直執(zhí)行LJMP$指令,形成死循環(huán),而P1口的值保持不變,從而實現(xiàn)了項目要求的功能,完成調試??傊?,仿真調試實際上就是利用集成開發(fā)環(huán)境(uVision)中的仿真調試軟件模擬單片機執(zhí)行程序,編程人員通過觀察相應窗口所顯示的運行結果,并不斷修改源程序使之最終達到項目功能要求的過程。知識點小結課后練習子任務1.1.4上一節(jié)介紹的仿真調試僅僅利用集成開發(fā)環(huán)境(uVision)中的仿真調試軟件對應用程序進行了模擬仿真,這種仿真可以大致確定軟件的正確性。但,硬件電路設計是否正確?軟件灌入硬件電路ROM后能否正常工作?正常工作后能否達到預期效果?這些問題則必須通過軟硬件聯(lián)合仿真調試才能得到解決。Proteus軟件組合了高級原理布圖、混合模式SPICE仿真、PCB設計以及自動布線來實現(xiàn)一個完整的電子設計系統(tǒng)。作為單片機教學,可以利用該軟件對多種類型的單片機進行軟硬件聯(lián)合仿真。其中,對于8051系列單片機系統(tǒng)的仿真,具有以下特點:全部8051指令系統(tǒng)和SFRs;所有I/O操作;所有片上外設的各種操作模式:包括Timers、UART;所有中斷模式;包括光耦,存儲器,多種串行通信,直流、步進和伺服電機,鍵盤,顯示、喇叭等多種單片機系統(tǒng)外圍器件仿真模型;內部產生處理器時鐘以優(yōu)化經濟結構性能,I/O和其它事件定時器精確至一個時鐘相位;程序和外部數(shù)據(jù)存儲器能被仿真為內部模型,以提高吞吐量,或仿真為外部模型以驗證硬件設計;提供內部一致性代碼檢查功能;完整集成ISIS的源碼級調試和源碼管理系統(tǒng);支持集成Keil等第三方編譯器和調試器??傊撥浖且豢罟δ軓姶蟮膯纹瑱C系統(tǒng)仿真軟件,對于單片機的教學起到了較好地輔助作用。利用Proteus軟件進行單片機系統(tǒng)仿真的步驟如下:繪制原理圖單片機軟件處理軟硬件聯(lián)合仿真調試1.1.4電路原理圖是由電子器件符號和連接導線組成的圖形。在圖中,器件編號、名稱、參數(shù)等屬性,連接線有名稱、連接的器件引腳等屬性。電路原理圖的設計就是放置器件并把相應得器件引腳用導線;連接起來,并修改器件和導線的屬性。按照以下步驟逐步完成設計。建立設計文件雙擊桌面ISIS.EXE文件出現(xiàn)如圖2-39所示界面,整個界面被分為三個區(qū)域,即,圖形編輯窗口、對象預覽窗口、對象選擇器窗口。圖

溫馨提示

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

評論

0/150

提交評論