第a10章 51單片機(jī)實(shí)現(xiàn)順序控制_第1頁
第a10章 51單片機(jī)實(shí)現(xiàn)順序控制_第2頁
第a10章 51單片機(jī)實(shí)現(xiàn)順序控制_第3頁
第a10章 51單片機(jī)實(shí)現(xiàn)順序控制_第4頁
第a10章 51單片機(jī)實(shí)現(xiàn)順序控制_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第10章 51單片機(jī)實(shí)現(xiàn)順序控制 按照規(guī)定的順序依次完成各種操作的控制系統(tǒng)稱為順序控制。順序控制采用按時間順序或邏輯順序進(jìn)行控制的開環(huán)控制方式。能輪流顯示不同顏色和不同圖案的廣告霓虹燈是順序控制系統(tǒng)的一個簡單例子。順序控制器一般用于生產(chǎn)過程的開關(guān)量控制、動力設(shè)備的起動和停止、加熱或冷凍設(shè)備的接通和斷開、信號燈的亮與滅等都是開關(guān)量信號。生產(chǎn)線、自動機(jī)床和各種設(shè)備都有許多開關(guān)量信號需要順序控制。因此,順序控制器廣泛應(yīng)用于機(jī)械、冶金、電力、石油、化工、煤炭、建材、紡織、輕工和國防等部門。 現(xiàn)在實(shí)現(xiàn)順序控制主要是采用可編程控制器(英文縮寫PC)利用它可以方便地編制程序,使工業(yè)設(shè)備實(shí)現(xiàn)順序控制。美國在1

2、969年研制成世界上第一臺可編程序控制器。此后可編程序控制器的發(fā)展經(jīng)歷了三個階段:采用固定(硬)布線方式,以代替電磁繼電器盤;以邏輯控制為主,采用不固定(軟)布線方式,在此之前這類控制器又稱可編程邏輯控制器;采用內(nèi)部裝有程序的存儲器,程序變動十分容易的單片機(jī)實(shí)現(xiàn)。1985年生產(chǎn)的可編程序控制器已普遍采用單片機(jī)技術(shù),它除了存儲容量小、輸入輸出通道以開關(guān)量為主和編程語言不同外,與一般單片機(jī)系統(tǒng)十分相似??删幊炭刂破鞑捎锰菪螆D、語句表設(shè)計(jì)順序控制程序。 10.1 梯形圖10.1.1 梯形圖簡介 一個梯形圖由左邊一條垂直向下的線及若干條與之相交并向右延伸的分支線組成。下圖表示的是一個梯形圖。左邊的線稱

3、為母線,相當(dāng)于電氣控制線路中的電源線。分支線稱為回路,在回路上有常開或常閉觸點(diǎn)的串聯(lián)或并聯(lián)。 如果觸點(diǎn)ON(閉合),從母線來的“能流”就可以通過該觸點(diǎn);若觸點(diǎn)OFF(斷開),則“能流”不能通過。若“能流”通過一系列串或并的觸點(diǎn)到達(dá)了繼電器線圈(指令),則其被通電,否則,線圈不能通電。習(xí)慣上線圈被通電也稱為線圈得電,線圈不能通電也稱為失電。 從計(jì)算機(jī)程序設(shè)計(jì)的角度,分支線回路也稱為指令行,常開、常閉觸點(diǎn)可認(rèn)為是沿指令行設(shè)置的條件,這些條件的邏輯組合(“與”對應(yīng)觸點(diǎn)串聯(lián),“或”對應(yīng)觸點(diǎn)的并聯(lián)),可以決定右邊指令的執(zhí)行結(jié)果(如線圈通電(得電)或斷電(失電)。 指令行上垂直的一對線稱為條件(即觸點(diǎn)),

4、無斜線穿過的條件稱為常開條件(NO,常開觸點(diǎn)),有斜線穿過的條件稱為常閉條件(NC,常閉觸點(diǎn)),每個條件上或下標(biāo)注的數(shù)字或符號表示指令的操作數(shù)位(繼電器觸點(diǎn)、輸入信號等)。梯形圖右側(cè)是指令(繼電器線圈),該指令的狀態(tài)(得電、失電、執(zhí)行或不執(zhí)行)由左側(cè)的條件來決定。常開觸點(diǎn)閉合,則該觸點(diǎn)為1;常開觸點(diǎn)斷開,則該觸點(diǎn)為0。常閉觸點(diǎn)閉合,則該觸點(diǎn)為0;常閉觸點(diǎn)斷開,則該觸點(diǎn)為1。例如,前圖中線圈step1得電的條件是n0=1、n3=0、step2=0、step3=0。10.1.2 基本術(shù)語(1)常開/常閉條件梯形圖中每個條件是否為ON或OFF,取決于分配給它的操作數(shù)位的狀態(tài)。如果操作數(shù)位是“1”,則

5、常開條件是閉合(ON),常閉條件是斷開(OFF);如果操作數(shù)位是“0”,則常開條件是斷開(OFF),常閉條件是閉合(ON)。若把操作數(shù)位理解為軟繼電器(不是實(shí)際的繼電器,是一個可以保存繼電器狀態(tài)的存儲單元),則有如下結(jié)論:若操作數(shù)位是“1”,則繼電器線圈通電,繼電器的常開觸點(diǎn)閉合(ON),常閉觸點(diǎn)斷開(OFF)。若操作數(shù)位是“0”,則繼電器線圈斷電,繼電器的常開觸點(diǎn)斷開(OFF),常閉觸點(diǎn)閉合(ON)。 例如圖10-2中,n0=1,則step1的線圈得電,使step=1;而n0=0,則step1的線圈失電,使step1=0。n1=0,則step2的線圈得電,使step2=1;而n1=1,則st

6、ep2的線圈失電,使step2=0; (2)執(zhí)行條件 在梯形圖中,一條指令前面的常開、常閉等條件的邏輯組合產(chǎn)生了執(zhí)行條件,對于繼電器線圈類的指令,執(zhí)行條件為ON(執(zhí)行條件具備),對應(yīng)線圈得電;而執(zhí)行條件為OFF(執(zhí)行條件不具備),對應(yīng)線圈失電。對于功能性指令,執(zhí)行條件為ON(執(zhí)行條件具備),則對應(yīng)功能指令的執(zhí)行;而執(zhí)行條件為OFF(執(zhí)行條件不具備),對應(yīng)功能指令不執(zhí)行(3)操作數(shù)位 輸入或輸出信號(I/O位)、指令(繼電器)狀態(tài)、定時器/計(jì)數(shù)器等都可以是梯形圖中的條件。(4)梯級 各種常開、常閉條件的一個邏輯組合又稱為一個梯級。10.1.3 常用梯形圖程序梯形圖程序可以用C語言描述,下面介紹常

7、用梯形圖程序以及他們的C語言描述。在C語言描述中,變量n0、n1等是按鈕,而step0、step1等是繼電器。1. 單繼電器線圈控制程序“失電優(yōu)先”和“得電優(yōu)先”電路如圖所示,其中 a是失電優(yōu)先電路,圖b是得電優(yōu)先電路。圖中n0是起動按鈕、n1是停止按鈕。若是兩個按鈕同時按下,若是step1=1則為得電優(yōu)先,若是step1=0,則為失電優(yōu)先。 常開按鈕是正邏輯,有效(動作)狀態(tài)是1,若用n0表示常開按鈕,則用原變量n0表示;表示沒有動作時n0=0。常閉按鈕是負(fù)邏輯,有效(動作)狀態(tài)是0,若用n1表示常閉按鈕,則應(yīng)該用反變量!n1表示,表示沒有動作時!n1=1。采用C語言描述:失電優(yōu)先:if(n

8、0|step1)&!n1) step1=1 else step1=0;得電優(yōu)先:if(n0|(step1&!n1)) step1=1 else step1=0;2. 多繼電器線圈控制程序多繼電器線圈控制有多種方法,右圖是可以同時控制4個繼電器線圈的電路圖,其中n0是起動按鈕,n1是停止按鈕。采用C語言描述:if(n0|step1)&!n1) step1=1;step5=1;step9=1;step13=1; else step1=0;step5=0;step9=0;step13=0;圖10-4 多繼電器線圈控制3. 多地控制程序下圖是兩個地方控制一個繼電器線圈的程序。其中n0和n1是一地的起動

