久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14972|回復: 3
打印 上一主題 下一主題
收起左側

基于51單片機的自動加料機控制系統設計

[復制鏈接]
跳轉到指定樓層
樓主
在現代科學技術的許多領域中,自動控制技術起著愈來愈重要的作用。并且,隨著生產和科學技術的發展,自動化水平也越來越高。自動控制利用控制裝置使被控對象的某個參數自動地按照預定的規律運行,大大提高了工作的效率,使整個生產過程又快又穩。

本設計主要是研究基于單片機的自動加料機控制系統,控制系統的控制器由單片機AT89C51及其擴展電路組成,單片機控制LCD顯示器以及控制電機等執行機構來實現整個控制系統的工作。這個控制系統可以根據送料工藝的需要,設計兩條生產線的滿料、送料、排料等整個加工流程的參數值。這樣大大的提高了控制系統和電機的工作效率,從而實現自動化加料。


1  緒論
1.1  課題背景

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

在變化中求發展、在發展中求變化是一個企業長久穩定發展的秘訣。自動加料機伴隨著工業生產的規模擴大和對產品質量的更高追求不斷發展,企業為追求更大的效益和更高的產品競爭能力也促進了自動控制技術的發展,國外第一套自動化生產設備是上世紀70年代在歐洲國家出現,自從它已出現人們就察覺到它巨大價值,自動化控制得到了飛速的發展,到目前為止已經經歷了三個不同的發展階段:

(1)連續自動生產階段:這個階段是自動化生產控制系統的萌芽階段主要是運用模擬量PID調節等控制技術和自動邏輯控制技術,這些技術甚至是在二戰時期就已經被被簡單應用,只不過在那個時候沒有給系統的結合起來。該階段主要采用繼電邏輯控制技術進行生產過程控制和工業二次儀表進行狀態監測,由于控制系統可靠性不高控制技術落后,在工藝方面產品狀態參數監測方面也不夠精細,加之檢測手段落后,在生產過程還需要大量人力去參與去控制大部分單元,表面上省事,但是生產的穩定性和產品質量都沒有辦法得到有效的控制。

(2)基于PLC控制的自動化生產階段:隨著計算機技術水平不斷的發展,簡單的PID控制理論發展到了模糊PID控制這就為技術革新創造了有力的條件,在這樣的大環境下面基于PLC控制的自動化生產系統就誕生了。這樣的控制系統比著原有自動化柔性系統進步了很多,很多處理工作就不需要認為的參與了;同時計算機技術也促進了檢測技術的發展,因此在這個階段自動化控制系統能夠提高生產效率也能夠對產品的質量進行保障。

(3)計算機技術控制的自動化生產階段:數字互聯網時代,一個小的電腦或者平板就可以對車間的生產進行控制操作,這是因為計算機技術以及更多的通訊技術都加入到了控制技術里面。不得不說的是現在的傳感器技術也發展非常迅速,在這樣的情況下我們自動化設備需要的人力就更少了,生產效率也大幅度提高,關鍵是生產產品的質量也更加優良。

而現在我國自動化程度仍然不高,生產速率依然較低。這一方面是由于我國人口眾多、勞動力便宜,很多企業不愿意將有限的資金投入到無限的自動化研究更新中去;另一方面也是由于自動化研制成本較高、適用面窄,國內很多企業雖有需求但是由于資金不足而不能投入。但是隨著我國對外貿易的日益增加和市場經濟體制的完善,國內外競爭越來越激烈,企業對自動化的需求也必定會日趨增長。我國企業由于引進國外的先進的設備價格又過于昂貴,因此要發揮自己的主觀能動性盡自己的能力自主研發或者引進消化吸收的基礎上創新研發出能自己使用的自動加料機,現在國內已經有很多家廠家可以生產這個自動加料的裝置,且價格公道,具有很大的市場發展潛力,必定會得到一定的發展。

1.2  課題意義

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

