《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)造紙?jiān)险糁筮^(guò)程壓力微機(jī)控制系統(tǒng)

上傳人:仙*** 文檔編號(hào):28305584 上傳時(shí)間:2021-08-25 格式:DOC 頁(yè)數(shù):33 大?。?52KB
收藏 版權(quán)申訴 舉報(bào) 下載
《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)造紙?jiān)险糁筮^(guò)程壓力微機(jī)控制系統(tǒng)_第1頁(yè)
第1頁(yè) / 共33頁(yè)
《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)造紙?jiān)险糁筮^(guò)程壓力微機(jī)控制系統(tǒng)_第2頁(yè)
第2頁(yè) / 共33頁(yè)
《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)造紙?jiān)险糁筮^(guò)程壓力微機(jī)控制系統(tǒng)_第3頁(yè)
第3頁(yè) / 共33頁(yè)

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)造紙?jiān)险糁筮^(guò)程壓力微機(jī)控制系統(tǒng)》由會(huì)員分享,可在線閱讀,更多相關(guān)《《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)造紙?jiān)险糁筮^(guò)程壓力微機(jī)控制系統(tǒng)(33頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 《微型計(jì)算機(jī)控制技術(shù)》 課 程 設(shè) 計(jì) 任 務(wù) 書(shū) 學(xué)院:信息工程學(xué)院 班級(jí):自動(dòng)化0701 姓名: 學(xué)號(hào): 指導(dǎo)老師: 目 錄 一、 設(shè)計(jì)題目---------------------------------------------------------------------------------------3 二、 工藝要求---------------------------------------------------------------------------------------3 三、系統(tǒng)的組成和工

2、作原理----------------------------------------------------------------------3 四、硬件電路----------------------------------------------------------------------------------------4 1、壓力變送及A/D轉(zhuǎn)換電路--------------------------------------------------------------4 2、D/A轉(zhuǎn)換及隔離輸出電路----------------------------------

3、----------------------------6 3、顯示電路------------------------------------------------------------------------------------7 4.上下限報(bào)警電路---------------------------------------------------------------------------8 5.控制系統(tǒng)的總電路圖-------------------------------------------------------------------8 五、數(shù)字控制器

4、的設(shè)計(jì)--------------------------------------------------------------------------9 六、軟件設(shè)計(jì)---------------------------------------------------------------------------------------10 1、內(nèi)存地址分配----------------------------------------------------------------------------10 2、主程序流程圖---------------------------

5、------------------------------------------------11 3、定時(shí)中斷處理程序流程圖----------------------------------------------------------12 4、AD轉(zhuǎn)換自檢程序流程圖-----------------------------------------------------------12 5.DA轉(zhuǎn)換自檢程序流程圖----------------------------------------------------------13 6.RAM自檢程序流程圖----------

6、----------------------------------------------------13 7.按鍵處理程序流程圖---------------------------------------------------------------14 七、程序清單---------------------------------------------------------------------------------------15 1.主程序----------------------------------------------------------------

7、----------- ------- ---15 2.AD轉(zhuǎn)換程序-------------------------------------------------------------------------------19 3.標(biāo)度變換程序------------------------------------------------------------------------------20 4.濾波程序------------------------------------------------------------------ ----------

8、-------20 5.RAM自檢程序-----------------------------------------------------------------------------22 6.?dāng)?shù)字控制器程序---------------------------------------------------------------------------23 7.顯示及按鍵處理程序----------------------------------------------------------------- ---23 8.DA轉(zhuǎn)換程序-------

9、------------------------------------------------------------------------30 八、系統(tǒng)調(diào)試--------------------------------------------------- ---------------------------- ------30 九、設(shè)計(jì)總結(jié)--------------------------------------------------------- ----- --- -------------------31 十、參考文獻(xiàn)------------------------

10、---------------------- ------------------------ ---------------31 一、設(shè)計(jì)題目 造紙?jiān)险糁筮^(guò)程壓力微機(jī)控制系統(tǒng) 二、工藝要求 造紙?jiān)险糁筮^(guò)程壓力微機(jī)控制系統(tǒng) 蒸煮過(guò)程是制漿造紙生產(chǎn)中的關(guān)鍵工序之一,對(duì)于整個(gè)造紙生產(chǎn)過(guò)程中紙漿得率和紙的質(zhì)量有很大影響,它要求根據(jù)原料的特點(diǎn)、紙漿的質(zhì)量和生產(chǎn)設(shè)備的實(shí)際情況制定出合理的蒸煮工藝,確定裝球量、用堿量、蒸煮溫度和壓力。造紙廠蒸煮車間有五個(gè)蒸球,依靠調(diào)節(jié)其進(jìn)氣量以達(dá)到控制蒸球工作壓力和溫度,調(diào)

