找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 12403|回復(fù): 0
收起左側(cè)

用單片機(jī)制作PLC(多路故障報(bào)警系統(tǒng))附源碼+梯形圖+仿真+論文

[復(fù)制鏈接]
ID:418906 發(fā)表于 2018-11-5 08:30 | 顯示全部樓層 |閱讀模式
簡(jiǎn)易可編程控制器PLC的單片機(jī)實(shí)現(xiàn)的全部設(shè)計(jì)資料包:
0.png

電路原理圖如下:
0.png

0.png

2.3 用單片機(jī)實(shí)現(xiàn)PLC的總體設(shè)計(jì)
本次設(shè)計(jì)用AT89C52單片機(jī)設(shè)計(jì)了一個(gè)4輸入4輸出的簡(jiǎn)單PLC。
該P(yáng)LC含有10個(gè)定時(shí)器和10個(gè)計(jì)數(shù)器,每個(gè)定時(shí)器的最長(zhǎng)定時(shí)時(shí)間為3276.75秒,每個(gè)計(jì)數(shù)器的最大計(jì)數(shù)值為65535。
該P(yáng)LC的輸入方式為直流開(kāi)關(guān)量,輸入電壓為24V。
輸出采用繼電器輸出方式,采用匯科繼電器HK4100F-24V-SHG,該繼電器是小型、小功率繼電器,觸點(diǎn)形式是常開(kāi)型,額定電壓為DC24V,直流電阻為1Ω,吸合電流為2A,釋放電流也為2A,線圈功率為4W,額定工作頻率為5Hz。
為了提高系統(tǒng)的抗干擾能力,輸入輸出電路中都使用了光電耦合器。光電耦合器采用TLP521-1。
該P(yáng)LC具有與計(jì)算通訊能力,可以在計(jì)算機(jī)上下載程序。
設(shè)計(jì)的PLC總體外觀圖如圖2.15所示。

圖2.15 PLC總體設(shè)計(jì)的外觀圖

圖2.15中,輸入端口X0、X1、X2和X3分別于單片機(jī)的P0.0、P0.1、P0.2和P0.3通過(guò)輸入電路相連接。輸出端口口Y0、Y1、Y2和Y3分別于單片機(jī)的P1.0、P1.1、P1.2和P1.3通過(guò)輸出電路相連接。+24V是輸入電源,電源與輸入端口間可以接開(kāi)關(guān)等開(kāi)關(guān)量輸入裝置。輸出端口和yCOM端之間接用戶的控制電路,可以是簡(jiǎn)單的LED燈,也可以是直流電機(jī)、交流電機(jī)。用戶控制電路中的電源可以是直流也可以是交流。
根據(jù)輸入端口的狀態(tài),單片機(jī)運(yùn)行梯形圖程序(已轉(zhuǎn)換成單片機(jī)可執(zhí)行的語(yǔ)言),控制輸出端口的狀態(tài)。對(duì)于用戶而言,只需要知道圖2.15中的10個(gè)外接的端口,至于輸入輸出電路以及單片機(jī)與這些電路的連接,用戶無(wú)需了解。這樣便實(shí)現(xiàn)了一個(gè)用單片機(jī)制作的簡(jiǎn)單PLC。

3章 系統(tǒng)硬件設(shè)計(jì)

3.1 硬件設(shè)計(jì)總述
硬件設(shè)計(jì)主要是設(shè)計(jì)外圍電路,特別是設(shè)計(jì)I/O接口。系統(tǒng)硬件設(shè)計(jì)如圖3.1所示。本次設(shè)計(jì)的硬件部分這要有五個(gè)部分:輸入電路、輸出電路、振蕩和復(fù)位電路、電源轉(zhuǎn)換電路、串口通信電路。由于本次設(shè)計(jì)比較簡(jiǎn)單,只有四個(gè)輸入和四個(gè)輸出,沒(méi)有拓展內(nèi)存。


圖3.1 硬件設(shè)計(jì)圖
3.2 單片機(jī)最小系統(tǒng)
PLC控制系統(tǒng)的主要功能是實(shí)現(xiàn)各種邏輯和過(guò)程控制,因此硬件對(duì)輸入輸出接口有相當(dāng)高的要求。CPU 是PLC 的核心,起神經(jīng)中樞的作用,CPU 的運(yùn)行速度和內(nèi)存容量是PLC的重要參數(shù),決定著PLC 的工作速度、I/O 數(shù)量及軟件容量等,因此也限制著控制規(guī)模。用單片機(jī)實(shí)現(xiàn)PLC,其CPU實(shí)際上就是單片機(jī),因此選用合適的單片機(jī)對(duì)于最終實(shí)現(xiàn)的PLC的功能影響很大。[8]
本次設(shè)計(jì)使用的單片機(jī)是AT89C52。AT89C52 是美國(guó)ATMEL公司生產(chǎn)的低電壓,高性能CMOS 8位單片機(jī),片內(nèi)含8KB的可反復(fù)擦寫(xiě)的Flash 只讀程序存儲(chǔ)器和256 bytes 的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),與標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及8052產(chǎn)品引腳兼容,片內(nèi)置通用8位中央處理器(CPU)和Flash 存儲(chǔ)單元,功能強(qiáng)大AT89C52 單片機(jī)適合于許多較為復(fù)雜控制應(yīng)用場(chǎng)合。AT89C52單片機(jī)為制作PLC應(yīng)用提供了靈活且低成本的方案。其最小系統(tǒng)設(shè)計(jì)如圖3.2所示。

圖3.2 單片機(jī)最小系統(tǒng)
3.2.1 振蕩電路
單片機(jī)系統(tǒng)里都有晶振,結(jié)合單片機(jī)內(nèi)部電路產(chǎn)生單片機(jī)所需的時(shí)鐘頻率,單片機(jī)晶振提供的時(shí)鐘頻率越高,那么單片機(jī)運(yùn)行速度就越快,單片機(jī)的一切指令的執(zhí)行都需要單片機(jī)晶振提供的時(shí)鐘頻率。
圖3.3 振蕩電路圖
單片機(jī)晶振的作用是為系統(tǒng)提供基本的時(shí)鐘信號(hào)。通常一個(gè)系統(tǒng)共用一個(gè)晶振,便于各部分保持同步。本設(shè)計(jì)使用12MHz的晶體振蕩器作為振蕩源,由于單片機(jī)內(nèi)部帶有振蕩電路,所以外部只要連接一個(gè)晶振和兩個(gè)電容即可,電容容量一般在15pF至50pF之間。
3.2.2 復(fù)位電路
復(fù)位操作是單片機(jī)的初始化,其作用是時(shí)CPU和系統(tǒng)其他部件都處于一個(gè)確定的初始狀態(tài),系統(tǒng)從這個(gè)狀態(tài)開(kāi)始工作。單片機(jī)有復(fù)位信號(hào)引腳RST,用于從外界引入復(fù)位信號(hào)。單片機(jī)的復(fù)位電路比較簡(jiǎn)單,如圖3.4所示,RESET接單片機(jī)RST引腳。在單片機(jī)調(diào)試或程序運(yùn)行時(shí),若遇到死機(jī)、死循環(huán)或程序“跑飛”等情況,按下復(fù)位鍵S1,單片機(jī)就將重新啟動(dòng)。完成復(fù)位操作共需24個(gè)狀態(tài)周期。復(fù)位結(jié)束后,單片機(jī)從地址0000H開(kāi)始執(zhí)行程序。[9]