加料自動化的重要性還在于促進產品制造系統的整體優化,生產率得以全面提高。自動加料不會因為工人的疲勞、疏忽、情緒、技術不熟練等因素的影響而造成產品質量缺陷或不穩定。有些操作需要潔凈空氣、惰性氣體、真空等特殊環境;有些操作人類難

以接近。因此,從工人勞動保護方面考慮,發展自動加料技術尤為重要,也是滿足社會、市場及技術發展過程中產品不斷更新的需要。

特別是目前操作過程中的防靜電、操作疲勞、協調作業等因素使得手工作業存在了很大的局限性,如容易發生誤操作,生產不合格等等,使得生產率大大下降,所以對于加料自動化的改造將會大大提高產品的生產效率以及產品的成品率及公司的競爭能力,同時降低公司的生產成本,對于公司發展具有重大意義。

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

1.3  課題內容

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

本文將LCD顯示技術、傳感器技術及信息處理技術等相互融合,將自動加料的多種參數檢測和單片機控制理論相結合,提出一種切實可行的自動加料機控制系統,可以全面、實時、自動地對系統數據進行自動記錄、存儲和處理,并將有關信息根據現場實際情況,采用最有效方式送入計算機進行處理,并可對加料系統進行遠程控制。滿足了對加料工業生產實行全面、實時、長期檢測的要求。與傳統技術相比,本系統具有以下優點:

(1)本設計用一臺電機就可以控制兩條生產線提高了勞動生產率;

(2)單片機的設計提高了系統的可控性、可靠性及實時性;

(3)可對生產線各種狀態的時間進行設置,實用性更強。


2  方案選擇
2.1  方案選擇

   在進行系統設計的時候重心放在加料機的自動化上,于此設想了基于51單片機的方案與基于PLC控制的方案。下面對兩種方案進行說明比較。

   PLC即可編程邏輯控制器,是工業控制計算機。采用梯形圖、助記符、功能圖等編程語言,完成邏輯運算、順序控制、記數、定時、計算及模擬量處理等功能。單片機由最簡單的輸出/輸入構成。如輸出用LED,輸入用開關。并且能實現最基本的運行條件,如應有供電、時鐘附屬電路等。兩種方案有如下區別:

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

(2)單片機在在在簡易自動化研究系統里面更容易實現而且成本比較小;

因此決定選用單片機做此次設計。

2.2  單片機選型
2.2.1  單片機概述

近年來,隨著超大規模集成電路的出現,單片微型計算機發展異常迅猛。在電子應用技術領域,如果說60年代面臨的是晶體管技術;70年代面臨的是集成電路技術;80年代面臨的是單板機技術的話,那么可以講,單片機技術無疑將是90年代最活躍的新一代電子應用技術。在當前以應用電子技術為代表的高新技術改造系統工業方面,在機電一體化領域,單片機技術必將顯示出強大的生命力。單片機功能強、體積小、使用方便、性價比高等優點,獲得很大的應用,通用的8位單片機而言,就有50多個系列數百種品種,目前世界上比較著名的部分8位單片機生產廠家和部分機型如下:

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

NS(美國國家半導體)公司:NS8070系列

RCA(美國無線電)公司:CDP1800系列

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

Cypress(美國Cypress半導體)公司:CYXX系列

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

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

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

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

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

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

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

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

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

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

MCS-51系列單片機包括基本型8031/8051/8751,由于8031片內沒有程序存儲器;8051是一個程序不超過4KB的小系統而8751是用4KB的EPROM取代了8051的4KBROM作為程序存儲器但還是太小了因此均不選用。

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

2.2.2 AT89C51單片機

(1)AT89C51功能特性概述

