這是一個直流伺服電機控制系統設計 有代碼 大師搭建出來仿真有問題 大家幫忙看看
電子信息與電氣工程系
課程設計報告
設計題目: 直流伺服電機控制系統設計 系 別:電子信息與電氣工程系 年級專業: 學 號: 學生姓名: 自動化專業《計算機控制技術》課程設計任務書 | | |
| | | | 設計對象是直流伺服電機實驗臺,設計一個計算機控制的直流伺服電機控制系統。由測量元件(位移傳感器)對被控制對象(電機)的被控參數(位移)進行測量,由變換發送單元(A/D轉換器)將被控參數變成一定形式的信號 ,送給控制器CPU,控制器將測量信號(實際位移量)與給定信號(位移量)進行比較,若有誤差則按預定的控制規律產生一控制信號驅動執行機構(伺服電機控制電源)工作,使被控參數(實際位移量)與給定信號(位移量)保持一致。其電機位置隨動系統: 其中:  =1.8,  =0.035,  =0.15,K =100,控制算法選用數字PID控制。 | | | | 3人 (1):明確課題功能。 (2):把復雜問題分解為若干模塊,確定各模塊處理方法,畫出流程圖。 (3):存儲器資源分配 (4):編制程序,根據流程圖來編制源程序 (5):對程序進行匯編,調試和修改,直到程序運行結果正確為止。 | | - 總體方案設計
- 控制系統的建模和數字控制器設計
- 硬件的設計和實現
- 選擇計算機字長(選用 51內核的單片機)
- 設計支持計算機工作的外圍電路(EPROM、RAM、I/O端口、鍵盤、顯示接口電路等);
- 設計輸入信號接口電路;
- 設計輸出控制電路;
- 其它相關電路的設計或方案(電源、通信等)。
- 分配系統資源,編寫系統初始化和主程序模塊框圖;
- 編寫A/D轉換和位置檢測子程序框圖;
- 編寫控制程序和D/A轉換控制子程序模塊框圖;
- 其它程序模塊(顯示與鍵盤等處理程序)框圖。
五、編寫課程設計說明書,繪制完整的系統電路圖(A3幅面)。 | | 1.于海生 計算機控制技術[M] 北京:機械工業出版社,2007.6 2、周荷琴等 微型計算機原理及接口技術[M]合肥:中國科技大學出版社,2008.6 3、李剛民等 單片機原理及應用技術[M]北京:高等教育出版社 4、樓然苗 51系列單片機設計實例[M]北京:北京航空航天大學出版社 5、計算機控制技術實驗指導書 |
摘要 隨著集成電路技術的飛速發展,微控制器在伺服控制系統普遍應用,這種數字伺服系統的性能可以大大超過模擬伺服系統。數字伺服系統可以實現高精度的位置控制、速度跟蹤,可以隨意地改變控制方式。單片機和DSP在伺服電機控制中得到了廣泛地應用,用單片機作為控制器的數字伺服控制系統,有體積小、可靠性高、經濟性好等明顯優點。。本設計研究的直流伺服電機控制系統即以單片機作為核心部件,主要是單片機為控制核心通過軟硬件結合的方式對直流伺服電機轉速實現開環控制。 對于伺服電機的閉環控制,采用PID控制,利用MATLAB軟件對單位階躍輸入響應的PID校正動態模擬仿真,研究PID控制作用以及PID各參數值對控制系統的影響,通過試湊法得到最佳PID參數。同時能更深度地掌握在 自動控制領域應用極為廣泛的MATLAB軟件。 目 錄 1.引言 2.單片機控制系統硬件組成 2.1 微控制器 2.2 DAC0808轉換器 2.3運算放大器 2.4按鍵輸入和顯示模塊 2.4.1 按鍵輸入 2.4.2 顯示模塊 2.5 直流伺服電動機 3.單片機控制系統軟件設計 3.1主程序 3.2鍵盤處理子程序 4.控制系統原理圖及仿真 4.1控制系統方框圖 4.2控制系統電路原理圖 4.3 Proteus仿真結果 5.Simulink組件對直流伺服控制系統的仿真 5.1 MATLAB與Simulink簡介 5.1.1 MATLAB簡介 5.1.2 Simulink簡介 5.2 直流伺服電機數學模型 5.3 系統Simulink模型及時域特性仿真 5.3.1 開環系統Simulink模型及仿真 5.3.2 單位負反饋系統Simulink模型及仿真 5.4 PID校正 5.4.1 PID參數的湊試法確定 5.4.2 比例控制器校正 5.4.3 比例積分控制器校正 5.4.4 PID控制器校正 6.小結 參考文獻 附錄 1.引言本設計的單片機控制直流伺服電機系統是一個開環的自動控制系統控制系統。是以單片機為控制器, 通過按鈕設置設定值輸入到單片機,單片機對輸入信號處理后輸出控制信號,經D/A轉換器DAC0808轉換后把數字信號轉變為模擬電壓,再經放大器放大后,去控制伺服電機工作,進而控制電機向著預定的轉速轉動。同時單片機處理的數字信號通過LCD來顯示,實時顯示單片機的轉速值。 另外本設計還利用了MATLAB軟件,利用 Simulink構造直流電機控制系統模型,通過對各個單元部件的參數進行設定,進而對直流伺服電機系統控制進行仿真,就其仿真功能對系統進行時域分析。 2.單片機控制系統硬件組成本系統是由一片單片機、矩陣式鍵盤,DAC0808轉換器、運算放大器、顯示模塊和一臺直流伺服電機組成,另外通過Proteus7.4軟件進行仿真。 2.1 微控制器選用AT89C52單片機。 AT89C52是51系列單片機的一個型號,它是ATMEL公司生產的。 AT89C52是一個低電壓,高性能CMOS 8位單片機,片內含8k bytes的可反復擦寫的Flash只讀程序存儲器和256 bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,功能強大的AT89C52單片機可為您提供許多較復雜系統控制應用場合。 AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2個讀寫口線,AT89C52可以按照常規方法進行編程,但不可以在線編程(S系列的才支持在線編程)。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的Flash存儲器可有效地降低開發成本。 AT89C52有PDIP、PQFP/TQFP及PLCC等三種封裝形式,以適應不同產品的需求。 主要功能特性: (1)兼容MCS51指令系統,8k可反復擦寫(>1000次)Flash ROM (2)32個雙向I/O口,256x8bit內部RAM (3)3個16位可編程定時/計數器中斷,時鐘頻率0-24MHz (4)2個串行中斷,可編程UART串行通道 (5)2個外部中斷源,共6個中斷源 (6)2個讀寫中斷口線,3級加密位 (7)低功耗空閑和掉電模式,軟件設置睡眠和喚醒功能 圖2-1 AT89C52 2.2 DAC0808轉換器設計中采用的芯片是DAC0808,它是一個8位DAC。圖2是DAC0808典型應用電路。圖2-1中輸出的模擬量是一個正電壓,當需要負電壓時,在DAC的第4引腳直接接一個3KΩ左右的電阻即可。DAC的第4引腳的電流總是流入的,其最大值為1.992mA。當外接一個3KΩ的負載電阻RL時,輸出的電壓是通過RL上所加的電壓,最大的電壓為-3KΩ×1.922mA ≈-6V(當所有位輸入都是高電平的時候),與實驗中的數據相符合。需要指出的是,負載電阻的大小會影響轉換時間,當負載電阻為2.5KΩ的時候,在最壞的情況下,會使轉換時間增加1.2μs。
圖2-2 DAC0808典型應用電路 2.3運算放大器把D/A轉換器的電流輸出轉換為電壓輸出,同時也是把微小的電流信號放大為較大的電壓信號,以驅動電機轉動。 2.4按鍵輸入和顯示模塊2.4.1 按鍵輸入采用自己設計的形如3×4矩陣式按鈕,按鈕用于設定某一數值,即電機轉速值。通過 程序設置延時環節來消除按鈕的抖動問題,這樣做使矩陣式按鈕硬件連線簡單,同時按鈕的軟件設計也不復雜。 2.4.2 顯示模塊系統采用點陣式液晶顯示器,顯示電機的當前轉速值,通過軟件設計使得連線簡單。 2.5 直流伺服電動機直流伺服電動機在伺服系統中控制機械元件運轉的發動機.是一種補助馬達間接變速裝置。又稱執行電動機,在自動控制系統中,用作執行元件,把所收到的電信號轉換成電動機軸上的角位移或角速度輸出。其主要特點是,當信號電壓為零時無自轉現象,轉速隨著轉矩的增加而勻速下降。其作用可使控制速度,位置精度非常準確。 直流伺服電動機的結構與直流電動機基本相同。只是為減小轉動慣量,電機做得細長一些。所不同的是電樞電阻大,機械特性軟、線性(電阻大,可弱磁起動、可直接起動)。供電方式是他勵供電,即勵磁繞組和電樞分別兩個獨立的電源供電。控制方式有.電樞控制和磁極控制,其中改變電樞電壓U調速范圍較大,直流伺服電機常用此方法調速 直流伺服電動機 轉速的計算公式如下: 式中:n為轉速;Φ為磁通;U為外加電壓;I、R為電樞電流和電阻;Ke為電勢系數。 3.單片機控制系統軟件設計軟件設計采用模塊化設計,由主程序模塊和功能實現模塊兩大部分組成。主程序通過讀取鍵值處理后送到D/A轉換以達到控制電機的目的;功能實現模塊主要由主函數模塊、鍵盤處理子程序和D/A轉換子程序等組成。 3.1主程序主程序首先對鍵盤和顯示模塊的程序進行初始化,通過讀取鍵值處理后送到D/A轉換以達到控制電機的目的。主程序流程圖如圖2-1所示。 圖2-1 主程序流程圖 3.2鍵盤處理子程序鍵盤采用程序掃描的工作方式,即在特定的程序位置段上安排鍵盤掃描程序讀取鍵盤狀態。鍵盤處理子程序的程序掃描法流程圖如圖2-2所示。 圖2-2 鍵盤處理子程序的程序掃描法流程圖 4.控制系統原理圖及仿真4.1控制系統方框圖控制系統是以單片機為控制器 ,通過鍵盤設置輸入轉速值,經單片機處理后送到D/A轉換器,模擬信號經功率放大后驅動電機,最終電機以設定的轉速值穩定旋轉。圖4-1即為控制系統方框圖 圖4-1 控制系統方框圖 4.2控制系統電路原理圖圖4-2 控制系統電路原理圖 4.3 Proteus仿真結果圖4-3 Proteus仿真圖 利用Proteus 7.4a進行仿真,當通過鍵盤選擇某一數值時,電機轉速即為相應的設定值,并在仿真電路圖中電機下方顯示電機對應轉速值的變化及最終穩定值。圖4-3中仿真圖是當通過按鍵設定值為158時,電機下方液晶顯示器即顯示158,表明電機轉速為158 r/min。經多次仿真分析,某些時候與鍵盤輸入值相比較得知當電機響應輸入值時有很小的穩態誤差存在,原因是沒有加入反饋環節。以下利用MATLAB仿真軟件研究PID反饋控制對直流伺服電機控制系統的作用。 5.Simulink組件對直流伺服控制系統的仿真5.1 MATLAB與Simulink簡介5.1.1 MATLAB簡介MATLAB軟件推出并應用到自動控制領域后,極大地改善了自動控制系統的動態仿真和性能分析環境。MATLAB(Matrix Laboratory,矩陣實驗室)是一個適用于科學計算和工程應用的數學軟件系統。自1982年由Mathworks軟件公司推出后,經二十多年的發展,現已是IEEE 組織認可的最優化的科技應用軟件,成為大學教學和科研中最常用的工具。掌握了MATLAB的應用,對直流伺服電機控制效果的改善,肯定有著意想不到的幫助。該軟件具有以下特點: (1)數值運算功能強大; (2)編程環境簡單; (3)數據可視化功能強; (4)豐富的程序工具箱; (5)可擴展性能強等。 5.1.2 Simulink簡介Simulink是MATLAB軟件的擴展,它是實現動態系統建模和仿真的一個軟件包,他與MATLAB語言的主要區別在于,其與用戶的交互接口是基于Windows模型化圖形輸入,使得用戶可以把更多的精力投入到系統模型的構建,而非編程上。 使用Simulink進行仿真一般分為兩步:用戶首先需要在仿真模型編輯窗口中搭建好自己的仿真模型,設置好具體模型參數和仿真參數,然后就可以開始仿真,Simulink將根據用戶搭建的模型,模擬系統在用戶設定條件下的具體行為。下面將以直流伺服電機的自動控制為例,演示MATLAB中Simulink仿真的應用。 5.2 直流伺服電機數學模型直流伺服電機開環系統結構圖如圖圖5-1所示 圖5-1 直流伺服電機開環系統結構圖 其中直流伺服電機的傳遞函數為 5.3 系統Simulink模型及時域特性仿真對于單輸入單輸出系統,在經典控制理論中可用傳遞函數來描述系統, 獲得系統的動態響應。同樣,S仿真軟件也有傳遞函數模塊,可方便地描述系統的特性,且簡化了仿真模型。從模塊庫窗口創建系統模型如圖1所示,選信號源模塊組中的階躍信號模塊為輸入信號,以輸出模塊組中的示波器模塊作為顯示器來觀察系統階躍響應。在模型窗口設置傳遞函數模塊的參數和特性,運行仿真模型,得系統階躍響應曲線。 5.3.1 開環系統Simulink模型及仿真圖5-2 直流伺服電機開環系統Simulink模型 端口Step為直流伺服電機的輸入電壓,輸出端口為電機轉速。 圖5-3是開環系統的仿真結果,即開環系統的階躍響應曲線,也即直流伺服電機輸入1V單位階躍電壓時。電機的轉軸輸出呈線性變化。 圖5-3 開環系統仿真圖 由圖5-3響應曲線可知,系統沒有在可視范圍內達到穩態值“1”,但從理論上分析知此系統屬穩定系統,在足夠時間內是能夠達到穩定狀態的。上述分析說明:系統的響應速度較慢,系統性能較差,從而可能不具備使用價值。這個分析結果表明,該系統沒有達到預期的設計要求。 5.3.2 單位負反饋系統Simulink模型及仿真圖5-4是在圖5-3的基礎上加一個單位負反饋環節,構成直流伺服電機的單位負反饋系統,單位負反饋系統Simulink模型如圖5-4所示 圖5-4 直流伺服電機單位負反饋系統Simulink模型 圖5-5是單位負反饋系統的仿真結果 圖5-5 單位負反饋系統仿真圖 系統超調:40%,調節時間:2 s。由圖5-5和開環階躍響應曲線相比較知:系統應經可以達到較快達到穩態值。說明閉環單位負反饋系統對系統性能有很大改善。 5.4 PID校正為了使系統能夠達到設計要求,我們可以在圖5-4前向通道上設置一個控制器構成閉環系統來校正直流伺服電機。基于PID控制(閉環)的直流伺服電機系統框圖如圖5-6所示。 圖5-6 基于PID控制(閉環)的直流伺服電機系統框圖 其控制過程為由測速發電機輸出電壓得到直流電機輸出量,即轉速,通過轉速反饋后與系統輸入信號進行比較,得到偏差信號。偏差信號作為PID控制器的輸入信號根據設定的PID控制規律計算后輸出信號U,作為控制量輸入給直流電機,從而實現整個直流電機調速系統的閉環負反饋PID控制。 5.4.1 PID參數的湊試法確定增大比例系數KP一般系統響應利于減小靜差,但是過大會增大超調,并產生震蕩,是穩定性變壞。增大TI有減小超調,減小震蕩,是系統更穩定,但靜差消除變慢。增大微分TD利于加快系統響應時間,使超調減小,穩定性增加,但對擾動的抑制能力減弱,對擾動有較敏感的響應。 在湊試時,對參數實行下述先比例,后積分,再微分的整定步驟。 (1)首先只整定比例部分。即將比例部分由小變大,并觀察相應的系統響應,直到得到反應快,超調小的響應曲線。如果系統沒有靜差或靜差已小到允許范圍內,并且響應曲線已屬滿意,那么只需用比例控制器即可,最優比例系數可由此確定。 (2)如果在比例調節的基礎下系統的靜差不能滿足設計要求,則須加入積分環節。整定時首先置積分時間T1為一較大值,并將經第一步整定得到的比例系數略微縮小,然后減小積分時間,并在保持系統良好動態性能的情況下,靜差得到消除。在此過程中,可根據響應曲線的好壞反復改變比例系數與積分時間,以期得到滿意的控制過程與整定參數。 (3)若使用比例積分控制器消除了靜差,但動態過程經反復調整仍不能滿意,則可加入微分環節,構成比例積分微分控制器。在整定時,可先置微分時間Td為零。在第二步整定的基礎上,增大Td,同時相應的改變比例系數和積分時間,逐步湊試,以獲得滿意的調節效果和控制參數。 5.4.2 比例控制器校正為能要求系統在特別短的時間內達到設定的轉速值,比例增益K 應盡可能大,以提高比例作用的強度,但必須同時考慮系統的穩定性。采用單純的比例控制,其調整時間和超調量是一對矛盾,無法同時滿足:要縮短調整時間,K 要加大;而K 加大,超調量也同時加大了。經過多次參數選擇,當K。=10時,階躍響應曲線較為理想,呈現接近0.75衰減率的振蕩過程。 比例控制系統Simulink模型及仿真 圖5-7 比例控制系統Simulink模型 Kp=1時仿真圖 Kp=3時仿真圖 Kp=5時仿真圖 由以上三個比例控制的仿真圖可知,增大比例系數KP一般系統響應利于減小靜差,但是過大會增大超調,并產生震蕩,是穩定性變壞。 5.4.3 比例積分控制器校正積分控制的作用是只要系統存在誤差,積分控制作用就不斷地積累,輸出控制量以消除誤差,因而,只要有足夠的時間,積分控制將能完全消除誤差。在比例環節基礎上加入積分環節,只要參數設置合適就能完全消除系統偏差。 比例積分控制系統Simulink模型 圖5-8 比例積分控制系統Simulink模型 Kp=1、Ki=1時仿真圖 Kp=1、Ki=3時仿真圖 Kp=5、Ki=3時仿真圖 由以上三個比例積分控制的仿真圖可知,增大TI有減小超調,減小震蕩,使系統更穩定,但靜差消除變慢。PI控制參數設置適當可使系統靜差為零。經多次試湊,選KI=1. 5.4.4 PID控制器校正比例積分作用雖能是系統誤差為零,但系統動態性能不能得到滿足。積分作用太強可能會使系統出現震蕩。微分控制具有超前控制能力,可抑制最大動態偏差,改善系統動態性能,提高系統的穩定性。為此,在PI作用基礎上引入微分控制,構成PID控制器,以使系統滿足穩、準、快的要求。 PID控制控制系統Simulink模型如圖 圖5-9 PID控制系統Simulink模型 Kp=1、Ki=1、Kd=0.1時仿真圖 和PI控制閉環響應曲線相比較可知:系統響應時間變短,超調變小,但仍不符合要求; Kp=5、Ki=1、Kd=0.1時仿真圖 與KP=1、KI=1、KD=0.1時的仿真圖相比,系統超調和調節時間都變小,仍然不符合要求,繼續校正。需加大Kp及Ki。 Kp=12、Ki=1、Kd=0.5時仿真圖 由上曲線知此時系統有微量的超調,進一步加大Ki時超調為零。 Kp=12、Ki=1、Kd=0.9時仿真圖 經過多次校正參數,此時當 Kp=12、Ki=1、Kd=0.9時系統超調量為0,穩態誤差為0,性能滿足設計要求,穩定、準確、快速得到了完滿的統一。 6.小結控制系統特點是以單片機為控制器 ,通過鍵盤設置輸入轉速值,使得電機的轉速設置方便快捷,另外又通過軟件實現系統轉速設置范圍的保護。 但在proteus中沒能實現閉環系統的PID控制。此缺點通過軟件彌補,在MATLAB軟件中的SIMULINK中進行了直流伺服電機的開環控制系統仿真,單位閉環控制系統仿真,閉環PI控制系統仿真,閉環PD控制仿真,閉環PID控制仿真能夠更好的測試和控制系統的性能,從而為設計事物提供了更準確的性能指標。
- #include "reg52.h"
- //#include "absacc.h"
- //#include "stdio.h"
- //#include "math.h"
- //#include "string.h"
- #define unchar unsigned char
- #define unint unsigned int
- void wdata(unchar dat);//write data function
- void wcom(unchar com);//write command function
- void delay(unchar t);//delay function
- sbit rw=P3^1;//rw
- sbit rs=P3^0;//rs
- sbit en=P3^2;//en
- #define MAX_LEN 16 // 數據最大長度
- #define count_M1 50000
- #define H_0 (65536-count_M1)/256
- #define L_0 (65536-count_M1)%256
- unchar code tab2[]={0x31,0x32,0x33,0x41,0x34,0x35,0x36,0x42,0x37,0x38,0x39,
- 0x43,0x0e,0x30,0x0f,0x44}; //鍵盤求值表
- unchar code tab3[]={"Target Value: "};
- unchar code tab4[]={" "};
- unchar code tab6[]={" input ERR "};
- unchar serial_data[MAX_LEN],serial_len=0,sure_flag=0;
-
- void wdata(unchar dat);//write data function
- void wcom(unchar com);//write command function
- void delay(unchar t);//delay function
- void keyscan(void);//鍵盤操作程序
- unchar scankey(void);//鍵盤求值程序
- void chushi(void);//初始化程序
- //void init_serial(void);//串口初始化
- //void uart_serial(void);//串口主程序
- void lcd_write(void);//液晶顯示待發送指令
- unchar jisuan(void);//計算結果為十進制
- unint freq = 0;//頻率變量
- sfr16 DPTR=0x82;//申明DPTR
- char times=0;//計算T0中斷次數
- //delay function
- //P0=0x00;
- //中斷初始化
- void init_interrup(void)
- {
- IE=0x8a;//啟用T0,T1中斷
- TMOD=0x51;//T1為計數器,T2為定時器,都采用mode1
- TH0=H_0;
- TL0=L_0;
- TH1=0;
- TL1=0;
- TR0=1;
- TR1=1;
- }
- void delay(unchar t)
- {
- unchar a,b;
- for(a=0;a<t;a++)
- for(b=0;b<128;b++);
- }
- //The function for write data to LCD screen
- void wdata(unchar dat)
- {
- P1=dat;
- rs=1;
- rw=0;
- en=0;
- delay(6);
- en=1;
- }
- //The function for write command to LCD screen
- void wcom(unchar com)
- {
- P1=com;
- rs=0;
- rw=0;
- en=0;
- delay(6);
- en=1;
- }
- //初始程序
- void chushi(void)
- {
- unchar i;
- wcom(0x01);
- wcom(0x38);
- wcom(0x0c);
- wcom(0x06);
- delay(4);
- wcom(0x80);
- delay(4);
- for(i=0;i<17;i++)
- {
- wdata(tab3[i]);
- }
- wcom(0xc0);
- delay(2);
- }
- //鍵盤求值程序
- unchar scankey(void)
- {
- unchar temp,c,d;
- P2=0x0f;
- temp=P2;
- temp=temp&0x0f;//屏蔽高四位,取列值
- temp=~(temp|0xf0);//將temp中的內容與0xf0進行相加,最后求反可得到是那列按下
- if(temp==1)
- c=0;//P2.0位低電平
- else if(temp==2)
- c=1;//P2.1位低電平
- else if(temp==4)
- c=2;//P2.2位低電平
- else if(temp==8)
- c=3;//P2.3位低電平
- else
- c=0;//否則給返回值C=0
- P2=0xf0;//給P2的行為高電平,以來判斷是高四為的那位為低電平
- delay(1);
- temp=P2;
- temp=temp&0xf0;//屏蔽低四位
- temp=~((temp>>4)|0xf0);//將temp中的高四位向右移動4位,與0xf0相加,最后求反可以得到是那行按下
- if(temp==1)
- c=c+0;//將行P2.4的值加上列的值
- else if(temp==2)
- c=c+4;//將行P2.5的值加上列的值
- else if(temp==4)
- c=c+8;//將行P2.6的值加上列的值
- else if(temp==8)
- c=c+12;//將行P2.7的值加上列的值
- else
- c=0;
- d=tab2[c];
- return (d);//最后返回行加列的值
- }
-
- //lcd_write function
- void lcd_write(void)
- {
- unchar write_0,write_1,jian_zhi[MAX_LEN];
- for(write_0=0;write_0<MAX_LEN;write_0++)
- {
- serial_data[write_0]=0;
- } //清空發送緩沖數組
- wcom(0x0f); // 將光標置在oxc0處
- serial_len=0;
- delay(2);
- while(1)
- {
- write_1=0xc0; //光標地址
- wcom(write_1);
- for(write_0=0;write_0<MAX_LEN; ) //輸入指令 最大為MAX_LEN
- {
- wcom(write_1);
- P2=0x0f; //等待鍵盤值
- while((P2&0x0f)==0x0f);
- jian_zhi[write_0]=scankey();
- delay(1);
- P2=0x0f;
- while((P2&0x0f)!=0x0f); //等待按鍵放松
- if(jian_zhi[write_0]==0x0e) //當按一下取消鍵時 清空所有發送緩沖數組,
- { //當連續按下兩次時則取消本次通訊,退出
- if(write_0==0)
- goto write_out;
- else if(write_0>=1)
- {
- write_1-=1;
- wcom(write_1);
- write_0-=1;
- wdata(tab4[0]);
- serial_data[write_0]=0;
- serial_len--;
- }
- }
- else if(jian_zhi[write_0]==0x0f) //確定發送的指令
- {
- if(serial_len==3)
- {if(serial_data[0]<2)
- sure_flag++;
- else if(serial_data[0]>2);
- else
- {
- if(serial_data[1]<5)
- sure_flag++;
- else if(serial_data[1]>5);
- else
- {
- if(serial_data[2]<6)
- sure_flag++;
- else ;
- }
- }
- }
- else
- sure_flag++; //確定的標志位
- goto write_out; //退出本次輸入指令
- }
- else
- {
- wdata(jian_zhi[write_0]);
- if(jian_zhi[write_0]<=0x39)
- serial_data[write_0]=jian_zhi[write_0]-0x30;
- else
- serial_data[write_0]=jian_zhi[write_0]-0x37;
- write_1++;
- write_0++;
- serial_len++;
- }
- }
- }
- write_out :
- delay(1);
- }
- //合并數組
- void serial_and(void)
- {
- unchar and0,and1,and2=0;
- and1=serial_len/2;
- for(and0=0;and0<and1;and0++)
- {
- serial_data[and0]=(serial_data[and0+and2++]<<4)|serial_data[and0+and2];
- }
- }
- //鍵盤操作
- void keyscan(void)
- {
- unchar ks_0,ks_1;
- delay(2);//延時去抖動
- P2=0x0f;
- if((P2&0x0f)!=0x0f)//延時后在判斷一次,去除抖動影響
- {
- ks_0=scankey(); //求鍵盤值
- P2=0x0f;
- while((P2&0x0f)!=0x0f); //等待放松
- while(ks_0==0x41)
- {
- switch(ks_0)
- {
- case 0x41 :
- {
- chushi();
- lcd_write(); //調用寫指令程序
- if((sure_flag==1)&&(serial_len<=3)&&(jisuan()<256))
- //發送指令的條為確認發送標志sure_flag=1&&本次發送指令的個數erial_len=6
- {
- sure_flag=0; //清除確定標志
- //serial_and();//合并數組
- // serial_len/=2;
- // uart_serial();//調用發送指令程序
- // P0=serial_data[0];
- P0=jisuan();
- // P0=255;
- }
- else
- {
- wcom(0xc0);
- for(ks_0=0;ks_0<10;ks_0++)
- {
- wdata(tab6[ks_0]);
- }
- for(ks_0=0;ks_0<10;ks_0++)
- {
- delay(250);
- }
- }
- delay(1);
- }break;
- default :
- break;
- }
- ks_0=0;
- }
- sure_flag=0;
- serial_len=0;
- chushi(); //初始化,等待下一次發送指令
- wcom(0xc0);
- for(ks_1=0;ks_1<MAX_LEN;ks_1++) //清空發送緩沖數組
- serial_data[ks_1]=0;
- }
- }
- // 求取輸入值轉換為十進制
- unchar jisuan(void)
- {
- unchar jieguo;
- if(serial_len==3)
- jieguo=serial_data[0]*100+serial_data[1]*10+serial_data[2];
- else if(serial_len==2)
- jieguo=serial_data[0]*10+serial_data[1];
- else if(serial_len==1)
- jieguo=serial_data[0];
- else ;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址:
|