9、與停止按鈕,n2和n3是另外一地的起動與停止按鈕。采用C語言描述:if(n0|n2|step1)&!n1&!n3) step1=1; else step1=0;4. 互鎖控制程序下圖是三個梯級互鎖的電路。其中n0、n1和n2是起動按鈕,n3是停止按鈕。采用C語言描述:if(n0 |step1)&!n3&!step2&step3) step1=1; else step1=0;if(n1 |step2)&!n3&!step1&step3) step2=1; else step2=0;if(n1 |step3)&!n3&!step1&step2) step3=1; else step3=0;5. 互

10、控程序下圖所示的互控電路中,n0、n1和n2中任意一個閉合,就可以起動step1、step2和step3中對應(yīng)的一個,同時關(guān)閉其它兩個。若n0、n1和n2同時按下時,可以同時使step1、step2和step3得電。采用C語言描述:if(n0 |(step1&!step3&!step2) &!n3) step1=1; else step1=0;if(n1 |(step2&!step1&!step3) &!n3) step2=1; else step2=0;if(n2 |(step3&!step1&!step2) &!n3) step3=1; else step3=0;6. 順序起動程序順序控制

11、電路如圖所示,該梯形圖中,只有step1運(yùn)行了,step2才能運(yùn)行,只有step1和step2運(yùn)行了step3才能運(yùn)行,圖中n0是step1的起動按鈕,n1是step2的起動按鈕,, n3是step3的起動按鈕,n4是總停止按鈕。采用C語言描述:圖10-9 周期脈沖電路if(n0 |(step1&!step3&!step2) &!n3) step1=1;else step1=0;if(n1 |(step2&!step1&!step3) &!n3) step2=1;else step2=0;7. 脈沖電路(1)周期脈沖電路下圖所示的就是周期脈沖電路,就是用時鐘控制位輸出時鐘脈沖的程序,時鐘控制位

12、就是每隔0.1s、0.2s和1s閉合常開觸點(diǎn)的控制位。,其中t01、t02、t1是時間控制的常開觸點(diǎn)。用C語言實(shí)現(xiàn)脈沖周期電路:(a)用定時器產(chǎn)生50ms的中斷,(用12MHz的時鐘,定時器0計(jì)數(shù)50000次,則產(chǎn)生50ms的中斷),定時器0初始化語句如下:TMOD=0 x01; /定時器0,M1,M0=01(模式1),gate=0(外中斷不起作用),C/T=0TH0=0 x3c; /設(shè)置TH初值 0 x3cb0=65536-50000=15536,50ms中斷一次,每秒20次中斷 TL0=0 xb0; /TL初值TR0=1; /啟動定時器0ET0=1; /設(shè)置中斷使能寄存器,允許定時器0中斷

13、EA=1; /允許所有中斷(b)在中斷服務(wù)程序中,用全局變量(時鐘控制位)產(chǎn)生需要時間間隔的循環(huán)。void timer0() interrupt 1 /定時器中斷服務(wù)程序 TH0=0 x3c; /重置定時器0初值TL0=0 xb0; /重置定時器0初值 t01+;if(t011) t01=0; /時鐘控制位t01,0-1-0-1 定時間隔為0.1st02+;if(t023) t02=0; /時鐘控制位t02,0-1-2-3-0-1-2-3-0 定時間隔為0.2s t03+;if(t0319) t03=0; /時鐘控制位t1。0-1-2-3-18-19-0 定時間隔為1s(c)寫C語言實(shí)現(xiàn)的梯形