圖3.4 復(fù)位電路

圖3.4中,RESET接單片機(jī)RST引腳。按鍵S1按下后,復(fù)位端接高電平,實(shí)現(xiàn)電路復(fù)位。單片機(jī)在RST端加一個(gè)正脈沖即可實(shí)現(xiàn)復(fù)位,在系統(tǒng)上電的瞬間,RST與電源電壓同電位,隨著電容的電壓逐漸上升,RST電位下降,于是在RST形成一個(gè)正脈沖。
3.3 電源設(shè)計(jì)
如第二章中所述,PLC等數(shù)字系統(tǒng)工作時(shí),需要三種電源:一是輸入信號(hào)電源;二是內(nèi)部元器件工作電源;三是負(fù)載工作電源。電源模塊在整個(gè)系統(tǒng)中起十分重要的作用,如果系統(tǒng)沒(méi)有一個(gè)良好的、可靠的電源系統(tǒng),它是無(wú)法正常工作的,因此電源的設(shè)計(jì)和制造十分重要。[8]
負(fù)載工作電源是用來(lái)驅(qū)動(dòng)PLC 輸出設(shè)備(負(fù)載)和提供輸入信號(hào)的,又稱用戶電源。用戶電源的容量由輸出設(shè)備和PLC 的輸入電路決定。由于本系統(tǒng)中 的I/O 電路都有濾波、隔離功能,所以外部電源對(duì)PLC 的性能影響不大。用戶電源不屬于本次設(shè)計(jì)中的內(nèi)容。
為了減小設(shè)計(jì)的復(fù)雜性,電源模塊為系統(tǒng)運(yùn)行提供內(nèi)部工作電源,同時(shí)為輸入信號(hào)提供電源。本設(shè)計(jì)中的電源設(shè)計(jì)采用獨(dú)立的DC24V—DC5V電壓轉(zhuǎn)換模塊。輸入信號(hào)是開(kāi)關(guān)量輸入,輸入電壓是24V,電源模塊將輸入信號(hào)的24V電壓轉(zhuǎn)換成供單片機(jī)工作的5V電壓。為了減小電源的數(shù)量,在選用繼電器時(shí)選用了24V的直流繼電器。電源模塊的電路如圖3.5所示。
DC24V—DC5V電壓轉(zhuǎn)換模塊NMA2405S。NMA系列是獨(dú)立的直流/直流轉(zhuǎn)換器,開(kāi)關(guān)噪聲小,組建電源系統(tǒng)非常簡(jiǎn)單方便。


圖3.5 電源電路

3.4 輸入電路
PLC為了提高系統(tǒng)的抗干擾能力,在輸入電路部分有各種抗干擾設(shè)計(jì)。本設(shè)計(jì)的輸入電路也仿照PLC,在信號(hào)輸入到單片機(jī)前進(jìn)行了濾波處理,采用光電耦合將輸入電源與系統(tǒng)電源隔開(kāi)。圖3.6是輸入電路邏輯意義上的示意圖,圖中的INPUT是一個(gè)子電路圖,里面包含四個(gè)相同的輸入電路,實(shí)際的電路如3.7所示,圖3.7中只畫(huà)出了一路輸入,其他輸入電路與之相同。圖3.6中D1、D2、D3、D4是輸入狀態(tài)指示燈。X0、X1、X2、X3是四個(gè)輸入端,通過(guò)按鈕與輸入電源24V的負(fù)極相連接,按鍵按下,相應(yīng)的LED就會(huì)亮。IN0、IN1、IN2、IN3接單片機(jī)的P0.0、P0.1、P0.2、P0.3。
圖3.6 輸入電路總圖

本設(shè)計(jì)的輸入為開(kāi)關(guān)量輸入。輸入電路接收工業(yè)現(xiàn)場(chǎng)輸入設(shè)備的開(kāi)關(guān)信號(hào),將信號(hào)轉(zhuǎn)換為PLC內(nèi)部單片機(jī)可接受的低電壓信號(hào),實(shí)現(xiàn)PLC內(nèi)外信號(hào)的電氣隔離。本設(shè)計(jì)的輸入信號(hào)選用直流輸入方式,該方式延時(shí)時(shí)間較短,還可以直接與光電開(kāi)關(guān)等電子輸入設(shè)備連接。開(kāi)關(guān)量輸入模塊的輸入信號(hào)電壓等級(jí)選擇24V,適用于傳輸距離較近的場(chǎng)合。為了提高系統(tǒng)的可靠性,需要考慮輸入門(mén)檻電流的高低,門(mén)檻電流越高,抗干擾能力越強(qiáng),傳輸距離也越遠(yuǎn),文中設(shè)計(jì)保證信號(hào)為真時(shí)電流在5到7mA?紤]到控制電路的抗干擾性能,減少設(shè)備之間的干擾,開(kāi)關(guān)量輸入電路的隔離采用光電耦合器。[8]
圖3.7 輸入電路

圖3.6與圖2.2在本質(zhì)上一樣的,是對(duì)圖2.2的具體化。圖3.4中,X0是PLC的一個(gè)輸入端。D1用于指示該輸入點(diǎn)的開(kāi)關(guān)狀態(tài)。輸入信號(hào)與單片機(jī)之間用光電耦合器TLP521-1隔開(kāi)。R2是限流電阻,同時(shí)與電容C1構(gòu)成濾波電路,去處高頻干擾。估算輸入電流約為:(24-2)/4.7=4.7mA,光電耦合器的一次側(cè)驅(qū)動(dòng)電流一般在4.5mA 以上,滿足設(shè)計(jì)要求。R3和C1構(gòu)成延時(shí)電路,一次回路中輸入信號(hào)有延時(shí)。IN0連接單片機(jī)的輸入端口P0.0。在輸入端X0與電源端接入用戶輸入電路,如圖2.2,用戶電路中都會(huì)設(shè)置開(kāi)關(guān),如果開(kāi)關(guān)閉合,光電耦合器的發(fā)光二極管所在的回路導(dǎo)通,光電耦合器的發(fā)光二極管發(fā)光,光電耦合器的三極管導(dǎo)通,IN0為高電平,D1發(fā)光,表示該輸入點(diǎn)已經(jīng)導(dǎo)通。
3.5 輸出電路
輸出電路用于將單片機(jī)內(nèi)部的低電壓信號(hào)轉(zhuǎn)換成驅(qū)動(dòng)外部輸出設(shè)備的開(kāi)關(guān)信號(hào),并且實(shí)現(xiàn)PLC內(nèi)外信號(hào)的電氣隔離。本設(shè)計(jì)的輸出電路為繼電器輸出方式,這樣可以驅(qū)動(dòng)交流負(fù)載,也可以驅(qū)動(dòng)直流負(fù)載,使用的電壓大小范圍較寬,同時(shí)承受順勢(shì)過(guò)電壓和過(guò)電流的能力較強(qiáng)。與晶閘管輸出和晶體管輸出相比,唯一的缺點(diǎn)是觸電元件動(dòng)作較慢,壽命較短,不適用于頻繁通斷的場(chǎng)合。輸出電路的輸出電流驅(qū)動(dòng)能力必須大于PLC外接設(shè)備的額定電流,因此需要根據(jù)輸出設(shè)備的電流大小來(lái)確定輸出電路的輸出電流。[8]

