《微型計算機控制技術(shù)》課程設(shè)計造紙原料蒸煮過程壓力微機控制系統(tǒng)
《《微型計算機控制技術(shù)》課程設(shè)計造紙原料蒸煮過程壓力微機控制系統(tǒng)》由會員分享,可在線閱讀,更多相關(guān)《《微型計算機控制技術(shù)》課程設(shè)計造紙原料蒸煮過程壓力微機控制系統(tǒng)(33頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 《微型計算機控制技術(shù)》 課 程 設(shè) 計 任 務(wù) 書 學(xué)院:信息工程學(xué)院 班級:自動化0701 姓名: 學(xué)號: 指導(dǎo)老師: 目 錄 一、 設(shè)計題目---------------------------------------------------------------------------------------3 二、 工藝要求---------------------------------------------------------------------------------------3 三、系統(tǒng)的組成和工
2、作原理----------------------------------------------------------------------3 四、硬件電路----------------------------------------------------------------------------------------4 1、壓力變送及A/D轉(zhuǎn)換電路--------------------------------------------------------------4 2、D/A轉(zhuǎn)換及隔離輸出電路----------------------------------
3、----------------------------6 3、顯示電路------------------------------------------------------------------------------------7 4.上下限報警電路---------------------------------------------------------------------------8 5.控制系統(tǒng)的總電路圖-------------------------------------------------------------------8 五、數(shù)字控制器
4、的設(shè)計--------------------------------------------------------------------------9 六、軟件設(shè)計---------------------------------------------------------------------------------------10 1、內(nèi)存地址分配----------------------------------------------------------------------------10 2、主程序流程圖---------------------------
5、------------------------------------------------11 3、定時中斷處理程序流程圖----------------------------------------------------------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è)計總結(jié)--------------------------------------------------------- ----- --- -------------------31 十、參考文獻(xiàn)------------------------
10、---------------------- ------------------------ ---------------31 一、設(shè)計題目 造紙原料蒸煮過程壓力微機控制系統(tǒng) 二、工藝要求 造紙原料蒸煮過程壓力微機控制系統(tǒng) 蒸煮過程是制漿造紙生產(chǎn)中的關(guān)鍵工序之一,對于整個造紙生產(chǎn)過程中紙漿得率和紙的質(zhì)量有很大影響,它要求根據(jù)原料的特點、紙漿的質(zhì)量和生產(chǎn)設(shè)備的實際情況制定出合理的蒸煮工藝,確定裝球量、用堿量、蒸煮溫度和壓力。造紙廠蒸煮車間有五個蒸球,依靠調(diào)節(jié)其進氣量以達(dá)到控制蒸球工作壓力和溫度,調(diào)
11、節(jié)噴料閥控制裝料量。 用微機控制技術(shù)實現(xiàn)該過程的自動控制,要求蒸球的實際工作壓力準(zhǔn)確跟蹤給定壓力曲線。 P1:低壓保壓值,P2:高壓保壓值,T1: 空轉(zhuǎn)時間,T2:升低壓時間,T3:低壓保持時間,T4:升高壓時間,T5:高壓保持時間 裝料控制系統(tǒng)示意圖 三、系統(tǒng)的組成和工作原理 本壓力控制系統(tǒng)的原理框圖如下圖所示 它采用Atmel公司的AT89S51單片機作為控制核心,AT89S51是低功耗的8位CMOS單片機,具有8K字節(jié)在線可編程Flash存儲器,內(nèi)部有帶看門狗。通過其ISP接口
12、線可以方便地在線調(diào)試程序。A/D轉(zhuǎn)換器采用具有8通道輸入的ADC0809。DBY-131型壓力變送器將0-1.28Mpa的壓力信號轉(zhuǎn)換為0-10mA的電流輸出,通過500Ω電阻轉(zhuǎn)化為0-5V的電壓信號供給A/D轉(zhuǎn)換器采樣。單片機定時(預(yù)定值為5s,用戶可根據(jù)實際在調(diào)試時進行修改)依次對5個蒸球的壓力進行采樣。采樣值經(jīng)過內(nèi)部程序數(shù)字濾波后與給定值進行比較(給定值通過程序計算按照用戶給定的壓力曲線變化),得到的偏差信號經(jīng)PID算法程序后輸出8位的閥門控制數(shù)字量。該數(shù)字量經(jīng)D/A轉(zhuǎn)換器AD558轉(zhuǎn)換成0-10V的電壓信號,0-10V的電壓信號再經(jīng)隔離放大器IC ISO1002與工業(yè)現(xiàn)場隔離,輸出4-
13、20mA 的標(biāo)準(zhǔn)電流信號控制蒸汽調(diào)節(jié)閥的開度。當(dāng)蒸球的壓力大于給定值時,偏差信號E=R-C小于零,經(jīng)PID運算后輸出量減小,蒸汽調(diào)節(jié)閥的開度隨之減小,從而使蒸球內(nèi)的壓力降低,重新回到平衡狀態(tài)。通過對PID參數(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的每個輸入通道前對地接有一500Ω的電阻,用于將壓力變送器送來的0~10mA電流信號轉(zhuǎn)換為0~5V的電壓信
14、號,ADC0809八個輸入通道的地址為FE00H~FE07H。單片機執(zhí)行寫總線指令后啟動A/D轉(zhuǎn)換,通過查詢EOC的狀態(tài)判斷轉(zhuǎn)換是否結(jié)束。執(zhí)行讀總線指令后將轉(zhuǎn)換后的數(shù)據(jù)讀入單片機內(nèi)部。 被測壓力與輸出量關(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 來回變差 不大于基本誤差的絕對值 結(jié)構(gòu)形式 現(xiàn)場安裝式 工作條件 環(huán)境溫度:-10~C~55~C 儀表重量 約15Kg 相對濕度 ≤85% 儀表管結(jié)頭螺紋 M201.5/M181.5 工作振動頻率 ≤25Hz ADC0809技術(shù)指標(biāo) 供電電源 單一+5V 模擬量輸入范圍 0-5V 分辨率 8位 最大不可調(diào)誤差 <1LSB 功耗 15mW 轉(zhuǎn)換速度 取決于芯片的時鐘頻率 2、D/A轉(zhuǎn)換及隔離輸出電路 D/A轉(zhuǎn)換器采用8位電壓輸出型D/A轉(zhuǎn)換器DAC0832 DAC0832數(shù)/模轉(zhuǎn)換器的
16、內(nèi)部,具有兩極輸入數(shù)據(jù)緩沖器和一個R-2R T型電阻網(wǎng)絡(luò)。即包括一個數(shù)據(jù)寄存器、DAC 寄存器和D/A轉(zhuǎn)換器三大部分。數(shù)據(jù)寄存器和DAC 寄存器實現(xiàn)兩次緩沖,故在輸出的同時,還可以接收一個數(shù)據(jù),提高了轉(zhuǎn)換速度。當(dāng)多芯片工作時,可用同步信號實現(xiàn)各模擬量的同時輸出。 該器件采用先進的CMOS工藝,功耗低,輸出漏電流誤差小,主要特性有:輸出電流線性度可在滿量程下調(diào)節(jié); 轉(zhuǎn)換時間為1μs;數(shù)據(jù)輸入可采用雙緩沖、單緩沖或直通方式;增益溫度補償為0.02%FS/℃;每次輸入數(shù)字為8 為二進數(shù);功耗為20mW; 邏輯電平與TTL 兼容;單一電源供電,可在5~15V 內(nèi)。DAC0832 可工作在單,雙緩沖
17、器方式。單緩沖器方式即輸入寄存器的信號和DAC 寄存器的信號同時控制,使一個數(shù)據(jù)直接寫入DAC 寄存器。 這種方式適用于只有一路模擬量輸出或幾路模擬量不需要同步輸出的系統(tǒng); 雙緩沖器方式即輸入寄存器的信號和DAC 寄存器的信號分開控制, 這種方式適用于幾路模擬量需要同步輸出的系統(tǒng)。為了提高轉(zhuǎn)換精度,可增加D/A轉(zhuǎn)換器的位數(shù)。 隔離放大器采用ISO1002,ISO系列隔離放大器在同一芯片上提供了電源及信號的隔離,該混合集成芯片在同一芯片上集成了一個磁電耦合DC/DC變換電源及一個 電流/ 電壓輸出的光電耦合隔離放大器。該芯片除為內(nèi)部放大電路供電外,還可向外部輸出一路隔離電壓,供外部電路擴展
18、使用。這一特點可方便地為外部電路基準(zhǔn)電源及外部放大電路或其他用戶應(yīng)用電路供電。輸入及輸出側(cè)寬爬電距離及內(nèi)部隔離措施使該芯片可提供3000VAC絕緣電壓。 ISO系列產(chǎn)品使用非常方便,幾乎無需外部元件,即可實現(xiàn)信號電流源長線傳輸(如圖)。 3.顯示電路 LED顯示器 LED顯示塊是由發(fā)光二極管顯示字段的顯示器件,常使用七段LED。這種顯示塊有共陰極與共陽極兩種接法。N位LED顯示器有N根位選線和8N根段選線。根據(jù)顯示方式不同,位選線與段選線的連接方法不同。段選線控制字符選擇,位選線控制顯示器的亮暗。LED顯示方式有靜態(tài)顯示方式(因其占用 I/O
19、資源較多,故在位數(shù)較多時不采用)和動態(tài)顯示方式,如八位LED動態(tài)顯示電路只需要兩個8位I/O口。其中一個控制段選碼,另一個控制位選碼。由于所有位的段選碼皆由一個I/O控制,因此,在每個瞬間,八位LED只可能顯示相同的字符,必須采用掃描顯示方式。即在每一瞬間只使某一位顯示相應(yīng)字符。在此瞬間,段選控制I/O口輸出相應(yīng)字符段選碼,位選控制I/O口在該顯示位送入選通電平以保證該位顯示相應(yīng)字符。如此輪流,使每位顯示該位應(yīng)顯示字符,并保持延時一段時間,以造成視覺暫留效果。段選、位選碼每送一次后延時1~5ms。 本控制系統(tǒng)的采用8255A進行I/O擴展,而后接LED數(shù)碼管電路加以顯示,各數(shù)碼管含義及電路如
20、圖所示: 4.上下限報警電路 本控制系統(tǒng)的采用8255A進行I/O擴展,報警輸入信號由PA口輸入,由PB口輸出以提示報警及正常工作狀態(tài),電路如圖所示: 5.控制系統(tǒng)的總電路圖 五、數(shù)字控制器的設(shè)計 本設(shè)計采用最小拍隨動系統(tǒng)數(shù)字控制器 因為 所以 (T=0.5s) 所以 ( 式1-1) 由式1-1知,該數(shù)字控制器為最少拍無波紋隨動系統(tǒng)控制。 假設(shè)輸入為單位階躍,取,所以 又取采樣周期T=0.5s, 得 (式1-2) 從而有 由差分方程得控制器輸出為: (式1-3) 最少拍隨動
21、系統(tǒng)的誤差為: 其中分為:1) 堿液設(shè)定值與實際輸出堿液之差 2)水設(shè)定值與實際輸出水之差 因為=1.5 所以 為第k次采樣時實際輸出堿液或?qū)嶋H輸出水 六:軟件設(shè)計 1. 內(nèi)存地址分配 2.主程序流程圖 3.定時中斷處理程序流程圖 4.AD轉(zhuǎn)換自檢程序流程圖 5.DA轉(zhuǎn)換自檢程序流程圖 6.按鍵處理程序流程圖 7.數(shù)字控制器流程圖 七.程序清單 1. 主程序 #include<
22、reg51.h>
#include
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個通道,IN0接液位檢測,INT1接水流量變送
24、器信號,IN2接堿液流量變送器信號 #define DAC0832BUFF XBYTE[0X2000] //DAC轉(zhuǎn)換地址 #define CD4051IN_1 XBYTE[0X3001] //輸出通道1 #define CD4051IN_2 XBYTE[0X3002] //輸出通道2 #define P1 XBYTE[0x5000] //堿液控制手動操作地址 #define P2 XBYTE[0x6000] //水控制手動操作地址 #define Set_water DBYTE
25、[0X60] //定義水設(shè)定值地址 #define Set_lye DBYTE[0X61] //定義堿液設(shè)定值地址 #define Set_up_alarm DBYTE[0X62] //定義上限報警設(shè)定值地址 #define Set_down_alarm DBYTE[0X63] //定義下限報警設(shè)定值地址 #define Real_water DBYTE[0x64] //定義水實際輸出值地址 #define Real_lye DBYTE[0x65] //定義堿液實際輸出值設(shè)定值地址 #define High
26、 DBYTE[0X66] //定義液位高度值地址 #define Water_Sample DBYTE[0x67] //定義水采樣值起始地址,采樣6個值,67H~6CH為存放采樣值地址, #define Lye_Sample DBYTE[0x6D] //定義堿液采樣值起始地址,采樣6個值,6DH~72H為存放采樣值地址 #define High_Sample DBYTE[0x73] //定義液位采樣值起始地址,采樣6個值,73H~78H為存放采樣值地址 unchar code table[]={0x3F,0x06,0x5B,0x4F,
27、0x66,0x6D,0x7D,0x07,0x7F ,0x6F}; //共陰極LED顯示數(shù)字0~9 unint T_count=0; //定義一個定時器定時0.5s計數(shù)單元 unchar sam_count=0; //定義一個采樣數(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++; //指向上限報警設(shè)定值地址 *add_set=90; //上限報警設(shè)定初值為90 addr_set++; //指向下限報警設(shè)定值地址 *add_set=
29、10; //下限報警設(shè)定初值為90 } unchar alarm(unchar height) //越限報警子程序 { if(height>Set_up_alarm) //如果液位高于上限報警值,則報警并顯示,返回1 { PORT_4B8255 =0x84; //上限報警燈亮,電笛響 return 1; } else if(height>Set_down_alarm) //如果液位低于下限報警值,則報警并顯示,返回1 { PORT_4B8255 =0x82; //下限報警燈亮,電笛響 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定時器等 TMOD=0x02; //初始化定時器0,自動重裝入初值工作方式2 TH0=0x38; //初值為56,單片機主頻為12MHz。定時0.5s需要2500個200us TL0=0x38; PT0=1; //置定時器0高優(yōu)先級 ET0=1; //允許定時器0中斷 IT0=1; //IT0=1:置外部中斷0為邊沿觸發(fā)方式 EX0=
32、1; //開放外部中斷0 IT1=1 //IT1=1:置外部中斷1為邊沿觸發(fā)方式 EX1=1; //開放外部中斷1,且EA=1(允許單片機響應(yīng)中斷) EA=1; // EA=1,允許單片機響應(yīng)中斷 PORT_0COM8255=0x8000; //初始化0口8255,其A口,B口 C口均作為輸出(接數(shù)碼管顯示) PORT_4COM8255=0x90; //4口8255初始化,其A口作輸入,其B口作輸出(接鍵盤和指示燈)
33、 set_init();//對水、堿液、上限報警、下限報警各值初始化 Water_sam=Water_Sample; Lye_sam=Lye_Sample; HIGH_sam=High_Sample ; //分別指向各自采樣值地址 if(ROMCheck) //開機檢測ROM是否正常工作 { P1=1; //如果有故障則轉(zhuǎn)到手動操作 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)到手動操作 P2=1; PORT_4B8255; //系統(tǒng)故障顯示燈亮且電笛響 EA=0; //不允許中斷 while(1); //死循環(huán)等待處理 } key(); //調(diào)用鍵盤程序 display(); //調(diào)用數(shù)碼管顯示程序
35、
ADC0809IN_0=1; //啟動A/D轉(zhuǎn)換
TR0=1; //啟動定時器
2.AD轉(zhuǎn)換程序
#include
36、INT1接水流量變送器信號,IN2接堿液流量變送器信號 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; //開放外部中斷1 EA=1; // EA=1,允許單片機響應(yīng)中斷
37、
for(i=0;i 38、1中斷服務(wù)程序,使用第一組寄存器
{ flag=1; //轉(zhuǎn)換結(jié)束標(biāo)志
}
3.標(biāo)度變換程序
#include 39、ude 40、unchar data buffer;
unsigned int SUM=0; //累加值
BUFF=0x67; //指針指向67H
addr=BUFF;
for(j=0;j 41、 for(i=0;i 42、nt 0x7F //設(shè)計數(shù)初值
bit ROMCheck(void)
{
unchar data *x; //設(shè)RAM地址指針
unchar bdata FLAG; //設(shè)檢查標(biāo)識單元
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; //檢查字寫入內(nèi)存單元
if((temp=*(x+j))!=0xAA) //寫入內(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為測量值
{
float data U_0; //設(shè)置U(K)
float data E_0; //設(shè)置E(k)
E_0=Rk-Ck; //計算偏差E(k)
U_0=4*E_1-3.92*E_2+1.92*U_1+0.92*U_2; //最少 45、拍無波紋控制算式
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 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] //定義上限報警設(shè)定值地址
#define Set_down_alarm DBYTE[0X63] //定義下限報警設(shè)定值地址
#define Real_water DBYTE[0x64] //定義水實際輸出值地址
#define Real 48、_lye DBYTE[0x65] //定義堿液實際輸出值設(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; //定義一個位選端
unchar data *addr_pointer; //定義一個指向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è)定值存儲地址
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(); //延時1ms
i++; //準(zhǔn)備顯示低位
Select=Select>>1;
PORT_0A8255=table[(*(addr_pointer+i))%10]; //低位顯示
PORT_0B8255=Select; //輸出位選碼到PB口
delay1ms(); 52、 //延時1ms
}
Select=0x80;
for(i=0;i<6;i++)
{
PORT_0C8255=table[(*(addr_pointer+i))/10]; //高位顯示
PORT_0B8255=Select; //輸出位選碼到PB口
delay1ms(); //延時1ms
i++; 53、 //準(zhǔn)備顯示低位
Select=Select>>1;
PORT_0C8255=table[(*(addr_pointer+i))%10]; //低位顯示
PORT_0B8255=Select; //輸出位選碼到PB口
delay1ms(); //延時1ms
}
}
void dis2_modify(unchar temp, unchar *add) //修改數(shù)碼管子程序
54、 //temp為欲修改顯示某個數(shù)碼管值的位選端,add為指向修改數(shù)碼管的地址
{ unchar i,slct;
slct=temp;
PORT_0A8255 =0x00; //高位停止顯示
PORT_0B8255=temp; //輸出位選碼到PB口
for(i=0;i<100;i++) //循環(huán)來延遲一段足以讓人看出數(shù)碼管閃爍的效果
delay1ms(); / 55、/延時1ms
slct=slct>>1; //選擇下一位
PORT_0A8255 =0x00; //低位停止顯示
PORT_0B8255=slct; //輸出位選碼到PB口
for(i=0;i<100;i++) //循環(huán)來延遲一段足以讓人看出數(shù)碼管閃爍的效果
delay1ms(); //延時1ms
slct=temp;
PORT_0A8255=table[(*add)/1 56、0]; //高位顯示
PORT_0B8255=slct; //輸出位選碼到PB口
for(i=0;i<100;i++) //循環(huán)來延遲一段足以讓人看出數(shù)碼管閃爍的效果
delay1ms(); //延時1ms
slct=slct>>1; //選擇下一位
PORT_0A8255 =table[(*add)%10]; //低位顯示
PORT_0B8255=slct; 57、 //輸出位選碼到PB口
for(i=0;i<100;i++) //循環(huán)來延遲一段足以讓人看出數(shù)碼管閃爍的效果
delay1ms(); //延時1ms
}
void INC_OR_DEC(unchar temp,unchar *add)//加1或減1子程序
//temp為欲修改顯示某個數(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)先級
EX0=1; //開放外部中斷0
EA=1; // EA=1,允許單片機響應(yīng)中斷
PORT_4COM8255=0x90; //4口8255初始化,其A口作輸入,其B口作輸出
if(!K_Start)
{ while(!K_Start)
{
PORT_0B8255=0x2 60、0; //如果啟動按鈕沒有按下,則顯示等待啟動按鈕按下燈,并死循環(huán)等待按下
}
PORT_0B8255=PORT_0B8255&&0xDF;//啟動按鈕按下,則等待啟動信號燈熄滅
}
if(K_Stop) //如果停止按鈕按下,則K_Start清零,等待其再次按下啟動
{ K_Start=0;
while(!K_Start) //如果啟動按鈕沒有按下,則顯示停止信號燈,并且數(shù)碼管顯示停止時的各種值
{
PORT_0B8255=0x10;
display();
}
K_Stop= 61、0; //啟動按鈕按下時,使K_Stop清零
PORT_0B8255=PORT_0B8255&&0xEF;//啟動按鈕按下,則停止信號燈熄滅
}
if(K_Water) //當(dāng)水設(shè)定值鍵按一下,則相應(yīng)兩個數(shù)碼管閃爍以表示需要設(shè)定,當(dāng)水設(shè)定值鍵再按一下,則停止設(shè)定
{
Select=0x80; //水設(shè)定值的數(shù)碼管顯示位選端
addr_pointer=&Set_water; //給指針賦值,指向DATA區(qū)地址60H處,即水設(shè)定值存儲地址
INC_OR_DEC(Select,addr_pointer);
}
if(K_L 62、ye) //當(dāng)堿液設(shè)定值鍵按一下,則相應(yīng)兩個數(shù)碼管閃爍以表示需要設(shè)定,當(dāng)堿液設(shè)定值鍵再按一下,則停止設(shè)定
{
Select=0x20; //堿液設(shè)定值的數(shù)碼管顯示位選端
addr_pointer=&Set_lye; //給指針賦值,指向DATA區(qū)地址60H處,即堿液設(shè)定值存儲地址
INC_OR_DEC(Select,addr_pointer); //調(diào)用加1或減1子程序
}
if(K_Up_Alarm) //當(dāng)上限報警設(shè)定值鍵按一下,則相應(yīng)兩個數(shù)碼管閃爍以表示需要設(shè)定
//當(dāng)上限報警設(shè)定值鍵再按一下,則停止設(shè)定
63、{Select=0x08; //上限報警設(shè)定值的數(shù)碼管顯示位選端
addr_pointer=&Set_lye; //給指針賦值,指向DATA區(qū)地址62H處,即上限報警設(shè)定值存儲地址
INC_OR_DEC(Select,addr_pointer); //調(diào)用加1或減1子程序
}
if(K_Down_Alarm) //當(dāng)下限報警設(shè)定值鍵按一下,則相應(yīng)兩個數(shù)碼管閃爍以表示需要設(shè)定
//當(dāng)下限報警設(shè)定值鍵再按一下,則停止設(shè)定
{Select=0x02; //下限報警設(shè)定值的數(shù)碼管顯示位選端
addr_pointer=&Set_ 64、lye; //給指針賦值,指向DATA區(qū)地址63H處,即下限報警設(shè)定值存儲地址
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端口的值取反來判斷鍵是否還按下,也可判斷是哪個鍵按下
if(Port_A) //如果如果確實有鍵按下
{
switch(Port_A) //判斷是哪個鍵按下,且若多于兩個鍵同時按下,視為無效
{
case 0x01: K_Start=1;break; //如果是SA0=1,則 K_Start=1,表示啟動按鈕有效
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,表示上限報警值設(shè)定按鈕有效
case 0x20: K_Down_Alarm=~K_Down_Alarm;break; //如果是SA5=1,則 K_Down_Alarm=1,表示下限報警值設(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按鈕有
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案