14、圖程序 如下是主程序中的時鐘控制位控制語句,語句中使被控繼電器的得電與失電時間各占1/2。while(1)if(t01) step1=1; else step1=0; /時鐘控制位t01控制step1的得電與失電if(t021) step2=1; else step2=0; /時鐘控制位t02控制step2的得電與失電if(t0310) step3=1; else step3=0; /時鐘控制位t03控制step3的得電與失電 (2)1分鐘脈沖 在中斷程序中,使定時器產(chǎn)生50ms為周期的中斷,則每中斷20次,使變量tmin加1,則中斷1800次,則產(chǎn)生每分鐘為周期的脈沖。主程序中,若是需要得電

15、30分鐘,則C語言程序如下:nn+; /每次中斷,變量nn加1if (nn=20) /如果中斷20次,定時為1秒nn=0;tsec+; /每秒鐘,變量tsec加1if(tsec59) /如果中斷1200次,則產(chǎn)生1分鐘定時信號tsec=0; tmin=1else tmin=0;主程序中,若是需要step7每分鐘得電一次,則C語言程序如下: if(tmin30) step7=1; else step7=0;圖10-10 1分鐘脈沖程序(3)上升沿微分上升沿微分程序利用微分功能,對工作位n0的上升沿(斷開變?yōu)榻油ǎ┻M(jìn)行微分,在上升沿出現(xiàn)瞬間,工作位n0=1,使step1得電,然后等待t0增加,定時

16、器0每中斷一次,t0增加1,當(dāng)t0大于3時,step1失電,所以step1得電時間內(nèi)為1,step1為1的時間就是微分時間。定時器0中斷服務(wù)程序中:t0+; /每次中斷t0加1if(t04) t0=4; /若是t0大于4,保持t0為4主程序中:if(n0=0) t0=0; /按鈕斷開時,t0變量保持為0。if(n0=1 | step1) &!time0) /若是n0=1同時time0=0時,step1得電step1=1; else step1=0; /若是time0=1時,step1失電if( t03) time0=1; else time0=0; /若是t03,time0為1,使step1失

17、電(4)極窄脈沖可以利用程序順序執(zhí)行的特點(diǎn)產(chǎn)生極窄脈沖,極短脈沖的C程序如下:if(n0=0) step2=0; /輸入信號n0=0,使step2=0,為產(chǎn)生窄脈沖做準(zhǔn)備if(n0 | step1) &!step2) /如果輸入信號n0=1,同時step2為0時,則step1為1step1=1; else step1=0; / 如果輸入信號為0,則step1為0 if(step1|step2) /如果step1為1 則step2為1,step2=1; else step2=0; / 否則step2為0由于step2為1,所以當(dāng)程序再次循環(huán)執(zhí)行時,step1的得電條件不成立,所以step1為0,

18、這樣在一個while(1)循環(huán)中,step1=1。圖(a)顯示的是C語言描述的梯形圖,8. 定時計(jì)數(shù)程序(1)單按鈕起停程序單按鈕起停程序下圖,該電路中使n0接點(diǎn)接通一次,使step3得電并自鎖,再使n0接點(diǎn)接通一次,可以使step3失電。程序中使用了微分功能,就是對n0的上升沿進(jìn)行微分,使step1短時間得電輸出微分脈沖,計(jì)數(shù)器對step1得電次數(shù)進(jìn)行計(jì)數(shù),計(jì)第一個數(shù)時使step3得電自鎖,再計(jì)一個數(shù)時使step3失電。C程序如下:if(n0=0) step2=0; /微分程序開始if(n0=1 | step1) &!step2) step1=1; else step1=0; if(step

19、1|step2) step2=1; else step2=0; /step1是微分輸出信號if(step1) count+; if(count=2) /計(jì)數(shù)程序開始,對step1的得電次數(shù)計(jì)數(shù)cnt=1; count=0; /cnt是計(jì)數(shù)器計(jì)數(shù)到信號else cnt=0; if(step1|step3)&!cnt )step3=1; else step3=0; /計(jì)數(shù)控制使step3失電的程序if(step3) P2_0=0;else P2_0=1; /用P2_0引腳相連的發(fā)光二極管顯示step3的狀態(tài) (2)可以改變脈沖寬度的單脈沖程序可以改變脈沖寬度的梯形圖程序如圖所示。該程序中接點(diǎn)n0接

20、通時,step1和step2得電,其中step1自鎖,定時器time0開始定時,當(dāng)定時時間到,step1和step2失電。step1和step2得電時間(單脈沖寬度),由定時器定時時間t0確定。源程序如下:if(n0=1 | step1) &!time0) /如果n0=1,同時time0=0,則step1=1,定時器啟動step1=1; else step1=0; t0=0; /否則step=0,t0=0if( t08) time0=1; else time0=0; /如果定時器計(jì)數(shù)t0 8,則time0=1if(step1&!time0) step2=1;else step2=0; /如果s

21、tep1=1,同時time0=0,則step2=1if(step1) P2_1=0;else P2_1=1; /如果step1=1,則P2_1連接的發(fā)光二極管亮if(step2) P2_3=0;else P2_3=1; /如果step2=1,則P2_3連接的發(fā)光二極管亮(3)瞬時得電和延時失電程序瞬時得電和延時失電程序如圖所示。接點(diǎn)n0閉合,step1得電,當(dāng)n0斷開后,定時器time0開始計(jì)時,當(dāng)計(jì)時時間到的時候,step1失電。而step2在n0斷開后得電,在定時器時間到時失電。if(n0 | step1) &!time0) /如果n0=1同時time0=0,step1得電step1=1;

