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

QQ登錄

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

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

基于51單片機(jī)的自動(dòng)加料機(jī)控制系統(tǒng)設(shè)計(jì)

[復(fù)制鏈接]
ID:161768 發(fā)表于 2017-6-2 18:29 | 顯示全部樓層 |閱讀模式
在現(xiàn)代科學(xué)技術(shù)的許多領(lǐng)域中,自動(dòng)控制技術(shù)起著愈來(lái)愈重要的作用。并且,隨著生產(chǎn)和科學(xué)技術(shù)的發(fā)展,自動(dòng)化水平也越來(lái)越高。自動(dòng)控制利用控制裝置使被控對(duì)象的某個(gè)參數(shù)自動(dòng)地按照預(yù)定的規(guī)律運(yùn)行,大大提高了工作的效率,使整個(gè)生產(chǎn)過(guò)程又快又穩(wěn)。

本設(shè)計(jì)主要是研究基于單片機(jī)的自動(dòng)加料機(jī)控制系統(tǒng),控制系統(tǒng)的控制器由單片機(jī)AT89C51及其擴(kuò)展電路組成,單片機(jī)控制LCD顯示器以及控制電機(jī)等執(zhí)行機(jī)構(gòu)來(lái)實(shí)現(xiàn)整個(gè)控制系統(tǒng)的工作。這個(gè)控制系統(tǒng)可以根據(jù)送料工藝的需要,設(shè)計(jì)兩條生產(chǎn)線的滿料、送料、排料等整個(gè)加工流程的參數(shù)值。這樣大大的提高了控制系統(tǒng)和電機(jī)的工作效率,從而實(shí)現(xiàn)自動(dòng)化加料。


1  緒論
1.1  課題背景

隨著信息技術(shù)的迅猛發(fā)展、市場(chǎng)經(jīng)濟(jì)的發(fā)展,國(guó)內(nèi)、國(guó)際市場(chǎng)競(jìng)爭(zhēng)日益激烈,產(chǎn)品更新更為迅速,尤其是隨著高新技術(shù)日新月異,產(chǎn)品的類型、工藝外形越來(lái)越復(fù)雜,精度要求越來(lái)越高,再加上企業(yè)經(jīng)營(yíng)與發(fā)展必會(huì)面對(duì)勞工的短缺、人工成本上要省力化、合理化的發(fā)展趨勢(shì)!傳統(tǒng)的手工加料不僅費(fèi)時(shí)費(fèi)力、工作效率低,且其安全狀況令人堪憂,因此已不能滿足社會(huì)發(fā)展的要求。于是機(jī)械加料機(jī)就應(yīng)運(yùn)而生。機(jī)械加料機(jī)是借助于機(jī)器運(yùn)動(dòng)的作用力加力于材料,對(duì)材料進(jìn)行運(yùn)送運(yùn)輸,相對(duì)于傳統(tǒng)人工手動(dòng)加料,省去了大部分人力用于材料的運(yùn)送運(yùn)輸,大大提高了工作效率。但其控制與監(jiān)測(cè)卻還是需要花費(fèi)大量的人力 ,安全性能較傳統(tǒng)手工加料而言反而更低,一旦發(fā)生事故,造成的后果更為嚴(yán)重。

在變化中求發(fā)展、在發(fā)展中求變化是一個(gè)企業(yè)長(zhǎng)久穩(wěn)定發(fā)展的秘訣。自動(dòng)加料機(jī)伴隨著工業(yè)生產(chǎn)的規(guī)模擴(kuò)大和對(duì)產(chǎn)品質(zhì)量的更高追求不斷發(fā)展,企業(yè)為追求更大的效益和更高的產(chǎn)品競(jìng)爭(zhēng)能力也促進(jìn)了自動(dòng)控制技術(shù)的發(fā)展,國(guó)外第一套自動(dòng)化生產(chǎn)設(shè)備是上世紀(jì)70年代在歐洲國(guó)家出現(xiàn),自從它已出現(xiàn)人們就察覺(jué)到它巨大價(jià)值,自動(dòng)化控制得到了飛速的發(fā)展,到目前為止已經(jīng)經(jīng)歷了三個(gè)不同的發(fā)展階段:

(1)連續(xù)自動(dòng)生產(chǎn)階段:這個(gè)階段是自動(dòng)化生產(chǎn)控制系統(tǒng)的萌芽階段主要是運(yùn)用模擬量PID調(diào)節(jié)等控制技術(shù)和自動(dòng)邏輯控制技術(shù),這些技術(shù)甚至是在二戰(zhàn)時(shí)期就已經(jīng)被被簡(jiǎn)單應(yīng)用,只不過(guò)在那個(gè)時(shí)候沒(méi)有給系統(tǒng)的結(jié)合起來(lái)。該階段主要采用繼電邏輯控制技術(shù)進(jìn)行生產(chǎn)過(guò)程控制和工業(yè)二次儀表進(jìn)行狀態(tài)監(jiān)測(cè),由于控制系統(tǒng)可靠性不高控制技術(shù)落后,在工藝方面產(chǎn)品狀態(tài)參數(shù)監(jiān)測(cè)方面也不夠精細(xì),加之檢測(cè)手段落后,在生產(chǎn)過(guò)程還需要大量人力去參與去控制大部分單元,表面上省事,但是生產(chǎn)的穩(wěn)定性和產(chǎn)品質(zhì)量都沒(méi)有辦法得到有效的控制。

(2)基于PLC控制的自動(dòng)化生產(chǎn)階段:隨著計(jì)算機(jī)技術(shù)水平不斷的發(fā)展,簡(jiǎn)單的PID控制理論發(fā)展到了模糊PID控制這就為技術(shù)革新創(chuàng)造了有力的條件,在這樣的大環(huán)境下面基于PLC控制的自動(dòng)化生產(chǎn)系統(tǒng)就誕生了。這樣的控制系統(tǒng)比著原有自動(dòng)化柔性系統(tǒng)進(jìn)步了很多,很多處理工作就不需要認(rèn)為的參與了;同時(shí)計(jì)算機(jī)技術(shù)也促進(jìn)了檢測(cè)技術(shù)的發(fā)展,因此在這個(gè)階段自動(dòng)化控制系統(tǒng)能夠提高生產(chǎn)效率也能夠?qū)Ξa(chǎn)品的質(zhì)量進(jìn)行保障。

(3)計(jì)算機(jī)技術(shù)控制的自動(dòng)化生產(chǎn)階段:數(shù)字互聯(lián)網(wǎng)時(shí)代,一個(gè)小的電腦或者平板就可以對(duì)車間的生產(chǎn)進(jìn)行控制操作,這是因?yàn)橛?jì)算機(jī)技術(shù)以及更多的通訊技術(shù)都加入到了控制技術(shù)里面。不得不說(shuō)的是現(xiàn)在的傳感器技術(shù)也發(fā)展非常迅速,在這樣的情況下我們自動(dòng)化設(shè)備需要的人力就更少了,生產(chǎn)效率也大幅度提高,關(guān)鍵是生產(chǎn)產(chǎn)品的質(zhì)量也更加優(yōu)良。

而現(xiàn)在我國(guó)自動(dòng)化程度仍然不高,生產(chǎn)速率依然較低。這一方面是由于我國(guó)人口眾多、勞動(dòng)力便宜,很多企業(yè)不愿意將有限的資金投入到無(wú)限的自動(dòng)化研究更新中去;另一方面也是由于自動(dòng)化研制成本較高、適用面窄,國(guó)內(nèi)很多企業(yè)雖有需求但是由于資金不足而不能投入。但是隨著我國(guó)對(duì)外貿(mào)易的日益增加和市場(chǎng)經(jīng)濟(jì)體制的完善,國(guó)內(nèi)外競(jìng)爭(zhēng)越來(lái)越激烈,企業(yè)對(duì)自動(dòng)化的需求也必定會(huì)日趨增長(zhǎng)。我國(guó)企業(yè)由于引進(jìn)國(guó)外的先進(jìn)的設(shè)備價(jià)格又過(guò)于昂貴,因此要發(fā)揮自己的主觀能動(dòng)性盡自己的能力自主研發(fā)或者引進(jìn)消化吸收的基礎(chǔ)上創(chuàng)新研發(fā)出能自己使用的自動(dòng)加料機(jī),現(xiàn)在國(guó)內(nèi)已經(jīng)有很多家廠家可以生產(chǎn)這個(gè)自動(dòng)加料的裝置,且價(jià)格公道,具有很大的市場(chǎng)發(fā)展?jié)摿Γ囟〞?huì)得到一定的發(fā)展。