AT89C51內部結構框圖如圖1所示。AT89C51 提供以下標準功能:4K 字節Flash 閃速存儲器,128 字節內部RAM,32 個I/0口線,兩個16 位定時/計數器,一個5 向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,AT89C51 可將至0Hz的靜態邏輯操作,并支持兩種軟件可選的節電工作模式。空閑方式停止CPU 的工作,但允許RAM,定時/計數器,串行通信口及中斷系統繼續它的工作。掉電方式時保存RAM中的全部內容,但振蕩器禁止其他所有部件工作并停止工作直到下一個硬件復位[1]。

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

            


圖1 AT89C51內部結構框圖

(2)AT89C51引腳功能介紹

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

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

P1口(1-8引腳)P1口是一個帶有內部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”的時候,通過內部的上拉電阻把端口拉到高電平,然后此時可作輸入口。因為內部存在上拉電阻,作輸入口使用時,某個引腳被外部信號校驗期間,P1接收低8位地址[2]。

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

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

表1  P3口第二功能

端 口 引 腳
         第  二  功  能
P3.0
RXD  (串行輸入口)
P3.1
TXD  (串行輸出口)
P3.2
(外中斷0)
P3,3
(外中斷1)
P3.4
T0(定時/計數器0)
P3.5
T1(定時/計數器1)
P3.6
(外部數據存儲器寫選通)
P3.7
(外部數據存儲器讀選通)

RST(9引腳)復位輸入。當振蕩器工作時,RST引腳出現兩個機器周期以上高電平將單片機復位。

ALE/

(30引腳)當訪問外部程序存儲器或數據存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節。即使不訪問外部存儲器。ALE仍一時鐘振蕩頻率的1/6輸出固定的正脈沖信號,因此它可對外輸出時鐘或用于定時目的。但要注意的是:每當訪問外部數據存儲器時將跳過一個ALE脈沖[2]。

(29引腳)程序存儲允許( )輸出是外部程序存儲器的讀選通信號,當AT89C51由外部程序存儲器取指令(或數據)時,每個機器周期兩次有效,即輸出兩個脈沖,在此期間,當訪問外部數據存儲器,這兩次有效的信號不出現[2]。

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

XTAL1、XTAL2(19、18引腳):當使用單片機內部振蕩電路時,用來接石英晶體和微調電容。當采用外部時鐘時,XTAL2引腳接地,XTAL1接片外振蕩脈沖輸入(帶上拉電阻)[2]。

2.3  物位傳感器的選擇

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

2.3.1  電容式物位傳感器

原理是當罐內放入被測物料時, 由于被測物料介電常數的影響, 傳感器的電容量將發生變化, 電容量變化的大小與被測物料在罐內高度有關, 且成比例變化。檢測出這種電容量的變化就可測定物料在罐內的高度。

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

2.3.2  浮力式物位傳感器

利用漂浮于液面上的浮標或浸沒于液體中的浮筒對液位進行測量的。當液位變化時,前者(恒浮力式)產生相應的位移,而所受到的浮力維持不變,后者(變浮力式)則發生浮力的變化。因此,只要檢測出浮標的位移或浮筒所受到的浮力的變化,就可以知道液位的高低。

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

2.3.3  阻力式物位傳感器

阻力式物位傳感器是利用物料對機械運動所呈現的阻擋力的特點來構成各種料位傳感器。

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

音叉式物位傳感器有如下優點:

①適應性強:被測介質不同的電參數、密度對測量均不產生影響。結垢、攪動、湍流、氣泡、振動、中等粘度、高溫(Max150℃)、高壓等惡劣條件對檢測也無影響。

②不需調校:由于音叉式物位開關的檢測不受被測介質電參數及密度的影響,所以無論測量何種介質都不需現場調校。

③免于維護:由于音叉式物位開關的檢測過程由電子電路完成,無活動部件,所以一經安裝投入使用便不需要維護。綜上所述,選擇音叉法阻力式料位傳感器。

原理:傳感器安裝于倉的頂部或倉的側壁上。音叉由壓電晶體驅動產生振動,當叉體被液體浸沒或被物料埋沒時振動頻率發生變化。這個變化由電子電路檢出并輸出一個開關量用于報警或控制。

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

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