22、 else step1=0; if(step1&!n0)step2=1; else step2=0;t0=0; /如果step1和n0=0,則step2=1,啟動定時變量t0加1if( t09) time0=1; else time0=0; /如果定時變量t09,則time0=1 if(step1=1) P2_0=0;else P2_0=1; /用LED燈顯示step1的得電/失電狀態(tài)if(step2=1) P2_1=0;else P2_1=1; /用LED燈顯示step2的得電/失電狀態(tài)(4)延時得電和延時失電程序延時得電和延時失電程序如圖所示。當(dāng)接點(diǎn)n0閉合,time0開始定時,定時6s時

23、間到,step3得電。當(dāng)n0斷開時,time1開始定時,8秒鐘后step3失電。 程序如下:if(n0=1 | step1) &!time0) /n0=1同時time0=0 使step1=1,啟動定時器t0 step1=1; else step1=0; t0=0; if (t06) time0=1;else time0=0; /當(dāng)t06 使time0=1 if(step3&!n0) step2=1;else step2=0; t1=0; /n0=0同時step3=1使step2=1,啟動定時器t1if (t18) time1=1;else time1=0; /如果t18 使time1=1if

24、(time0|step3)&!time1) step3=1;else step3=0; /如果time0=1同時time1=0 使step3=1(5)使用一個按鈕的延時得電和延時失電程序下圖所示的是使用一個按鈕的延時得電和延時失電程序,接點(diǎn)n0接通一次后,延時5秒鐘,step4得電,當(dāng)接點(diǎn)n0接通第二次后,延時8秒,step4失電。 (6)定時器和計(jì)數(shù)器配合使用實(shí)現(xiàn)長延時定時器和計(jì)數(shù)器配合使用的程序如圖所示。 (7)定時器接力程序定時器接力程序如圖所示。 圖10-19定時器接力程序圖10-20 計(jì)數(shù)器定時程序(8)計(jì)數(shù)器定時程序計(jì)數(shù)器定時程序如圖所示。 (9)計(jì)數(shù)器串聯(lián)程序計(jì)數(shù)器串聯(lián)程序如圖所

25、示 圖10-21計(jì)數(shù)器串聯(lián)程序9. 順序控制程序順序控制程序如圖所示。程序由接點(diǎn)n0起動,step1得電并自鎖,定時器time0和time1起動計(jì)時,進(jìn)入程序第一步,在time1計(jì)時6s時,第一步結(jié)束。當(dāng)time0計(jì)時4s時間到,使step2得電、自鎖,同時起動定時器time2和time3,程序的第二步開始,當(dāng)time3計(jì)時6s時第二步結(jié)束。當(dāng)time2計(jì)時3s時,使step3得電、自鎖,同時起動time4,程序第三步開始,當(dāng)time4計(jì)時8s時step3失電,第三步結(jié)束。圖10-22 順序控制程序源程序如下:if(n0|step1)&!n1&!time1)step1=1; else step

26、1=0;t0=0;t1=0; if(t04)&step1) time0=1;else time0=0; /第1步if(t16)&step1) time1=1;else time1=0;if(time0|step2)&!n1&!time3) step2=1; /第2步elsestep2=0;t2=0;t3=0;if(t23)&step2) time2=1;else time2=0;if(t36)&step2) time3=1;else time3=0;if(time2|step3)&!n1&!time4)step3=1; /第3步elsestep3=0;t4=0;if(t48)&step3) t

27、ime4=1;else time4=0;10. 三個燈輪流閃爍程序 11. 另一個三個燈輪流閃爍的程序 圖10-24另一個三燈輪流閃爍梯形圖圖10-25 由開關(guān)條件控制的順序控制程序10.2 順序功能圖SFC設(shè)計(jì)方法SFC功能圖設(shè)計(jì)方法是專用于工業(yè)順序控制程序設(shè)計(jì)的一種方法,該方法能夠描述被控系統(tǒng)的工作過程,是設(shè)計(jì)電氣控制系統(tǒng)的重要方法。該方法廣泛用于可編程控制器PLC的程序設(shè)計(jì),也可以用于單片機(jī)控制程序的C語言描述。 10.2.1 SFC基礎(chǔ)SFC圖的基本元素是流程步、有向線段、轉(zhuǎn)移和動作說明。1. 流程步,又稱為工作步,它是控制系統(tǒng)中的一個穩(wěn)定狀態(tài),流程步用矩形方框表示,框中用數(shù)字表示該步

28、的編號,編號可以是實(shí)際的控制步序號,常用C語言中的靜態(tài)變量表示。 對應(yīng)于系統(tǒng)的初始狀態(tài)工作步,稱為初始步,該步是系統(tǒng)運(yùn)行的起點(diǎn),一個系統(tǒng)至少需要有一個初始步,初始步用雙線矩形框表示,流程步如圖所示,其中a是工作步,b是初始步。 圖10-26 流程步2. 轉(zhuǎn)移轉(zhuǎn)移就是從一個步向另外一個步之間的切換條件,兩個步之間用一個有向線段表示可以從一個步切換到另一個步,代表向下轉(zhuǎn)移方向的箭頭可以忽略。通常轉(zhuǎn)移用有向線段上的一段橫線表示,在橫線旁可以用文字、圖形符號或邏輯表達(dá)式標(biāo)注描述轉(zhuǎn)移的條件,當(dāng)相鄰步之間的轉(zhuǎn)移條件滿足時,就從一個步按照有向線段的方向進(jìn)行切換。有向線段和轉(zhuǎn)移如圖所示。 3. 動作說明流程步

29、并不是單片機(jī)輸出端口的動作,步只是控制系統(tǒng)中的一個穩(wěn)定的狀態(tài),在這個狀態(tài),可以有一個或多個單片機(jī)端口引腳輸出的動作,但也可以沒有任何輸出動作,例如某步只是起動了定時器或是一個等待過程,所以步和單片機(jī)輸出端口的動作是兩個事情。對于一個步,可以有一個或幾個動作,表示的方法是在步的右側(cè)加一個或幾個矩形框,并在框中加文字對動作進(jìn)行說明。如圖所示。常見的動作的種類:動作不自鎖,步結(jié)束時動作就結(jié)束。動作自鎖,步結(jié)束時還繼續(xù),直到復(fù)位到達(dá)之后。復(fù)位作用,動作的任務(wù)是復(fù)位以前自鎖的動作。起動定時器,定時器可以在步結(jié)束時或時間復(fù)位信號到達(dá)時結(jié)束。脈沖作用,當(dāng)步開始時激活脈沖,該脈沖只作用一次。在時間延遲之后,起

