日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當(dāng)前位置:首頁 >> 技術(shù)中心 >> 單片機(jī)入門 >> 8051單片機(jī)模塊化編程技巧

8051單片機(jī)模塊化編程技巧

作者:admin 來源:不詳 發(fā)布時間:2018-05-08  瀏覽:2

  目前在8051 單片機(jī)應(yīng)用開發(fā)中主要有兩種編程語言:匯編語言和C51 語言。C51 語言是一種結(jié)構(gòu)化的編程語言,采用C51 編寫的應(yīng)用程序結(jié)構(gòu)清晰、模塊化程度高、可讀性強(qiáng)、并容易移植。但C51 語言也有缺點(diǎn),就是編譯后生成的目標(biāo)代碼空間要比匯編的大。

  而且目前單片機(jī)的教材還是側(cè)重于匯編語言。因此學(xué)習(xí)用單片機(jī)匯編語言程序進(jìn)行結(jié)構(gòu)化設(shè)計還是很有必要的。我們知道C51 語言是函數(shù)式語言,其程序由函數(shù)構(gòu)成,每一個源程序有且只有一個主函數(shù)main() 和若干個函數(shù)組成。其中每一個函數(shù)都用于完成某一特定任務(wù)。也就是說,一個項目若具有幾個功能,實(shí)現(xiàn)這些功能就會需要由若干個任務(wù)來完成,那么它的源程序中就會有若干個或以上的函數(shù)。而在匯編語言中,源程序中只有程序和子程序。那么我們能否以子程序為基本單位,用一個子程序?qū)崿F(xiàn)一種功能來做到模塊化編程呢?實(shí)踐證明是可行的。但在編制程序中不要忘記匯編語言的特點(diǎn),注意子程序之間對單片機(jī)資源的使用,避免不同子程序交叉共用同一資源引起程序的錯誤執(zhí)行。子程序嵌套調(diào)用的級數(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 所示。

單片機(jī)接口電路

圖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. 新建項目

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

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

  2. 添加源程序

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

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

  在中間左邊的“項目空間(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)左鍵,使按鈕按下。按鈕釋放后倒計時開始。原文來自www.dqjsw.com.cn圖9ISIS 仿真圖

圖9ISIS 仿真圖

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

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

 、痹趹(yīng)用實(shí)驗板上按圖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í)驗電路。

 、瞪想婒炞C程序,按下按鍵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)用程序。

編輯:admin  最后修改時間:2018-05-08

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

偏关县| 莱阳市| 合山市| 洛浦县| 宽甸| 清苑县| 张家口市| 屏东县| 兴义市| 兴国县| 高台县| 高台县| 漳平市| 略阳县| 化德县| 青铜峡市| 尉氏县| 阿拉善右旗| 莱西市| 英吉沙县| 上栗县| 南华县| 平罗县| 铁岭县| 徐闻县| 麻江县| 甘谷县| 乾安县| 房山区| 新昌县| 顺昌县| 永定县| 和田市| 奉节县| 金堂县| 射阳县| 大厂| 中牟县| 江门市| 翼城县| 阳西县|