圖3.8 輸出電路總圖

圖3.8是輸出電路邏輯意義上的示意圖,圖中的OUTPUT是一個(gè)子電路圖,里面包含四個(gè)相同的輸出電路,實(shí)際的電路如3.9所示,圖3.9中只畫(huà)出了一路輸出,其他輸出電路與之相同。圖3.8中OUT0、OUT1、OUT2、OUT3接單片機(jī)的P1.0、P1.1、P1.2、P1.3。D5、D6、D7、D8是輸出狀態(tài)指示燈。Y0、Y1、Y2、Y3四個(gè)輸出端,用戶電路接在輸出端和yCOM之間。


圖3.9 輸入電路

圖3.9與圖2.6在本質(zhì)上一樣的,是對(duì)圖2.6的具體化。5V電源為PLC 的內(nèi)部電源,24V 電源為開(kāi)關(guān)量輸出電源,兩個(gè)電源是隔離的。圖3.7中,Y0是PLC的一個(gè)輸出端。D1用于指示該輸出點(diǎn)的開(kāi)關(guān)狀態(tài)。輸出信號(hào)與單片機(jī)之間也用光電耦合器TLP521-1隔開(kāi)。R1是限流電阻。D2用以防止繼電器開(kāi)斷時(shí)的反向電流。D3是一個(gè)齊納穩(wěn)壓管,是Q1基極和發(fā)射極之間電壓穩(wěn)定。OUT0連接單片機(jī)的輸出端口P1.0。采用匯科繼電器HK4100F-24V-SHG,該繼電器是小型、小功率繼電器,觸點(diǎn)形式是常開(kāi)型,額定電壓為DC24V,直流電阻為1Ω,吸合電流為2A,釋放電流也為2A,線圈功率為4W,額定工作頻率為5Hz。
當(dāng)OUT0 接口端輸出低電平時(shí),經(jīng)光電耦合器使驅(qū)動(dòng)晶體管Q1導(dǎo)通,繼電器K1得電吸合,同時(shí)D1發(fā)光。當(dāng)OUT0接口輸出高電平,經(jīng)光電耦合器使Q1 截止,K1釋放,D1熄滅。
3.6 串口通信電路
本設(shè)計(jì)上位機(jī)程序下載時(shí)采用RS-232C通信接口技術(shù),RS-232C是常用的點(diǎn)對(duì)點(diǎn)串行通信技術(shù),采用單端信號(hào)傳輸方式,將PC 機(jī)和單片機(jī)連接至一起,實(shí)現(xiàn)梯形圖目標(biāo)代碼的下載。通訊電路如圖3.10所示。
圖3.10中主要用到了芯片MAX232,該芯片是由美國(guó)德州儀器公司(TI)推出的一款兼容RS232標(biāo)準(zhǔn)的芯片。單片機(jī)使用的是TTL電平(+5V為高電平,低電平為0V),而計(jì)算機(jī)的串口為RS-232C電平,其中高電平為-12V,低電平為+12V,RS-232C電平為負(fù)邏輯電平。MAX232 就是用來(lái)進(jìn)行電平轉(zhuǎn)換的。該器件包含兩個(gè)驅(qū)動(dòng)器、兩個(gè)接收器。它的的9、10、11、12 引腳是TTL 電平端,用來(lái)連接單片機(jī);7、8、13、14引腳是接PC機(jī)的。

圖3.10 串口通信電路

在圖3.10中,D9、D10兩個(gè)發(fā)光二極管用來(lái)指示此時(shí)是否有通信正在進(jìn)行。串口通信的數(shù)據(jù)傳輸過(guò)程如下:MAX232的10腳T2IN接單片機(jī)TXD端P3.1,TTL電平從單片機(jī)的TXD端發(fā)出,經(jīng)過(guò)MAX232轉(zhuǎn)換為RS-232電平后從MAX232的7腳T2OUT發(fā)出,再連接到系統(tǒng)板上的串口座的第2腳RXD,至此計(jì)算機(jī)端接收到數(shù)據(jù)。PC機(jī)發(fā)送數(shù)據(jù)時(shí)從PC機(jī)串口座上的第3腳TXD端發(fā)出數(shù)據(jù),再逆向流向單片機(jī)的RXD端P3.0接收數(shù)據(jù)。

4章 系統(tǒng)軟件設(shè)計(jì)

4.1 系統(tǒng)程序結(jié)構(gòu)
一個(gè)完整的PLC系統(tǒng)程序流程圖如圖4.1所示,該圖是對(duì)圖2.8的簡(jiǎn)化。本設(shè)計(jì)的軟件部分主要是模仿PLC的循環(huán)工作。輸入采樣程序和輸出程序?qū)θ魏螒?yīng)用程序都是一樣的,這部分屬于系統(tǒng)程序,但梯形圖處理處理程序需要針對(duì)不同的應(yīng)用編寫(xiě)不同的程序。

                                 

圖4.1 系統(tǒng)程序流程圖

本設(shè)計(jì)的編程語(yǔ)言用了C語(yǔ)言和匯編語(yǔ)言兩種。匯編語(yǔ)言的執(zhí)行效率要比C語(yǔ)言高,但可讀性比較差。C語(yǔ)言編程簡(jiǎn)潔,可讀性好,但C語(yǔ)言會(huì)占用更多的內(nèi)存資源。
C語(yǔ)言程序含有六個(gè)文件:“IO.h”、“timer_counter.h”、“main.c”、“functions.c”、“timer_counter.c”和“process.c”。頭文件“IO.h”是對(duì)輸入輸出端口以及輸入輸出端口映像寄存器的聲明。頭文件“timer_counter.h”是定時(shí)器和計(jì)數(shù)器的聲明,定時(shí)器和計(jì)數(shù)器的定義在C文件“timer_counter.c”中。C文件“main.c”是系統(tǒng)的主程序。C文件“functions.c”中是初始化程序、輸入程序、輸出程序等的具體實(shí)現(xiàn)。C文件“process.c”是用戶編寫(xiě)不同控制程序的文件,該文件中內(nèi)容需要用戶根據(jù)梯形圖程序來(lái)填寫(xiě),其他五個(gè)文件不需要用戶關(guān)心,用戶只需要了解一些接口即可。這種設(shè)計(jì)使用戶只要關(guān)注如何將梯形圖程序轉(zhuǎn)換成C語(yǔ)言,而這種轉(zhuǎn)換往往相對(duì)比較簡(jiǎn)單。
匯編語(yǔ)言程序只有一個(gè)文件,含有三個(gè)個(gè)部分:預(yù)定義部分,系統(tǒng)函數(shù)部分和用戶程序部分。預(yù)定義部分是對(duì)輸入輸出端口以及輸入輸出端口映像寄存器的定義,還包括計(jì)數(shù)器和定時(shí)器的定義。系統(tǒng)程序部分包括主函數(shù),輸入/輸出函數(shù),定時(shí)器程序個(gè)計(jì)數(shù)器程序。用戶程序是供用戶根據(jù)梯形圖程序填寫(xiě)的部分。
4.2 系統(tǒng)主程序
系統(tǒng)主程序是主要是模擬PLC的循環(huán)工作方式。主程序中調(diào)用了四個(gè)函數(shù):initi()是初始化程序,getIn()是輸入采樣程序,process()是用來(lái)翻譯梯形圖程序的梯形圖處理程序,getOut()是輸出刷新程序。這四個(gè)程序的具體定義見(jiàn)本章的4.3、4.4、4.8和4.5。
主程序如下:
void main()
{
   initi();                           
   while(1)
   {
                 getIn();                           
                 process();            
                 getOut();                  
  }
}

