標題:
PROTEUS 雙層卸灰閥仿真
[打印本頁]
作者:
liuda
時間:
2015-1-21 21:31
標題:
PROTEUS 雙層卸灰閥仿真
#include <reg52.h>
#define uchar unsigned char //宏定義uchar為無符型字節(jié)
#define uint unsigned int //宏定義uint為無符型整數(shù)
#define RCOMMAND 0x01 //宏定義讀命令
#define WCOMMAND 0x02 //宏定義寫命令
#define ECOMMAND 0x03 //宏定義擦寫命令
#define WAITTIME 0x01
sfr ISP_DATA=0xe2; //定義數(shù)據(jù)寄存器地址
sfr ISP_ADDRH=0xe3; //定義地址寄存器地址高位
sfr ISP_ADDRL=0xe4; //定義地址寄存器地址低位
sfr ISP_CMD=0xe5; //定義命令寄存器地址
sfr ISP_TRIG=0xe6; //定義觸發(fā)命令地址
sfr ISP_CONTR=0xe7; //定義控制寄存器地址
sbit duan=P1^6 ; //定義段選
sbit wei=P1^7 ; //定義位選
/*指示燈led*/
sbit yx_led=P2^0; //運行燈
sbit jsms_led=P2^1; //計時燈
sbit jsums_led=P2^2; //計數(shù)燈
sbit sgdw_led=P2^3; // 上關到位燈
sbit skdw_led=P2^4; // 上開到位燈
sbit xgdw_led=P2^5; // 下關到位燈
sbit xkdw_led=P2^6; // 下開到位燈
/*按鈕*/
sbit ms_key=P1^0; // 模式按鈕
sbit shang_key=P1^1; // 向上鍵
sbit seding_key=P1^2; // 設定按鈕
sbit qiting_key=P1^3; // 啟停按鈕
sbit xia_key=P1^4; // 向下按鈕
sbit rest_key=P1^5; // 復位按鈕
/*閥門位置信號*/
sbit skdw_in=P3^0; // 上閥開到位信號
sbit sgdw_in=P3^1; // 上閥關到位信號
sbit xkdw_in=P3^2; // 下閥開到位信號
sbit xgdw_in=P3^3; // 下閥關到位信號
/*輸出啟動電機*/
sbit skq=P3^4; // 上閥電機開得電
sbit sgq=P3^5; // 上閥電機關得電
sbit xkq=P3^6; // 下閥電機開得電
sbit xgq=P3^7; // 下閥電機關得電
uchar table[8]; //定義字符數(shù)組存放EEPROM里存的變量,和調(diào)整后存入EEPROM里
uchar ms,shang,xia,seding,qiting,rest,sfk,xfk,xfg,sfg,dj;
uchar jsgz=1,flg,x,err; //計時間隔,計時工作時間 e工作數(shù) fl計時工作開始標志
uchar js_jg=10,js_gz=20,jsu_cs,un,jisu;
char e,jsjg,time,time2=3,flg1,flg2,fqwz,fqwz2=3,sd1,ys,ys1=5,flag3,cbz;
/******************變量名稱***************************
ms 模式狀態(tài) shang按鈕上 xia按鈕下鍵 seding設定鍵值 qiting啟停鍵變量 rest復位鍵變量
sfk上閥開 sfg上閥關 xfk下閥開 xfg下閥關 dj定時器延時標志位
jsgz計時工作 flg計時工作工作時間倒計時減標志位 x閥位連續(xù)開關狀態(tài) err錯誤時用閃爍
e計時工作時間 jsjg計時工作間隔時間 time閥開到位等待進放料時間
time2閥門開到位等待時間存在E2ROM值 flg1閥開到位倒計時標志位 flg2上下閥啟動但位置信號不復位
fqwz上下閥開關啟動多久位置沒變化 fqwz2上下閥開關啟動多久們沒變化設定值
sd1設定有邏輯故障是否繼續(xù)工作 ys測試閥電機得電幾秒鐘沒到位 flag3閥電機得電沒到位標志位倒計時
ys1存EEPROM閥得電幾秒沒到位 js_jg能調(diào)整數(shù)值EEPROM存,賦給值 js_gz能調(diào)整數(shù)值EEPROM存,賦值
jisu計數(shù)倒計數(shù)值 cbz錯標志位復位用
//jisu time2 js_jg js_gz */
/*led數(shù)碼管段選位選*/
uchar code dm[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xd8,0x80,0x90,0xaf,0xa3,0xfb,0xab,0x7f,0x86,0x87};
uchar code wm[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,} ;
/**************毫秒延時函數(shù)*****************/
void delay(unsigned int a)
{
unsigned int i,x;
for(i=0;i<a;i++)
for(x=0;x<110;x++);
}
/*********按鍵掃描函數(shù)************/
void key_scan()
{
// uchar k; //定義變量返回值
ms_key=1; //送高電平到模式位
if(ms_key!=1) //檢測如果不等于高電平
{
delay(5); //延時
if(ms_key!=1)
ms=ms+1; // 確定,計時模0或計數(shù)模式1
if(ms>=2)ms=0;
while(ms_key!=1); //等侍按鍵抬起
}
// else ms=0; //如果還是低電平返回0
if(shang_key!=1) //如果檢測上鍵不是高電平
{
delay(5); // 延時
if(shang_key!=1)
shang=1; //如果上鍵還是低電平返回1
}
else shang=0;
if(seding_key!=1) //如果檢測設定不是高電平
{
delay(5); //延時
if(seding_key!=1)
seding++; //如果檢測設定還是低電平返回1
if(seding>=3)seding=0;
while(seding_key!=1);
}
if(qiting_key!=1) //檢測起動按鈕如果是低電平
{
delay(5); //延時
if(qiting_key!=1)
qiting=1; //如果啟動還是低電平返回1
else qiting=0;
}
if(xia_key!=1) //如果下檢測是低電平
{
delay(5); //延時
if(xia_key!=1)
xia=1; //如果下不是低電平返回1
}
else xia=0;
if(rest_key!=1) //檢測復位按鈕如果是低電平
{
delay(5); //延時
if(rest_key!=1)
rest=1; //如果復位按鈕還是低電平返回1
else rest=0;
}
}
/********閥門位置掃描***********/
void fmwz()
{
if(skdw_in!=1) // 測試如果上閥在開的位置
{
delay(5); //延時
if(skdw_in!=1)
sfk=1; //上閥如果真的在開的位置SF復位0
}
else sfk=0;
if(sgdw_in!=1) // 測試如果上閥在關的位置
{
delay(5); //延時
if(sgdw_in!=1)
sfg=1; //上閥如果真的在關的位置SF置位1
}
else sfg=0;
if(xkdw_in!=1) //測試如果下閥在開的位置
{
delay(5); //延時
if(xkdw_in!=1)
xfk=1; //如果下閥還在開的位置,復位XF為0
}
else xfk=0;
if(xgdw_in!=1) // 測試如果下閥在關的位置
{
delay(5); //延時
if(xgdw_in!=1)
xfg=1;
//如果下閥還是在關位置,置XF為1
}
else xfg=0;
}
/************閥門位置指示燈****************************/
void fled()
{
sgdw_led=!sfg; //上閥在關的位置,上關到位燈亮
skdw_led=!sfk; //上閥在開的位置,上開到位燈亮
xgdw_led=!xfg; //下閥在關的位置,下關到位燈亮
xkdw_led=!xfk; //下閥在開的位置,下開到位燈亮
if(ms) //如果模式是不是0
{
jsums_led=0; //計數(shù)LED燈亮
jsms_led=1; //計時模式LED燈滅
}
else //如果模式是0
{
jsms_led=0; //計時LED燈亮
jsums_led=1; //計數(shù)LED燈滅
}
}
/****************顯示數(shù)碼管函數(shù)*********************/
void display(uchar a,uchar b)
{
duan=1; //開段選
P0=dm[a]; //段碼給P0口
duan=0; //關段選
wei=1; //開位選
P0=wm[b]; //位碼給P0口
wei=0; //關位選
P0=0xff; //消隱
delay(2);
}
/**************ISP使能**********************************/
void enable()
{ //關閉總中斷
EA=0;
ISP_CONTR=ISP_CONTR|WAITTIME; //寫入硬件等待時間
ISP_CONTR|=0x80; //啟動ISP
}
/***************ISP 禁止*******************************/
void disable()
{
ISP_CONTR=ISP_CONTR&0x7f; //關閉ISP
ISP_TRIG=0x00; //清0
EA=1; //開總中斷
}
/*******************觸發(fā)********************************/
void goon()
{
enable();
ISP_TRIG|=0x46;
ISP_TRIG|=0xb9;
}
/******************讀一個字節(jié)**************************/
uchar read_byte(uint a)
{
ISP_ADDRH=(uchar)((a>>8)|ISP_ADDRH); //地址高位寫入
ISP_ADDRL=(uchar)(a|0x00ff); //地址低位寫入
ISP_CMD=ISP_CMD&0xf8; //清低3位
ISP_CMD=ISP_CMD|RCOMMAND; //寫入讀命令
goon(); //觸發(fā)
disable(); //關閉
return ISP_DATA; //返回讀出數(shù)據(jù)
}
/*****************寫一個字節(jié)****************************/
void write_byte(uint b,uchar c)
{
ISP_ADDRH=(uchar)((b>>8)|ISP_ADDRH); //賦值地址高位
ISP_ADDRL=(uchar)(b|0x00ff); //賦值地址低位
ISP_CMD=ISP_CMD&0xf8; //清低3位
ISP_CMD=ISP_CMD|WCOMMAND; //寫入寫命令
goon(); //觸發(fā)
// disable(); //關閉
ISP_DATA=c; //把要寫入字節(jié)賦給寄存器
}
/******************擦除扇區(qū)*****************************/
void sector_erase(uint a)
{
ISP_ADDRH=(uchar)((a>>8)|ISP_ADDRH); //賦值地址高位
ISP_ADDRL=0; //賦值低位
ISP_CMD=ISP_CMD&0xf8; //清低3位
ISP_CMD=ISP_CMD|ECOMMAND; //寫入擦除命令
goon(); //觸發(fā)
disable(); //關閉
}
/*******************寫入調(diào)整好的數(shù)值數(shù)組到EEPROM******************/
void write()
{
uchar *pa=0x2000; //定義指針變量地址是2000
uchar x,y;
table[0]=js_gz; //計時工作工作時間 (e)
table[1]=js_jg; //計時間隔數(shù)值 (jsjg)
table[2]=jisu; //計數(shù)數(shù)值 (jisu)
table[3]=time2; //閥門開到位待待進,放料時間 (time)
table[4]=ys1; //電機得電檢測沒到位時間 (ys)
table[5]=fqwz2; //電機啟動檢測沒離開位置時間 (fqwz)
sector_erase(pa); //擦除2000地址扇區(qū)
for(x=0;x<8;x++) //循環(huán)
{
write_byte(pa+x,table[x]); //把數(shù)組寫入EEPROM里
}
disable(); //關ISP
}
/***********開機初始化閥門回關位置顯示INI**************/
void initia()
{
uchar a=4,x; //定義延時變量
uchar *pa=0x2000; //定義指針變量并賦值為2000
P3=0x0f; //把P3口初化下
for(x=0;x<8;x++) //循環(huán)
{
table[x]=read_byte(pa+x); //讀出EEPROM 2000以后連續(xù)數(shù)賦給數(shù)組
}
js_gz=table[0]; //把讀出來數(shù)賦給計時工作變量
js_jg=table[1]; //把讀出來數(shù)賦給計時間隔變量
jisu=table[2]; //把讀出來數(shù)賦給計數(shù)變量
time2=table[3]; //把讀出來數(shù)賦給閥開到位進,放料等待變量
ys1=table[4]; //把讀出來數(shù)賦給檢測電機得電多久沒到位變量
// fqwz2=table[5]; //把讀出來數(shù)賦給檢測電機得電多久位置沒動變量
fqwz2=5;//臨時測試
while(a|((sfg&xfg)!=1)) //如果延時和上閥關下閥關都等于1
{
fmwz(); //檢測閥門位置
fled(); //閥門位置LED
if(dj)a--; //閥門延時變量4秒--
display(12,5); //顯示I
display(13,4); //顯示N
display(12,3); //顯示I
if(sfg!=1)sgq=1; //如果上閥沒在關的位置,啟動關上閥電機
else sgq=0; //或者上閥關電機停
if(xfg!=1)xgq=1; //如果下閥沒在關的位置,啟協(xié)關下閥電機
else xgq=0; //或者下閥關電機停
}
}
/********************顯示錯誤碼Error****************/
void error()
{
display(15,6); //顯示字符E
display(10,5); //顯示字符R
display(10,4); //顯示字符R
display(11,3); //顯示字符O
display(10,2); //顯示字符R
cbz=1; //錯誤標志位
// display(0xff,0x08); //全部不顯示
// delay(60); //延時
}
/************掃描錯閥位置邏輯錯誤*****************/
void scan_error()
{
if(sfk&sfg) error(); //如果上閥開,關到位信號同時來顯示錯誤
if(xfk&xfg) error(); //如果下閥開,關到位信號同時來顯示錯誤
if(skq) //上閥開電機啟動
{
flag3=1; //置標志位FLAG3為1
if(sfk&(ys>0))flag3=0; //如果上閥在開位和倒計時大于0成立,清FLAG3為0
while(!sfk&(ys==0)) //如果過了設定延時,上開位還沒到進行死循環(huán)
{
error(); //顯示錯誤碼
if(err)skdw_led=~skdw_led; //上閥開到位LED燈閃爍
skq=0; //關開上閥電機
ys=0; //延時賦0
if(!sfg)sgq=1; //如果上閥沒在關的位置,關上閥電機啟動
else sgq=0; //或在關位置,停關上閥電機
if(!xfg)xgq=1; //如果下閥沒在關的位置,下閥關電機啟動
else xgq=0; //或者關下閥電機停止
}
}
if(sgq) //上閥關電機啟動
{
flag3=1; //置標志位FLAG3為1
if(sfg&(ys>0))flag3=0; //如果上閥在關位和倒計時大于0成立,清FLAG3為0
while(!sfg&(ys==0)) //如果過了設定延時,上關位還沒到進行死循環(huán)
{
error(); //顯示錯誤碼
if(err)sgdw_led=~sgdw_led; //上閥關到位LED燈閃爍
sgq=0; //關上閥電機停
ys=0; //延時賦0
if(!sfg)sgq=1; //如果上閥沒在關的位置,關上閥電機啟動
else sgq=0; //或在關位置,停關上閥電機
if(!xfg)xgq=1; //如果下閥沒在關的位置,下閥關電機啟動
else xgq=0; //或者關下閥電機停止
}
}
if(xkq) //下閥開電機啟動
{
flag3=1; //置標志位FLAG3為1
if(xfk&(ys>0))flag3=0; //如果下閥在開位和倒計時大于0成立,清FLAG3為0
if(xfk&(ys>0))flag3=0; //如果下閥在開位和倒計時大于0成立,清FLAG3為0
while(!xfk&(ys==0)) //如果過了設定延時,下開位還沒到進行死循環(huán)
{
error(); //顯示錯誤碼
if(err)xkdw_led=~xkdw_led; //下閥開到位LED燈閃爍
xkq=0; //關開下閥電機
ys=0; //延時賦0
if(!sfg)sgq=1; //如果上閥沒在關的位置,關上閥電機啟動
else sgq=0; //或在關位置,停關上閥電機
if(!xfg)xgq=1; //如果下閥沒在關的位置,下閥關電機啟動
else xgq=0; //或者關下閥電機停止
}
}
if(xgq) //下閥關電機啟動
{
flag3=1; //置標志位FLAG3為1
if(xfg&(ys>0))flag3=0; //如果下閥在關位和倒計時大于0成立,清FLAG3為0
while(!xfg&(ys==0)) //如果過了設定延時,下關位還沒到進行死循環(huán)
{
error(); //顯示錯誤碼
if(err)xgdw_led=~xgdw_led; //下閥關到位LED燈閃爍
xgq=0; //下關閥電機停
ys=0; //延時賦0
if(!sfg)sgq=1; //如果上閥沒在關的位置,關上閥電機啟動
else sgq=0; //或在關位置,停關上閥電機
if(!xfg)xgq=1; //如果下閥沒在關的位置,下閥關電機啟動
else xgq=0; //或者關下閥電機停止
}
}
if(skq) //如果上閥開電機得電,
{
flg2=1; //置倒計時標志位為1
if(sfk)flg2=0; //如果上閥在開位置,倒計時標志位清0
else //如果上閥沒在開的位置
{
if((fqwz==0)&sfg) //倒計時數(shù)等于0時間到,上閥還在關的位置
{ sd1=1;
while(sd1) //如果設定數(shù)為(內(nèi)參)進行循環(huán)顯示錯誤碼
{
error(); //錯誤函數(shù)
if(err)sgdw_led=~sgdw_led; //上關到位LED燈閃爍
skq=0; //關上閥開電機
}
// if(err)sgdw_led=~sgdw_led; //如果設定(內(nèi)參)為0只上關到位LED閃顯示
}
}
}
if(sgq) //如果上閥關電機得電,
{
flg2=1; //置倒計時標志位為1
if(sfg)flg2=0; //如果上閥在關位置,倒計時標志位清0
else //如果上閥沒在關的位置
if((fqwz==0)&sfk) //倒計時數(shù)等于0時間到,上閥還在開的位置
{ sd1=1;
while(sd1) //如果設定數(shù)為(內(nèi)參)進行循環(huán)顯示錯誤碼
{
error(); //錯誤函數(shù)
if(err)skdw_led=~skdw_led; //上開到位LED燈閃爍
sgq=0; //關上閥關電機
}
// if(err)skdw_led=~skdw_led; //如果設定(內(nèi)參)為0只上開到位LED閃顯示
}
}
if(xkq) //如果下閥開電機得電,
{
flg2=1; //置倒計時標志位為1
if(xfk)flg2=0; //置倒計時標志位為1
else if((fqwz==0)&xfg) //倒計時數(shù)等于0時間到,下閥還在關的位置
{ sd1=1;
while(sd1) //如果設定數(shù)為(內(nèi)參)進行循環(huán)顯示錯誤碼
{
error(); //錯誤函數(shù)
if(err)xgdw_led=~xgdw_led; //下關到位LED燈閃爍
xkq=0; //關下閥關電機
}
// if(err)xgdw_led=~xgdw_led; //如果設定(內(nèi)參)為0只下關到位LED閃顯示
}
}
if(xgq) //如果下閥關電機得電,
{
flg2=1; //置倒計時標志位為1
if(xfg)flg2=0; //置倒計時標志位為1
else if((fqwz==0)&xfk) //倒計時數(shù)等于0時間到,下閥還在開的位置
{ sd1=1;
while(sd1) //如果設定數(shù)為(內(nèi)參)進行循環(huán)顯示錯誤碼
{
error(); //錯誤函數(shù)
if(err)xkdw_led=~xkdw_led; //下開到位LED燈閃爍
skq=0;
} //關下閥開電機
// if(err)xkdw_led=~xkdw_led; //如果設定(內(nèi)參)為0只下開到位LED閃顯示
}
}
}
/*************待機狀態(tài)*************/
void jsdaiji()
{
uchar a,b,c,d;
a=js_jg/10; //計時間隔十位
b=js_jg%10; //計時間隔個位
c=js_gz/10;
d=js_gz%10;
if(dj) //如果變量DJ等于1
{
display(10,7); //顯示R字符
display(a,2); //顯示間隔數(shù)字十位
display(b,1); //顯示間隔數(shù)字個位
}
else //或者變量DJ等于0
{
display(11,7);
display(c,2); //顯示工作時間0
display(d,1); //顯示工作時間
}
}
/**********計時工作運行函數(shù)***************/
void jsigzuo()
{
uchar a,b,c,d;
yx_led=0; //運行燈點亮
a=jsjg/10; //計時間隔十位
b=jsjg%10; //計時間隔個位
c=e/10;
d=e%10;
if(e<1) //計時工作倒計時小于1,計時間隔開始工作
{
flg=0; //計時工作減標志位置0
if(jsjg==0) //如果計時間隔數(shù)值倒計時為0
{
e=js_gz; //把計時工作時間重新賦給E
TR1=0; //關閉定時器1,停止計時間隔倒計時
}
if(dj)display(10,7); //每隔一秒閃一次顯示間隔字符
display(14,7); //點小數(shù)點
display(a,2); //顯示間隔時間
display(b,1); //顯示間隔時間
if(xfg&sfg) //工作模式工作沒完成,上下閥都在關
{
skq=0; //開上閥電機停
xkq=0; //開下閥電機停
sgq=0; //關上閥電機停
xgq=0; //關下閥電機停
}
else
{
switch(x)
{
case 0: //狀態(tài)等于0執(zhí)行上閥開動作
{ if(sfk==0)skq=1; //如果上閥沒要開位,上開閥電機得電啟動
else
{
skq=0; //或者上開閥電機停
flg1=1; //閥開到位倒計時標志位
if(time==1)x=1; //改狀態(tài)為1 //上閥開到位,等待時間到
}
} break;
case 1: //如果狀態(tài)是1執(zhí)行上閥關
{
flg1=0; //閥開到位倒計時標志位
sgq=1; //上閥關電機啟動
if(sfg==1) //如果上閥關到位,上閥電機停
{
sgq=0; //上閥關電機啟動
x=3; //改狀態(tài)為3
}
} break;
case 3: //如果狀態(tài)為3執(zhí)行下閥開電機啟動
{
if(xfk==0)xkq=1; //如果下閥沒開到位下開電機得電
else
{
xkq=0; //或下閥開到位,下閥開電機停
flg1=1; //閥開到位倒計時標志位
if(time==1)x=4; //等待時間到改狀態(tài)字為4
}
}
break;
case 4: //狀態(tài)字為4執(zhí)行下閥關
{
flg1=0; //閥開到位倒計時標志位
if(xfk==1) xgq=1; //如果狀態(tài)為4下閥關電機啟動
if(xfg==1) // 如果下閥到關位置,
{
xgq=0; //下閥關電機停
// z=0;
x=0; //狀態(tài)字改為0
}
}break;
}
}
}
if(e>=1) //計時工鐵倒計時小于等于1,開始工作
{
flg=1; //置計時工作減標志為1
if(dj)display(11,7); //每隔一秒閃一次顯示工作字符
display(14,7);
display(c,2);
display(d,1); //顯示工作時間
if(e==1) //如果計時工作變量倒計時等于1
{
jsjg=js_jg; //重新給計時間隔賦值
TR1=1; //開定時器1,啟動計時間隔減
}
switch(x)
{
case 0: //狀態(tài)等于0執(zhí)行上閥開動作
{ if(sfk==0)skq=1; //如果上閥沒要開位,上開閥電機得電啟動
else
{
skq=0; //或者上開閥電機停
flg1=1; //閥開到位倒計時標志位
if(time==1)x=1; //改狀態(tài)為1 //上閥開到位,等待時間到
}
} break;
case 1: //如果狀態(tài)是1執(zhí)行上閥關
{
flg1=0; //閥開到位倒計時標志位
sgq=1; //上閥關電機啟動
if(sfg==1) //如果上閥關到位,上閥電機停
{
sgq=0; //上閥關電機啟動
x=3; //改狀態(tài)為3
}
} break;
case 3: //如果狀態(tài)為3執(zhí)行下閥開電機啟動
{
if(xfk==0)xkq=1; //如果下閥沒開到位下開電機得電
else
{
xkq=0; //或下閥開到位,下閥開電機停
flg1=1; //閥開到位倒計時標志位
if(time==1)x=4; //等待時間到改狀態(tài)字為4
}
}
break;
case 4: //狀態(tài)字為4執(zhí)行下閥關
{
flg1=0; //閥開到位倒計時標志位
if(xfk==1) xgq=1; //如果狀態(tài)為4下閥關電機啟動
if(xfg==1) // 如果下閥到關位置,
{
xgq=0; //下閥關電機停
// z=0;
x=0; //狀態(tài)字改為0
}
}break;
}
}
}
/*****************計數(shù)待機模式********************/
void jsudaiji()
{
uchar a,b;
a=jisu/10;
b=jisu%10;
display(16,7); //顯示倒計數(shù)字符
display(a,2); //顯示倒計數(shù)字十位
display(b,1); //顯示倒計數(shù)數(shù)字個位
}
/****************計數(shù)模式運行函數(shù)*****************/
void jsugzuo()
{
uchar a,b,c,d;
a=jisu/10;
b=jisu%10;
yx_led=0; //運行燈點亮
if(dj)display(16,7); //顯示倒計數(shù)字符
display(c,2); //顯示倒計數(shù)字十位
display(d,1); //顯示倒計數(shù)數(shù)字個位
}
/************計時計數(shù)工作模式數(shù)值調(diào)整************/
void jstz()
{
uchar a,b,c,d,e,f;
if((ms==0)&(~qiting)&(seding==1)) //如果工作在計時待機模式,調(diào)整間隔數(shù)值
{
a=js_jg/10;
b=js_jg%10;
display(10,7); //顯示R字符
if(dj) //如果T0里計時變量DJ是1
{
display(a,2); //顯示間隔數(shù)字十位
display(b,1); //顯示間隔數(shù)字個位
}
if(shang)js_jg++; //如果上按鍵按下,計時間隔變量加1
if(xia)js_jg--; //如果下按鍵按下,計時間隔變量減1
while(shang|xia) //檢測等待上,下按鍵抬起
{
key_scan(); //循環(huán)掃描按鍵
}
}
if((ms==0)&(~qiting)&(seding==2)) //如果工作在計時待機模式,調(diào)整計時工作數(shù)值
{
c=js_gz/10;
d=js_gz%10;
display(11,7); //顯示o字符
if(dj) //如果T0里計時變量DJ是1
{
display(c,2); //顯示間隔數(shù)字十位
display(d,1); //顯示間隔數(shù)字個位
}
if(shang)js_gz++; //如果上按鍵按下,計時工作變量加1
if(xia)js_gz--; //如果下按鍵按下,計時工作變量減1
while(shang|xia) //等待上,下按鍵抬起
{
key_scan(); //循環(huán)掃按鍵
}
write(); //把修改后數(shù)值寫入EEPROM
}
if((ms==1)&(~qiting)&(seding==1))//如果工作在計數(shù)待機模式,調(diào)整計數(shù)數(shù)值
{
e=jisu/10;
f=jisu%10;
display(16,7); //顯示倒計數(shù)字符
if(dj)
{
display(e,2); //顯示倒計數(shù)字十位
display(f,1); //顯示倒計數(shù)數(shù)字個位
}
if(shang)jisu++; //如果上按鍵按下,計數(shù)變量加1
if(xia)jisu--; //如果下按鍵按下,計數(shù)變量減1
while(shang|xia) //檢測等待上,下按鍵抬起
{
key_scan(); //循環(huán)掃描按鍵
}
write(); //把修改后數(shù)值寫入EEPROM
}
}
/*********定時器0初始化***********/
void initime0()
{
TMOD=0X11; //開啟定時器0
TH0=(65536-45782)/256; //裝初值
TL0=(65536-45782)%256; //裝初值
TH1=(65536-45782)/256;
TH0=(65536-45782)%256;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
ET1=1;
TR0=1;
TR1=1; //啟動定時器0
time=time2; //閥門開到位等待時間賦值
ys=ys1; //閥門電機得電多久沒到位時間賦值
}
/****************計時,計數(shù)變量賦值*******************/
void fz()
{
}
void main()
{
// uchar d ,c; //定義變量
initime0(); //定時器初始化
initia(); //開機初始化
while(1) //大循環(huán)
{
fmwz(); //閥門位置
fled(); //閥門位置燈
key_scan(); //鍵盤掃描
if(cbz&rest)ISP_CONTR=0x20; //如果有錯誤復位按鍵按下
// if((sfk&sfg)||(xfk&xfg)) //如果閥門位置有邏輯錯誤
scan_error(); //檢測閥位置邏輯錯誤
// else
{
jstz(); //計時數(shù)值調(diào)整函數(shù)
if((qiting==0)&(ms==0)&(seding==0)) //啟停按鈕,模式,設定都是0,執(zhí)行待機程序
{
jsdaiji(); //計時待機
jsjg=js_jg; //把設定的好的計時間隔時間傳遞給計時間隔變量
e=js_gz;
}
if(qiting&(ms==0)) //啟停按鈕和計時模式都是1,執(zhí)行計時程序
{
jsigzuo(); //計時工作函數(shù)
}
if((qiting==0)&(ms==1))jsudaiji(); //如果啟停按鈕和計數(shù)模式都是1,執(zhí)行計數(shù)程序
if(qiting&(ms==1)) jsugzuo(); //計數(shù)工作函數(shù)
}
}
}
/**********定時器0中斷函數(shù)***************/
void time0()interrupt 1
{
static a,er; //定義靜態(tài)變量A
TH0=(65536-45872)/256; //重新裝初值
TL0=(65536-45872)%256;
a++; //變量A加1
er++;
if(er>=30)
{
er=0;
err=~err; //錯誤顯示如果ER變量中斷大于等于30次
}
if(a>=20) //如果計滿大于等于20次次
{
a=0; //A清0
if(flg1)time--; //閥門開到位等待標志位是1,倒計時減1
else time=time2; //如果閥門開到位標志位是0,重新把設定值賦給
if(flag3)ys--; //如果閥電機得電標志位,幾秒沒到是1延時變量值減1
else ys==ys1 ; //如果是0重新賦值
dj=~dj; //變量DJ取反
if(flg) //如果計時工作變量標志是1
{
e--; //計時工作變量E減1
}
if(flg2)fqwz--;
else fqwz=fqwz2;
}
}
/**********定時器1中斷函數(shù)****************/
void time1()interrupt 3
{
static b;
TH1=(65536-45782)/256;
TL1=(65536-45782)%256;
b++; //中斷一次B增加1
if(b>=20) //如果中斷20次就是一秒
{
b=0; //變量賦0
jsjg--; //計時間隔變量減1
}
}
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1