30、動自鎖和定時器,直到復(fù)位信號到達(dá)。當(dāng)步被激活時,自鎖和定時器起動,直到定時時間到達(dá)和復(fù)位信號到達(dá)。起動功能指令,完成特定的動作。4. 一些規(guī)則(1)步和步之間必須有轉(zhuǎn)移隔開。(2)轉(zhuǎn)移和轉(zhuǎn)移之間必須有步隔開。(3)步和轉(zhuǎn)移,轉(zhuǎn)移和步之間用有向線段連接,正常畫SFC圖的方向是從上向下或是從左向右,按照正常順序畫圖時,有向線段可以不加箭頭,否則必須加箭頭。(4)一個SFC圖中至少有一個初始步。 10.2.2 SFC圖的結(jié)構(gòu)1. 順序結(jié)構(gòu)順序結(jié)構(gòu)是最簡單的一種結(jié)構(gòu),該結(jié)構(gòu)的特點(diǎn)是步與步之間只有一個轉(zhuǎn)移,轉(zhuǎn)移和轉(zhuǎn)移之間只有一個步。2. 選擇性分支結(jié)構(gòu)選擇性分支如右圖所示。圖中共有2,3、4,5、6和7

31、、8、9四個分支,根據(jù)分支轉(zhuǎn)移條件A、C、F和I來決定究竟選擇哪一個分支。分支用水平線相連,每一條單一順序的進(jìn)入都有一個轉(zhuǎn)移條件,每個分支的轉(zhuǎn)移條件都位于水平線下方,單水平線上方?jīng)]有轉(zhuǎn)移。如果某一分支轉(zhuǎn)移條件得到滿足,則執(zhí)行這一分支,一旦進(jìn)入這一分支后,就再也不執(zhí)行其它分支了。分支結(jié)束用水平線將各個分支會合,水平線上方的每個分支都有一個轉(zhuǎn)移條件,而水平線下方?jīng)]有轉(zhuǎn)移條件。 3. 并發(fā)性分支結(jié)構(gòu)如果在某一步執(zhí)行完后,需要起動若干條分支,這種結(jié)構(gòu)稱為并發(fā)分支結(jié)構(gòu)。并發(fā)分支結(jié)構(gòu)如圖所示。分支開始是用水平雙線將各個分支相連,雙水平線上方需要一個轉(zhuǎn)移,轉(zhuǎn)移對應(yīng)的條件稱為公共轉(zhuǎn)移條件,如果公共轉(zhuǎn)移條件滿足

32、,則同時執(zhí)行下面所有分支,水平線下方一般沒有轉(zhuǎn)移條件,特殊情況下允許有分支轉(zhuǎn)移條件。公共轉(zhuǎn)移條件滿足時,同時執(zhí)行多個分支,但是由于各個分支完成的時間不同,所以每個分支的最后一步通常設(shè)置一個等待步。分支結(jié)束用水平雙線將各個分支匯合,水平雙線上方一般沒有轉(zhuǎn)移,下方有一個轉(zhuǎn)移。 4. 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)用于一個順序過程的多次反復(fù)執(zhí)行,結(jié)構(gòu)示意圖如圖所示。 5. 復(fù)合結(jié)構(gòu)復(fù)合結(jié)構(gòu)就是在一個集順序、選擇性分支、并發(fā)分支和循環(huán)結(jié)構(gòu)于一體結(jié)構(gòu),由于結(jié)構(gòu)復(fù)雜,必須仔細(xì)才能正確的描述實(shí)際問題 10.2.3 C語言描述SFC圖1. 進(jìn)入有效工作步(1)起動單片機(jī)就進(jìn)入有效工作步 可以設(shè)置一個局部變量,該變量在whi

33、le(1)循環(huán)語句外為1,在循環(huán)語句結(jié)束前使該變量為0,這樣該局部變量只在第一個while(1)循環(huán)中為1,因此可以作為進(jìn)入有效工作步的條件。(2)還可以使用按鈕進(jìn)入有效工作步,但是應(yīng)該加限制條件,就是避免按鈕的按下影響工作步正常轉(zhuǎn)移的情況。2. 停止有效工作步 可以使用按鈕停止流程,方法是在while(1)循環(huán)結(jié)束前,增加語句:if(n0) step0=0;step1=0;stepn=0; /n0是按鈕,stepn是工作步若是停止有效工作步后,返回到工作步step0,則可以按照如下語句描述:if(n0) step0=1;step1=0;stepn=0; /n0是按鈕,stepn是工作步3.

34、最后一個工作步一般情況下,需要在最后一個工作步完成之后,返回第一個工作步,但是有時需要做一些判斷,例如,在1個工藝流程結(jié)束后,是否進(jìn)行第2個工藝流程等。如果在程序中有tj=1停止有效工作的語句,以及tj=0返回第1工作步的語句,則可實(shí)現(xiàn)下一個流程的起動與停止操作。判斷語句如下:if(n1)tj=1;else tj=0; /n1是鈕子開關(guān)信號,如果n1=1,則tj=1,否則tj=04. 工作步的轉(zhuǎn)移條件轉(zhuǎn)移條件可以是來自單片機(jī)外部的按鈕、行程開關(guān)、傳感器等輸出的信號,也可以是來自內(nèi)部的定時器的時間到條件、計(jì)數(shù)器的計(jì)數(shù)數(shù)值條件等。單片機(jī)中可以直接使用定時器的時間數(shù)值,例如if(t012),表示定時