匯編程序如下
Main:
                     ACALL Initi                                                      
Loop: ACALL GetIn                                                      
                 LCALL Process                                         
                 ACALL GetOut                                         
                 SJMP Loop
匯編語(yǔ)言中的Initi是初始化程序,GetIn是輸入采樣程序,Process是用來(lái)翻譯梯形圖程序的梯形圖處理程序,GetOut是輸出刷新程序。這四個(gè)程序的具體定義見(jiàn)本章的4.3、4.4、4.8和4.5。
由以上的程序可以發(fā)現(xiàn),用單片機(jī)實(shí)現(xiàn)PLC的循環(huán)掃描過(guò)程,在程序上比較容易實(shí)現(xiàn),結(jié)構(gòu)清晰,易于理解。主程序中各個(gè)子函數(shù)的具體定義見(jiàn)本章以下各節(jié)內(nèi)容。
4.3 初始化程序
初始化程序是在系統(tǒng)進(jìn)入循環(huán)掃描所必須的預(yù)處理。本設(shè)計(jì)的初始化化程序主要完成以下一些工作:輸入、輸出初始化,設(shè)置所有定時(shí)器的時(shí)間基數(shù),定時(shí)器初始化、計(jì)數(shù)器初始化化。C語(yǔ)言程序如下。
void initi()
{
              P0=0x00;               
              P1=0xFF;                                         
              TMOD=0x01;            
              TH0=0x3C;
              TL0=0x0B0;            

              EA=1;
              ET0=1;

              initi_timer();            
              initi_counter();
              TR0=1;
}
initi_timer()是定時(shí)器初始化程序,initi_counter()是計(jì)數(shù)器初始化程序。如本章開(kāi)始所述,把這兩個(gè)函數(shù)定義放在在C文件"process.c"中是為了方便用戶,用戶在編寫(xiě)用戶處理程序時(shí)可能會(huì)使用定時(shí)器和計(jì)數(shù)器,這就需要對(duì)定時(shí)器和計(jì)數(shù)器進(jìn)行初始化,把這兩個(gè)程序和用戶處理程序放在一個(gè)文件中,使用戶只需要關(guān)注一個(gè)文件,專注于梯形圖程序的轉(zhuǎn)換。
匯編程序如下:
Initi:              
                            MOV                SP,                            #78H
    MOV               P0,                            #00H               
       MOV               P1,                            #0FFH                             
                            MOV               TMOD,              #01H            
                            MOV               TH0,              #3CH
                            MOV               TL0,              #0B0H            
                            SETB   EA
                            SETB              ET0

                            LCALL  Initi_Timer
                            LCALL  Initi_Counter

                            SETB   TR0
                            RET
Initi_Timer和Initi_Counter分別是定時(shí)器初始化程序和計(jì)數(shù)器初始化程序。
定時(shí)器程序和計(jì)數(shù)器程序見(jiàn)本章的4.6和4.7。
4.4 輸入程序
輸入程序用以檢測(cè)四個(gè)輸入點(diǎn)的開(kāi)關(guān)狀態(tài)。程序首先把四個(gè)輸入映像寄存器清零,然后依次檢測(cè)四個(gè)輸入端口,如果檢測(cè)到該輸入端為高電平,則延時(shí)10毫秒,主要用于去除按鍵抖動(dòng),如果延時(shí)10毫秒之后,再次檢測(cè)到得該輸入端仍為高電平,則將該輸入點(diǎn)的映像寄存器置1,否則置0。掃描得到的輸入映像寄存器的不同狀態(tài)將在用戶程序中使用。In0、In1、In2和In3分別代表單片機(jī)的四個(gè)輸入端口P0.0、P0.1、P0.2和P0.3。InMap0、InMap1、InMap2和InMap3分別是四個(gè)輸入端口的映像存儲(chǔ)器,每個(gè)映像存儲(chǔ)器占一位存儲(chǔ)空間。定義映像存儲(chǔ)器實(shí)際上也有效地防止了輸入信號(hào)的干擾,提高了系統(tǒng)的抗干擾能力。輸入程序如下:
void getIn()
{
              InMap0=0;
              InMap1=0;
              InMap2=0;
              InMap3=0;

              if(In0)
              {
                            delay10ms();
                            if(In0)
                                          InMap0=1;
              }

              if(In1)
              {
                            delay10ms();
                            if(In1)
                                          InMap1=1;
              }

              if(In2)
              {
                            delay10ms();
                            if(In2)
                                          InMap2=1;
              }

              if(In3)
              {
                            delay10ms();
                            if(In3)
                                          InMap3=1;
              }
}
匯編程序如下:
GetIn:                              
                  CLR InMap0
                            CLR InMap1
                            CLR InMap2
                            CLR InMap3

                            JNB                In0,              CHK1
                            LCALL                KT10MS
                            JNB                In0,              CHK1
                            SETB               InMap0              

   CHK1: JNB                In1,              CHK2
                   LCALL                KT10MS
                   JNB                In1,              CHK2
                   SETB               InMap1

   CHK2: JNB                In2,              CHK3
                            LCALL                KT10MS
                            JNB                In2,              CHK3
                            SETB               InMap2

   CHK3: JNB                In3,              EndCHK
                            LCALL                KT10MS
                            JNB                In3,              EndCHK
                            SETB               InMap3

   EndCHK:RET
4.5  輸出程序
輸出程序比較簡(jiǎn)單,在每個(gè)掃描周期,都需要把輸出映像寄存器的值賦給輸出端,即所謂的輸出刷新。Out0、Out1、Out2和Out3分別代表單片機(jī)的四個(gè)輸出端口P1.0、P1.1、P1.2和P1.3。OutMap0、OutMap1、OutMap2和OutMap3分別是四個(gè)輸出端口的映像存儲(chǔ)器,每個(gè)映像存儲(chǔ)器占一位存儲(chǔ)空間。輸出程序如下:
void getOut()
{
              Out0=~OutMap0;
              Out1=~OutMap1;
              Out2=~OutMap2;
              Out3=~OutMap3;
}
匯編程序如下:
GetOut:            
                            MOV               C,                            OutMap0
                            CPL              C                                                      
                            MOV               Out0,              C                                                                     
                            MOV               C,                            OutMap1
                            CPL              C
                            MOV               Out1,              C

                            MOV               C,                            OutMap2
                            CPL              C
                            MOV              Out2,              C

                            MOV               C,                            OutMap3
                            CPL              C
                            MOV               Out3,              C
                            RET