11、節(jié)噴料閥控制裝料量。 用微機(jī)控制技術(shù)實(shí)現(xiàn)該過(guò)程的自動(dòng)控制,要求蒸球的實(shí)際工作壓力準(zhǔn)確跟蹤給定壓力曲線。 P1:低壓保壓值,P2:高壓保壓值,T1: 空轉(zhuǎn)時(shí)間,T2:升低壓時(shí)間,T3:低壓保持時(shí)間,T4:升高壓時(shí)間,T5:高壓保持時(shí)間 裝料控制系統(tǒng)示意圖 三、系統(tǒng)的組成和工作原理 本壓力控制系統(tǒng)的原理框圖如下圖所示 它采用Atmel公司的AT89S51單片機(jī)作為控制核心,AT89S51是低功耗的8位CMOS單片機(jī),具有8K字節(jié)在線可編程Flash存儲(chǔ)器,內(nèi)部有帶看門(mén)狗。通過(guò)其ISP接口

12、線可以方便地在線調(diào)試程序。A/D轉(zhuǎn)換器采用具有8通道輸入的ADC0809。DBY-131型壓力變送器將0-1.28Mpa的壓力信號(hào)轉(zhuǎn)換為0-10mA的電流輸出,通過(guò)500Ω電阻轉(zhuǎn)化為0-5V的電壓信號(hào)供給A/D轉(zhuǎn)換器采樣。單片機(jī)定時(shí)(預(yù)定值為5s,用戶可根據(jù)實(shí)際在調(diào)試時(shí)進(jìn)行修改)依次對(duì)5個(gè)蒸球的壓力進(jìn)行采樣。采樣值經(jīng)過(guò)內(nèi)部程序數(shù)字濾波后與給定值進(jìn)行比較(給定值通過(guò)程序計(jì)算按照用戶給定的壓力曲線變化),得到的偏差信號(hào)經(jīng)PID算法程序后輸出8位的閥門(mén)控制數(shù)字量。該數(shù)字量經(jīng)D/A轉(zhuǎn)換器AD558轉(zhuǎn)換成0-10V的電壓信號(hào),0-10V的電壓信號(hào)再經(jīng)隔離放大器IC ISO1002與工業(yè)現(xiàn)場(chǎng)隔離,輸出4-

13、20mA 的標(biāo)準(zhǔn)電流信號(hào)控制蒸汽調(diào)節(jié)閥的開(kāi)度。當(dāng)蒸球的壓力大于給定值時(shí),偏差信號(hào)E=R-C小于零,經(jīng)PID運(yùn)算后輸出量減小,蒸汽調(diào)節(jié)閥的開(kāi)度隨之減小,從而使蒸球內(nèi)的壓力降低,重新回到平衡狀態(tài)。通過(guò)對(duì)PID參數(shù)的整定可以使蒸球的實(shí)際工作壓力準(zhǔn)確跟蹤給定壓力曲線。 四、硬件電路 1、壓力變送及A/D轉(zhuǎn)換電路 電路如圖所示: 壓力變送器為DBY-131型,其量程可調(diào)范圍為0~1 Mpa至0~3Mpa。本系統(tǒng)中調(diào)整為0~1.28Mpa。ADC0809的每個(gè)輸入通道前對(duì)地接有一500Ω的電阻,用于將壓力變送器送來(lái)的0~10mA電流信號(hào)轉(zhuǎn)換為0~5V的電壓信

14、號(hào),ADC0809八個(gè)輸入通道的地址為FE00H~FE07H。單片機(jī)執(zhí)行寫(xiě)總線指令后啟動(dòng)A/D轉(zhuǎn)換,通過(guò)查詢EOC的狀態(tài)判斷轉(zhuǎn)換是否結(jié)束。執(zhí)行讀總線指令后將轉(zhuǎn)換后的數(shù)據(jù)讀入單片機(jī)內(nèi)部。 被測(cè)壓力與輸出量關(guān)系: 壓力(Mpa) 輸出數(shù)字量 0 0. 635 1.275 00000000 10000000 11111111 DBY-131壓力變送器性能指標(biāo): 輸出電流 0~10m ADC 振幅 ≤0.1mm(雙向) 靈敏限 0.1% 供電電源 220V 50Hz 負(fù)載電阻

15、 0~1.5kΩ 消耗功率 ≤6W 來(lái)回變差 不大于基本誤差的絕對(duì)值 結(jié)構(gòu)形式 現(xiàn)場(chǎng)安裝式 工作條件 環(huán)境溫度:-10~C~55~C 儀表重量 約15Kg 相對(duì)濕度 ≤85% 儀表管結(jié)頭螺紋 M201.5/M181.5 工作振動(dòng)頻率 ≤25Hz ADC0809技術(shù)指標(biāo) 供電電源 單一+5V 模擬量輸入范圍 0-5V 分辨率 8位 最大不可調(diào)誤差 <1LSB 功耗 15mW 轉(zhuǎn)換速度 取決于芯片的時(shí)鐘頻率 2、D/A轉(zhuǎn)換及隔離輸出電路 D/A轉(zhuǎn)換器采用8位電壓輸出型D/A轉(zhuǎn)換器DAC0832 DAC0832數(shù)/模轉(zhuǎn)換器的