2.4  顯示方式選擇
2.4.1  LED顯示

在單片機應用系統中,LED數碼管是很重要的外設,通常用來顯示控制過程和運算結果。LED數碼管顯示清晰、成本低廉、使用電壓低、壽命長、配置靈活的特點,與單片機接口簡單易行LED管的顯示可分為靜態和動態兩種。

靜態顯示的特點是各LED管能穩定地同時顯示各自字形系統在每一次顯示輸出后,能保持顯示不變,僅僅在待顯示數字需要改變時,才更新其數字顯示器中鎖存的內容,這種顯示占用CPU時間少,顯示穩定可靠。缺點是:當顯示位數較多時,占用I/O較多。

LED動態顯示就是LED輪流地一遍一遍顯示各自字形,CPU需定時地對每位LED顯示器進行掃描,每位LED顯示器分時輪流工作,每次只能使一位LED顯示,但由于人眼視覺暫留現象,仍感覺所有的LED顯示器都同時顯示。這種顯示的優點是使用硬件少,占用 I/O少。缺點是:占用CPU時間長,只要不執行顯示程序,就立刻停止顯示。

由于在自動加料機控制系統中運行是要同時顯示兩條生產線路滿料、送料及排料,所顯示的位數很多,因此不采用LED顯示

2.4.2  LCD顯示

LCD液晶顯示屏的顯示功能強大、 體積小、重量輕、功耗低可顯示大量文字、圖形,顯示內容豐富,清晰可見,顯示質量高,并且數字式接口和AT89C51已經接好,方便。

1602液晶顯示器是一種點陣型液晶模塊,在顯示形式上面是有一定的要求的,一些不規范的圖形它都不能顯示出來,只能顯示一些字母、數字和符號。這是因為它的點陣字符排位決定。我們常見的點陣字符主要有由若干個5×7結構形式,或者也有5×11的結構形式。這些點陣字符位只能顯示出一個字符,并且每個字符之間還有一個點陣字符的距離,行與行之間也有一個點陣字符的距離。使得屏幕能夠達到字符之間和行距之間都有空位。所以不能構成一個連體的圖像。

LCD1602液晶是顯示電路最常用到的一款顯示屏。尤其在顯示字符上,更為普遍。它的屏幕大小可以顯示2行字符,每行可以顯示16個字符。它的屏幕顏色清晰可調,背光以黃綠色為底,在顯示字符或者數字的同時,可以通過調節來改變它的對比度,使得符號和數字容易被觀察。因此,決定此設計采用LCD1602顯示屏。



3  自動加料機系統的硬件電路設計
3.1  原理框圖

圖4 原理框圖

首先系統供電,通過按鍵對生產線的送料和排料時間進行設定,設定的時間由LCD顯示屏顯示出來。設定完畢后,由單片機開始檢測安裝在物料倉的音叉傳感器是否有滿料信號輸入。若有,則物料倉的閥門打開。此時,電動機帶動傳送帶運動,生產線開始送料、排料,設定的送料、排料時間開始遞減,直至為零。電動機停止轉動,生產線指示燈亮,表示完成自動加料。

3.2  鍵盤電路設計

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

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

圖5 按鍵電路

本設計一共設計有6個按鍵:步驟時間切換鍵、時間設定加減鍵、時間設定確定鍵以及兩個滿料信號模擬鍵,所以采用獨立式鍵盤。通過這些按鍵可以對兩條生產線路的各種運行狀態時間進行選擇和設定。

3.3  顯示電路設計

圖6 顯示電路

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

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

圖7 LCD1602管腳圖

1腳VSS為電源地;

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

3腳V0為對比控制端,可以通過1K阻值的電阻接地;

4腳RS為寄存器選擇端,當引腳為高電平1時,表示其為數據寄存器;當引腳為低電平0時,表示其為指令寄存器;

5腳R/W為讀寫信號線,當引腳為高電平1時,表示其為讀操作,當引腳為低電平0時,表示其為寫操作;