特別要注意的是,本設(shè)計(jì)在輸出時(shí)是低電平表示輸出有效(見(jiàn)圖3.9),是負(fù)邏輯,為了在梯形圖處理程序中減小用戶的負(fù)擔(dān),在梯形圖處理程序中使用易于理解的正邏輯,只在輸出時(shí)對(duì)所有的映像寄存器取反,但是這里的取反并不是讓映像存儲(chǔ)器里的值取反,這樣會(huì)破壞用戶編寫(xiě)的程序,而是將映像存儲(chǔ)器相反的值賦給相應(yīng)的輸出端。
4.6  定時(shí)程序
PLC中的定時(shí)器代表延時(shí)繼電器的功能,通?梢杂卸鄠(gè),考慮到單片機(jī)內(nèi)存資源有限,本設(shè)計(jì)中定義了10個(gè)定時(shí)器。定時(shí)器需要一個(gè)統(tǒng)一的時(shí)鐘,用單片機(jī)片內(nèi)的T0來(lái)作統(tǒng)一的時(shí)鐘。T0每0.05秒中斷一次,T0的設(shè)置在初始化程序中。因此定時(shí)器程序包兩個(gè)部分,一個(gè)是定時(shí)中斷服務(wù)程序,另一個(gè)是定時(shí)器邏輯指令程序。
4.6.1 定時(shí)器的定義
定時(shí)器有四個(gè)部分組成:定時(shí)器邏輯位,初始值,定時(shí)器計(jì)數(shù)器,觸發(fā)啟動(dòng)標(biāo)志。定時(shí)器如果用C語(yǔ)言的結(jié)構(gòu)體定義比較容易理解。定時(shí)器的結(jié)構(gòu)體定義如下。
struct  tim
{
              Bit DT;                                                             //定時(shí)器邏輯位(溢出標(biāo)志)
              unsigned int K;                                             //初值
              unsigned int TC;                               //定時(shí)器計(jì)數(shù)器
              Bit ST;                                                                      //觸發(fā)啟動(dòng)標(biāo)志
} timer[10];
定時(shí)器的計(jì)數(shù)器占兩個(gè)字節(jié),最大值是65535,由于每中斷一次,計(jì)數(shù)器加1,因此定時(shí)器的最長(zhǎng)定時(shí)時(shí)間為3276.75秒。
4.6.2定時(shí)中斷服務(wù)程序
定時(shí)中斷服務(wù)程序的流程圖如4.2所示。
圖4.2 中斷服務(wù)程序流程圖[10]

根據(jù)流程圖,寫(xiě)出C程序如下。
void interT0() interrupt 1
{
                unsigned char i;

                TR0=0;
                TH0=0x3c;
                TL0=0xb0;
                for(i=0;i<10;i++)                                                           
    {
                              if(timer[ i].ST)
                                            timer.TC++;            
                }
                TR0=1;
}
匯編程序如下:
IT0Int:   CLR               TR0
                              PUSH               PSW
                              PUSH               ACC
                              MOV               TH0,              #3CH
                              MOV               TL0,              #0B0H            
                              JNB               ST0,                            Next1
                              INC               TC0_L
                              MOV A , TC0_L                                                                        
        JNZ    Next1
        INC               TC0_H
  Next1:  JNB               ST1,                            Next2
                                INC               TC1_L
                              MOV A , TC1_L
                              JNZ    Next2
          INC               TC1_H
  Next2:  JNB               ST2,                            Next3
                                INC               TC2_H
                              MOV A , TC2_L
                              JNZ    Next3
                              INC               TC2_L
  Next3:  JNB               ST3,                            Next4
                                INC               TC3_L
                              MOV A , TC3_L
                              JNZ    Next4
          INC               TC3_H
  Next4:  JNB               ST4,              Next5
                                  INC               TC4_L
                                MOV A , TC4_L
                                JNZ    Next5
          INC               TC4_H
  Next5:  JNB               ST5,              Next6
                                INC               TC5_L
                              MOV A , TC5_L
                              JNZ    Next6
          INC               TC5_H
  Next6:  JNB               ST6,                            Next7
          INC               TC6_L
                              MOV A , TC6_L
                              JNZ    Next7
          INC               TC6_H
  Next7:  JNB               ST7,                            Next8            
                                INC               TC7_L
                              MOV A , TC7_L
                              JNZ    Next8
          INC               TC7_H
  Next8:  JNB               ST8,                            Next9
                                INC               TC8_L
                              MOV A , TC8_L
                              JNZ    Next9
          INC               TC8_H
  Next9:  JNB               ST9,              EndInt               
                     INC               TC9_L
                              MOV A , TC9_L
                              JNZ    EndInt
          INC               TC9_H
  EndInt: POP ACC
                              POP PSW
                              SETB TR0
                              RETI
4.6.3定時(shí)器邏輯指令程序
定時(shí)器邏輯指令程序中需要注意觸發(fā)啟動(dòng)標(biāo)志何時(shí)打開(kāi)。流程圖如圖4.3所示。
圖4.2 定時(shí)器程序流程圖[10]

根據(jù)以上的流程圖寫(xiě)出的C語(yǔ)言程序如下。
void  time(unsigned char n,bit in)
{
              if(in)
                            {
                                          if(timer[n].ST)
                                          {
                                                        if(timer[n].TC==timer[n].K)               
                                                        {
                                                                      timer[n].DT=1;                                          
                                                                      timer[n].ST=0;
                                                                      timer[n].TC=0;
                                                        }
                                          }
                                          else
                                          {
                                                        if(timer[n].DT!=1)
                                                                      timer[n].ST=1;               
                                          }
                            }
              else
                            {
                                          timer[n].DT=0;
                                          timer[n].ST=0;
                                          timer[n].TC=0;
                            }
}
程序中的n是定時(shí)器的編號(hào),有效值是0到9,in是當(dāng)前的邏輯運(yùn)算值。
匯編程序需要對(duì)分別寫(xiě)出每個(gè)定時(shí)器的邏輯指令程序,但它們都是相同的。下面定時(shí)器0為例,寫(xiě)出匯編程序如下。匯編程序中當(dāng)前邏輯運(yùn)算值在位累加器C中。
Tim0:                            JNC                            Off0
                                          JNB                            ST0,              Open0

                                          MOV                            A,                            TC0_L                                         
                                          CJNE    A,                            K0_L,              Exit0
                                          MOV                            A,                            TC0_H
                                          CJNE    A,                            K0_H,              Exit0
                                          SETB              DT0                                                                        
                                          SJMP    Rest0

              Open0:              JB                            ST0,                            Exit0
                                          JB                            DT0,                            Exit0
                                          SETB              ST0                                                                                   
                                          RET

              Off0:              CLR                            DT0                           
              Rest0:              CLR                            ST0                           
                                          MOV     TC0_H,                            #00H                              
                                          MOV     TC0_L,                            #00H

              Exit0:              RET