16、內(nèi)部,具有兩極輸入數(shù)據(jù)緩沖器和一個(gè)R-2R T型電阻網(wǎng)絡(luò)。即包括一個(gè)數(shù)據(jù)寄存器、DAC 寄存器和D/A轉(zhuǎn)換器三大部分。數(shù)據(jù)寄存器和DAC 寄存器實(shí)現(xiàn)兩次緩沖,故在輸出的同時(shí),還可以接收一個(gè)數(shù)據(jù),提高了轉(zhuǎn)換速度。當(dāng)多芯片工作時(shí),可用同步信號(hào)實(shí)現(xiàn)各模擬量的同時(shí)輸出。 該器件采用先進(jìn)的CMOS工藝,功耗低,輸出漏電流誤差小,主要特性有:輸出電流線性度可在滿量程下調(diào)節(jié); 轉(zhuǎn)換時(shí)間為1μs;數(shù)據(jù)輸入可采用雙緩沖、單緩沖或直通方式;增益溫度補(bǔ)償為0.02%FS/℃;每次輸入數(shù)字為8 為二進(jìn)數(shù);功耗為20mW; 邏輯電平與TTL 兼容;單一電源供電,可在5~15V 內(nèi)。DAC0832 可工作在單,雙緩沖

17、器方式。單緩沖器方式即輸入寄存器的信號(hào)和DAC 寄存器的信號(hào)同時(shí)控制,使一個(gè)數(shù)據(jù)直接寫(xiě)入DAC 寄存器。 這種方式適用于只有一路模擬量輸出或幾路模擬量不需要同步輸出的系統(tǒng); 雙緩沖器方式即輸入寄存器的信號(hào)和DAC 寄存器的信號(hào)分開(kāi)控制, 這種方式適用于幾路模擬量需要同步輸出的系統(tǒng)。為了提高轉(zhuǎn)換精度,可增加D/A轉(zhuǎn)換器的位數(shù)。 隔離放大器采用ISO1002,ISO系列隔離放大器在同一芯片上提供了電源及信號(hào)的隔離,該混合集成芯片在同一芯片上集成了一個(gè)磁電耦合DC/DC變換電源及一個(gè) 電流/ 電壓輸出的光電耦合隔離放大器。該芯片除為內(nèi)部放大電路供電外,還可向外部輸出一路隔離電壓,供外部電路擴(kuò)展

18、使用。這一特點(diǎn)可方便地為外部電路基準(zhǔn)電源及外部放大電路或其他用戶應(yīng)用電路供電。輸入及輸出側(cè)寬爬電距離及內(nèi)部隔離措施使該芯片可提供3000VAC絕緣電壓。 ISO系列產(chǎn)品使用非常方便,幾乎無(wú)需外部元件,即可實(shí)現(xiàn)信號(hào)電流源長(zhǎng)線傳輸(如圖)。 3.顯示電路 LED顯示器 LED顯示塊是由發(fā)光二極管顯示字段的顯示器件,常使用七段LED。這種顯示塊有共陰極與共陽(yáng)極兩種接法。N位LED顯示器有N根位選線和8N根段選線。根據(jù)顯示方式不同,位選線與段選線的連接方法不同。段選線控制字符選擇,位選線控制顯示器的亮暗。LED顯示方式有靜態(tài)顯示方式(因其占用 I/O

19、資源較多,故在位數(shù)較多時(shí)不采用)和動(dòng)態(tài)顯示方式,如八位LED動(dòng)態(tài)顯示電路只需要兩個(gè)8位I/O口。其中一個(gè)控制段選碼,另一個(gè)控制位選碼。由于所有位的段選碼皆由一個(gè)I/O控制,因此,在每個(gè)瞬間,八位LED只可能顯示相同的字符,必須采用掃描顯示方式。即在每一瞬間只使某一位顯示相應(yīng)字符。在此瞬間,段選控制I/O口輸出相應(yīng)字符段選碼,位選控制I/O口在該顯示位送入選通電平以保證該位顯示相應(yīng)字符。如此輪流,使每位顯示該位應(yīng)顯示字符,并保持延時(shí)一段時(shí)間,以造成視覺(jué)暫留效果。段選、位選碼每送一次后延時(shí)1~5ms。 本控制系統(tǒng)的采用8255A進(jìn)行I/O擴(kuò)展,而后接LED數(shù)碼管電路加以顯示,各數(shù)碼管含義及電路如

