亚洲欧美一区二区三区日产_日本高清视频在线www色_1024看99精品_亚洲欧美中东在线观看

  • <pre id="xnhje"></pre>
    <dfn id="xnhje"><var id="xnhje"></var></dfn><menu id="xnhje"></menu>
    <pre id="xnhje"></pre>
  • <bdo id="xnhje"></bdo>

      8051單片機模塊化編程技巧

      發(fā)布時間:2025-03-23
      目前在8051 單片機應用開發(fā)中主要有兩種編程語言:匯編語言和c51 語言。c51 語言是一種結構化的編程語言,采用c51 編寫的應用程序結構清晰、模塊化程度高、可讀性強、并容易移植。但c51 語言也有缺點,就是編譯后生成的目標代碼空間要比匯編的大。
      而且目前單片機的教材還是側重于匯編語言。因此學習用單片機匯編語言程序進行結構化設計還是很有必要的。我們知道c51 語言是函數式語言,其程序由函數構成,每一個源程序有且只有一個主函數main() 和若干個函數組成。其中每一個函數都用于完成某一特定任務。也就是說,一個項目若具有幾個功能,實現這些功能就會需要由若干個任務來完成,那么它的源程序中就會有若干個或以上的函數。而在匯編語言中,源程序中只有程序和子程序。那么我們能否以子程序為基本單位,用一個子程序實現一種功能來做到模塊化編程呢?實踐證明是可行的。但在編制程序中不要忘記匯編語言的特點,注意子程序之間對單片機資源的使用,避免不同子程序交叉共用同一資源引起程序的錯誤執(zhí)行。子程序嵌套調用的級數等。本文以“60秒倒計時電路”為例談一談51 單片機匯編語言模塊化編程的一點技巧。
      一、60秒倒計時電路及編程
      1. 功能要求
      所謂倒計時,就是首先給定一個初始值,然后對初始值進行減“1”操作,直到該值為“0”為止。60 秒倒計時就是對給定的初始值“60”每隔1 秒鐘對其進行減“1”,一直減到該值為“0”為止。
      該倒計時電路要求有兩個按鈕。一個是“復位”按鈕,按下按鈕設置倒計時初始值,并把指示燈熄滅;另一個是“開始”按鈕,按下按鈕開始倒計時。并用兩位led 數碼管顯示當前倒計時值。計時時間到,指示燈點亮。
      2. 電路組成
      實現上述功能要求的單片機接口電路如圖1 所示。
      圖1單片機接口電路
      圖中用按鈕sb1 作為“置初值”按鈕,按鈕sb2 作為“開始”按鈕。按下sb1 按鈕,將顯示值設置為“60”。
      按下按鈕sb2,每隔一秒顯示值減“1”,直到值為“0”
      停止計數。按鈕和指示燈接在p0 口上,p0.0 為初始按鈕,p0.1 為開始按鈕,p0.7 為指示燈。十位led 數碼管接p2 口,個位led 數碼管接p1 口。圖2 為單片機基本系統(tǒng)電路。
      圖2 單片機基本系統(tǒng)電路
      3. 功能分析
      根據60 秒倒計時的功能要求,需要單片機完成以下任務:
      ⑴ 按鍵掃描。用來判斷有沒有鍵被按下,是哪個鍵被按下?根據不同的鍵,給出相應的鍵值。
      ⑵ 計時顯示。這里時間值使用的是兩位數,故需要將被顯示的時間值取出個位數和十位數,然后才能進行顯示。
      ⑶ 被顯示數轉換成7 段碼。由于單片機中的數據都是以二進制形式存放或運算的。而這里輸出顯示使用了兩位led 數碼管來顯示計時數值的,一個被顯示的數要點亮數碼管的某幾段才能顯示出這個數,不同的數需要點亮數碼管的不同段。因此需要將被顯示的這個數轉換成相應的顯示段碼,才能被正確顯示出來。
      ⑷ 延時。包括1秒鐘延時和按鍵消抖的10毫秒延時。
      ⒋ 程序編制
      程序按實現功能采用模塊化結構,有一個主程序和若干個子程序組成。每個子程序分別是完成某個任務的獨立模塊,有時會用到調用參數。本實例共有5 個子程序,分別是按鍵掃描子程序、10ms 延時子程序、1s 延時子程序、顯示子程序、取段碼子程序。
      ⑴ 按鍵掃描子程序
      按鍵掃描子程序完成對按鍵進行掃描,確定有沒有鍵被按下,當有鍵被按下并抬起后將相關鍵值返回給主程序的任務。其流程如圖3 所示。該子程序沒有入口參數,但有一個出口參數,即按鍵的鍵值,存放在寄存器r3 中。寄存器r3 中的值為“60h”表示sb1 鍵被按下;寄存器r3 中的值為“00h”表示sb2 鍵被按下。
      圖3 按鍵掃描子程序流程圖
      按照圖3 的流程圖和51 單片機的指令系統(tǒng)編制的子程序如下:
      ;----------- 按鍵掃描描--------------
      ; 出口參數鍵值存放在寄存器r3 中,用于識別哪個鍵。
      ;r3=60h, 說明sb1 被按下;r3=00h, 說明sb2 被按下
      key_scan: jnb kb_init, k1check ; sb1 按下轉移
      jnb kb_begin, k2check ; sb2 按下轉移
      sjmp ksr ;
      k1check: acall del10 ; 調用毫秒延時,去抖
      jb kb_init, ksr ; 干擾,返回
      jnb kb_init,$ ; 等待按鍵釋放
      mov r3, #60h; 是sb1,鍵值“60h”送寄存器r3
      sjmp ksr ; 是,不進行任何操作返回
      k2check: acall del10 ; 調用毫秒延時,去抖
      jb kb_begin, ksr ; 干擾,返回
      jnb kb_begin,$ ; 等待按鍵釋放
      mov r3, #00h; 是sb2,鍵值“00h”送寄存器r3
      ksr: ret ; 返回
      ;---------------------------------
      ⑵ 顯示子程序
      顯示子程序完成從被顯示值中取出十位數將其轉換成顯示斷碼,并送單片機的p2 口;從被顯示值中取出個位數將其轉換成顯示斷碼,并送單片機的p1 口任務。其流程如圖4 所示。該子程序有一個入口參數,即被顯示的值,存放在寄存器r2 中。
      圖4 顯示子程序流程圖
      按照圖4 的流程圖和51 單片機的指令系統(tǒng)編制的子程序如下:
      ;------------ 顯示子程序------------
      ; 入口參數存放在寄存器r2 中
      display:mov a, r2 ; 取被顯示值
      mov b, #10; 取被顯示值的十位數
      div ab;
      acall seg7; 調用轉換子程序,取顯示斷碼
      mov p2, a ; 十位數段碼送p2 口
      mov a, b; 取個位數
      acall seg7 ; 調用轉換子程序,取顯示斷碼
      mov p1, a ; 個位數段碼送p1 口
      ret ; 返回
      ;---------------------------------
      ⑶ 取段碼子程序
      取段碼子程序完成將被顯示的數轉換成7 段共陽led 數碼管對應數的段碼的任務。其流程如圖5 所示。
      圖5 取段碼子程序流程圖
      該子程序有一個入口參數和一個出口參數。入口參數就是被顯示的數,出口參數就是該數的段碼(相應位=0表示亮),都存放在累加器a 中。
      按照圖5 的流程圖和51 單片機的指令系統(tǒng)編制的子程序如下:
      ;-------------- 取段碼--------------
      ; 對累計器a 中的值由查表得到顯示斷碼
      ; 入口和出口參數存放在累計器a 中
      seg7: inc a ; 取被顯示數,累加器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
      ;---------------------------------
      ⑷ 延時子程序
      延時子程序完成一定的延時時間任務。這里有兩個延時時間不同的子程序(也可以調用100 次10ms 做1s 延遲),其流程如圖6 所示。延時子程序沒有入口和出口參數。
      圖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; 立即數46 送寄存器r1
      del0: mov r2 , #100; 立即數100 送寄存器r2
      del1: mov r3 , #100 ; 立即數100 送寄存器r3
      djnz r3 , $ ; 寄存器r3 中的內容減1,不為零轉移到當
      前指令
      djnz r2 , del1; 寄存器r2 中的內容減1,不為零轉移到
      del1
      djnz r1 , del0; 寄存器r1 中的內容減1,不為零轉移到
      del0
      clr psw.3 ; 選用寄存器區(qū)0
      re
      上一個:液壓油專用濾油機的優(yōu)勢及使用與保養(yǎng)怎么做
      下一個:持槍搶劫存在未遂嗎

      windows11性能提升(win10 win11性能對比)
      直流高壓發(fā)生器快速極性轉換方法
      活蟲采集管 平底養(yǎng)蟲管 養(yǎng)蚊管 微小昆蟲飼養(yǎng)管 型號:HL-CJG
      深圳口岸數字清關加速:618期間單日破5萬單
      海外倉清關是什么意思 海外倉發(fā)貨清關是什么意思
      Lazada雙11期間聯(lián)合菜鳥提供超450趟干線航班保障運力
      寄長途大件物流最便宜
      洗手液海運到美國物流(肥皂)
      淘寶官方海運美國多久(海運中國到美國多久)
      蘇州倉儲物流設備有限公司 蘇州大型倉儲物流