1.2  課題意義

隨著單片機(jī)和傳感器技術(shù)的迅速發(fā)展,自動(dòng)加料機(jī)領(lǐng)域也得到了很好的發(fā)展,自動(dòng)加料機(jī)的發(fā)展使傳統(tǒng)的手工操作面臨嚴(yán)峻的挑戰(zhàn)。從加工生產(chǎn)率來(lái)看,手工加料過(guò)程大多屬于勞動(dòng)密集型,生產(chǎn)率在很大程度上取決于生產(chǎn)過(guò)程對(duì)人的依賴性,它是工人執(zhí)行某一具體操作所花費(fèi)時(shí)間的函數(shù),其勞動(dòng)量在產(chǎn)品制造總勞動(dòng)量中占有相當(dāng)高的比例。隨著國(guó)際競(jìng)爭(zhēng)的日益激烈,產(chǎn)品生產(chǎn)周期不斷的縮短、種類的日益增加、質(zhì)量的要求更高、相應(yīng)的要求產(chǎn)品交貨時(shí)間越來(lái)越短短、勞動(dòng)成本的增加。人類手工操作,已經(jīng)不能與當(dāng)前的社會(huì)經(jīng)濟(jì)條件相適應(yīng)。在生產(chǎn)中作為一個(gè)生產(chǎn)元素的出現(xiàn),手工操作不具備判斷準(zhǔn)確、靈巧,并賦以較大作用力的這些特性,又不能保證工作的一致性和穩(wěn)定性,另一方面,從市場(chǎng)經(jīng)濟(jì)的現(xiàn)實(shí)出發(fā),人工操作與加工功能可靠、質(zhì)量一致性好、價(jià)格合理的要求也極不相適應(yīng)。這就對(duì)企業(yè)提出了高要求,即:生產(chǎn)率和產(chǎn)品質(zhì)量高、穩(wěn)定,生產(chǎn)加工成本不斷降低。所以,加料系統(tǒng)的自動(dòng)化是生產(chǎn)制造過(guò)程中需要解決的關(guān)鍵技術(shù)。

加料自動(dòng)化的重要性還在于促進(jìn)產(chǎn)品制造系統(tǒng)的整體優(yōu)化,生產(chǎn)率得以全面提高。自動(dòng)加料不會(huì)因?yàn)楣と说钠、疏忽、情緒、技術(shù)不熟練等因素的影響而造成產(chǎn)品質(zhì)量缺陷或不穩(wěn)定。有些操作需要潔凈空氣、惰性氣體、真空等特殊環(huán)境;有些操作人類難

以接近。因此,從工人勞動(dòng)保護(hù)方面考慮,發(fā)展自動(dòng)加料技術(shù)尤為重要,也是滿足社會(huì)、市場(chǎng)及技術(shù)發(fā)展過(guò)程中產(chǎn)品不斷更新的需要。

特別是目前操作過(guò)程中的防靜電、操作疲勞、協(xié)調(diào)作業(yè)等因素使得手工作業(yè)存在了很大的局限性,如容易發(fā)生誤操作,生產(chǎn)不合格等等,使得生產(chǎn)率大大下降,所以對(duì)于加料自動(dòng)化的改造將會(huì)大大提高產(chǎn)品的生產(chǎn)效率以及產(chǎn)品的成品率及公司的競(jìng)爭(zhēng)能力,同時(shí)降低公司的生產(chǎn)成本,對(duì)于公司發(fā)展具有重大意義。

同時(shí),研究本課題對(duì)于個(gè)人也有很重要的意義。它需要重點(diǎn)學(xué)習(xí)單片機(jī)的應(yīng)用知識(shí),掌握C語(yǔ)言及匯編語(yǔ)言用于編程,然后將之前所學(xué)其他專業(yè)課如《傳感器與檢測(cè)技術(shù)》的知識(shí)綜合在一起。從原理設(shè)計(jì)到方案論證再到選材、硬件設(shè)計(jì)和軟件設(shè)計(jì),每一步都需要查閱大量資料,不斷地發(fā)現(xiàn)問(wèn)題、分析問(wèn)題和解決問(wèn)題。該課題的研究不僅能鞏固以前所學(xué)的專業(yè)知識(shí),而且能鍛煉我收集資料、解決問(wèn)題及實(shí)際動(dòng)手的能力,更重要的是能夠?qū)W以致用,為我步入社會(huì)走上工作崗位打下堅(jiān)實(shí)的基礎(chǔ)。

1.3  課題內(nèi)容

本次設(shè)計(jì)主要做了如下幾方面的工作:一是確立系統(tǒng)的總體功能設(shè)計(jì)方案;二是對(duì)系統(tǒng)的硬件電路和軟件系統(tǒng)的設(shè)計(jì);三是單片機(jī)及通信接口的硬件電路及軟件系統(tǒng)的設(shè)計(jì);四是對(duì)連接單片機(jī)的上位管理計(jì)算機(jī)軟件系統(tǒng)的設(shè)計(jì)思路、工作原理和實(shí)現(xiàn)方法的闡述。

本文將LCD顯示技術(shù)、傳感器技術(shù)及信息處理技術(shù)等相互融合,將自動(dòng)加料的多種參數(shù)檢測(cè)和單片機(jī)控制理論相結(jié)合,提出一種切實(shí)可行的自動(dòng)加料機(jī)控制系統(tǒng),可以全面、實(shí)時(shí)、自動(dòng)地對(duì)系統(tǒng)數(shù)據(jù)進(jìn)行自動(dòng)記錄、存儲(chǔ)和處理,并將有關(guān)信息根據(jù)現(xiàn)場(chǎng)實(shí)際情況,采用最有效方式送入計(jì)算機(jī)進(jìn)行處理,并可對(duì)加料系統(tǒng)進(jìn)行遠(yuǎn)程控制。滿足了對(duì)加料工業(yè)生產(chǎn)實(shí)行全面、實(shí)時(shí)、長(zhǎng)期檢測(cè)的要求。與傳統(tǒng)技術(shù)相比,本系統(tǒng)具有以下優(yōu)點(diǎn):

(1)本設(shè)計(jì)用一臺(tái)電機(jī)就可以控制兩條生產(chǎn)線提高了勞動(dòng)生產(chǎn)率;

(2)單片機(jī)的設(shè)計(jì)提高了系統(tǒng)的可控性、可靠性及實(shí)時(shí)性;

(3)可對(duì)生產(chǎn)線各種狀態(tài)的時(shí)間進(jìn)行設(shè)置,實(shí)用性更強(qiáng)。


2  方案選擇
2.1  方案選擇

   在進(jìn)行系統(tǒng)設(shè)計(jì)的時(shí)候重心放在加料機(jī)的自動(dòng)化上,于此設(shè)想了基于51單片機(jī)的方案與基于PLC控制的方案。下面對(duì)兩種方案進(jìn)行說(shuō)明比較。

   PLC即可編程邏輯控制器,是工業(yè)控制計(jì)算機(jī)。采用梯形圖、助記符、功能圖等編程語(yǔ)言,完成邏輯運(yùn)算、順序控制、記數(shù)、定時(shí)、計(jì)算及模擬量處理等功能。單片機(jī)由最簡(jiǎn)單的輸出/輸入構(gòu)成。如輸出用LED,輸入用開(kāi)關(guān)。并且能實(shí)現(xiàn)最基本的運(yùn)行條件,如應(yīng)有供電、時(shí)鐘附屬電路等。兩種方案有如下區(qū)別:

(1)PLC比單片機(jī)更加復(fù)雜,它是在單片機(jī)的基礎(chǔ)上集成許多其他控制單元組成的;