20、圖所示: 4.上下限報(bào)警電路 本控制系統(tǒng)的采用8255A進(jìn)行I/O擴(kuò)展,報(bào)警輸入信號(hào)由PA口輸入,由PB口輸出以提示報(bào)警及正常工作狀態(tài),電路如圖所示: 5.控制系統(tǒng)的總電路圖 五、數(shù)字控制器的設(shè)計(jì) 本設(shè)計(jì)采用最小拍隨動(dòng)系統(tǒng)數(shù)字控制器 因?yàn)? 所以 (T=0.5s) 所以 ( 式1-1) 由式1-1知,該數(shù)字控制器為最少拍無(wú)波紋隨動(dòng)系統(tǒng)控制。 假設(shè)輸入為單位階躍,取,所以 又取采樣周期T=0.5s, 得 (式1-2) 從而有 由差分方程得控制器輸出為: (式1-3) 最少拍隨動(dòng)

21、系統(tǒng)的誤差為: 其中分為:1) 堿液設(shè)定值與實(shí)際輸出堿液之差 2)水設(shè)定值與實(shí)際輸出水之差 因?yàn)?1.5 所以 為第k次采樣時(shí)實(shí)際輸出堿液或?qū)嶋H輸出水 六:軟件設(shè)計(jì) 1. 內(nèi)存地址分配 2.主程序流程圖 3.定時(shí)中斷處理程序流程圖 4.AD轉(zhuǎn)換自檢程序流程圖 5.DA轉(zhuǎn)換自檢程序流程圖 6.按鍵處理程序流程圖 7.數(shù)字控制器流程圖 七.程序清單 1. 主程序 #include<

22、reg51.h> #include #define unchar unsigned char #define unint unsigned int #define PORT_4A8255 XBYTE[0X4000] #define PORT_4B8255 XBYTE[0X4001] #define PORT_4C8255 XBYTE[0X4002] #define PORT_4COM8255 XBYTE[0X4003] //定義4口8255的地址端 #define PORT_0A8255 XBYTE[0X0000]

23、#define PORT_0B8255 XBYTE[0X0001] #define PORT_0C8255 XBYTE[0X0002] #define PORT_0COM8255 XBYTE[0X0003] //定義0口8255的地址端 #define ADC0809IN_0 XBYTE[0x1000] #define ADC0809IN_1 XBYTE[0x1001] #define ADC0809IN_2 XBYTE[0x1002] #define CHANNELS 3 //3個(gè)通道,IN0接液位檢測(cè),INT1接水流量變送

24、器信號(hào),IN2接堿液流量變送器信號(hào) #define DAC0832BUFF XBYTE[0X2000] //DAC轉(zhuǎn)換地址 #define CD4051IN_1 XBYTE[0X3001] //輸出通道1 #define CD4051IN_2 XBYTE[0X3002] //輸出通道2 #define P1 XBYTE[0x5000] //堿液控制手動(dòng)操作地址 #define P2 XBYTE[0x6000] //水控制手動(dòng)操作地址 #define Set_water DBYTE

25、[0X60] //定義水設(shè)定值地址 #define Set_lye DBYTE[0X61] //定義堿液設(shè)定值地址 #define Set_up_alarm DBYTE[0X62] //定義上限報(bào)警設(shè)定值地址 #define Set_down_alarm DBYTE[0X63] //定義下限報(bào)警設(shè)定值地址 #define Real_water DBYTE[0x64] //定義水實(shí)際輸出值地址 #define Real_lye DBYTE[0x65] //定義堿液實(shí)際輸出值設(shè)定值地址 #define High

26、 DBYTE[0X66] //定義液位高度值地址 #define Water_Sample DBYTE[0x67] //定義水采樣值起始地址,采樣6個(gè)值,67H~6CH為存放采樣值地址, #define Lye_Sample DBYTE[0x6D] //定義堿液采樣值起始地址,采樣6個(gè)值,6DH~72H為存放采樣值地址 #define High_Sample DBYTE[0x73] //定義液位采樣值起始地址,采樣6個(gè)值,73H~78H為存放采樣值地址 unchar code table[]={0x3F,0x06,0x5B,0x4F,

27、0x66,0x6D,0x7D,0x07,0x7F ,0x6F}; //共陰極LED顯示數(shù)字0~9 unint T_count=0; //定義一個(gè)定時(shí)器定時(shí)0.5s計(jì)數(shù)單元 unchar sam_count=0; //定義一個(gè)采樣數(shù)的單元 unchar data *Water_sam,*Lye_sam,*HIGH_sam; //定義分別指向水、堿液、液位采樣值的指針 float Water_control,Lye_control; //定義水和堿液控制器輸出單元 bit ADCheck(void); bit DACheck(void); //定義A/D和D/A自檢程序

