国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

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

8051單片機模塊化編程技巧

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

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

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

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

  1. 功能要求

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

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

  2. 電路組成

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

單片機接口電路

圖1 單片機接口電路 

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

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

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

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

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

  3. 功能分析

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

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

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

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

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

 、 程序編制

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

  ⑴ 按鍵掃描子程序

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

按鍵掃描子程序流程圖

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

  按照圖3 的流程圖和51 單片機的指令系統(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 ; 是,不進行任何操作返回

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

  jb kb_begin, ksr ; 干擾,返回

  jnb kb_begin,$ ; 等待按鍵釋放

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

  ksr: ret ; 返回

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

  ⑵ 顯示子程序

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

顯示子程序流程圖

圖4 顯示子程序流程圖

  按照圖4 的流程圖和51 單片機的指令系統(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 單片機的指令系統(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 單片機的指令系統(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)移到當

  前指令

  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 ; 子程序返回

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

 、 主程序編制

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

主程序編制流程圖

圖7 主程序編制流程圖

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

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

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

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

  十進制數(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”。

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

  2. 添加源程序

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

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

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

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

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

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

  4. 程序編譯

  點編譯和建立目標文件,得到“counter.hex”文件。

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

圖8

圖8

  三、Preteus仿真

  ISIS 仿真圖如圖9 所示。設(shè)置CPU:89C51 的特性,加載counter.HEX 代碼加載,運行仿真。將光標移至按鈕SB1,使光標變成一只“手”時,點擊鼠標左鍵,使按鈕按下。按鈕釋放后,數(shù)碼管顯示值加“60”,如圖9 所示。啟動倒計時。將光標移至按鈕SB2,使光標變成一只“手”時,點擊鼠標左鍵,使按鈕按下。按鈕釋放后倒計時開始。原文來自www.dqjsw.com.cn圖9ISIS 仿真圖

圖9ISIS 仿真圖

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

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

  ⒈在應(yīng)用實驗板上按圖1 焊接好電阻、電容、數(shù)碼管和接插件、按鈕等。

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

圖10

圖10

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

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

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

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

  五、結(jié)束語

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

久久热在线视频免费观看| 老司机精品一区二区三区| 亚洲人午夜精品射精日韩| 黑鬼糟蹋少妇资源在线观看| 91精品视频全国免费| 少妇福利视频一区二区| 一区二区三区国产日韩| 有坂深雪中文字幕亚洲中文| 日韩日韩日韩日韩在线| 日韩欧美中文字幕人妻| 久久99爱爱视频视频| 国产精品欧美日韩中文字幕| 99精品人妻少妇一区二区人人妻| 风间中文字幕亚洲一区| 精品少妇人妻一区二区三区| 麻豆亚州无矿码专区视频| 人人妻人人澡人人夜夜| 亚洲国产色婷婷久久精品| 欧美精品久久一二三区| 欧美一区二区三区性视频| 欧美日韩国内一区二区| 暴力性生活在线免费视频| 国产精品福利一二三区| 日韩偷拍精品一区二区三区| 在线观看国产成人av天堂野外| 大香蕉再在线大香蕉再在线| 欧美精品激情视频一区| 国产美女网红精品演绎| 男人和女人草逼免费视频| 欧美二区视频在线观看| 亚洲男人的天堂色偷偷| 人人妻人人澡人人夜夜| 欧美亚洲综合另类色妞| 黑人粗大一区二区三区| 国产精品久久精品毛片| 我想看亚洲一级黄色录像| 国产av天堂一区二区三区粉嫩| 中国一区二区三区人妻| 久久精品久久久精品久久| 欧美日韩人妻中文一区二区| 色老汉在线视频免费亚欧|