(2)單片機(jī)在在在簡(jiǎn)易自動(dòng)化研究系統(tǒng)里面更容易實(shí)現(xiàn)而且成本比較;

因此決定選用單片機(jī)做此次設(shè)計(jì)。

2.2  單片機(jī)選型
2.2.1  單片機(jī)概述

近年來(lái),隨著超大規(guī)模集成電路的出現(xiàn),單片微型計(jì)算機(jī)發(fā)展異常迅猛。在電子應(yīng)用技術(shù)領(lǐng)域,如果說(shuō)60年代面臨的是晶體管技術(shù);70年代面臨的是集成電路技術(shù);80年代面臨的是單板機(jī)技術(shù)的話,那么可以講,單片機(jī)技術(shù)無(wú)疑將是90年代最活躍的新一代電子應(yīng)用技術(shù)。在當(dāng)前以應(yīng)用電子技術(shù)為代表的高新技術(shù)改造系統(tǒng)工業(yè)方面,在機(jī)電一體化領(lǐng)域,單片機(jī)技術(shù)必將顯示出強(qiáng)大的生命力。單片機(jī)功能強(qiáng)、體積小、使用方便、性價(jià)比高等優(yōu)點(diǎn),獲得很大的應(yīng)用,通用的8位單片機(jī)而言,就有50多個(gè)系列數(shù)百種品種,目前世界上比較著名的部分8位單片機(jī)生產(chǎn)廠家和部分機(jī)型如下:

Intel(美國(guó)英特爾)公司:MCS-51/96及其增強(qiáng)系列

NS(美國(guó)國(guó)家半導(dǎo)體)公司:NS8070系列

RCA(美國(guó)無(wú)線電)公司:CDP1800系列

TI(美國(guó)得克薩斯儀器儀表)公司:TMS700系列

Cypress(美國(guó)Cypress半導(dǎo)體)公司:CYXX系列

Rockwell(美國(guó)洛克威爾)公司:6500系列

Motorola(美國(guó)摩托羅拉)公司:6805系列

Fairchild(美國(guó)仙童)公司:FS系列及3870系列

Zilog(美國(guó)齊洛格)公司:Z8系列及SUPER8系列

Atmel(美國(guó) Atmel)公司:AT89系列

National(日本松下)公司:MN6800系列

Hitachi(日本日立)公司:HD6301、HD65L05、HD6305系列

NEC(日本電氣)公司:UCOM87、(UPD7800)系列

Philips(荷蘭菲利浦)公司:P89C51XX系列

盡管單片機(jī)的種類很多但是在我國(guó)使用最多并且最廣泛的還是51核系列的單片機(jī)如Intel公司的MCS-51和美國(guó)的89C51。

MCS-51系列單片機(jī)包括基本型8031/8051/8751,由于8031片內(nèi)沒(méi)有程序存儲(chǔ)器;8051是一個(gè)程序不超過(guò)4KB的小系統(tǒng)而8751是用4KB的EPROM取代了8051的4KBROM作為程序存儲(chǔ)器但還是太小了因此均不選用。

與MCS-51系列相比AT89C51/AT89S51單片機(jī)片內(nèi)的4KB的Flash存儲(chǔ)器取代了4KB的EPROM可重復(fù)編程,功能強(qiáng)大性價(jià)比較高且價(jià)格較低,因此本設(shè)計(jì)就選用AT89C51。AT89C51 是美國(guó)ATMEL公司生產(chǎn)的低電壓,高性能CMOS8位單片機(jī),片內(nèi)含4KBYTES的可反復(fù)擦寫的只讀程序存儲(chǔ)器(PEROM)和128BYTES的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(ROM),器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51 指令系統(tǒng),片內(nèi)置通用8 位中央處理器(CPU)和Flash 存儲(chǔ)單元。功能強(qiáng)大AT89C51 單片機(jī)符合上述選擇原則,可提供許多高性價(jià)比的應(yīng)用場(chǎng)合,可靈活應(yīng)用于各種控制領(lǐng)域[1]。

2.2.2 AT89C51單片機(jī)

(1)AT89C51功能特性概述

AT89C51內(nèi)部結(jié)構(gòu)框圖如圖1所示。AT89C51 提供以下標(biāo)準(zhǔn)功能:4K 字節(jié)Flash 閃速存儲(chǔ)器,128 字節(jié)內(nèi)部RAM,32 個(gè)I/0口線,兩個(gè)16 位定時(shí)/計(jì)數(shù)器,一個(gè)5 向量?jī)杉?jí)中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),AT89C51 可將至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式?臻e方式停止CPU 的工作,但允許RAM,定時(shí)/計(jì)數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)它的工作。掉電方式時(shí)保存RAM中的全部?jī)?nèi)容,但振蕩器禁止其他所有部件工作并停止工作直到下一個(gè)硬件復(fù)位[1]。

                               P0.0~P0.7                P2.0~P2.7

1.003.jpg             


圖1 AT89C51內(nèi)部結(jié)構(gòu)框圖

(2)AT89C51引腳功能介紹

AT89C51單片機(jī)為40引腳雙列直插式封裝。其引腳排列和邏輯符號(hào)如圖2所示。

P0口(39-32引腳):P0口是一組8位漏極開(kāi)路型雙向I/O,也即地址/數(shù)據(jù)總線復(fù)用口。對(duì)端口寫“1”可作為高阻抗輸入端用及 在訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器或程序存儲(chǔ)器時(shí),作為輸出口用時(shí),每位能吸收電流的方式驅(qū)動(dòng)8個(gè)TTL邏輯門電路。這組口線在訪問(wèn)期間激活內(nèi)部上拉電阻,分時(shí)轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用[2]。

P1口(1-8引腳)P1口是一個(gè)帶有內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對(duì)端口寫“1”的時(shí)候,通過(guò)內(nèi)部的上拉電阻把端口拉到高電平,然后此時(shí)可作輸入口。因?yàn)閮?nèi)部存在上拉電阻,作輸入口使用時(shí),某個(gè)引腳被外部信號(hào)校驗(yàn)期間,P1接收低8位地址[2]。

P2口(21-28引腳)P2口是一個(gè)帶有內(nèi)部上拉電阻的8位雙向I/O口,P2的輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對(duì)端口寫“1”,此時(shí)可作輸入口,通過(guò)內(nèi)部的上拉電阻把端口拉到高電平。同時(shí)在訪問(wèn)外部程序存儲(chǔ)器或16位外部數(shù)據(jù)存儲(chǔ)器的地址(例如執(zhí)行MOVE @DPTR指令)時(shí),P2口送出高8位地址數(shù)據(jù)。在訪問(wèn)8位地址的外部數(shù)據(jù)存儲(chǔ)器(例如執(zhí)行MOVX @RI指令)時(shí),P2口線上的內(nèi)容(也即特殊功能寄存器(SFR)區(qū)總R2寄存器的內(nèi)容),在整個(gè)訪問(wèn)期間不改變[2]。

P3口(10-17引腳):P3口是一組帶有內(nèi)部上拉電阻的8位雙向I/O口,P3口輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對(duì)P3口寫入“1”時(shí),它們被內(nèi)部上拉電阻拉高并可作為輸入端口[2]。同時(shí)更重要的用途是它的第二功能,如下表所示:

表1  P3口第二功能

端 口 引 腳
         第  二  功  能
P3.0
RXD  (串行輸入口)
P3.1
TXD  (串行輸出口)
P3.2
1.006.jpg (外中斷0)
P3,3
1.007.jpg (外中斷1)
P3.4
T0(定時(shí)/計(jì)數(shù)器0)
P3.5
T1(定時(shí)/計(jì)數(shù)器1)
P3.6
1.008.jpg (外部數(shù)據(jù)存儲(chǔ)器寫選通)
P3.7
1.009.jpg (外部數(shù)據(jù)存儲(chǔ)器讀選通)

RST(9引腳)復(fù)位輸入。當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期以上高電平將單片機(jī)復(fù)位。