28、 void set_init(void) //設(shè)定值初值子程序 {unchar *add_set //定義設(shè)定值指針 addr_set=&Set_water ; //指向水設(shè)定值地址 *add_set=40; //水設(shè)定初值為40 addr_set++ ; //指向堿液設(shè)定值地址 *add_set=60; //堿液設(shè)定初值為60 addr_set++; //指向上限報(bào)警設(shè)定值地址 *add_set=90; //上限報(bào)警設(shè)定初值為90 addr_set++; //指向下限報(bào)警設(shè)定值地址 *add_set=

29、10; //下限報(bào)警設(shè)定初值為90 } unchar alarm(unchar height) //越限報(bào)警子程序 { if(height>Set_up_alarm) //如果液位高于上限報(bào)警值,則報(bào)警并顯示,返回1 { PORT_4B8255 =0x84; //上限報(bào)警燈亮,電笛響 return 1; } else if(height>Set_down_alarm) //如果液位低于下限報(bào)警值,則報(bào)警并顯示,返回1 { PORT_4B8255 =0x82; //下限報(bào)警燈亮,電笛響 return 1;

30、 } else //液位高度正常,則正常工作指示燈亮,返回0 { PORT_4B8255 =0x88; return 0; } } main() { bit ADCheck(void); bit DACheck(void); bit ROMCheck(void); unchar multi_filter(void); void DAC0832(unchar x,unchar y); void key(void); float Dignal_Contoller(unchar Rk,unchar

31、Ck); //函數(shù)聲明 //初始化8255定時(shí)器等 TMOD=0x02; //初始化定時(shí)器0,自動(dòng)重裝入初值工作方式2 TH0=0x38; //初值為56,單片機(jī)主頻為12MHz。定時(shí)0.5s需要2500個(gè)200us TL0=0x38; PT0=1; //置定時(shí)器0高優(yōu)先級(jí) ET0=1; //允許定時(shí)器0中斷 IT0=1; //IT0=1:置外部中斷0為邊沿觸發(fā)方式 EX0=

32、1; //開(kāi)放外部中斷0 IT1=1 //IT1=1:置外部中斷1為邊沿觸發(fā)方式 EX1=1; //開(kāi)放外部中斷1,且EA=1(允許單片機(jī)響應(yīng)中斷) EA=1; // EA=1,允許單片機(jī)響應(yīng)中斷 PORT_0COM8255=0x8000; //初始化0口8255,其A口,B口 C口均作為輸出(接數(shù)碼管顯示) PORT_4COM8255=0x90; //4口8255初始化,其A口作輸入,其B口作輸出(接鍵盤(pán)和指示燈)

33、 set_init();//對(duì)水、堿液、上限報(bào)警、下限報(bào)警各值初始化 Water_sam=Water_Sample; Lye_sam=Lye_Sample; HIGH_sam=High_Sample ; //分別指向各自采樣值地址 if(ROMCheck) //開(kāi)機(jī)檢測(cè)ROM是否正常工作 { P1=1; //如果有故障則轉(zhuǎn)到手動(dòng)操作 P2=1; PORT_4B8255; //系統(tǒng)故障顯示燈亮且電笛響 EA=0; //不允許中斷 while(1); //死循環(huán)等待處理

34、 } set_init(); //設(shè)定默認(rèn)值 while(1) //死循環(huán) { if(ADCcheck|DACheck) //調(diào)用A/D和D/A自檢程序 { P1=1; //如果有故障則轉(zhuǎn)到手動(dòng)操作 P2=1; PORT_4B8255; //系統(tǒng)故障顯示燈亮且電笛響 EA=0; //不允許中斷 while(1); //死循環(huán)等待處理 } key(); //調(diào)用鍵盤(pán)程序 display(); //調(diào)用數(shù)碼管顯示程序

35、 ADC0809IN_0=1; //啟動(dòng)A/D轉(zhuǎn)換 TR0=1; //啟動(dòng)定時(shí)器 2.AD轉(zhuǎn)換程序 #include #include #define unchar unsigned char #define ADC0809IN_0 XBYTE[0x1000] #define ADC0809IN_1 XBYTE[0x1001] #define ADC0809IN_2 XBYTE[0x1002] #define CHANNELS 3 //3個(gè)通道,IN0接液位檢測(cè),

36、INT1接水流量變送器信號(hào),IN2接堿液流量變送器信號(hào) bit bdata flag; //設(shè)置標(biāo)志位 void ADC0809(unchar data *a,unchar data *b,unchar data *c) { unchar i; unchar xdata *addr; addr=&ADC0809IN_0; //指針指向ADC0809通道0地址 IT1=1; //IT1=1:置外部中斷1為邊沿觸發(fā)方式 EX1=1; //開(kāi)放外部中斷1 EA=1; // EA=1,允許單片機(jī)響應(yīng)中斷