35、器t0的數(shù)值大于12以后就滿足轉(zhuǎn)移條件,其中t0是對單片機(jī)定時器中斷計(jì)數(shù)的全局變量;又例如,if(cnt8)表示計(jì)數(shù)器cnt數(shù)值大于8時就滿足轉(zhuǎn)移條件,其中cnt是可以對按鈕動作、流程循環(huán)次數(shù)等計(jì)數(shù)的全局變量。5. 工作步得電和失電 工作步的得電條件是:該步的上一個工作步是有效工作步,而該步的下一步?jīng)]有工作,這時若出現(xiàn)轉(zhuǎn)移條件,則該工作步就會得電變成有效工作步。 工作步失電的條件是:該步的下個工作步得電,則該工作步失電。一般情況下工作步都需要自鎖。 例如:若step0、step1和step2是三個順序執(zhí)行的工作步,則step1得電與失電的條件可以寫為:if(step0|step1)&!step

36、2) step1=1;else step1=0;一般工作步得電與失電條件的梯形圖如圖所示。 6. 選擇性分支選擇性分支就是在工作步得電的條件中增加一個選擇條件,若滿足選擇條件,則工作步得電,若不滿足選擇條件的工作步就不能得電。若在起動程序時出現(xiàn)選擇分支,則工作步的得電條件應(yīng)該為起動條件“與”選擇條件。若在工作步轉(zhuǎn)移時出現(xiàn)選擇性分支,則工作步的得電條件應(yīng)為轉(zhuǎn)移條件“與”選擇條件。選擇性分支如圖所示,圖中n0 、n1、n2、n3是按鈕或是開關(guān)條件。與圖對應(yīng)的C語言描述如下:start=1;while(1)if(n0&step3)|step0|start)&!step1&!step2) step0=

37、1;else step0=0;if(n1&step0)|step1)&!step3) step1=1;else step1=0; /分支step1 if(n2&step0)|step2)&!step3) step2=1;else step2=0; /分支step2if(n3&step1|n3&step2)|step3)&!step0) step3=1;else step3=0; start=0;圖10-37 簡單選擇分支結(jié)構(gòu)7. 并發(fā)分支并發(fā)工作步是在一個得電條件下,幾個并發(fā)分支都得電,所以幾個并發(fā)分支的得電條件是一樣的。所有并發(fā)工作步都結(jié)束后才能進(jìn)行工作步轉(zhuǎn)移,所以若要工作步轉(zhuǎn)移,則需要所有

38、并發(fā)分支的的轉(zhuǎn)移條件相“與”。下圖所示的是一個具有并發(fā)分支的SFC圖。該圖中工作步step1和工作步step2是并發(fā)分支,n0 、n1、n2、n3是按鈕或是開關(guān)條件。start=1; / 第1周期信號while(1)if(n0&step3)|step0|start)&!step1&!step2) step0=1;else step0=0;if(n1&step0)|step1)&!step3) step1=1;else step1=0; /并發(fā)分支step1 if(n1&step0)|step2)&!step3) step2=1;else step2=0; /并發(fā)/分支step2if(n2&st

39、ep1&n3&step2)|step3)&!step0) step3=1;else step3=0;start=0;8. 第0工作步 第0工作步是單片機(jī)上電后的狀態(tài),當(dāng)除第0工作步以外的工作步都無效時,第0工作步有效,所以第0工作步的一個得電條件是除第0工作步以外的工作步都無效。 停止條件出現(xiàn)后,程序應(yīng)該回到第0工作步。9. 動作輸出 在有些系統(tǒng)中,工作步就是動作輸出,在這種情況下,工作步的繼電器就是單片機(jī)的輸出引腳。而在有些系統(tǒng)中,動作輸出是工作步的邏輯組合。 動作開始時刻就是工作步得電時刻,動作結(jié)束時刻就是工作步失電時刻,若是動作時間是一個工作步,則工作步就可以是輸出;若是該動作還需要在下

40、一個工作步繼續(xù)動作,則這時該動作就是這兩個工作步的“或”。10. 描述SFC的一般C語言結(jié)構(gòu)描述SFC的一般C語言結(jié)構(gòu)如下:while(1)輸入掃描部分工作步流程部分輸出部分其他其中:(1)輸入掃描部分就是處理按鈕、行程開關(guān)、傳感器等信號。(2)工作流程部分就是按照輸入條件,實(shí)現(xiàn)工作步的轉(zhuǎn)移,輸入條件可以是按鈕、行程開關(guān)或是傳感器等外部輸入的信號,也可以是單片機(jī)內(nèi)部的定時器或是計(jì)數(shù)器信號。(3)輸出部分就是描述對應(yīng)各個工作步的輸出動作(4)其他部分描述:停止信號、首次while(1)循環(huán)有效信號、按鈕信號歸0等信號。例題10-1 下圖是送料小車示意圖,小車可以在A、B之間運(yùn)動,在A、B點(diǎn)各有一

41、個行程開關(guān)。小車從A點(diǎn)向B點(diǎn)前進(jìn),到達(dá)B點(diǎn),停車6s后,從B點(diǎn)后退到A點(diǎn),在A點(diǎn)停車8s后再向B點(diǎn)前進(jìn),如此往復(fù)不止。要求可以人為控制小車的前進(jìn)起動和后退起動,并且能夠任何時候都可以停止小車運(yùn)行。 該題的步是小車前進(jìn)、定時6秒、小車后退和定時8秒共四個步,轉(zhuǎn)移條件是小車到達(dá)B點(diǎn)時的行程開關(guān)閉合、B點(diǎn)定時6秒時間到、小車到達(dá)A點(diǎn)時的行程開關(guān)閉合和A點(diǎn)定時8秒時間到,動作是小車從A點(diǎn)向B點(diǎn)的前進(jìn)動作、起動6s定時器動作、小車從B點(diǎn)向A點(diǎn)的退回動作和起動8s定時器動作。 該題要求能夠前進(jìn)起動和后退起動,這需要選擇分支結(jié)構(gòu),當(dāng)按下前進(jìn)起動按鈕時,小車向B點(diǎn)前進(jìn),當(dāng)按下后退起動按鈕時,小車向A點(diǎn)后退。停