ALE/ 1.010.jpg (30引腳)當(dāng)訪問(wèn)外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。即使不訪問(wèn)外部存儲(chǔ)器。ALE仍一時(shí)鐘振蕩頻率的1/6輸出固定的正脈沖信號(hào),因此它可對(duì)外輸出時(shí)鐘或用于定時(shí)目的。但要注意的是:每當(dāng)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí)將跳過(guò)一個(gè)ALE脈沖[2]。

1.011.jpg (29引腳)程序存儲(chǔ)允許( 1.012.jpg )輸出是外部程序存儲(chǔ)器的讀選通信號(hào),當(dāng)AT89C51由外部程序存儲(chǔ)器取指令(或數(shù)據(jù))時(shí),每個(gè)機(jī)器周期兩次有效,即輸出兩個(gè)脈沖,在此期間,當(dāng)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器,這兩次有效的信號(hào)不出現(xiàn)[2]。

EA/Vpp(29引腳):外部訪問(wèn)允許,使CPU僅訪問(wèn)外部程序存儲(chǔ)器(地址為0000H--FFFFH),EA端必須保持低電平(接地)。需要注意的是:如果加密位LB1被編程,復(fù)位時(shí)內(nèi)部會(huì)鎖存EA端狀態(tài)。如EA端為高電平(接Vcc端),CPU則執(zhí)行內(nèi)部會(huì)鎖存EA端狀態(tài)[2]。

XTAL1、XTAL2(19、18引腳):當(dāng)使用單片機(jī)內(nèi)部振蕩電路時(shí),用來(lái)接石英晶體和微調(diào)電容。當(dāng)采用外部時(shí)鐘時(shí),XTAL2引腳接地,XTAL1接片外振蕩脈沖輸入(帶上拉電阻)[2]。

2.3  物位傳感器的選擇

物位是指貯存容器里密度不同的物體形成的分界面,物位是保證生產(chǎn)安全和設(shè)備安全的重要系數(shù)。它可以確定容器中的貯料數(shù)量,以保證連續(xù)生產(chǎn)的需要或經(jīng)濟(jì)核算;其次為了監(jiān)視或控制容器的物位,使它保持在規(guī)定的范圍內(nèi);最后可以對(duì)它的上下極限位置進(jìn)行報(bào)警,以保證生產(chǎn)安全、正常運(yùn)行。同時(shí)考慮到粉塵的類型、尺寸、是否振動(dòng)有無(wú)粘性等,因此要特別注意選擇物位傳感器的類型。

2.3.1  電容式物位傳感器

原理是當(dāng)罐內(nèi)放入被測(cè)物料時(shí), 由于被測(cè)物料介電常數(shù)的影響, 傳感器的電容量將發(fā)生變化, 電容量變化的大小與被測(cè)物料在罐內(nèi)高度有關(guān), 且成比例變化。檢測(cè)出這種電容量的變化就可測(cè)定物料在罐內(nèi)的高度。

利用電容式物位傳感器,當(dāng)環(huán)境溫度、濕度變化時(shí),它們的介電常數(shù)隨之改變,產(chǎn)生誤差。這種誤差雖可用后續(xù)電路加以補(bǔ)償(如采用與測(cè)量電橋相并聯(lián)的補(bǔ)償電橋),但無(wú)法完全消除。而且傳感器內(nèi)電極表面不便經(jīng)常清洗,應(yīng)加以密封,用以防塵、防潮。若在電極表面鍍以極薄的惰性金屬(如銠等)層,則可代替密封件起保護(hù)作用,可防塵、防濕、防腐蝕,并在高溫下可減少表面損耗、降低溫度系數(shù),但成本較高。傳感器要密封以防止水分侵入內(nèi)部而引起電容值變化和絕緣性能下降。傳感器的殼體剛性要好,以免安裝時(shí)變形且需用高頻電路。 同時(shí)也比較麻煩,因此不予選用。

2.3.2  浮力式物位傳感器

利用漂浮于液面上的浮標(biāo)或浸沒(méi)于液體中的浮筒對(duì)液位進(jìn)行測(cè)量的。當(dāng)液位變化時(shí),前者(恒浮力式)產(chǎn)生相應(yīng)的位移,而所受到的浮力維持不變,后者(變浮力式)則發(fā)生浮力的變化。因此,只要檢測(cè)出浮標(biāo)的位移或浮筒所受到的浮力的變化,就可以知道液位的高低。

但是由于其比較適用于液體的檢測(cè),如果是固體,半固體就不是很好用了,適用范圍較窄因此不選用這種。

2.3.3  阻力式物位傳感器

阻力式物位傳感器是利用物料對(duì)機(jī)械運(yùn)動(dòng)所呈現(xiàn)的阻擋力的特點(diǎn)來(lái)構(gòu)成各種料位傳感器。

  • 重錘探測(cè)法:傳感器放置倉(cāng)頂,重錘由電機(jī)通過(guò)不銹鋼帶或鋼絲繩牽引吊入在倉(cāng)內(nèi),儀表控制傳感自動(dòng)定時(shí)對(duì)料位進(jìn)行探測(cè),每次測(cè)量時(shí)重錘從倉(cāng)頂起始位置開(kāi)始下降,碰到料面立即返回到倉(cāng)頂?shù)却乱淮螠y(cè)量。儀表通過(guò)對(duì)重錘下降過(guò)程傳感信號(hào)的處理可得到倉(cāng)頂?shù)搅厦娴木嚯xhl,倉(cāng)高H是由用戶預(yù)置的,這樣用倉(cāng)高H減去hl便可得出料位高度h=H-hl,儀表直接顯示料位高度(h)。但這種方法屬于數(shù)字傳感器,雖然采樣是周期性的,但是對(duì)時(shí)間而言不連續(xù),因此不采用。
  • 旋槳或推板法:利用微型電機(jī)做驅(qū)動(dòng)裝置,傳動(dòng)軸與離合器相連接,當(dāng)未接觸物料時(shí),電機(jī)正常運(yùn)轉(zhuǎn),當(dāng)葉片接觸物料時(shí),電機(jī)停止轉(zhuǎn)動(dòng),檢測(cè)裝置輸出一接點(diǎn)信號(hào),同時(shí)切斷電源停止轉(zhuǎn)動(dòng)。當(dāng)物料下降時(shí)葉片所受阻力消失,檢測(cè)裝置依靠扭力彈簧恢復(fù)到原始狀態(tài)。針對(duì)不同比重物料扭力大小可以調(diào)節(jié)。這類應(yīng)用較少也不選用。
  • 音叉法:音叉式物位傳感器的工作原理是通過(guò)安裝在音叉基座上的一對(duì)壓電晶體使音叉在一定共振頻率下振動(dòng)。音叉的振幅和頻率將發(fā)生突變,當(dāng)音叉與被測(cè)介質(zhì)相接觸時(shí),智能電路將對(duì)此進(jìn)行檢測(cè)并把這種變化轉(zhuǎn)換為一個(gè)開(kāi)關(guān)信號(hào)。音叉式物位傳感器具有使用壽命長(zhǎng)、性能穩(wěn)定、安全可靠等優(yōu)點(diǎn),也正因它的這諸多優(yōu)勢(shì),決定著音叉式物位傳感器具有了適應(yīng)性強(qiáng)(被測(cè)介質(zhì)不同的電參數(shù)、密度對(duì)測(cè)量均不產(chǎn)生影響)、不需調(diào)校(無(wú)論測(cè)量何種介質(zhì)都不需要現(xiàn)場(chǎng)調(diào)校)和免于維護(hù)等特點(diǎn),它廣泛應(yīng)用于冶金、建材、化工、輕工、糧食等行業(yè)中物位的過(guò)程控制。機(jī)械結(jié)構(gòu)簡(jiǎn)單、靈敏可靠。

音叉式物位傳感器有如下優(yōu)點(diǎn):

①適應(yīng)性強(qiáng):被測(cè)介質(zhì)不同的電參數(shù)、密度對(duì)測(cè)量均不產(chǎn)生影響。結(jié)垢、攪動(dòng)、湍流、氣泡、振動(dòng)、中等粘度、高溫(Max150℃)、高壓等惡劣條件對(duì)檢測(cè)也無(wú)影響。