4.6.4定時(shí)器初始化
用戶需要對(duì)用到得定時(shí)器進(jìn)行初始化,C語(yǔ)言初始化程序如下。程序中已對(duì)初始化的方法做了詳細(xì)的說(shuō)明。
void initi_timer()
{
              /*timer[n].K=t/0.05;*/
}
程序中的n是使用的定時(shí)器編號(hào)(0-9)。t是定時(shí)的時(shí)間,最長(zhǎng)定時(shí)時(shí)間為3276.75秒。
匯編語(yǔ)言定時(shí)器的初始化方法如下。
Initi_Timer:              /*              MOV              Kn_L,              #Low            
                         MOV              Kn_H,              #High*/            
                         RET
程序中Low=t/0.05%256,High=t/0.05/256。
4.7  計(jì)數(shù)程序
S7-200中的計(jì)數(shù)器有加計(jì)數(shù)器、減計(jì)數(shù)器和加減計(jì)數(shù)器。本設(shè)計(jì)的計(jì)數(shù)器屬于加計(jì)數(shù)器。S7-200中的計(jì)數(shù)器如圖4.3所示。當(dāng)計(jì)數(shù)器的復(fù)位端R斷開(kāi),且輸入脈沖CU檢測(cè)到輸入信號(hào)正跳變時(shí)當(dāng)前值加1,直到達(dá)到PV端設(shè)定值時(shí),計(jì)數(shù)器的邏輯位置位。
圖4.3 加計(jì)數(shù)器
4.7.1 計(jì)數(shù)器的定義
下面的結(jié)構(gòu)體定義了計(jì)數(shù)器的結(jié)構(gòu)。
struct  ct
{
              Bit Cnt;                                                        //計(jì)數(shù)器邏輯位(溢出標(biāo)志)
              unsigned int PV;                            //初值
              unsigned int CT;                            //計(jì)數(shù)器
              Bit RST;                                          //復(fù)位標(biāo)志
} counter[10];
定義了10個(gè)計(jì)數(shù)器,計(jì)數(shù)器初始值最大為65535。
4.7.2計(jì)數(shù)器程序的實(shí)現(xiàn)
根據(jù)S7-200中的加計(jì)數(shù)器,計(jì)數(shù)器的流程圖如圖4.4所示。
圖4.4 計(jì)數(shù)器程序流程圖


根據(jù)以上的流程圖寫(xiě)出計(jì)數(shù)器的C語(yǔ)言程序如下。
void count(unsigned char n,bit in)
{
              if(!counter[n].RST)
                            {
                                          if(in)
                                                        {
                                                                      if(!counter[n].Cnt)
                                                                                    counter[n].CT++;
                                                                      if(counter[n].CT==counter[n].PV)
                                                                      {
                                                                                    counter[n].Cnt=1;
                                                                                    counter[n].CT=0;
                                                                      }
              }
           else
           counter[n].Cnt=0;
                                                        }
                            }
              else
              {
                                          counter[n].Cnt=0;
                                          counter[n].CT=0;
              }
}
程序中的n是計(jì)數(shù)器的編號(hào),有效值是0到9,in是當(dāng)前的邏輯運(yùn)算值。
匯編程序需要對(duì)分別寫(xiě)出每個(gè)計(jì)數(shù)器的程序,但它們都是相同的。下面計(jì)數(shù)器0為例,寫(xiě)出匯編程序如下。匯編程序中當(dāng)前邏輯運(yùn)算值在位累加器C中。
COUNT0: JB              RST0,Reset0                           
                              JNC   CExit0                                         
                              JB    C0,  End0

                              INC   C0_L                              
                              MOV A , C0_L
                              JNZ    CN0
                              INC   C0_H

              CN0: MOV              A,                            C0_L                                         
                              CJNE    A,                            PV0_L,              End0
                              MOV                  A,                            C0_H
                              CJNE    A,                            PV0_H,              End0                           
                              SETB               C0                                                      
                              MOV                  C0_L,  #0                                         
                              MOV   C0_H,  #0
                              RET

  Reset0: MOV                C0_L,   #0                           
                              MOV   C0_H,  #0
CExit0:  CLR   C0
   End0:  RET
4.7.3計(jì)數(shù)器初始化
用戶需要對(duì)用到得計(jì)數(shù)器進(jìn)行初始化,計(jì)數(shù)器的初始化很簡(jiǎn)單,C語(yǔ)言初始化程序如下。
void initi_counter()
{            
              /*counter[n].PV=;*/                                                                     
}
程序中的n是使用的計(jì)數(shù)器編號(hào)(0-9)。設(shè)置計(jì)數(shù)器初始值,最大值為65535。
匯編語(yǔ)言定時(shí)器的初始化方法如下。
Initi_Counter: /*              MOV              PVn_L,              #Low                                                                                   
             MOV              PVn_H,              #High*/            
                        RET                                                                     
程序中Low=PV%256,High=PV/256。
4.8 梯形圖處理程序
以上的的程序都屬于系統(tǒng)程序,用戶是不需要關(guān)心的。只有梯形圖處理程序是用戶需要關(guān)注的。梯形圖處理程序需要用戶根據(jù)梯形圖程序編寫(xiě),因此梯形圖處理程序是不完整的。梯形圖處理程序如下。
void process()
{
//先定義輔助繼電器
//用戶根據(jù)梯形圖在此填寫(xiě)程序
}
匯編程序如下:
Process:            
/*用戶根據(jù)梯形圖在此填寫(xiě)程序*/
         RET
下面舉一個(gè)例子。
現(xiàn)設(shè)計(jì)一個(gè)使用一個(gè)按鈕控制電機(jī)的啟、停,第一次按動(dòng)按鈕,電機(jī)啟動(dòng),第二次按動(dòng)按鈕,電機(jī)停止轉(zhuǎn)動(dòng)。梯形圖程序如圖4.2所示。


圖4.2 用戶處理程序舉例

通過(guò)第二章的分析可知,把圖4.2轉(zhuǎn)換成C語(yǔ)言或者匯編語(yǔ)言是很容易的。假設(shè)按扭使用X0接口,電機(jī)使用Y0接口(見(jiàn)圖2.15)。
在寫(xiě)匯編語(yǔ)言之前要先定義映像寄存器和輔助寄存器:
  M0_0  BIT  26H.1                           
  M0_1  BIT  26H.2            
  M0_2  BIT  26H.3
寫(xiě)出的匯編程序如下:
Process: MOV              C,                            InMap0
                            ANL              C,                            /M0_1
                            MOV              M0_0,              C

                            MOV    C,                            InMap0
                            MOV    M0_1,              C

                            MOV              C,                            M0_0
                            ANL              C,                            OutMap0
                            MOV              M0_2,              C

                            MOV              C,                            M0_0
                            ORL              C,                            OutMap0
                            ANL              C,                            /M0_2
                            MOV              OutMap0,              C

        RET