42、止按鈕的動作是停止正在工作的步,回到步0。地址信號地址信號n0前進(jìn)按鈕step0上電狀態(tài)n1后退按鈕step1小車前進(jìn)運(yùn)行n2停止按鈕step2B點(diǎn)定時工作步n3B點(diǎn)行程開關(guān)step3小車后退運(yùn)行n4A點(diǎn)行程開關(guān)A點(diǎn)定時工作步run0前進(jìn)起動run1后退起動time0B點(diǎn)定時器time1A點(diǎn)定時器該題的C語言程序如下: #include AT89X51.hunsigned int code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;unsigned int n0,n1,n2,n3,n4,sn; unsig

43、ned int kk=8,start,run0,run1; unsigned int step0=0,step1=0,step2=0,step3=0,step4=0;unsigned int time0,time1;unsigned int t0,t1;void main()unsigned int nn; /定時器0初始化TMOD=0 x01; /定時器0,M1M0=01(模式1),gate=0(外中斷不起作用),C/T=0TH0=0 x3c; /TH初值 0 x3cb0=65536-50000=15536,50ms中斷一次,每秒20次,時鐘12MHz TL0=0 xb0; /TL初值TR0

44、=1; /啟動定時器0ET0=1; /設(shè)置中斷使能寄存器,允許定時器0中斷EA=1; /允許所有中斷start=1; /啟動標(biāo)志置1while(1) P3=0 xff; /P3口連接8個按鍵作為輸入if(P3_0=0) /如果P3_0引腳連接的按鍵按下for(nn=0; nn1000;nn+); /延時消抖if(P3_0=0) n0=1;kk=0; /如果按鍵還在按下狀態(tài),則n0=1else n0=0; if(P3_1=0) /如果P3_1引腳連接的按鍵按下for(nn=0; nn1000;nn+); if(P3_1=0)n1=1;kk=1; /如果按鍵還在按下狀態(tài),則n1=1else n1=

45、0;if(P3_2=0) /如果P3_2引腳連接的按鍵按下for(nn=0; nn1000;nn+);if(P3_2=0)n2=1;kk=2; else n2=0;if(P3_3=0) /如果P3_3引腳連接的按鍵按下for(nn=0; nn1000;nn+);if(P3_3=0)n3=1;kk=3; else n3=0; if(P3_4=0) /如果P3_4引腳連接的按鍵按下for(nn=0; nn6) time0=1; else time0=0; /如果t06,定時器time0=1if(run1|time0&step2|step3)&!step4) step3=1;else step3=0

46、; /后退步,step3=1if(n4&step3|step4)&!step1) step4=1;else step4=0;t1=0; /到達(dá)A點(diǎn),step4=1,啟動定時t1if(t18) time1=1;else time1=0; /如果t18,定時器time1=1if(step1) P2_6=0;else P2_6=1; /前進(jìn)動作信號輸出,LED燈顯示小車前進(jìn)if(step3) P2_7=0; else P2_7=1; /后退動作信號輸出,LED燈顯示小車后退if(n2)step0=1;step1=0;step2=0;step3=0;step4=0; /停止按鈕按下,回到初始步step

47、0start=0; /上電啟動標(biāo)志清0if(step0)sn=0; /將工作步轉(zhuǎn)換成數(shù)值在數(shù)碼管上顯示if(step1)sn=1;if(step2)sn=2;if(step3)sn=3;if(step4)sn=4;P0=tablesn; /P0口連接的數(shù)碼管顯示工作步if(step0) P2_0=0; else P2_0=1; /用LED燈顯示工作步if(step1) P2_1=0; else P2_1=1;if(step2) P2_2=0; else P2_2=1;if(step3) P2_3=0; else P2_3=1;if(step4) P2_4=0; else P2_4=1;if(s

48、tep2) P1=tablet0; /將定時數(shù)據(jù)顯示在P1口連接的數(shù)碼管上if(step4) P1=tablet1;void timer0() interrupt 1 /定時器0中斷服務(wù)程序static unsigned int jj; TH0=0 x3c; /重置初值TL0=0 xb0; /重置初值 jj+; if (jj=20) /如果jj=20,則為1s ,為調(diào)試方便,可以減小jj值jj=0; t0+;if(t010) t0=0;t1+;if(t110) t1=0;實(shí)際調(diào)試時可用連接在P3口的按鈕代替行程開關(guān)和控制按鈕。 例題10-2 交通信號燈的動作如圖所示,請畫出該交通燈控制的SFC

49、圖。要求可以用按鈕強(qiáng)制使南北通或東西通。 設(shè)計(jì)中沒有考慮停止按鈕,若要交通燈停止工作,只要關(guān)掉控制器電源就可以了,南北方向強(qiáng)制按鈕用于強(qiáng)制南北綠燈,東西方向強(qiáng)制按鈕用于強(qiáng)制東西綠燈。該控制器在通電時自起動。 地址信號地址信號n0南北方向強(qiáng)制按鈕step1第1步,東西綠燈n1東西方向強(qiáng)制按鈕step2第2步,東西綠燈閃爍start第一周期標(biāo)志step3第3步 東西黃燈second秒標(biāo)志step4第4步 南北綠燈step5第5步 南北綠燈閃爍step6第6步 南北黃燈time1東西綠燈定時time2東西綠燈閃爍定時time3東西黃燈定時time4南北綠燈定時time5南北綠燈閃爍定時time6南北

50、黃燈定時#include AT89X51.hunsigned int code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;unsigned int n0,n1,second; unsigned int kk=8,start ,sn; unsigned int step0=0,step1=0,step2=0,step3=0,step4=0,step5,step6;unsigned int out0=0,out1=0,out2=0,out3=0,out4=0,out5,out6;unsigned int ti

