freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

plc單片機(jī)嵌入式系統(tǒng)畢業(yè)論文-資料下載頁

2025-06-19 14:28本頁面
  

【正文】 X@DPTR,A 匯編語言讀寫外部RAM不受地址范圍限制,且效率比較高。本系統(tǒng)設(shè)計(jì)的鍵盤比較簡(jiǎn)單,采用按鍵與單片機(jī)的某輸入端口一一對(duì)應(yīng)的接線方式,當(dāng)某個(gè)按鍵按下時(shí)該端口對(duì)應(yīng)的位被與地短接,輸入為0。因此只需要查詢?cè)摱丝诘母魑恢心男┹斎霝?,即可判斷是哪個(gè)鍵被按下。按鍵處理任務(wù)的代碼如下: unsigned char KeyValue //按鍵的鍵值 define KEY 3 //按鍵處理任務(wù)的編號(hào) void KEY(void)_task_KEY { while(1){ KeyValue=U1A。 //U1A為與鍵盤相連的端口 //若切換到停止模式,則給串口通信任務(wù)發(fā)送信號(hào) if(KeyValue==STOP)isr_send_signal(UART)。 //若切換到運(yùn)行模式,則給讀用戶程序任務(wù)發(fā)送信號(hào) if(KeyValue==RUN)isr_send_signal(RUN_USR_CODE)。 os_wait(K_TMO,sec,0)。//每隔50ms掃描,sec根據(jù)實(shí)際晶振頻率及系統(tǒng)的INIT_CLOCK參數(shù)值決定 }} PLC指令解釋任務(wù)的實(shí)現(xiàn)在上位機(jī)軟件中,根據(jù)編碼規(guī)律對(duì)PLC指令表進(jìn)行了唯一的編碼并生成二進(jìn)制文件。下位機(jī)在得到該P(yáng)LC指令表程序后,為了實(shí)現(xiàn)PLC實(shí)際控制功能,應(yīng)該對(duì)指令表程序進(jìn)行解釋執(zhí)行。根據(jù)不同指令的不同意義,進(jìn)行不同的操作,使指令表程序可以實(shí)現(xiàn)特定環(huán)境下的控制。 PLC指令解釋原理 本系統(tǒng)的下位機(jī)對(duì)PLC指令進(jìn)行解釋的原理是:首先建立一個(gè)用戶程序指針usr_code_ptr,初始化為指向用戶程序存儲(chǔ)區(qū)的起始地址,用以記錄當(dāng)前掃描用戶程序所到的位置。然后從usr_code_ptr指針指向的地址開始讀取用戶程序。第一個(gè)字節(jié)一定是操作碼,首先判斷其類型,根據(jù)操作數(shù)的不同執(zhí)行選擇下一步動(dòng)作:若為無操作數(shù)指令,則直接調(diào)用相應(yīng)的C函數(shù)或代碼段;若為有操作數(shù)指令,usr_code_ptr指針后移,繼續(xù)讀操作碼所要求的數(shù)量的操作數(shù),每讀一個(gè)字節(jié)就將指針值加1。根據(jù)操作碼的含義和操作數(shù)的類型,可以判斷每個(gè)操作數(shù)需要讀幾個(gè)字節(jié)。在讀取到所需數(shù)量的操作數(shù)之后,調(diào)用相應(yīng)的C函數(shù),并將操作數(shù)作為參數(shù)按順序傳遞該函數(shù)。這是一個(gè)“以空間換時(shí)間”的策略,因?yàn)楹瘮?shù)指針數(shù)組需要占用256字節(jié)。而ADuC841的程序ROM有62KB,足夠系統(tǒng)使用。因此用這點(diǎn)空間換取程序效率的大大提高是非常值得的。真正的PLC在執(zhí)行指令的過程中,堆棧是非常關(guān)鍵、不可缺少的一個(gè)結(jié)構(gòu),它通常有9位:棧頂用來存儲(chǔ)邏輯運(yùn)算的結(jié)果,下面的8位用來存儲(chǔ)中間運(yùn)算結(jié)果。堆棧中的數(shù)據(jù)一般按“先進(jìn)后出”的原則存取。為了解釋PLC指令,下位機(jī)PLC指令解釋任務(wù)中必須創(chuàng)建一個(gè)操作數(shù)堆棧,也設(shè)計(jì)為9位:使用一個(gè)位變量status來做棧頂,保存當(dāng)前運(yùn)算結(jié)果。Keil的庫(kù)函數(shù)_cror_和_crol_能分別實(shí)現(xiàn)字節(jié)的右移和左移,可以通過對(duì)字節(jié)的移位操作來模擬堆棧的入棧和出棧操作。以上是解釋PLC指令的總體上的基本原理,可用圖53來概括。后面幾節(jié)具體介紹常用PLC指令的解釋方法。常開觸點(diǎn)對(duì)應(yīng)的存儲(chǔ)器地址位為1狀態(tài)時(shí),該觸點(diǎn)閉合,在PLC語句表中,分別用LD(Load,裝載)、A(And,與)和O(Or,或)指令來表示開始、串聯(lián)和并聯(lián)的常開觸點(diǎn)。常閉觸點(diǎn)對(duì)應(yīng)的存儲(chǔ)器地址位為0狀態(tài)時(shí),該觸點(diǎn)閉合,在PLC語句表中,分別用LDN(Load Not)、AN(And Not)和ON(Or Not)來表示開始、串聯(lián)和并聯(lián)的常閉觸點(diǎn),觸點(diǎn)符號(hào)中間的“/”表示常閉。觸點(diǎn)指令中變量的數(shù)據(jù)類型為BOOL型。見圖54。 當(dāng)CPU掃描到LD指令時(shí),程序首先判斷其帶單操作數(shù),于是先讀取下一個(gè)存儲(chǔ)單元中的操作數(shù),即位元件,通過元件的編碼來計(jì)算位元件在存儲(chǔ)器中的字節(jié)地址,將指令指定的位地址中的二進(jìn)制數(shù)據(jù)裝載入棧頂。執(zhí)行A指令時(shí),同樣判斷其帶單操作數(shù),從下一個(gè)存儲(chǔ)單元中讀取操作數(shù)地址后將指令指定的位地址中的二進(jìn)制數(shù)據(jù)和棧頂status中的二進(jìn)制數(shù)據(jù)相“與”,結(jié)果存入棧頂status。執(zhí)行O指令時(shí),將指令指定的位地址中的二進(jìn)制數(shù)據(jù)和棧頂status中的二進(jìn)制數(shù)據(jù)相“或”,結(jié)果存入棧頂status。執(zhí)行常閉觸點(diǎn)對(duì)應(yīng)的LCD、AN和ON指令時(shí),取出指令指定的位地址中的二進(jìn)制數(shù)據(jù)后,將它取反,然后再作對(duì)應(yīng)的裝載、與、或操作。需要特別注意的是,由于我們提供的工作堆棧有9級(jí),LD和(或)LDN指令在同一網(wǎng)絡(luò)連續(xù)出現(xiàn)超過8次時(shí),再執(zhí)行LD或LDN指令,將丟失數(shù)據(jù)。本系統(tǒng)采用的與堆棧有關(guān)的指令有6個(gè),它們的意義及實(shí)現(xiàn)原理解釋如下:裝載或(OLD,Or Load)指令,用于將兩個(gè)電路塊并聯(lián)。當(dāng)CPU掃描到OLD指令時(shí),解釋程序?qū)⒐ぷ鞫褩ORK_STACK右移移位模擬堆棧的出棧,將移出的一位與status位進(jìn)行邏輯或操作,結(jié)果保存在status中。裝載與(ALD,And Load)指令,用于將兩個(gè)電路塊串聯(lián)。當(dāng)CPU掃描到ALD指令時(shí),解釋程序?qū)⒐ぷ鞫褩ORK_STACK右移移位模擬堆棧的出棧,將移出的一位與status位進(jìn)行邏輯與操作,結(jié)果保存在status中。邏輯入棧指令(Logic Push,LPS)。當(dāng)CPU掃描到LPS指令時(shí),解釋程序復(fù)制棧頂status內(nèi)容,并將其壓入堆棧WORK_STACK的最右端,棧中原來的數(shù)據(jù)依次向下層推移,棧底值被推出丟失。邏輯讀棧指令(Logic Read,LPR)。當(dāng)CPU掃描到LPP指令時(shí),解釋程序?qū)⒐ぷ鞫褩ORK_STACK最右端的一位復(fù)制到status,WORK_STACK中的內(nèi)容不變,但是原status值丟失。邏輯出棧指令(Logic Pop,LPP)。當(dāng)CPU掃描到LPS指令時(shí),解釋程序?qū)⒐ぷ鞫褩ORK_STACK右移一位,移出的位到棧頂status,原status值丟失。裝載堆棧指令(Load Stack,n=1~8,LDS n)。當(dāng)CPU掃描到LPS指令時(shí),解釋程序復(fù)制堆棧內(nèi)第n層的值到棧頂,堆棧WORK_STACK中原來的數(shù)據(jù)依次向下一層推移,棧底值被推出丟失。立即(Immediate)觸點(diǎn)指令只能用于輸入量I,執(zhí)行立即觸點(diǎn)指令時(shí),立即讀入物理輸入點(diǎn)的值,根據(jù)該值決定觸點(diǎn)的接通/斷開狀態(tài),但是并不更新該物理輸入點(diǎn)對(duì)應(yīng)的輸入過程映像寄存器。本系統(tǒng)包含的立即觸點(diǎn)指令有6個(gè),LDI、AI、OI分別用來表示開始、串聯(lián)和并聯(lián)的常開觸點(diǎn)立即觸點(diǎn),LDNI、ANI、ONI分別用來表示開始、串聯(lián)和并聯(lián)的常閉觸點(diǎn)立即觸點(diǎn)。立即觸點(diǎn)指令用C語言實(shí)現(xiàn)比較簡(jiǎn)單,只需在讀該觸點(diǎn)值時(shí)直接讀對(duì)應(yīng)的物理端口。正跳變觸點(diǎn)檢測(cè)到一次正跳變(觸點(diǎn)的輸入信號(hào)由0變?yōu)?)時(shí),或負(fù)跳變觸點(diǎn)檢測(cè)到一次負(fù)跳變(觸點(diǎn)的輸入信號(hào)由1變?yōu)?)時(shí),觸點(diǎn)接通一個(gè)掃描周期。正/負(fù)跳變指令的助記符分別為EU(Edge Up,上升沿)和ED(Edge Down,下降沿),它們沒有操作數(shù),觸點(diǎn)符號(hào)中間的“P”和“N”分別表示正跳變和負(fù)跳變。位元件必須保存上一個(gè)掃描周期的狀態(tài)才能實(shí)現(xiàn)跳變觸點(diǎn)指令功能,所以為每一個(gè)位元件都分配一個(gè)存儲(chǔ)變量,該存儲(chǔ)變量在系統(tǒng)初始化時(shí)全部置0。在每個(gè)掃描周期的末尾將各位元件的值賦給對(duì)應(yīng)的存儲(chǔ)變量,在下一個(gè)掃描周期中,若位元件的狀態(tài)發(fā)生變化,則通過與對(duì)應(yīng)的存儲(chǔ)變量的值進(jìn)行比較就可知道其是正跳變還是負(fù)跳變。在C51實(shí)現(xiàn)上,當(dāng)CPU掃描到EU或ED指令時(shí),解釋程序就比較當(dāng)前位元件與其對(duì)應(yīng)的存儲(chǔ)變量。若位元件為1,存儲(chǔ)變量為0,則為正跳變,EU被觸發(fā);若位元件為0,存儲(chǔ)變量為1,則為負(fù)跳變,ED被觸發(fā)。輸出指令(=)與線圈相對(duì)應(yīng),驅(qū)動(dòng)線圈的觸點(diǎn)電路接通時(shí),線圈流過“能流”,指定位對(duì)應(yīng)的映像寄存器為1,反之則為0。當(dāng)CPU掃描到輸出指令時(shí),解釋程序?qū)m斨祻?fù)制到對(duì)應(yīng)的映像寄存器。S(Set)是置位指令,R(Reset)是復(fù)位指令。執(zhí)行置位指令或復(fù)位指令時(shí),從指定的位地址開始的N個(gè)連續(xù)的位地址都被置位(變?yōu)?)或復(fù)位(變?yōu)?),N=1~255。執(zhí)行立即置位(Set Immediate,SI)或立即復(fù)位(Reset Immediate,RI)指令時(shí),從指定的位地址開始的N個(gè)連續(xù)的位地址都被置位或復(fù)位,N=1~128。取反(NOT)觸點(diǎn)將存放在堆棧頂部的邏輯運(yùn)算結(jié)果取反,故其在下位機(jī)解釋程序中的實(shí)現(xiàn)只需將status位取反再存入status即可:status=~status??詹僮髦噶睿∟OP N)不影響程序的執(zhí)行,操作數(shù)N=0~255。故其在下位機(jī)解釋程序中可以用空循環(huán)來實(shí)現(xiàn),先取下一個(gè)字節(jié)中的操作數(shù)N,然后執(zhí)行N次空循環(huán):char i。for(i=0。iN。i++)。PLC系統(tǒng)一般要三種不同時(shí)間間隔的定時(shí)器:1ms間隔定時(shí)器、10ms間隔定時(shí)器和100ms間隔定時(shí)器。首先要實(shí)現(xiàn)一個(gè)實(shí)時(shí)時(shí)鐘,由于嵌入式實(shí)時(shí)操作系統(tǒng)已經(jīng)占用了定時(shí)器/計(jì)數(shù)器0,我們可以采用定時(shí)器/計(jì)數(shù)器1產(chǎn)生10ms的中斷。然后要設(shè)計(jì)一個(gè)結(jié)構(gòu)體變量Timer來記錄定時(shí)器的狀態(tài)。 定時(shí)中斷服務(wù)子程序設(shè)計(jì)流程如圖55所示。由于本系統(tǒng)很少需要使用到精確到1ms的定時(shí),故只在總共16個(gè)定時(shí)器中設(shè)置一個(gè)為1ms定時(shí)器;100ms定時(shí)器用戶需要使用的最多,因此系統(tǒng)需要提供的也最多,設(shè)置其中10個(gè)為100ms定時(shí)器,剩余5個(gè)為10ms定時(shí)器。下面以接通延時(shí)定時(shí)器(TON)為例介紹定時(shí)器指令的具體實(shí)現(xiàn)方法,其它定時(shí)器指令都可用類似的方法實(shí)現(xiàn),在此不詳述。定時(shí)器的當(dāng)前值、設(shè)定值均為16位有符號(hào)整數(shù),允許最大值為32767。接通延時(shí)定時(shí)器(TON)的使能輸入端(IN)的輸入電路接通時(shí)開始定時(shí)。當(dāng)前值大于等于預(yù)置時(shí)間(Preset Time,PT)端指定的設(shè)定值時(shí),定時(shí)器位變?yōu)镺N,梯形圖中該定時(shí)器的常開觸點(diǎn)閉合,常閉觸點(diǎn)斷開。達(dá)到設(shè)定值后,當(dāng)前值仍然繼續(xù)增大,直到最大值32767。定時(shí)器指令的指令格式為:TON T0 E100在上述格式中,TO表示定時(shí)器的編號(hào),可以根據(jù)該操作數(shù)找到定時(shí)器元件的變量。操作數(shù)E100用來表示當(dāng)前定時(shí)器的定時(shí)常數(shù),在系統(tǒng)中,分別采用“E”、“F”、“G”來分別代表時(shí)間基準(zhǔn)1ms、10ms、l00ms。在上述指令中定時(shí)器的定時(shí)時(shí)間為100ms。在解釋程序中,當(dāng)掃描到定時(shí)器指令TON時(shí),解釋程序完成如下操作:根據(jù)第一個(gè)操作數(shù)可以確定定時(shí)器編號(hào)以及表示該定時(shí)器的變量存儲(chǔ)地址。彈出輸入值堆棧中的棧頂元素(該元素即為定時(shí)器的驅(qū)動(dòng)元件),判斷該元素的值是否為l,如果是,定時(shí)器開始計(jì)時(shí),在到達(dá)時(shí)間基準(zhǔn)后,在定時(shí)器當(dāng)前值的基礎(chǔ)上加1。如果驅(qū)動(dòng)元件狀態(tài)為0,定時(shí)器停止計(jì)時(shí)。判斷當(dāng)前值是否等于預(yù)置值,如果相等,則定時(shí)器輸出值置l,如果不是,定時(shí)器輸出值置0。計(jì)數(shù)器指令的格式為:CNT C0 K100若驅(qū)動(dòng)計(jì)數(shù)器的元件狀態(tài)產(chǎn)生了由“0”到“1”的跳變,若當(dāng)前計(jì)數(shù)器的計(jì)數(shù)值等于計(jì)數(shù)器預(yù)置值時(shí),計(jì)數(shù)操作數(shù)C0表示計(jì)數(shù)器的輸出元件,其狀態(tài)表示計(jì)數(shù)器的輸出狀態(tài)。操作數(shù)K100表示計(jì)數(shù)器的預(yù)置值。而計(jì)數(shù)值的當(dāng)前值則是采用固定的變量來表示的。當(dāng)解釋程序遇到計(jì)數(shù)器指令時(shí)(以CNT為例),解釋子程序需要完成如下操作:根據(jù)第一個(gè)操作數(shù)計(jì)算出當(dāng)前計(jì)數(shù)器的編號(hào)和變量存儲(chǔ)地址。將輸入值堆棧的棧頂元素彈出(該元素狀態(tài)為計(jì)數(shù)器驅(qū)動(dòng)元件的狀態(tài)),判斷該元素的狀態(tài)是否為ON,如果是再判斷該元件的變量的上一個(gè)周期的狀態(tài)是否為OFF,如果是,則計(jì)數(shù)器當(dāng)前值加1。如果不是,則計(jì)數(shù)器當(dāng)前值不變。判斷計(jì)數(shù)器當(dāng)前值是否等于預(yù)置值,如果相等則計(jì)數(shù)器元件狀態(tài)置ON。否則置OFF。在讀取用戶程序時(shí)用一個(gè)程序指針usr_code_ptr來記錄當(dāng)前系統(tǒng)掃描用戶程序所到達(dá)的位置。利用這個(gè)指針,程序才能正確地按順序執(zhí)行。本系統(tǒng)所實(shí)現(xiàn)的PLC指令中有兩條跳轉(zhuǎn)指令:JMP(跳到定義的標(biāo)號(hào))和LBL(定義一個(gè)跳轉(zhuǎn)的標(biāo)號(hào)),在下位機(jī)上也可以利用這個(gè)指針來實(shí)現(xiàn)。當(dāng)CPU掃描到指令中有LBL時(shí),解釋程序先讀取下一個(gè)字節(jié)中LBL指令的操作數(shù),并為該操作數(shù)聲明一個(gè)對(duì)應(yīng)的全局變量。然后將當(dāng)前程序指針的值存入該操作數(shù)對(duì)應(yīng)的全局變量中。當(dāng)掃描到JMP指令時(shí),則從與指令操作數(shù)對(duì)應(yīng)的全局變量中取出跳轉(zhuǎn)地址,從該地址的下一個(gè)字節(jié)開始執(zhí)行。這樣就實(shí)現(xiàn)了程序的跳轉(zhuǎn)。 下位機(jī)軟件的特色本系統(tǒng)的下位機(jī)軟件的特色就是使用專門的存儲(chǔ)區(qū)來存儲(chǔ)用戶程序本系統(tǒng)將上位機(jī)發(fā)送過來的用戶程序編碼存儲(chǔ)在外部數(shù)據(jù)RAM中,在執(zhí)行用戶程序時(shí)從該存儲(chǔ)區(qū)中讀取。這種方案有如下好處:(1)、系統(tǒng)程序存儲(chǔ)在程序ROM中,一經(jīng)書寫即不用更改。(2)、便于訪問,方便PLC指令解釋程序的執(zhí)行。采用程序指針和函數(shù)指針數(shù)組來實(shí)現(xiàn)程序的解釋執(zhí)行采用程序指針記錄用戶程序的執(zhí)行進(jìn)度,保證用戶程序順序執(zhí)行。函數(shù)指針數(shù)組能高效地實(shí)現(xiàn)PLC指令的解釋。二者結(jié)合的方案簡(jiǎn)單可靠,使用戶程序不需要復(fù)雜的編譯過程即可在下位機(jī)執(zhí)行。 本章小結(jié)本章主要介紹了系統(tǒng)的下位機(jī)部分的具體設(shè)計(jì)以及實(shí)現(xiàn)。本章首先介紹了嵌入式實(shí)時(shí)操作系統(tǒng)RTX51 TINY的原理、開發(fā)方法等等,在此基礎(chǔ)上提出了下位機(jī)軟件的總體結(jié)構(gòu),并進(jìn)行了任務(wù)的劃分。后面分別介紹各任務(wù)的具體實(shí)現(xiàn)方法,重點(diǎn)介紹了指令表的解釋執(zhí)行原理以及各指令的解釋執(zhí)行方法和程序?qū)崿F(xiàn)所采取的方法。最后總結(jié)了本系統(tǒng)下位機(jī)軟件實(shí)現(xiàn)方案的特色??? 結(jié) 本課題的主要任務(wù)是開發(fā)出一個(gè)能模擬小型可編程控制器(PLC)功能的通用控制器。在對(duì)PLC的體系結(jié)構(gòu)、運(yùn)行原理以及指令的解釋執(zhí)行方法的研究基礎(chǔ)上,參閱了大量參考文獻(xiàn),開發(fā)了基于單片機(jī)的小型通用控制器,能模擬部分PLC的功能。 本論文的主要工作包括以下幾個(gè)方面: 以ADuC841單片機(jī)作為核心控制芯片設(shè)計(jì)了控制
點(diǎn)擊復(fù)制文檔內(nèi)容
法律信息相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1