37、 for(i=0;i

38、1中斷服務(wù)程序,使用第一組寄存器 { flag=1; //轉(zhuǎn)換結(jié)束標(biāo)志 } 3.標(biāo)度變換程序 #include #include #define unchar unsigned char #define unint unsigned int unchar data Conversion(unchar x) //標(biāo)度轉(zhuǎn)換子程序 { return 100*x/255; //Ax=100*Nx/255 } 4.濾波程序 #include #incl

39、ude #define unchar unsigned char #define unint unsigned int unchar multi_filter(unchar GET_COUNT,unchar data *BUFF) //采用復(fù)合數(shù)字濾波法,GET_COUNT為采樣值個(gè)數(shù) { //*BUFF為指向采樣值存儲(chǔ)地址的指針 unchar data *addr; //定義一個(gè)地址 int i,j;

40、unchar data buffer; unsigned int SUM=0; //累加值 BUFF=0x67; //指針指向67H addr=BUFF; for(j=0;j*(addr+i+1)) { buffer=*(addr+i); *(addr+i)=*(addr+i+1); *(addr+i+1)=buffer; } }

41、 for(i=0;i #include #define unchar unsigned char #define unint unsigned char #define xRAM DBYTE[0x00] //檢查內(nèi)部128B的RAM #define R_cou

42、nt 0x7F //設(shè)計(jì)數(shù)初值 bit ROMCheck(void) { unchar data *x; //設(shè)RAM地址指針 unchar bdata FLAG; //設(shè)檢查標(biāo)識(shí)單元 unchar bdata CHECK; //設(shè)檢查字單元 unint i,j,k,r; unchar bdata temp; FLAG=0;i=k=r=0; //變量初始化 CHECK=0xAA; //設(shè)檢查字AAH while(FLAG!=2) //檢查標(biāo)志=02?是,則結(jié)束 { for(i=R_count;i>0;

43、i--) { *(x+j)=CHECK; //檢查字寫(xiě)入內(nèi)存單元 if((temp=*(x+j))!=0xAA) //寫(xiě)入內(nèi)容=檢查字? return 1; //否,則返回1 j++; //修改地址 } FLAG++; //檢查標(biāo)志加1 CHECK=0x55; //修改檢查字(55H) j=0; //設(shè)地址指針,從頭再檢查 } return 0; } 6. 數(shù)字控制器程序 static float data E_1; //設(shè)置E(K-1) stat

44、ic float data E_2; //設(shè)置E(K-2) static float data U_1; //設(shè)置U(K-1) static float data U_2; //設(shè)置U(K-2) float Dignal_Contoller(float Rk,float Ck) //Rk為給定值,Ck為測(cè)量值 { float data U_0; //設(shè)置U(K) float data E_0; //設(shè)置E(k) E_0=Rk-Ck; //計(jì)算偏差E(k) U_0=4*E_1-3.92*E_2+1.92*U_1+0.92*U_2; //最少

45、拍無(wú)波紋控制算式 E_2=E_1; E_1=E_0; //E(k)賦值給E(K-1), E(k-1)賦值給E(K-2) U_2=U_1; U_1=U_0; //U(k)賦值給U(K-1), U(k-1)賦值給U(K-2) return ( U_0); } 7. 顯示與按鍵處理程序 #include #include #define PORT_4A8255 XBYTE[0X4000] #define PORT_4B8255 XBYTE[0X4001]

46、#define PORT_4C8255 XBYTE[0X4002] #define PORT_4COM8255 XBYTE[0X4003] //定義4口8255的地址端 #define PORT_0A8255 XBYTE[0X0000] #define PORT_0B8255 XBYTE[0X0001] #define PORT_0C8255 XBYTE[0X0002] #define PORT_0COM8255 XBYTE[0X0003] //定義0口8255的地址端 #define unchar unsigned char #def

47、ine unint unsigned int #define Set_water DBYTE[0X60] //定義水設(shè)定值地址 #define Set_lye DBYTE[0X61] //定義堿液設(shè)定值地址 #define Set_up_alarm DBYTE[0X62] //定義上限報(bào)警設(shè)定值地址 #define Set_down_alarm DBYTE[0X63] //定義下限報(bào)警設(shè)定值地址 #define Real_water DBYTE[0x64] //定義水實(shí)際輸出值地址 #define Real

48、_lye DBYTE[0x65] //定義堿液實(shí)際輸出值設(shè)定值地址 #define High DBYTE[0X66] //定義液位高度值地址 #define unchar unsigned char #define unint unsigned int unchar K_Start=0,K_Stop=0,K_Water=0,K_Lye=0,K_Up_Alarm=0, K_Down_Alarm=0,K_INC=0,K_DEC=0; unchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x

49、7D,0x07,0x7F,0x6F}; //共陰極LED顯示數(shù)字0~9 unsigned Select; //定義一個(gè)位選端 unchar data *addr_pointer; //定義一個(gè)指向DATA區(qū)空間的指針 delay1ms() //延遲1ms { unchar i; for(i=0;i<173;i++); } void display(void) { unchar i; Select=0x80; //首先選擇最高位 addr_pointer=&Set_water;

50、 //給指針賦值,指向DATA區(qū)地址60H處,即水設(shè)定值存儲(chǔ)地址 PORT_0COM8255=0x8000; //初始化0口8255,其A口,B口,C口均作為輸出 PORT_4COM8255=0x90; //4口8255初始化,其A口作輸入,其B口,C口作輸出 for(i=0;i<8;i++) { PORT_0A8255=table[(*(addr_pointer+i))/10]; //高位顯示 PORT_0B8255=Select; //輸出位選碼到PB口

51、 delay1ms(); //延時(shí)1ms i++; //準(zhǔn)備顯示低位 Select=Select>>1; PORT_0A8255=table[(*(addr_pointer+i))%10]; //低位顯示 PORT_0B8255=Select; //輸出位選碼到PB口 delay1ms();

52、 //延時(shí)1ms } Select=0x80; for(i=0;i<6;i++) { PORT_0C8255=table[(*(addr_pointer+i))/10]; //高位顯示 PORT_0B8255=Select; //輸出位選碼到PB口 delay1ms(); //延時(shí)1ms i++;

53、 //準(zhǔn)備顯示低位 Select=Select>>1; PORT_0C8255=table[(*(addr_pointer+i))%10]; //低位顯示 PORT_0B8255=Select; //輸出位選碼到PB口 delay1ms(); //延時(shí)1ms } } void dis2_modify(unchar temp, unchar *add) //修改數(shù)碼管子程序

54、 //temp為欲修改顯示某個(gè)數(shù)碼管值的位選端,add為指向修改數(shù)碼管的地址 { unchar i,slct; slct=temp; PORT_0A8255 =0x00; //高位停止顯示 PORT_0B8255=temp; //輸出位選碼到PB口 for(i=0;i<100;i++) //循環(huán)來(lái)延遲一段足以讓人看出數(shù)碼管閃爍的效果 delay1ms(); /

55、/延時(shí)1ms slct=slct>>1; //選擇下一位 PORT_0A8255 =0x00; //低位停止顯示 PORT_0B8255=slct; //輸出位選碼到PB口 for(i=0;i<100;i++) //循環(huán)來(lái)延遲一段足以讓人看出數(shù)碼管閃爍的效果 delay1ms(); //延時(shí)1ms slct=temp; PORT_0A8255=table[(*add)/1

56、0]; //高位顯示 PORT_0B8255=slct; //輸出位選碼到PB口 for(i=0;i<100;i++) //循環(huán)來(lái)延遲一段足以讓人看出數(shù)碼管閃爍的效果 delay1ms(); //延時(shí)1ms slct=slct>>1; //選擇下一位 PORT_0A8255 =table[(*add)%10]; //低位顯示 PORT_0B8255=slct;

57、 //輸出位選碼到PB口 for(i=0;i<100;i++) //循環(huán)來(lái)延遲一段足以讓人看出數(shù)碼管閃爍的效果 delay1ms(); //延時(shí)1ms } void INC_OR_DEC(unchar temp,unchar *add)//加1或減1子程序 //temp為欲修改顯示某個(gè)數(shù)碼管值的位選端,add為指向修改數(shù)碼管的地址 { display(); //數(shù)碼管掃描顯示 dis2_modify(te

58、mp,add); //閃爍要修改的數(shù)碼管 display(); //數(shù)碼管掃描顯示 if(K_INC) //如果加1鍵按下,顯示加1 { K_INC=0; //加1鍵每按一次則加1,故在次將其清零 (*add)++; //設(shè)定值加1 } if(K_DEC) //如果減1鍵按下,顯示減1 { K_DEC=0; //減1鍵每按一次則加1,故在次將其清零 (*add)--;//設(shè)定值減1 } dis2_modify(temp,add); //閃爍顯示修改后的數(shù)碼管 display(); //數(shù)碼管掃描顯示 } v