如果寫(xiě)成C語(yǔ)言則更加容易:
void process()
{
   bit M0_0,M0_1,M0_2;
       M0_0=InMap0&(~M0_1);
       M0_1=InMap0;
       M0_2=M0_0&OutMap0;
       OutMap0=(M0_0|OutMap0)&(~M0_2);
     }




5章 基于Proteus的軟件仿真
5.1 Proteus仿真軟件簡(jiǎn)介
Proteus ISIS是英國(guó)Labcenter公司開(kāi)發(fā)的電路分析與實(shí)物仿真軟件。該軟件是一款集單片機(jī)和SPICE分析于一身的仿真軟件,功能極其強(qiáng)大。它運(yùn)行于Windows操作系統(tǒng)上,可以仿真、分析(SPICE)各種模擬器件和集成電路。
Proteus ISIS的工作界面是一種標(biāo)準(zhǔn)的Windows界面,如圖5.1所示。包括:標(biāo)題欄、主菜單、標(biāo)準(zhǔn)工具欄、繪圖工具欄、狀態(tài)欄、對(duì)象選擇按鈕、預(yù)覽對(duì)象方位控制按鈕、仿真進(jìn)程控制按鈕、預(yù)覽窗口、對(duì)象選擇器窗口、圖形編輯窗口。


圖 5.1 Proteus工作界面

該軟件的特點(diǎn)是:
(1)實(shí)現(xiàn)了單片機(jī)仿真和SPICE電路仿真相結(jié)合。具有模擬電路仿真、數(shù)字電路仿真、單片機(jī)及其外圍電路組成的系統(tǒng)的仿真、RS232動(dòng)態(tài)仿真、I2C調(diào)試器、SPI調(diào)試器、鍵盤(pán)和LCD系統(tǒng)仿真的功能;有各種虛擬儀器,如示波器、邏輯分析儀、信號(hào)發(fā)生器等。
(2)支持主流單片機(jī)系統(tǒng)的仿真。目前支持的單片機(jī)類型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片。
(3)提供軟件調(diào)試功能。在硬件仿真系統(tǒng)中具有全速、單步、設(shè)置斷點(diǎn)等調(diào)試功能,同時(shí)可以觀察各個(gè)變量、寄存器等的當(dāng)前狀態(tài),因此在該軟件仿真系統(tǒng)中,也必須具有這些功能;同時(shí)支持第三方的軟件編譯和調(diào)試環(huán)境,如Keil C51等軟件。
(4)具有強(qiáng)大的原理圖繪制功能。
5.2仿真實(shí)驗(yàn)5.2.1 對(duì)輸入電路的仿真測(cè)試
為了驗(yàn)證仿真電路的正確性,減小硬件制作的成本,可以用Proteus先進(jìn)行仿真驗(yàn)證。在圖5.7中,對(duì)輸入電路中的一路進(jìn)行了仿真。如圖5.2所示,當(dāng)按鍵沒(méi)有按下時(shí),D1不亮,輸入到單片機(jī)引腳P0.0的輸入端IN0的電壓為6.96482e-6V,是低電平。

圖 5.2 輸入電路測(cè)試1

在圖5.3中,按鍵已經(jīng)按下,D1發(fā)光,IN0端的電壓是4.66026V,是高電平。
模擬情況符合設(shè)計(jì)的要求。

圖 5.3 輸入電路測(cè)試2
在仿真中發(fā)現(xiàn)D1的亮度不是很高,是由于輸入回路中電流過(guò)小的緣故。D1的導(dǎo)通壓降為2V,最大電流為10mA。
5.2.2 對(duì)輸出電路的仿真測(cè)試
圖5.3是對(duì)輸出電路的仿真測(cè)試。在圖5.9中,當(dāng)開(kāi)關(guān)SW1接地是,直流電動(dòng)機(jī)轉(zhuǎn)動(dòng),穩(wěn)壓管兩端的電壓穩(wěn)定在3.20648V。當(dāng)SW1接高電平時(shí),電動(dòng)機(jī)是不轉(zhuǎn)動(dòng)的。從仿真測(cè)試中可知,輸出電路是符合設(shè)計(jì)要求的。
圖 5.4 輸出電路測(cè)試
5.2.3 多路故障報(bào)警系統(tǒng)仿真
為了驗(yàn)證設(shè)計(jì)的正確性,下面通過(guò)一個(gè)實(shí)例用Proteus軟件進(jìn)行了仿真。
報(bào)警是電氣自動(dòng)控制中不可缺少的重點(diǎn)環(huán)節(jié),標(biāo)志的報(bào)警功能應(yīng)該是聲光報(bào)警。本仿真是一個(gè)兩路的聲光報(bào)警系統(tǒng)。系統(tǒng)的仿真原理圖如圖5.5所示。該系統(tǒng)有四個(gè)輸入,三個(gè)輸出。圖5.5中的OUTRUT是一個(gè)子電路圖,里面含有四個(gè)相同的輸出電路,見(jiàn)圖5.6。圖5.5中的D5、D6、D7和D8是輸出狀態(tài)指示燈。
圖 5.5 聲光報(bào)警控制系統(tǒng)
圖中的SA1和SA2是兩個(gè)故障輸入信號(hào)。如果SA1或SA2按下,表示故障發(fā)生。當(dāng)故障發(fā)生以后,報(bào)警燈會(huì)閃爍,同時(shí)蜂鳴器鳴響。SB1是故障解除按鈕。當(dāng)操作人員知道故障發(fā)生后,按下SB1,蜂鳴器就停止鳴響,報(bào)警指示燈從閃爍變?yōu)槌A,告訴造作人員哪一路發(fā)生了故障。系統(tǒng)還設(shè)置了SB2測(cè)試按鈕,用于平時(shí)檢測(cè)報(bào)警指示燈和蜂鳴器的好壞。
圖 5.6 仿真輸出電路

報(bào)警系統(tǒng)的梯形圖程序如圖5.7所示。
圖 5.7 報(bào)警系統(tǒng)梯形圖程序

根據(jù)梯形圖寫(xiě)出C程序如下。
為了方便程序閱讀,先做一些預(yù)處理。
#define SA1 InMap0
#define SA2 InMap1
#define SB1 InMap2
#define SB2 InMap3
#define Q0  OutMap0
#define Q1  OutMap1
#define Q2  OutMap2
#define T0  timer[0].DT
#define T1  timer[1].DT
void initi_timer()
{
              timer[0].K=2/0.05;
              timer[1].K=1/0.05;
}
void process()
{
                bit M0,M1;
              time(0,(SA1|SA2)&(~T1));
              time(1,T0);
              Q0=((T0|M0)&SA1)|SB2;
              Q1=((T0|M1)&SA2)|SB2;
              M0=(SB1|M0)&SA1;
              M1=(SB1|M1)&SA2;
              Q2=(SA1&(~M0))|(SA2&(~M1))|SB2;

}
根據(jù)梯形圖寫(xiě)出匯編程序如下。
      M0 BIT 26H.0
                            M1 BIT 26H.1
                            SA1 BIT InMap0
                            SA2 BIT InMap1
                            SB1 BIT InMap2
                            SB2 BIT InMap3            
                            Q0 BIT OutMap0
                            Q1 BIT OutMap1
                            Q2 BIT OutMap2