②不需調(diào)校:由于音叉式物位開(kāi)關(guān)的檢測(cè)不受被測(cè)介質(zhì)電參數(shù)及密度的影響,所以無(wú)論測(cè)量何種介質(zhì)都不需現(xiàn)場(chǎng)調(diào)校。

③免于維護(hù):由于音叉式物位開(kāi)關(guān)的檢測(cè)過(guò)程由電子電路完成,無(wú)活動(dòng)部件,所以一經(jīng)安裝投入使用便不需要維護(hù)。綜上所述,選擇音叉法阻力式料位傳感器。

原理:傳感器安裝于倉(cāng)的頂部或倉(cāng)的側(cè)壁上。音叉由壓電晶體驅(qū)動(dòng)產(chǎn)生振動(dòng),當(dāng)叉體被液體浸沒(méi)或被物料埋沒(méi)時(shí)振動(dòng)頻率發(fā)生變化。這個(gè)變化由電子電路檢出并輸出一個(gè)開(kāi)關(guān)量用于報(bào)警或控制。

適用范圍:中等粘度、腐蝕性液體。流動(dòng)性好的粉狀物料和顆粒狀物料。

禁用范圍:高溫、高粘度液體。高溫、易結(jié)垢固體、塊狀物料

2.4  顯示方式選擇
2.4.1  LED顯示

在單片機(jī)應(yīng)用系統(tǒng)中,LED數(shù)碼管是很重要的外設(shè),通常用來(lái)顯示控制過(guò)程和運(yùn)算結(jié)果。LED數(shù)碼管顯示清晰、成本低廉、使用電壓低、壽命長(zhǎng)、配置靈活的特點(diǎn),與單片機(jī)接口簡(jiǎn)單易行LED管的顯示可分為靜態(tài)和動(dòng)態(tài)兩種。

靜態(tài)顯示的特點(diǎn)是各LED管能穩(wěn)定地同時(shí)顯示各自字形系統(tǒng)在每一次顯示輸出后,能保持顯示不變,僅僅在待顯示數(shù)字需要改變時(shí),才更新其數(shù)字顯示器中鎖存的內(nèi)容,這種顯示占用CPU時(shí)間少,顯示穩(wěn)定可靠。缺點(diǎn)是:當(dāng)顯示位數(shù)較多時(shí),占用I/O較多。

LED動(dòng)態(tài)顯示就是LED輪流地一遍一遍顯示各自字形,CPU需定時(shí)地對(duì)每位LED顯示器進(jìn)行掃描,每位LED顯示器分時(shí)輪流工作,每次只能使一位LED顯示,但由于人眼視覺(jué)暫留現(xiàn)象,仍感覺(jué)所有的LED顯示器都同時(shí)顯示。這種顯示的優(yōu)點(diǎn)是使用硬件少,占用 I/O少。缺點(diǎn)是:占用CPU時(shí)間長(zhǎng),只要不執(zhí)行顯示程序,就立刻停止顯示。

由于在自動(dòng)加料機(jī)控制系統(tǒng)中運(yùn)行是要同時(shí)顯示兩條生產(chǎn)線路滿料、送料及排料,所顯示的位數(shù)很多,因此不采用LED顯示

2.4.2  LCD顯示

LCD液晶顯示屏的顯示功能強(qiáng)大、 體積小、重量輕、功耗低可顯示大量文字、圖形,顯示內(nèi)容豐富,清晰可見(jiàn),顯示質(zhì)量高,并且數(shù)字式接口和AT89C51已經(jīng)接好,方便。

1602液晶顯示器是一種點(diǎn)陣型液晶模塊,在顯示形式上面是有一定的要求的,一些不規(guī)范的圖形它都不能顯示出來(lái),只能顯示一些字母、數(shù)字和符號(hào)。這是因?yàn)樗狞c(diǎn)陣字符排位決定。我們常見(jiàn)的點(diǎn)陣字符主要有由若干個(gè)5×7結(jié)構(gòu)形式,或者也有5×11的結(jié)構(gòu)形式。這些點(diǎn)陣字符位只能顯示出一個(gè)字符,并且每個(gè)字符之間還有一個(gè)點(diǎn)陣字符的距離,行與行之間也有一個(gè)點(diǎn)陣字符的距離。使得屏幕能夠達(dá)到字符之間和行距之間都有空位。所以不能構(gòu)成一個(gè)連體的圖像。

LCD1602液晶是顯示電路最常用到的一款顯示屏。尤其在顯示字符上,更為普遍。它的屏幕大小可以顯示2行字符,每行可以顯示16個(gè)字符。它的屏幕顏色清晰可調(diào),背光以黃綠色為底,在顯示字符或者數(shù)字的同時(shí),可以通過(guò)調(diào)節(jié)來(lái)改變它的對(duì)比度,使得符號(hào)和數(shù)字容易被觀察。因此,決定此設(shè)計(jì)采用LCD1602顯示屏。



3  自動(dòng)加料機(jī)系統(tǒng)的硬件電路設(shè)計(jì)
3.1  原理框圖

1.013.jpg

圖4 原理框圖

首先系統(tǒng)供電,通過(guò)按鍵對(duì)生產(chǎn)線的送料和排料時(shí)間進(jìn)行設(shè)定,設(shè)定的時(shí)間由LCD顯示屏顯示出來(lái)。設(shè)定完畢后,由單片機(jī)開(kāi)始檢測(cè)安裝在物料倉(cāng)的音叉?zhèn)鞲衅魇欠裼袧M料信號(hào)輸入。若有,則物料倉(cāng)的閥門打開(kāi)。此時(shí),電動(dòng)機(jī)帶動(dòng)傳送帶運(yùn)動(dòng),生產(chǎn)線開(kāi)始送料、排料,設(shè)定的送料、排料時(shí)間開(kāi)始遞減,直至為零。電動(dòng)機(jī)停止轉(zhuǎn)動(dòng),生產(chǎn)線指示燈亮,表示完成自動(dòng)加料。

3.2  鍵盤電路設(shè)計(jì)

鍵盤是由若干按鈕組成的開(kāi)關(guān)矩陣,它是單片機(jī)系統(tǒng)中最常用的輸入設(shè)備,用戶能通過(guò)鍵盤向計(jì)算機(jī)輸入指令、地址和數(shù)據(jù),實(shí)現(xiàn)人機(jī)通信。鍵盤可以分為獨(dú)立聯(lián)接式和行列式兩類,每一類又可根據(jù)對(duì)鍵盤的譯碼方法分為編碼鍵盤和非編碼鍵盤兩類。編碼鍵盤本身除了按鍵之外,還包括產(chǎn)生鍵碼的硬件電路,只要按下某一個(gè)鍵,就能產(chǎn)生這個(gè)鍵的代碼,同時(shí),還能產(chǎn)生一個(gè)脈沖,以通知CPU接收輸入鍵的代碼。這種鍵盤的使用比較方便,亦不需要編寫很多程序,但使用的硬件比較偏復(fù)雜,在微型的計(jì)算機(jī)控制系統(tǒng)中并不多見(jiàn)。

非編碼鍵盤是由一些按鍵排列成的一個(gè)行列矩陣。按鍵的作用,是簡(jiǎn)單的實(shí)現(xiàn)節(jié)點(diǎn)的接通與斷開(kāi),但必須有一套相應(yīng)的程序與之配合,才能產(chǎn)生出相應(yīng)的鍵碼。非編碼鍵盤幾乎不需要附加硬件電路,目前,在微型計(jì)算機(jī)控制系統(tǒng)中使用比較普遍。鍵盤是由若干按鈕組成的開(kāi)關(guān)矩陣,它是單片機(jī)系統(tǒng)中最常用的輸入設(shè)備,用戶能通過(guò)鍵盤向計(jì)算機(jī)輸入指令、地址和數(shù)據(jù),實(shí)現(xiàn)人機(jī)通信。鍵盤可以分為獨(dú)立聯(lián)接式和行列式兩類,每一類又可根據(jù)對(duì)鍵盤的譯碼方法分為編碼鍵盤和非編碼鍵盤兩類。編碼鍵盤本身除了按鍵之外,還包括產(chǎn)生鍵碼的硬件電路,只要按下某一個(gè)鍵,就能產(chǎn)生這個(gè)鍵的代碼,同時(shí),還能產(chǎn)生一個(gè)脈沖,以通知CPU接收輸入鍵的代碼。這種鍵盤的使用比較方便,亦不需要編寫很多程序,但使用的硬件比較偏復(fù)雜,在微型的計(jì)算機(jī)控制系統(tǒng)中并不多見(jiàn)。

