注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! • 打開購物車 • 查看留言 • 付款方式 • 聯系我們 |
![]() |
首頁 | 電子入門 | 學單片機 | 免費資源 | 下載中心 | 商品列表 | 象棋在線 | 在線繪圖 | 加盟五一 | 加入收藏 | 設為首頁 |
選擇分類:當前分類——學單片機 相關聯或者相類似的文章: 三十分鐘一個小時學會單片機(9045) 什么是單片機?單片機有什么用? (8723) 如何用STC板將代碼燒錄進IC(8681) 怎樣安裝AT51編程板的USB轉串口軟件?(8206) 送給單片機愛好者——LED在線編碼器(1814) 送給單片機愛好者——LED點陣在線編碼器(1544) 單片機系統中的漢字顯示(1492) 帶語音報數功能的搶答器(1489) 用VB進行串口實時數據采集(1347) 用AT89C2051設計超聲波測距儀(1171) 小小電子鬧鐘 生活學習良伴(1165) DS1820測溫原理(1129) 幾句代碼實現控制攝像頭(轉)(1117) STC單片機選型指南(1111) 自制PIC單片機編程器(1105) USB轉串口芯片CH340(1010) 快速學習單片機之黃金機會!(1010) 告戒購單片機開發實驗板初學者(970) 新款實用旋轉LED顯示屏A(890) 使用市售 USB轉RS232串口與PLC通信的測試報告 (881) 首頁 前頁 后頁 尾頁 本站推薦: | 含延時程序的燈光顯示 含延時程序的燈光顯示 經過前一階段的學習我們終于編寫了一個可以控制燈光變化的程序。在實際應用中,既可以用這個程序控制發光二極管, 也可以控制繼電器,還可以控制可控硅……。只是對于繼電器、 可控硅等需要用較大功率推動的器件,不能用單片機直接帶動,要在輸出接上三極管或集成電路,以擴大推動能力。 仿照前面的講解,可以根據自己需要改變燈光顯示的順序,也可以改變顯示的花樣。但是,前面的程序有一個缺點,就是勘浠灰淮蝸允荊托枰匆淮渭獺?/span> 在實際工作中是否每運行一步都需要用按一次按鍵呢?如果真這樣還不如直接用人工控制呢。其實,剛才的手動操作是為調試程序檢查實驗效果設計的,用手動操作,每次前進一步,如果運行的結果和設計的不同就可以停下來,檢查原因。在計算機調試中稱為“單步運行”。對應的由程序自己運行稱之為“連續運行”。 如果在程序輸入完成后,將K1(注有S-E的標記)撥向“E”一方,不是按STEP鍵,而是按一次EXE鍵,程序就自己運行了,在主機板顯示“廠”字,其原意是顯示英文“r”,(run 是運行的意思)但是形狀相差比較大。 這時,再觀察實驗板的LED情況如何呢?并沒有出現想象中的輪流顯示,而是全部都亮了,只是亮度較剛才低了一點,這又是怎么回事呢?在手動實驗中,每次變換都由人工操作,過程很慢,可以清楚的觀察到燈光轉換現象。由計算機直接運行,速度比人工快的多,雖然燈光是輪流顯示的,由于眼睛的滯后效應觀察起來燈光連成了一片。但是每個燈只有十分之一的時間在發光 (想想為什么?)所以就看起來暗了。 為了觀察到輪流發光的效果,就必須在每次轉換之后,讓計算機停頓一段時間,可是計算機的運行是無法停止的,于是就在每次變換燈光之后加入一段程序,讓計算機白白消耗一段時間再運行下一步。這段程序稱做“延時程序”。延時程序在計算機程序中應用很普遍。 為了簡潔,只給出兩組燈光的變換程序,讀者可以根據原理自己擴展。 程序二,延時燈光變換 8000 1 0RG 800H 8000 7590AA 2 LOOP:MOV P1,#0AAH;燈光1 8003 7FFF 3 MOV R7,#OFFH;預置R7為255 8005 7EFF 4 WAIT1:MOV R6,#OFFH;預置R6為255 8007 00 5 WAIT1: NOP ;空操作 8008 DEFD 6 DJNZ R6,WAIT2;R6減1,不為零返回DELA2處 800A DFF9 7 DJNZ R7,WAIT1;R7減1,不為零返回DELA1處 800C 759055 8 MOV P1, #055H;燈光2 800F 7FFF 9 MOV R7, #0FFH;預置R7為255 8011 7EFF 10 WAIT3: MOV R6,#0FFH;預置R6為255 8013 00 11 WAIT4: NOP;空操作 8014 DEFD 12 DJNZ R6,WAIT4;R6減1,不為零返回DELA2處 8016 DFF9 13 DJNZ R7,WAIT3 1R7減1,不為零返回DELA1處 8018 0100 14 AJMP LOOP 15 END 和程序一比較,這個程序中使用了R6、R7兩個寄存器。在單片機中可以同時使用8個寄存器,分別叫R0、R1……R7。這么多寄存器做什么用呢?在一個復雜的程序中,要進行許多運算,運算的初始值和中間結果都可以用寄存器保存。如果寄存器太少運算就不方便。在我們這個程序中就使用了兩個寄存器,至于使用哪一個都是一樣。 下面對程序二的改進部分做一說明: 第3、4行將R7、R6寄存器預先送入0FFH (等于十進制 的255)。 然后執行一條空操作(NOP)指令,這條指令除了消耗一段時間(兩個微秒)以外什么也不做。 DJNZ R6, WAIT2指令的功能是:將R6減1,并判斷是否到0,如果沒有到0,就返回WAIT2,再執行NOP(空操作指令)……直到循環了255次,R6減到0,執行下條指令。這條指令也消耗2微秒的時間。 后續DJNZ R7,WAIT3的功能類同上條,當R7減1不等于0時,返回到WAIT3,將R6又一次設定為0FFH,R6又執行一遍遞減。如此這般總計循環了65025次(255x255)。在Dp-851K機器上每次循環消耗4微秒,總計約0.3秒,也就是說,每變換一次燈光就停頓0.3秒,由于時間加長,就可以清楚的觀察到燈光變換了。改變R6、R7的設定值就可以改變延時時間。 把程序二的機器碼輸入到單片機中,實驗一下連續運行方式,是否如上面分析的?可是,如果再用單步方式一步步地走一遍,即便一秒鐘按2下鍵盤,完成一個循環也需要18個小時,而計算機僅用0.3秒,這就是計算機和人的區別! 程序二中,兩個延時程序十分相似:第3-7行和第9-13行。如果增加燈光變換指令,還要在其后面加上延時程序,這樣整個程序就顯得很煩瑣。能否將這些程序簡化呢?完全可以,這需要采用于程序形式。 將程序中多處需要使用的程序編制為一個獨立的部分稱之為“子程序”。子程序的第一條加一個標號,作為子程序的名稱, 最后一條一定是返回指令RET。在使用于程序的地方加入一條調用指令CALL XXXX即可。這里的XXXX是子程序的名稱,也就是子程序的入口地址。上例可改編如下: 程序三:用延時子程序的燈光變換 8000 1 0RG 800H 8000 7590AA 2 LOOP: MOV P1,#0AAH;燈光1 8003 110C 3 ACALL WAIT ;調用延時子程序 8005 759055 4 MOV P1,#055H ;燈光2 8008 110C 5 ACALL WAIT ;調用延時子程序 800A 0100 6 AJMP L00P 800C 7FFF 8 WAIT:MOV R7, #0FFH;預置R7為255 800E 7EFF 9 WAIT1 : MOV R6, #0FFH;預置R6為25 8010 00 10 WAIT2: NOP ;空操作 8011 DEFD 11 DJNZ R6,WAIT2;R6減1,不為零返回DELA2處 8013 DFF9 12 DJNZ R7,WAIT1;R7減1,不為零返DELA1處 13 END 在這個程序中,編寫了一個叫“WAIT”的延時子程序。延時程序的內容和前面程序二的3-7行相同,但是主程序簡潔多了,子程序獨立后也很清晰。使用于程序還有一些優點:將已經調試成功的模塊編成子程序,以后可以直接使用,不必重新編寫。在進行大型程序調試時,將一個大程序分解為若干個子程序,可以使程序流程清晰,也便于分別調試加快進度。使用子程序需要注意幾個問題: 1.每個子程序必須有一個唯一的名字,便于主程序調用時指定。 2.子程序的最后一條必須是返回指令(RET)。 3.子程序中使用的寄存器不能和主程序沖突。在上例中,子程序使用了R6、R7,在主程序中就不能在調用子程序前、后用R6、R7存儲數據。比如下面的程序就會出現錯誤。 MOV R6,#05H MOV R7,#06H ACALL WAIT MOV A,R6 ADD A,R7 …… WAIT:MOV R7,#0FFH;預置R7為255 WAIT1:MOV R6,#0FFH;預置R6為255 WAIT2:NOP;空操作 DJNZ R6,WAIT2;R6減1,不為零返回DELA2處 DJNZ R7,WAIT1;R7減1,不為零返回DELAI處 END 程序的原意是在R6、R7中保存了數據,在延時之后求R6和R7的和。但是,在子程序WAIT中R6、R7已經被使用(最后實際值都為0)。后面的加法運算結果不是預計的0BH(二進制05H+06H=0BH)而是0。如果主程序和子程序使用的寄存器產生了沖突怎么辦?在后面我們將講到,可以用堆棧的方法來解決。 1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。 2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! |
本站協議。
版權信息。
關于我們。
本站地圖。
營業執照。
發票說明。
付款方式。
聯系方式
深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102 E-mail:51dz$163.com($改為@);Tel:(0755)27947428 工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389 |