在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      8051模塊化編程分析

      作者: 時間:2011-08-04 來源:網(wǎng)絡(luò) 收藏

      程序設(shè)計就是用計算機(jī)所能接受的語言把解決問題的步驟描述出來,也就是把計算機(jī)指令或語句組成一個有序的集合。一個好的應(yīng)用程序不僅是執(zhí)行效率高,而且還要結(jié)構(gòu)清晰、便于調(diào)試。所以人們都采用結(jié)構(gòu)化程序設(shè)計方法來編制應(yīng)用程序。目前單片機(jī)的教材側(cè)重于匯編語言。因此學(xué)習(xí)用單片機(jī)匯編語言程序進(jìn)行結(jié)構(gòu)化設(shè)計還是很有必要的。本文以“60秒倒計時電路”為例談一談51 單片機(jī)匯編語言的一點(diǎn)技巧。

        一、60秒倒計時電路及編程

        1. 功能要求

        所謂倒計時,就是首先給定一個初始值,然后對初始值進(jìn)行減“1”操作,直到該值為“0”為止。60 秒倒計時就是對給定的初始值“60”每隔1 秒鐘對其進(jìn)行減“1”,一直減到該值為“0”為止。

        該倒計時電路要求有兩個按鈕。一個是“復(fù)位”按鈕,按下按鈕設(shè)置倒計時初始值,并把指示燈熄滅;另一個是“開始”按鈕,按下按鈕開始倒計時。并用兩位LED 數(shù)碼管顯示當(dāng)前倒計時值。計時時間到,指示燈點(diǎn)亮。

        2. 電路組成

        實(shí)現(xiàn)上述功能要求的單片機(jī)接口電路如圖1 所示。

      8051模塊化編程分析

      圖1單片機(jī)接口電路

        圖中用按鈕SB1 作為“置初值”按鈕,按鈕SB2 作為“開始”按鈕。按下SB1 按鈕,將顯示值設(shè)置為“60”。

        按下按鈕SB2,每隔一秒顯示值減“1”,直到值為“0”

        停止計數(shù)。按鈕和指示燈接在P0 口上,P0.0 為初始按鈕,P0.1 為開始按鈕,P0.7 為指示燈。十位LED 數(shù)碼管接P2 口,個位LED 數(shù)碼管接P1 口。圖2 為單片機(jī)基本系統(tǒng)電路。

      單片機(jī)基本系統(tǒng)電路

      圖2 單片機(jī)基本系統(tǒng)電路

        3. 功能分析

        根據(jù)60 秒倒計時的功能要求,需要單片機(jī)完成以下任務(wù):

       ?、?按鍵掃描。用來判斷有沒有鍵被按下,是哪個鍵被按下?根據(jù)不同的鍵,給出相應(yīng)的鍵值。

       ?、?計時顯示。這里時間值使用的是兩位數(shù),故需要將被顯示的時間值取出個位數(shù)和十位數(shù),然后才能進(jìn)行顯示。

       ?、?被顯示數(shù)轉(zhuǎn)換成7 段碼。由于單片機(jī)中的數(shù)據(jù)都是以二進(jìn)制形式存放或運(yùn)算的。而這里輸出顯示使用了兩位LED 數(shù)碼管來顯示計時數(shù)值的,一個被顯示的數(shù)要點(diǎn)亮數(shù)碼管的某幾段才能顯示出這個數(shù),不同的數(shù)需要點(diǎn)亮數(shù)碼管的不同段。因此需要將被顯示的這個數(shù)轉(zhuǎn)換成相應(yīng)的顯示段碼,才能被正確顯示出來。

       ?、?延時。包括1秒鐘延時和按鍵消抖的10毫秒延時。

       ?、?程序編制

        程序按實(shí)現(xiàn)功能采用模塊化結(jié)構(gòu),有一個主程序和若干個子程序組成。每個子程序分別是完成某個任務(wù)的獨(dú)立模塊,有時會用到調(diào)用參數(shù)。本實(shí)例共有5 個子程序,分別是按鍵掃描子程序、10ms 延時子程序、1s 延時子程序、顯示子程序、取段碼子程序。

        ⑴ 按鍵掃描子程序

        按鍵掃描子程序完成對按鍵進(jìn)行掃描,確定有沒有鍵被按下,當(dāng)有鍵被按下并抬起后將相關(guān)鍵值返回給主程序的任務(wù)。其流程如圖3 所示。該子程序沒有入口參數(shù),但有一個出口參數(shù),即按鍵的鍵值,存放在寄存器R3 中。寄存器R3 中的值為“60H”表示SB1 鍵被按下;寄存器R3 中的值為“00H”表示SB2 鍵被按下。

      按鍵掃描子程序流程圖

      圖3 按鍵掃描子程序流程圖

        按照圖3 的流程圖和51 單片機(jī)的指令系統(tǒng)編制的子程序如下:

        ;----------- 按鍵掃描描--------------

        ; 出口參數(shù)鍵值存放在寄存器R3 中,用于識別哪個鍵。

        ;R3=60H, 說明SB1 被按下;R3=00H, 說明SB2 被按下

        key_scan: jnb kb_init, k1check ; SB1 按下轉(zhuǎn)移

        jnb kb_begin, k2check ; SB2 按下轉(zhuǎn)移

        sjmp ksr ;

        k1check: acall del10 ; 調(diào)用毫秒延時,去抖

        jb kb_init, ksr ; 干擾,返回

        jnb kb_init,$ ; 等待按鍵釋放

        mov r3, #60h; 是SB1,鍵值“60H”送寄存器R3

        sjmp ksr ; 是,不進(jìn)行任何操作返回

        k2check: acall del10 ; 調(diào)用毫秒延時,去抖

        jb kb_begin, ksr ; 干擾,返回

        jnb kb_begin,$ ; 等待按鍵釋放

        mov r3, #00h; 是SB2,鍵值“00H”送寄存器R3

        ksr: ret ; 返回

        ;---------------------------------

       ?、?顯示子程序

        顯示子程序完成從被顯示值中取出十位數(shù)將其轉(zhuǎn)換成顯示斷碼,并送單片機(jī)的P2 口;從被顯示值中取出個位數(shù)將其轉(zhuǎn)換成顯示斷碼,并送單片機(jī)的P1 口任務(wù)。其流程如圖4 所示。該子程序有一個入口參數(shù),即被顯示的值,存放在寄存器R2 中。

      顯示子程序流程圖

      圖4 顯示子程序流程圖

        按照圖4 的流程圖和51 單片機(jī)的指令系統(tǒng)編制的子程序如下:

        ;------------ 顯示子程序------------

        ; 入口參數(shù)存放在寄存器R2 中

        display:mov a, r2 ; 取被顯示值

        mov b, #10; 取被顯示值的十位數(shù)

        div ab;

        acall seg7; 調(diào)用轉(zhuǎn)換子程序,取顯示斷碼

        mov p2, a ; 十位數(shù)段碼送P2 口

        mov a, b; 取個位數(shù)

        acall seg7 ; 調(diào)用轉(zhuǎn)換子程序,取顯示斷碼

        mov p1, a ; 個位數(shù)段碼送P1 口

        ret ; 返回

        ;---------------------------------

       ?、?取段碼子程序

        取段碼子程序完成將被顯示的數(shù)轉(zhuǎn)換成7 段共陽LED 數(shù)碼管對應(yīng)數(shù)的段碼的任務(wù)。其流程如圖5 所示。

      取段碼子程序流程圖

      圖5 取段碼子程序流程圖

        該子程序有一個入口參數(shù)和一個出口參數(shù)。入口參數(shù)就是被顯示的數(shù),出口參數(shù)就是該數(shù)的段碼(相應(yīng)位=0表示亮),都存放在累加器A 中。

        按照圖5 的流程圖和51 單片機(jī)的指令系統(tǒng)編制的子程序如下:

        ;-------------- 取段碼--------------

        ; 對累計器A 中的值由查表得到顯示斷碼

        ; 入口和出口參數(shù)存放在累計器A 中

        seg7: inc a ; 取被顯示數(shù),累加器A 加1

        movc a, @a+pc ; 查表

        ret ; 返回

        db 0c0h,0f9h,0a4h,0b0h;0123

        db 99h,92h,82h,0f8h;4567

        db 80h,90h,88h,83h;89AB

        db 0c6h,0a1h,86h,8eh;cdEF

        ;---------------------------------

        ⑷ 延時子程序

        延時子程序完成一定的延時時間任務(wù)。這里有兩個延時時間不同的子程序(也可以調(diào)用100 次10mS 做1S 延遲),其流程如圖6 所示。延時子程序沒有入口和出口參數(shù)。

      延時子程序流程圖

      圖6 延時子程序流程圖

        按照圖6 的流程圖和51 單片機(jī)的指令系統(tǒng)編制的子程序如下:

        ;----------- 延時10ms 程序----------

        ; 用到寄存器組1 中的R6 和R7 寄存器

        del10: setb psw.3 ; 切換至第1 組寄存器

        mov r7, #0bh ;

        dl1: mov r6, #0ffh ;

        dl2: djnz r6, dl2 ;

        djnz r7, dl1;

        clr psw.3 ; 切換至第0 組寄存器

        ret ;

        ;---------------------------------

        ;------------- 延時1s 程序-----------

        ; 用到寄存器組1 中的R1、R2 和R3 寄存器

        del1s: setb psw.3 ; 選用寄存器區(qū)1

        mov r1 , #46; 立即數(shù)46 送寄存器R1

        del0: mov r2 , #100; 立即數(shù)100 送寄存器R2

        del1: mov r3 , #100 ; 立即數(shù)100 送寄存器R3

        djnz r3 , $ ; 寄存器R3 中的內(nèi)容減1,不為零轉(zhuǎn)移到當(dāng)

        前指令

        djnz r2 , del1; 寄存器R2 中的內(nèi)容減1,不為零轉(zhuǎn)移到

        del1

        djnz r1 , del0; 寄存器R1 中的內(nèi)容減1,不為零轉(zhuǎn)移到

        del0

        clr psw.3 ; 選用寄存器區(qū)0

        ret ; 子程序返回

        ;---------------------------------

       ?、?主程序編制

        主程序需要實(shí)現(xiàn)的功能是:完成單片機(jī)端口定義;初始化任務(wù);調(diào)用鍵掃描子程序,根據(jù)按鍵狀態(tài)實(shí)現(xiàn)置初值或進(jìn)行倒計時,并調(diào)用顯示子程序等。其流程如圖7 所示。

      主程序編制流程圖

      圖7 主程序編制流程圖

        按照圖7 的流程圖和51 單片機(jī)的指令系統(tǒng)、以上編制的各子程序,主程序如下:

        ;**********************************************************

        ; 文件名:counter.asm 功能:60 秒倒計時

        ; 說明:p2 和p1 口分別接一個LED 數(shù)碼管, 顯示兩位

        十進(jìn)制數(shù)。

        ; p0.0 和p0.1 口接置初值按鈕和開始倒計時按鈕,p0.7

        接提示LED。

        ; 晶振頻率11.0592MHz.

        ;**********************************************************

        ;------------ 端口定義--------------

        kb_init bit p0.0 ; 置初值按鈕定義

        kb_begin bit p0.1 ; 開始按鈕定義

        warn bit p0.7 ; 提示

        ;---------------------------------

        org 0000h

        ajmp begin

        ;============ 主程序===============

        org 00b0h

        begin:

        mov sp, #50h ; 初始化

        mov p0, #0ffh

        mov p1, #0ffh

        mov p2, #0ffh

        mov r2, #60

        mov r3, #0ffh

        main:

        lcall key_scan ; 按掃描鍵

        mov a, r3 ; 取返回值

        cjne a, #60h, lp1 ; 非SB1 按鍵轉(zhuǎn)移

        mov r2, #60 ; 初值送寄存器R2

        setb p0.7 ; 清指示燈

        acall display ; 調(diào)顯示子程序

        ajmp main ; 轉(zhuǎn)移

        lp1: mov a, r3 ; 取返回值

        cjne a, #00h, main ; 非SB2 按鍵轉(zhuǎn)移

        setb p0.7

        mov r2, #60

        lp2: acall display

        acall del1s ; 調(diào)用1 秒延時子程序

        dec r2

        cjne r2, #00h,lp2

        acall display

        clr p0.7

        mov r3, #0ffh

        ajmp main

        ;=================================

        二、Keil C 中編譯

        1. 新建項(xiàng)目

        打開“Keil C”軟件,新建一個項(xiàng)目。項(xiàng)目名也不妨為“counter”。

        點(diǎn)擊桌面上的圖標(biāo) ,進(jìn)入Keil C51 μVision2集成開發(fā)環(huán)境。在主界面上點(diǎn)下拉菜單“Project”,選“New Project?”命令。在彈出的對話框中將項(xiàng)目命名為“counter”。點(diǎn)“保存”按鈕,選“Atmel”下的“AT89S52”后返回。

        2. 添加源程序

        打開已建立的文件“counter.asm”;并將該文件添加到“Source Group 1”中。

        在μVision2 主界面上點(diǎn)擊打開文件按鈕 ,在彈出的對話框內(nèi)找到剛才新建并保存的文件“counter.asm”。點(diǎn)“打開”按鈕打開。

        在中間左邊的“項(xiàng)目空間(Project Workspace)”內(nèi),點(diǎn)擊“+”展開。再用右鍵點(diǎn)擊“Source Group 1”文件夾,在彈出的菜單命令中選“Add Files to group‘Source Group 1’”。

        3. 參數(shù)設(shè)置

        在“Options for Target‘ Target 1’”中的“Output”標(biāo)簽頁上進(jìn)行設(shè)置。

        點(diǎn)下拉菜單“Project”, 選“Options for Target‘Target 1’”。在彈出對話框上的“Target”標(biāo)簽頁內(nèi),把單片機(jī)的運(yùn)行頻率調(diào)整為11.0592MHz。在“Output”標(biāo)簽頁上,點(diǎn)“Create HEX File”前的復(fù)選框,使其內(nèi)出現(xiàn)“√”,這樣編譯后就能生成目標(biāo)文件了。點(diǎn)“確定”按鈕返回。

        4. 程序編譯

        點(diǎn)編譯和建立目標(biāo)文件,得到“counter.hex”文件。

        在μVision2 主界面上點(diǎn)重新編譯按鈕,對源程序文件進(jìn)行編譯,結(jié)果如圖8 所示。

      圖8

      圖8

        三、Preteus仿真

        ISIS 仿真圖如圖9 所示。設(shè)置CPU:89C51 的特性,加載counter.HEX 代碼加載,運(yùn)行仿真。將光標(biāo)移至按鈕SB1,使光標(biāo)變成一只“手”時,點(diǎn)擊鼠標(biāo)左鍵,使按鈕按下。按鈕釋放后,數(shù)碼管顯示值加“60”,如圖9 所示。啟動倒計時。將光標(biāo)移至按鈕SB2,使光標(biāo)變成一只“手”時,點(diǎn)擊鼠標(biāo)左鍵,使按鈕按下。按鈕釋放后倒計時開始。源程序counter.DSN 請到www.ele169.com 下載。

      8051模塊化編程分析

      圖9ISIS 仿真圖

        四、基本系統(tǒng)上運(yùn)行

        用單片機(jī)基本系統(tǒng)板來驗(yàn)證程序,首先準(zhǔn)備好實(shí)驗(yàn)用器材基本系統(tǒng)板、下載器、電源和萬能板及所需元器件。然后按下面步驟進(jìn)行操作。

       ?、痹趹?yīng)用實(shí)驗(yàn)板上按圖1 焊接好電阻、電容、數(shù)碼管和接插件、按鈕等。

       ?、舶稳プ钚∠到y(tǒng)板上的跳線J101、J102、J103,插上AT89S52 芯片。將下載線的接口板插入電腦的并口上,連接電纜把最小系統(tǒng)與接口板連好,再在最小系統(tǒng)上接上電源。如圖10 所示。

      圖10

      圖10

       ?、炒蜷_下載軟件,并設(shè)置好有關(guān)參數(shù);加載待寫文件“counter.hex”;點(diǎn)“編程”按鈕下載程序。必要時須先對芯片進(jìn)行“擦寫”( 若該芯片中曾燒錄過程序)。

       ?、赐瓿缮厦娴牟僮骱?,關(guān)閉電源,拔下連接電纜,插上跳線J101,接上實(shí)驗(yàn)電路。

       ?、瞪想婒?yàn)證程序,按下按鍵SB1 置初值,按下按鍵SB2 開始倒計時。若不符合要求則進(jìn)行修改(可以先在μVision2 進(jìn)行調(diào)試或Proteus 中仿真)。

       ?、吨貜?fù)上述步驟直到實(shí)現(xiàn)要求的功能。

        五、結(jié)束語

        用匯編語言編制應(yīng)用程序時雖然要考慮單片機(jī)的硬件資源的分配,且實(shí)現(xiàn)相同功能時的語句可能比C51 編程更多,匯編的模塊按結(jié)構(gòu)化編程,同樣也能編制出結(jié)構(gòu)清晰、功能明確、可讀性強(qiáng)、的應(yīng)用程序。



      關(guān)鍵詞: 8051 模塊化編程

      評論


      相關(guān)推薦

      技術(shù)專區(qū)

      關(guān)閉