1.014.jpg

圖5 按鍵電路

本設(shè)計(jì)一共設(shè)計(jì)有6個(gè)按鍵:步驟時(shí)間切換鍵、時(shí)間設(shè)定加減鍵、時(shí)間設(shè)定確定鍵以及兩個(gè)滿料信號(hào)模擬鍵,所以采用獨(dú)立式鍵盤。通過(guò)這些按鍵可以對(duì)兩條生產(chǎn)線路的各種運(yùn)行狀態(tài)時(shí)間進(jìn)行選擇和設(shè)定。

3.3  顯示電路設(shè)計(jì)

1.015.jpg

圖6 顯示電路

顯示電路采用LCD1602液晶顯示模塊,直接與單片機(jī)P0口相連,兩行分別顯示生產(chǎn)線路1和生產(chǎn)線路2的滿料時(shí)間、送料時(shí)間和排料時(shí)間等。顯示電路如圖6所示。

LCD 1602有16個(gè)管腳,每一個(gè)管腳都有其固定的作用,管腳圖及功能如下:

1.016.jpg 1.017.jpg

圖7 LCD1602管腳圖

1腳VSS為電源地;

2腳VDD為+5V邏輯電源;

3腳V0為對(duì)比控制端,可以通過(guò)1K阻值的電阻接地;

4腳RS為寄存器選擇端,當(dāng)引腳為高電平1時(shí),表示其為數(shù)據(jù)寄存器;當(dāng)引腳為低電平0時(shí),表示其為指令寄存器;

5腳R/W為讀寫信號(hào)線,當(dāng)引腳為高電平1時(shí),表示其為讀操作,當(dāng)引腳為低電平0時(shí),表示其為寫操作;

6腳E(或EN)端為使能信號(hào)端,當(dāng)其為高電平或者是下降沿的時(shí)候有效;

7~14腳D0~D7為8位數(shù)據(jù)總線;

15腳LEDA為背光+5V;

16腳LEDK為背光地線。

3.4  電機(jī)控制電路設(shè)計(jì)
3.4.1  電機(jī)驅(qū)動(dòng)電路

1.018.jpg

圖8 電機(jī)驅(qū)動(dòng)電路

采用L298N來(lái)驅(qū)動(dòng)電機(jī),可直接由單片機(jī)的I/O端口來(lái)提供模擬時(shí)序信號(hào),通過(guò)單片機(jī)的I/O輸入改變芯片控制端的電平,即可以對(duì)電機(jī)進(jìn)行正反轉(zhuǎn),停止的操作,,驅(qū)動(dòng)簡(jiǎn)單,并且可以同時(shí)驅(qū)動(dòng)兩臺(tái)電機(jī)。而且在直流電機(jī)的電樞兩端并聯(lián)一個(gè)瓷片電容,可以穩(wěn)定電機(jī)的電壓,不至于對(duì)單片機(jī)造成干擾,省掉了通過(guò)光耦隔離來(lái)實(shí)現(xiàn)單片機(jī)信號(hào)與電機(jī)驅(qū)動(dòng)信號(hào)隔離的環(huán)節(jié),節(jié)約了成本。電機(jī)驅(qū)動(dòng)電路如圖8所示。

3.4.2  L298N功能介紹

L298N是ST公司生產(chǎn)的一種高電壓、大電流電機(jī)驅(qū)動(dòng)芯片。該芯片的主要特點(diǎn)是:工作電壓高,最高工作電壓可達(dá)46V;輸出電流大,瞬間峰值電流可達(dá)3A,持續(xù)工作電流為2A;內(nèi)含兩個(gè)H橋的高電壓大電流全橋式驅(qū)動(dòng)器,可以用來(lái)驅(qū)動(dòng)直流電動(dòng)機(jī)和步進(jìn)電動(dòng)機(jī)、繼電器、線圈等感性負(fù)載;采用標(biāo)準(zhǔn)TTL邏輯電平信號(hào)控制;具有兩個(gè)使能控制端,在不受輸入信號(hào)影響的情況下允許或禁止器件工作;有一個(gè)邏輯電源輸入端,使內(nèi)部邏輯電路部分在低電壓下工作;可以外接檢測(cè)電阻,將變化量反饋給控制電路;可以直接透過(guò)電源來(lái)調(diào)節(jié)輸出電壓;此芯片可直接由單片機(jī)的I/O端口來(lái)提供模擬時(shí)序信號(hào),通過(guò)單片機(jī)的I/O輸入改變芯片控制端的電平,即可以對(duì)電機(jī)進(jìn)行正反轉(zhuǎn)、啟停的操作。其引腳功能圖及引腳功能如下:

SENSA、SENSB(1腳、15腳):此兩端與地連接電流檢測(cè)電阻,并向驅(qū)動(dòng)芯片反饋檢測(cè)到的信號(hào);

OUT1 、OUT2(2腳、3腳):此兩腳是全橋式驅(qū)動(dòng)器A的兩個(gè)輸出端,用來(lái)連接負(fù)載;
                  1.019.jpg

圖9  L298N引腳圖

VS(4腳):電機(jī)驅(qū)動(dòng)電源輸入端;
   IN1 、IN2(5腳、7腳):輸入標(biāo)準(zhǔn)的TTL邏輯電平信號(hào),用來(lái)控制全橋式驅(qū)動(dòng)器A的開(kāi)關(guān);
  ENA、ENB(6腳、11腳):使能控制端.輸入標(biāo)準(zhǔn)TTL邏輯電平信號(hào);低電平時(shí)全橋式驅(qū)動(dòng)器禁止工作;

GND(8腳):接地端,芯片本身的散熱片與8腳相通;
   VCC(9腳):邏輯控制部分的電源輸人端口;
  IN3 、IN4(10腳 、12 腳):輸入標(biāo)準(zhǔn)的TTL邏輯電平信號(hào),用來(lái)控制全橋驅(qū)動(dòng)器B的開(kāi)關(guān);
    OUT3 、OUT4(13腳、14腳):此兩腳是全橋式驅(qū)動(dòng)器B的兩個(gè)輸出端,用來(lái)連接負(fù)載。

                                表2 L298N邏輯狀態(tài)表

1.020.jpg



4  自動(dòng)加料機(jī)控制系統(tǒng)的軟件設(shè)計(jì)
4.1  主程序流程圖
1.021.jpg

圖10 主程序流程圖

4.2  倒計(jì)時(shí)精確延時(shí)子程序
               1.022.jpg

圖11 延時(shí)子程序



結(jié)語(yǔ)

本設(shè)計(jì)是基于AT89C51的自動(dòng)加料系統(tǒng),沒(méi)有外擴(kuò)ROM和RAM,程序直接放在AT89C51內(nèi)部閃存中;趩纹瑱C(jī)控制的自動(dòng)加料系統(tǒng)是一種無(wú)需人工直接操作,可實(shí)現(xiàn)一臺(tái)電機(jī)控制雙生產(chǎn)線運(yùn)作的新型材料自動(dòng)供給系統(tǒng),相比于老式自動(dòng)加料系統(tǒng)定時(shí)定點(diǎn)加料、單生產(chǎn)線運(yùn)行的工作模式,其大大提高了生產(chǎn)效率,降低了生產(chǎn)。大提高了工作可靠性。