59、oid key(void) { IT0=1; //IT0=1:置外部中斷0為邊沿觸發(fā)方式 PX0=1; //置外部中斷0高優(yōu)先級(jí) EX0=1; //開(kāi)放外部中斷0 EA=1; // EA=1,允許單片機(jī)響應(yīng)中斷 PORT_4COM8255=0x90; //4口8255初始化,其A口作輸入,其B口作輸出 if(!K_Start) { while(!K_Start) { PORT_0B8255=0x2

60、0; //如果啟動(dòng)按鈕沒(méi)有按下,則顯示等待啟動(dòng)按鈕按下燈,并死循環(huán)等待按下 } PORT_0B8255=PORT_0B8255&&0xDF;//啟動(dòng)按鈕按下,則等待啟動(dòng)信號(hào)燈熄滅 } if(K_Stop) //如果停止按鈕按下,則K_Start清零,等待其再次按下啟動(dòng) { K_Start=0; while(!K_Start) //如果啟動(dòng)按鈕沒(méi)有按下,則顯示停止信號(hào)燈,并且數(shù)碼管顯示停止時(shí)的各種值 { PORT_0B8255=0x10; display(); } K_Stop=

61、0; //啟動(dòng)按鈕按下時(shí),使K_Stop清零 PORT_0B8255=PORT_0B8255&&0xEF;//啟動(dòng)按鈕按下,則停止信號(hào)燈熄滅 } if(K_Water) //當(dāng)水設(shè)定值鍵按一下,則相應(yīng)兩個(gè)數(shù)碼管閃爍以表示需要設(shè)定,當(dāng)水設(shè)定值鍵再按一下,則停止設(shè)定 { Select=0x80; //水設(shè)定值的數(shù)碼管顯示位選端 addr_pointer=&Set_water; //給指針賦值,指向DATA區(qū)地址60H處,即水設(shè)定值存儲(chǔ)地址 INC_OR_DEC(Select,addr_pointer); } if(K_L

62、ye) //當(dāng)堿液設(shè)定值鍵按一下,則相應(yīng)兩個(gè)數(shù)碼管閃爍以表示需要設(shè)定,當(dāng)堿液設(shè)定值鍵再按一下,則停止設(shè)定 { Select=0x20; //堿液設(shè)定值的數(shù)碼管顯示位選端 addr_pointer=&Set_lye; //給指針賦值,指向DATA區(qū)地址60H處,即堿液設(shè)定值存儲(chǔ)地址 INC_OR_DEC(Select,addr_pointer); //調(diào)用加1或減1子程序 } if(K_Up_Alarm) //當(dāng)上限報(bào)警設(shè)定值鍵按一下,則相應(yīng)兩個(gè)數(shù)碼管閃爍以表示需要設(shè)定 //當(dāng)上限報(bào)警設(shè)定值鍵再按一下,則停止設(shè)定