51、me0=0,time1=0,time2=0,time3=0,time4=0,time5,time6;unsigned int t0,t1,t2,t3,t4,t5,t6;void main()unsigned int nn; /定時器0初始化TMOD=0 x01; /定時器0,M1M0=01(模式1),gate=0(外中斷不起作用),C/T=0TH0=0 x3c; /設(shè)置TH初值 0 x3cb0=65536-50000=15536,50ms中斷一次,每秒20次 TL0=0 xb0; /設(shè)置TL初值TR0=1; /啟動定時器0ET0=1; /設(shè)置中斷使能寄存器,允許定時器0中斷EA=1; /允許所

52、有中斷start=1; /設(shè)置第一周期標(biāo)志信號while(1)P3=0 xff; /P3口連接8個按鍵作為輸入if(P3_0=0) /如果P3_0引腳連接的按鍵按下for(nn=0; nn1000;nn+); /延時消除抖動if(P3_0=0)n0=1;kk=0; /如果按鍵還在按下狀態(tài),使n0=1else n0=0; if(P3_1=0) /P3_1 鍵按下for(nn=0; nn9) time1=1; else time1=0; if(time1&step1|step2)&!step3)step2=1;else step2=0;t2=0; /東西綠閃(step2)if(t25) time2

53、=1; else time2=0; if(time2&step2|step3)&!step4) step3=1;else step3=0;t3=0; /東西黃燈(step3)if(t33) time3=1; else time3=0; if(time3&step3|step4)&!step5)step4=1;else step4=0;t4=0; /南北綠燈(step4)if(t47) time4=1; else time4=0; if(time4&step4|step5)&!step6)step5=1;else step5=0;t5=0; /南北綠閃(step5)if(t55) time5=1

54、; else time5=0; if(time5&step5|step6)&!step1)step6=1;else step6=0;t6=0; /南北黃燈(step6)if(t63) time6=1; else time6=0; if(n0)step1=1;step2=0;step3=0;step4=0;step5=0;step6=0; /強(qiáng)制東西綠燈if(n1)step1=0;step2=0;step3=0;step4=1;step5=0;step6=0; /強(qiáng)制南北綠燈if(step1|step2&second) P2_5=0; else P2_5=1; /東西綠燈/綠閃(用LED燈代替)

55、if(step3) P2_4=0; else P2_4=1; /東西黃燈if(step4|step5|step6) P2_3=0;else P2_3=1; /東西紅 if(step4|step5&second) P2_2=0; else P2_2=1; /南北綠燈/綠閃if(step6) P2_1=0; else P2_1=1; /南北黃燈if(step1|step2|step3) P2_0=0; else P2_0=1; /南北紅燈if(step1)sn=1; /將工作步轉(zhuǎn)換成數(shù)值在數(shù)碼管上顯示if(step2)sn=2;if(step3)sn=3;if(step4)sn=4;if(step

56、5)sn=5;if(step6)sn=6; P0=tablesn; /將工作步順序顯示在P0口連接的數(shù)碼管上if(step1) P1=tablet1; /將定時數(shù)值顯示在P1口連接的數(shù)碼管上if(step2) P1=tablet2;if(step3) P1=tablet3;if(step4) P1=tablet4;if(step5) P1=tablet5;if(step6) P1=tablet6; start=0;void timer0() interrupt 1 /定時器0中斷服務(wù)程序static unsigned int jj; TH0=0 x3c; /重置初值TL0=0 xb0; /重置

57、初值 jj+; if (jj=20) /如果jj=20,則定時時間為1s,為調(diào)試方便,可以將jj數(shù)值減小jj=0; t1+;if(t110) t1=0;t2+;if(t210) t2=0;t3+;if(t310) t3=0;t4+;if(t410) t4=0;t5+;if(t510) t5=0;t6+;if(t610) t6=0;second+; /秒閃信號if(second1) second=0;注意交通控制不需要停止按鈕,而且要求通電就起動,特別是停電再來電的情況下,要求能夠在無人干預(yù)的情況下自己起動,所以使用第一周期標(biāo)志start,該標(biāo)志在單片機(jī)通電開始掃描的第一個周期為1,將該標(biāo)志作為

58、第一個工作步的得電條件,就可以在單片機(jī)通電時起動程序。 例題10-3 自保持電路(電機(jī)啟動、停止控制電路)。 C程序如下:#include AT89X51.hunsigned int code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;unsigned int n0,n1,n2,n3,n4,n5,n6,n7;unsigned int kk=8;unsigned int step1=0;void main()unsigned int nn;P3=0 xff; /P3口連接8個按鍵作為輸入if(P3_0=0)

59、 /如果P3_0引腳連接的按鍵按下(常開按鈕)for(nn=0; nn1000;nn+); /延時消除抖動if(P3_0=0) n0=1;kk=0; /如果還在按下狀態(tài),/則n0=1,kk=0;否則n0=0,kk=8;else n0=0; if(P3_1=0) /如果P3_0引腳連接的按鍵按下(常閉按鈕)for(nn=0; nn1000;nn+); if(P3_1=0) n1=1;kk=1; /如果還在按下狀態(tài),/則n1=1,kk=1;否則n1=0,kk=8; else n1=0;P0=tablekk; /P0口顯示按鍵值if(n0 | step1) & !n1) /自保持電路step1=1;

60、 /n0是常開按鈕(啟動),n1是常閉按鈕(停止)else step1=0;if(step1) P2_0=0; /P2_0引腳輸出軟繼電器step1的狀態(tài)(LED燈顯示)else P2_0=1;例題10-4 互鎖程序 #include AT89X51.hunsigned int code table=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;unsigned int n0,n1,n2;unsigned int kk=8;unsigned int step1=0,step2=0;void main()unsigned

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論