6腳E(或EN)端為使能信號端,當其為高電平或者是下降沿的時候有效;

7~14腳D0~D7為8位數據總線;

15腳LEDA為背光+5V;

16腳LEDK為背光地線。

3.4  電機控制電路設計
3.4.1  電機驅動電路

圖8 電機驅動電路

采用L298N來驅動電機,可直接由單片機的I/O端口來提供模擬時序信號,通過單片機的I/O輸入改變芯片控制端的電平,即可以對電機進行正反轉,停止的操作,,驅動簡單,并且可以同時驅動兩臺電機。而且在直流電機的電樞兩端并聯一個瓷片電容,可以穩定電機的電壓,不至于對單片機造成干擾,省掉了通過光耦隔離來實現單片機信號與電機驅動信號隔離的環節,節約了成本。電機驅動電路如圖8所示。

3.4.2  L298N功能介紹

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

SENSA、SENSB(1腳、15腳):此兩端與地連接電流檢測電阻,并向驅動芯片反饋檢測到的信號;

OUT1 、OUT2(2腳、3腳):此兩腳是全橋式驅動器A的兩個輸出端,用來連接負載;
                 

圖9  L298N引腳圖

VS(4腳):電機驅動電源輸入端;
   IN1 、IN2(5腳、7腳):輸入標準的TTL邏輯電平信號,用來控制全橋式驅動器A的開關;
  ENA、ENB(6腳、11腳):使能控制端.輸入標準TTL邏輯電平信號;低電平時全橋式驅動器禁止工作;

GND(8腳):接地端,芯片本身的散熱片與8腳相通;
   VCC(9腳):邏輯控制部分的電源輸人端口;
  IN3 、IN4(10腳 、12 腳):輸入標準的TTL邏輯電平信號,用來控制全橋驅動器B的開關;
    OUT3 、OUT4(13腳、14腳):此兩腳是全橋式驅動器B的兩個輸出端,用來連接負載。

                                表2 L298N邏輯狀態表



4  自動加料機控制系統的軟件設計
4.1  主程序流程圖

圖10 主程序流程圖

4.2  倒計時精確延時子程序
              

圖11 延時子程序



結語

本設計是基于AT89C51的自動加料系統,沒有外擴ROM和RAM,程序直接放在AT89C51內部閃存中。基于單片機控制的自動加料系統是一種無需人工直接操作,可實現一臺電機控制雙生產線運作的新型材料自動供給系統,相比于老式自動加料系統定時定點加料、單生產線運行的工作模式,其大大提高了生產效率,降低了生產。大提高了工作可靠性。

本設計的主要部分是由單片機控制的顯示器部分與驅動電機電路等硬件部分與軟件部分的設計共同組成,本設計的控制系統可以一臺電機為兩條生產線供料,主要取決于工藝要求。這個過程需要用判斷程序實現,當一條生產線排料料結束后判斷到另一條生產線物料處于滿料狀態,則為第二條生產線供料,這需要精準的控制而且要嚴格控制其誤差。

采用L298N作為電機驅動,不僅可以控制電機的啟停和正反轉,而且還可以同時驅動兩臺電機,并且能對電機的速度進行調節。因此,未來自動加料機控制必然會得到大規模的使用以及發展,希望本文的一些粗淺工作,能夠為后續的深入研究和項目建設,提供一定的幫助。


參考文獻:

[1] 張毅剛等.MCS-51單片機應用技術[M].哈爾濱工業大學出版社,2003.7

[2] 謝維成等.單片機原理與應用及C51程序設計[M].清華大學出版社,2009.7

[3] 何立民.MCS-51單片機應用技術[M].北京航空航天大學出版社.1998.7

[4] 徐愛軍 .單片機高級語言C51應用程序設計[M]電子工業出版社.1997.7

[5] 李華.MCS-51系列單片機實用接口技術[N].北京航空航天大學出版社.1993.3