Initi_Timer:              MOV              K0_L,              #40            
                                          MOV              K0_H,              #0
                                          MOV              K1_L,              #20            
                                          MOV              K1_H,              #0
                                          RET

Process: MOV C,SA1
                            ORL C,SA2
                            ANL C,/DT1
                            LCALL Tim0
                            MOV C,DT0
                            LCALL Tim1

                            MOV C,DT0
                            ORL C,M0
                            ANL C,SA1
                            ORL C,SB2
                            MOV Q0,C

                            MOV C,DT0
                            ORL C,M1
                            ANL C,SA2
                            ORL C,SB2
                            MOV Q1,C

                            MOV C,SB1
                            ORL C,M0
                            ANL C,SA1
                            MOV M0,C

                            MOV C,SB1
                            ORL C,M1
                            ANL C,SA2
                            MOV M1,C

                            MOV C,SA1
                            ANL C,/M0
                            MOV 26H.2,C
                            MOV C,SA2
                            ANL C,/M1
                            ORL C,26H.2
                            ORL C,SB2
                            MOV Q2,C            

        RET
5.3仿真總結(jié)
上述的仿真實(shí)驗(yàn)可以達(dá)到預(yù)期的效果。說(shuō)明硬件設(shè)計(jì)和程序設(shè)計(jì)是可行的。
仿真中還有一些問(wèn)題:輸入電路在接單片機(jī)時(shí),單片機(jī)引腳不能檢測(cè)到高電平,因此仿真中做了簡(jiǎn)單處理。C程序會(huì)出現(xiàn)內(nèi)存不夠的現(xiàn)象,因此在上面的C程序中沒(méi)有包括計(jì)數(shù)器。
仿真的結(jié)果往往比較理想化,因此并不能代表沒(méi)有錯(cuò)誤。由與沒(méi)有制作實(shí)物,本設(shè)計(jì)還需要在實(shí)踐中檢驗(yàn)其可靠性。
6章 總結(jié)
單片機(jī)和PLC都是在工業(yè)控制領(lǐng)域有著廣泛應(yīng)用的工業(yè)控制裝置,它們各有各自的特點(diǎn)。
本設(shè)計(jì)用AT89C52單片機(jī)設(shè)計(jì)了一個(gè)4輸入4輸出的簡(jiǎn)單PLC。該P(yáng)LC含有10個(gè)定時(shí)器和10個(gè)計(jì)數(shù)器,每個(gè)定時(shí)器的最長(zhǎng)定時(shí)時(shí)間為3276.75秒,每個(gè)計(jì)數(shù)器的最大計(jì)數(shù)值為65535。該P(yáng)LC的輸入方式為直流開(kāi)關(guān)量,輸入電壓為24V。輸出采用繼電器輸出方式,繼電器的額定電壓為DC24V,吸合電流為2A,線圈功率為4W。為了提高系統(tǒng)的抗干擾能力,輸入輸出電路中都使用了光電耦合器。該P(yáng)LC具有與計(jì)算通訊能力,可以在計(jì)算機(jī)上下載程序。
最終完成了原來(lái)圖和PCB圖的繪制,也對(duì)設(shè)計(jì)的正確性通過(guò)Proteus仿真進(jìn)行了驗(yàn)證。
但仿真的結(jié)果往往比較理想化,因此并不能代表沒(méi)有錯(cuò)誤。由與沒(méi)有制作實(shí)物,本設(shè)計(jì)還需要在實(shí)踐中檢驗(yàn)其可靠性。
在設(shè)計(jì)時(shí),為了簡(jiǎn)化設(shè)計(jì),沒(méi)有拓展單片機(jī)內(nèi)存,梯形圖程序稍微復(fù)雜時(shí),用C語(yǔ)言編寫(xiě)的程序往往會(huì)超出內(nèi)存空間。本設(shè)計(jì)在程序中沒(méi)有自診斷功能。對(duì)一些簡(jiǎn)單的控制,在仿真時(shí)本設(shè)計(jì)是可行的。為了能滿足復(fù)雜的控制需要,在功能上還可以進(jìn)行拓展:
  • 增加輸人、輸出接點(diǎn)的數(shù)量
  • 增加不同的輸入方式和輸出方式。
  • 為適應(yīng)工業(yè)環(huán)境的要求, 就要有極為可靠的抗干擾措施。
3.加大負(fù)載能力, 以滿足工業(yè)控制對(duì)象的一般需要。
4.增加處理模擬量的能力, 以滿足模擬量的控制濡要。
5.增加通訊能力, 以滿足控制系統(tǒng)網(wǎng)絡(luò)的需要。
6.拓展單片機(jī)的內(nèi)存,使制作的PLC能夠運(yùn)行更加復(fù)雜的程序。
7.增加更加豐富的人機(jī)接口,比如撥盤(pán)預(yù)置程序輸入預(yù)置值,LCD顯示工作狀態(tài)等。
由于軟件的擴(kuò)充, 掃描時(shí)間必然加長(zhǎng), 所以就要提高運(yùn)行速。由于硬件的擴(kuò)充, 體積必然增大,因此要有合理的結(jié)構(gòu)。硬件的拓充和功能的增加,又對(duì)軟件設(shè)計(jì)提出了更高的要求,軟件系統(tǒng)要更加合理。
用單片機(jī)制作PLC的另外一個(gè)研究方向是開(kāi)發(fā)出一種將梯形圖直接轉(zhuǎn)化成單片機(jī)可執(zhí)行的二進(jìn)制文件的軟件。這樣用戶只需要根據(jù)控制需要,設(shè)計(jì)出自己的梯形圖程序,然后直接把梯形圖程序通過(guò)軟件轉(zhuǎn)換成二進(jìn)制文件,用戶不必要寫(xiě)C語(yǔ)言程序或者匯編程序。這是一個(gè)值得研究的課題。


致謝
在畢業(yè)論文即將完成之際,我要衷心感謝甘英俊老師在畢業(yè)設(shè)計(jì)期間給予的指導(dǎo)和幫助!甘老師工作繁忙,但依然十分關(guān)心我們的畢業(yè)設(shè)計(jì),每周都抽出時(shí)間悉心指導(dǎo)我們。甘老師淵博的知識(shí)和嚴(yán)謹(jǐn)?shù)墓ぷ髯黠L(fēng)深深地影響了我。
同時(shí)也要感謝大學(xué)期間所有的任課老師,他們教授的知識(shí)是我大學(xué)期間獲得的寶貴財(cái)富。



附錄A  系統(tǒng)原理圖

B  系統(tǒng)PCB圖


全部資料51hei下載地址:
單片機(jī)制作PLC.rar (635.07 KB, 下載次數(shù): 47)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表