63、{Select=0x08; //上限報(bào)警設(shè)定值的數(shù)碼管顯示位選端 addr_pointer=&Set_lye; //給指針賦值,指向DATA區(qū)地址62H處,即上限報(bào)警設(shè)定值存儲(chǔ)地址 INC_OR_DEC(Select,addr_pointer); //調(diào)用加1或減1子程序 } if(K_Down_Alarm) //當(dāng)下限報(bào)警設(shè)定值鍵按一下,則相應(yīng)兩個(gè)數(shù)碼管閃爍以表示需要設(shè)定 //當(dāng)下限報(bào)警設(shè)定值鍵再按一下,則停止設(shè)定 {Select=0x02; //下限報(bào)警設(shè)定值的數(shù)碼管顯示位選端 addr_pointer=&Set_

64、lye; //給指針賦值,指向DATA區(qū)地址63H處,即下限報(bào)警設(shè)定值存儲(chǔ)地址 INC_OR_DEC(Select,addr_pointer); //調(diào)用加1或減1子程序 } } service_int0() interrupt 0 using 1 //INT1中斷服務(wù)程序,使用第一組寄存器 { unint i; unchar Port_A; Port_A=PORT_4A8255; //將4口8255A端口的值賦給Port_A for(i=0;i<20000;i++); //延遲去抖

65、 Port_A=~Port_A; //將A端口的值取反來(lái)判斷鍵是否還按下,也可判斷是哪個(gè)鍵按下 if(Port_A) //如果如果確實(shí)有鍵按下 { switch(Port_A) //判斷是哪個(gè)鍵按下,且若多于兩個(gè)鍵同時(shí)按下,視為無(wú)效 { case 0x01: K_Start=1;break; //如果是SA0=1,則 K_Start=1,表示啟動(dòng)按鈕有效 case 0x02: K_Stop=1;break; //如果是SA1

66、=1,則 K_Stop=1,表示停止按鈕有效 case 0x04: K_Water=~K_Water;break; //如果是SA2=1,則 K_Water=1,表示水設(shè)定值按鈕有效 case 0x08: K_Lye=~K_Lye;break; //如果是SA3=1,則 K_Lye=1,表示堿液設(shè)定值按鈕有效 case 0x10: K_Up_Alarm=~K_Up_Alarm;break; //如果是SA4=1,則 K_Up_Alarm=1,表示上限報(bào)警值設(shè)定按鈕有效 case 0x20: K_Down_Alarm=~K_Down_Alarm;break; //如果是SA5=1,則 K_Down_Alarm=1,表示下限報(bào)警值設(shè)定按鈕有效 case 0x40: K_INC=1;break; //如果是SA6=1,則 K_INC=1,表示加1按鈕有效 case 0x80: K_DEC=1;break; //如果是SA7=1,則 K_DEC=1,表示減1按鈕有

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!