[6] 王福瑞.單片微機測控系統設計大全[M].北京航空航天大學出版社.2000.5

[7] 于微波等.微型計算機控制系統[M].吉林大學出版社.2002.5

[8] 陳汝全等.實用微機與單片機控制技術[M].電子科技大學出版社.1998.11

[9] 武慶生等.單片機原理與應用[M].電子科技大學出版社.1998.2

[10] 劉燦軍.實用傳感器[M].國防工業出版社.2004.6

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

[12] 趙負圖.傳感器應用技術[M].傳感器集成電路手冊[M].化學工業出版社.2002.4

[13] 薛文達 等傳感器應用技術[M].東南大學出版社.1998.12

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

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

[16] 徐科軍.傳感器與檢測技術[M].電子工業出版社.2004.5

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

[18] 周秉功.繼電器選型手冊[M].機械工業出版社.1998.8

[19] 陳兆寬.計算機過程控制軟件設計[M].電子工業出版社.1993.12

[20] 付曉光.單片機原理與實用技術[M].清華大學出版社.2004.8

[21] 劉勇等.數字電路[M].電子工業出版社.2003.1

[22] 康華光等.電子技術基礎[M].高等教育出版社.2006.1


單片機源程序:
  1. #include   
  2. #include     //包含_nop_()函數定義的
  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;                  //根據規定,RS和R/W同時為低電平時,可以寫入指令
  70.               RW=0;  
  71.               E=0;                  

  72.               _nop_();
  73.               _nop_();              
  74.               P0=dictate;           
  75.               _nop_();
  76.               _nop_();
  77.               _nop_();
  78.               _nop_();               //空操作四個機器周期,給硬件反應時間
  79.                 E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  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為低電平時,可以寫入數據
  89.                 RW=0;
  90.                 E=0;           
  91.                 P0=y;         
  92.                 _nop_();
  93.                 _nop_();
  94.                 _nop_();
  95.               _nop_();        //空操作四個機器周期,給硬件反應時間
  96.               E=0;            //當E由高電平跳變成低電平時,液晶模塊開始執行命令
  97. }


  98. void LcdInitiate(void)
  99. {
  100.    delay(15);             //延時15ms,首次寫指令時應給LCD一段較長的反應時間
  101.    WriteInstruction(0x38);
  102.               delay(5);   //延時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);  //清屏幕指令,將以前的顯示內容清除
  112.               delay(5);
  113. }


  114. void main(void)            //主函數
  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();         //調用LCD初始化函數
  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                              //定時器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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:625382 發表于 2020-7-15 01:24 來自手機 | 只看該作者
lcd為什么沒顯示??
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区三区四区 | 精品国产乱码久久久久久丨区2区 | 午夜一级做a爰片久久毛片 精品综合 | 日本精品一区二区三区视频 | 国产在线观看av | 国产精品久久精品 | 国产高清视频在线播放 | 国产欧美在线观看 | 国产精品欧美一区二区三区 | 日韩国产欧美在线观看 | 久久久久久久一区 | 91视频18 | 免费毛片网站在线观看 | 中文在线一区二区 | 一级片av| 91精品国产色综合久久不卡蜜臀 | 国产在线拍偷自揄拍视频 | 亚洲在线视频 | 亚洲欧美国产一区二区三区 | 欧美成人免费在线视频 | 色欧美片视频在线观看 | 资源首页二三区 | 久久精品久久久 | 国产精品成人一区二区三区 | 亚洲精品在线看 | 欧美阿v | 在线观看av免费 | 999视频| 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 亚洲人人 | 国产午夜精品一区二区三区 | 国产91色在线 | 亚洲 | 视频一区在线 | 99精品亚洲国产精品久久不卡 | 亚洲精品电影网在线观看 | 色伊人| 色欧美综合 | 欧美二区三区 | 免费成人高清在线视频 | 日本一区精品 | 91久久精品 |