本設(shè)計(jì)的主要部分是由單片機(jī)控制的顯示器部分與驅(qū)動(dòng)電機(jī)電路等硬件部分與軟件部分的設(shè)計(jì)共同組成,本設(shè)計(jì)的控制系統(tǒng)可以一臺(tái)電機(jī)為兩條生產(chǎn)線供料,主要取決于工藝要求。這個(gè)過(guò)程需要用判斷程序?qū)崿F(xiàn),當(dāng)一條生產(chǎn)線排料料結(jié)束后判斷到另一條生產(chǎn)線物料處于滿料狀態(tài),則為第二條生產(chǎn)線供料,這需要精準(zhǔn)的控制而且要嚴(yán)格控制其誤差。

采用L298N作為電機(jī)驅(qū)動(dòng),不僅可以控制電機(jī)的啟停和正反轉(zhuǎn),而且還可以同時(shí)驅(qū)動(dòng)兩臺(tái)電機(jī),并且能對(duì)電機(jī)的速度進(jìn)行調(diào)節(jié)。因此,未來(lái)自動(dòng)加料機(jī)控制必然會(huì)得到大規(guī)模的使用以及發(fā)展,希望本文的一些粗淺工作,能夠?yàn)楹罄m(xù)的深入研究和項(xiàng)目建設(shè),提供一定的幫助。


參考文獻(xiàn):

[1] 張毅剛等.MCS-51單片機(jī)應(yīng)用技術(shù)[M].哈爾濱工業(yè)大學(xué)出版社,2003.7

[2] 謝維成等.單片機(jī)原理與應(yīng)用及C51程序設(shè)計(jì)[M].清華大學(xué)出版社,2009.7

[3] 何立民.MCS-51單片機(jī)應(yīng)用技術(shù)[M].北京航空航天大學(xué)出版社.1998.7

[4] 徐愛(ài)軍 .單片機(jī)高級(jí)語(yǔ)言C51應(yīng)用程序設(shè)計(jì)[M]電子工業(yè)出版社.1997.7

[5] 李華.MCS-51系列單片機(jī)實(shí)用接口技術(shù)[N].北京航空航天大學(xué)出版社.1993.3

[6] 王福瑞.單片微機(jī)測(cè)控系統(tǒng)設(shè)計(jì)大全[M].北京航空航天大學(xué)出版社.2000.5

[7] 于微波等.微型計(jì)算機(jī)控制系統(tǒng)[M].吉林大學(xué)出版社.2002.5

[8] 陳汝全等.實(shí)用微機(jī)與單片機(jī)控制技術(shù)[M].電子科技大學(xué)出版社.1998.11

[9] 武慶生等.單片機(jī)原理與應(yīng)用[M].電子科技大學(xué)出版社.1998.2

[10] 劉燦軍.實(shí)用傳感器[M].國(guó)防工業(yè)出版社.2004.6

[11] 方佩敏.新編傳感器原理應(yīng)用于電路詳解[M].電子工業(yè)出版社.1998.6

[12] 趙負(fù)圖.傳感器應(yīng)用技術(shù)[M].傳感器集成電路手冊(cè)[M].化學(xué)工業(yè)出版社.2002.4

[13] 薛文達(dá) 等傳感器應(yīng)用技術(shù)[M].東南大學(xué)出版社.1998.12

[14] 張勇德.過(guò)程控制裝置[M].化工出版社.2001.5

[15] 楊緒東.實(shí)用電子電路精選[M].化工出版社.2004.5

[16] 徐科軍.傳感器與檢測(cè)技術(shù)[M].電子工業(yè)出版社.2004.5

[17] 楊幫文.新型繼電器使用手冊(cè)[M].人民郵電出版社.2004.5

[18] 周秉功.繼電器選型手冊(cè)[M].機(jī)械工業(yè)出版社.1998.8

[19] 陳兆寬.計(jì)算機(jī)過(guò)程控制軟件設(shè)計(jì)[M].電子工業(yè)出版社.1993.12

[20] 付曉光.單片機(jī)原理與實(shí)用技術(shù)[M].清華大學(xué)出版社.2004.8

[21] 劉勇等.數(shù)字電路[M].電子工業(yè)出版社.2003.1

[22] 康華光等.電子技術(shù)基礎(chǔ)[M].高等教育出版社.2006.1

1.025.jpg
單片機(jī)源程序:
  1. #include   
  2. #include     //包含_nop_()函數(shù)定義的
  3. #include


  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. unsigned char count=0,ss=0;

  7. void delay_timer( uchar);

  8. sbit start_1 = P1^0;
  9. sbit start_2 = P1^1;
  10. sbit inc = P1^2;
  11. sbit dec = P1^3;
  12. sbit mode = P1^4;
  13. sbit ok = P1^5;
  14. sbit led1 = P1^6;
  15. sbit led2 = P1^7;
  16. sbit IN1 = P2^3;
  17. sbit IN2 = P2^4;

  18. sbit RS=P2^0;   
  19. sbit RW=P2^1;   
  20. sbit E=P2^2;   
  21. sbit BF=P0^7;   

  22. uint timer = 0;
  23. uchar mode_val = 0;
  24. uint cnt_whole =0;

  25. uint set_limit = 1000;
  26. uchar flag_step = 0;
  27. uchar flag_begin = 0;
  28. uint cnt = 0;

  29.             
  30. uchar t_p_1, t_p_2, t_p_3, t_p_4, v_4, v_3, v_2, v_1;
  31. uchar t_p_a_1, t_p_a_2, t_p_a_3, t_p_a_4;
  32.                                          
  33. uint timer0_cnt = 0;
  34. unsigned char flag = 0;
  35. uchar flag_1 = 0, flag_2 = 0;
  36. uchar time_set[4] = {5, 5, 5, 5};
  37. uint time_full[2] = {0, 0};

  38. void disp(void);
  39. void delay1ms()
  40. {
  41.    unsigned char i,j;            
  42.               for(i=0;i<10;i++)
  43.                 for(j=0;j<33;j++)
  44.                  ;                           
  45. }

  46. void delay(unsigned int n)
  47. {
  48.    unsigned int i;
  49.               for(i=0;i<n;i++)
  50.                  delay1ms();
  51. }


  52. unsigned char BusyTest(void)
  53.   {
  54.     bit result;
  55.                             RS=0;      
  56.     RW=1;
  57.     E=1;      
  58.     _nop_();  
  59.     _nop_();
  60.     _nop_();
  61.     _nop_();               
  62.     result=BF;
  63.                             E=0;
  64.     return result;
  65.   }


  66. void WriteInstruction (unsigned char dictate)
  67. {  
  68.    while(BusyTest()==1);  
  69.               RS=0;                  //根據(jù)規(guī)定,RS和R/W同時(shí)為低電平時(shí),可以寫入指令
  70.               RW=0;  
  71.               E=0;                  

  72.               _nop_();
  73.               _nop_();              
  74.               P0=dictate;           
  75.               _nop_();
  76.               _nop_();
  77.               _nop_();
  78.               _nop_();               //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間
  79.                 E=0;                  //當(dāng)E由高電平跳變成低電平時(shí),液晶模塊開(kāi)始執(zhí)行命令
  80. }


  81. void WriteAddress(unsigned char x)
  82. {

  83.      WriteInstruction(x|0x80);
  84. }


  85. void WriteData(unsigned char y)
  86. {
  87.    while(BusyTest()==1);
  88.                 RS=1;           //RS為高電平,RW為低電平時(shí),可以寫入數(shù)據(jù)
  89.                 RW=0;
  90.                 E=0;           
  91.                 P0=y;         
  92.                 _nop_();
  93.                 _nop_();
  94.                 _nop_();
  95.               _nop_();        //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間
  96.               E=0;            //當(dāng)E由高電平跳變成低電平時(shí),液晶模塊開(kāi)始執(zhí)行命令
  97. }


  98. void LcdInitiate(void)
  99. {
  100.    delay(15);             //延時(shí)15ms,首次寫指令時(shí)應(yīng)給LCD一段較長(zhǎng)的反應(yīng)時(shí)間
  101.    WriteInstruction(0x38);
  102.               delay(5);   //延時(shí)5ms 
  103.               WriteInstruction(0x38);
  104.               delay(5);
  105.               WriteInstruction(0x38);
  106.               delay(5);
  107.               WriteInstruction(0x0d);
  108.               delay(5);
  109.               WriteInstruction(0x06);
  110.               delay(5);
  111.               WriteInstruction(0x01);  //清屏幕指令,將以前的顯示內(nèi)容清除
  112.               delay(5);
  113. }


  114. void main(void)            //主函數(shù)
  115. {
  116.   uint i = 0;            
  117.               uchar s_1, s_2, s_3, m_1, m_2, m_3, p_1, p_2, p_3, q_1, q_2, q_3;
  118.             
  119.   TMOD=0x01;
  120.   TL0=0xf0;
  121.   TH0=0xd8;                                                                     
  122.   IT0 = 1;

  123.               ET0 = 1;
  124.               EA=1;
  125.                 led1 = 0;
  126.               led2 = 0;
  127.               LcdInitiate();         //調(diào)用LCD初始化函數(shù)
  128.               while(1)
  129.               {
  130.                             if(start_1 == 0)
  131.                  {
  132.                                delay(50);
  133.                                           if(start_1 == 0 && flag_1 == 0)
  134.                                           {            
  135.                                                         flag_1 = 1;
  136.                                                         flag_step = 1;
  137.                                           }
  138.                  }
  139.                             if(start_2 == 0)
  140.                  {
  141.                                delay(50);
  142.                                           if(start_2 == 0 && flag_2 == 0)
  143.                                           {            
  144.                                                         flag_2 = 1;
  145.                                           }
  146.                  }
  147.                             if(inc == 0 && flag_step == 0)
  148.                             {
  149.                                           delay(50);
  150.                                           if(inc == 0)
  151.                                           {
  152.                                                         if(time_set[mode_val] < 200)
  153.                                                                       time_set[mode_val] ++;
  154.                                                         else;
  155.                                           }
  156.                             }

  157.               if(dec == 0 && flag_step == 0)
  158.               {
  159.                                delay(50);
  160.                                           if(dec == 0)
  161.                                           {
  162.                                                           if(time_set[mode_val] > 0)
  163.                                                                                     time_set[mode_val] --;
  164.                                           }
  165.                                           else;
  166.               }
  167.             
  168.             
  169.                             if(mode == 0)
  170.                             {
  171.                                           delay(50);
  172.                                           if(mode == 0)
  173.                                           {
  174.                                                         if(mode_val >= 3)
  175.                                                                       mode_val = 0;
  176.                                                         else
  177.                                                                       mode_val ++;
  178.                                           }
  179.                                          
  180.                             }
  181.                            
  182.                            
  183.                             if(ok == 0)
  184.                             {
  185.                                           delay(10);
  186.                                           if(ok == 0)
  187.                                           {
  188.                                                         flag_begin = 1;
  189.                                           }
  190.                             }
  191.                            
  192.                             if(flag_begin == 1)
  193.                             {
  194.                                           WriteAddress(0xcd);  
  195.                                 WriteData('o');
  196.                                 WriteAddress(0xce);
  197.                                           WriteData('k');                                         
  198.                             }
  199.                             else
  200.                             {
  201.                                           WriteAddress(0xcd);  
  202.                                 WriteData(' ');
  203.                                 WriteAddress(0xce);
  204.                                           WriteData(' ');            
  205.                                          
  206.                             }
  207.                
  208.             
  209.                                           s_1 = time_set[0]%10;
  210.                                           s_2 = time_set[0]/10%10;
  211.                                 s_3 = time_set[0]/100;

  212.                                           m_1 = time_set[1]%10;
  213.                                           m_2 = time_set[1]/10%10;
  214.                                 m_3 = time_set[1]/100;
  215.                            
  216.                                           p_1 = time_set[2]%10;
  217.                                           p_2 = time_set[2]/10%10;
  218.                               p_3 = time_set[2]/100;
  219.                            
  220.                                           q_1 = time_set[3]%10;
  221.                                           q_2 = time_set[3]/10%10;
  222.                               q_3 = time_set[3]/100;

  223.                            
  224.                                           t_p_1 = time_full[0] %10;
  225.                      t_p_2 = time_full[0]/10%10;
  226.                      t_p_3 = time_full[0]/100%10;
  227.                
  228.                                          
  229.                                           t_p_a_1 = time_full[1] %10;
  230.                     t_p_a_2 = time_full[1]/10%10;
  231.                     t_p_a_3 = time_full[1]/100%10;
  232.             
  233.                                          
  234.                                                       
  235.                                           WriteAddress(0x00);  
  236.                                 WriteData(t_p_3 + 0x30);
  237.                                 WriteAddress(0x01);
  238.                                 WriteData(t_p_2 + 0x30);
  239.                                           WriteAddress(0x02);  
  240.                                 WriteData(t_p_1 + 0x30);

  241.                                           WriteAddress(0xc0);  
  242.                                 WriteData(t_p_a_3 + 0x30);
  243.                                 WriteAddress(0xc1);
  244.                                 WriteData(t_p_a_2 + 0x30);
  245.                                           WriteAddress(0xc2);  
  246.                                 WriteData(t_p_a_1 + 0x30);
  247.                                                       
  248.                                           WriteAddress(0x04);  
  249.                                 WriteData(s_3 + 0x30);
  250.                                 WriteAddress(0x05);
  251.                                 WriteData(s_2 + 0x30);
  252.                                           WriteAddress(0x06);  
  253.                                 WriteData(s_1 + 0x30);
  254.                                                       
  255.                                                       
  256.                                           WriteAddress(0xc4);  
  257.                                 WriteData(p_3 + 0x30);
  258.                                 WriteAddress(0xc5);
  259.                                 WriteData(p_2 + 0x30);
  260.                                           WriteAddress(0xc6);  
  261.                                 WriteData(p_1 + 0x30);
  262.                                                       
  263.                                                       
  264.                                           WriteAddress(0x09);  
  265.                                 WriteData(m_3 + 0x30);
  266.                                 WriteAddress(0x0a);
  267.                                 WriteData(m_2 + 0x30);
  268.                                           WriteAddress(0x0b);  
  269.                                 WriteData(m_1 + 0x30);
  270.                                                       
  271.                                                       
  272.                                           WriteAddress(0xc9);  
  273.                                 WriteData(q_3 + 0x30);
  274.                                 WriteAddress(0xca);
  275.                                 WriteData(q_2 + 0x30);
  276.                                           WriteAddress(0xcb);  
  277.                                 WriteData(q_1 + 0x30);
  278.                                                       
  279.                                           WriteAddress(0x0d);  
  280.                                 WriteData(mode_val + 0x30);
  281.                                 WriteAddress(0x0e);
  282.             

  283.                                           delay(100);
  284.                                          
  285.                             }
  286.               }
  287.             
  288.             
  289. void timer0(void) interrupt 1                              //定時(shí)器0                                          10ms
  290. {

  291.                 TL0= 0xf0;
  292.                 TH0= 0xd8;
  293. if(flag_begin == 1)
  294. {
  295.               if(timer0_cnt >= 100)
  296.               {
  297.                             timer0_cnt = 0;
  298.                             if(flag_step == 1 && flag_1 == 1)
  299.                             {
  300.                                           led1 = 0;
  301.                                           IN1 = 1;
  302.                                           IN2 = 0;
  303.                                           if(time_set[flag_step - 1] == 0)
  304.                                           {
  305.                                                         flag_step = 2;
  306.                                           }
  307.                                           else
  308.                                                         time_set[flag_step - 1] --;
  309.                             }
  310.                             else if(flag_step == 2 && flag_1 == 1)
  311.                             {
  312.                                           IN1 = 1;
  313.                                           IN2 = 0;
  314.                                           if(time_set[flag_step - 1] == 0)
  315.                                           {
  316.                                                         flag_step = 3;
  317.                                                         led1 = 1;
  318. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

完整文檔下載(word格式 可編輯):
http://www.torrancerestoration.com/bbs/dpj-86636-1.html




相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:625382 發(fā)表于 2020-7-15 01:24 來(lái)自手機(jī) | 顯示全部樓層
lcd為什么沒(méi)顯示??
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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