标题:
PROTEUS 双层卸灰阀仿真
[打印本页]
作者:
liuda
时间:
2015-1-21 21:31
标题:
PROTEUS 双层卸灰阀仿真
#include <reg52.h>
#define uchar unsigned char //宏定义uchar为无符型字节
#define uint unsigned int //宏定义uint为无符型整数
#define RCOMMAND 0x01 //宏定义读命令
#define WCOMMAND 0x02 //宏定义写命令
#define ECOMMAND 0x03 //宏定义擦写命令
#define WAITTIME 0x01
sfr ISP_DATA=0xe2; //定义数据寄存器地址
sfr ISP_ADDRH=0xe3; //定义地址寄存器地址高位
sfr ISP_ADDRL=0xe4; //定义地址寄存器地址低位
sfr ISP_CMD=0xe5; //定义命令寄存器地址
sfr ISP_TRIG=0xe6; //定义触发命令地址
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; //计数灯
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]; //定义字符数组存放EEPROM里存的变量,和调整后存入EEPROM里
uchar ms,shang,xia,seding,qiting,rest,sfk,xfk,xfg,sfg,dj;
uchar jsgz=1,flg,x,err; //计时间隔,计时工作时间 e工作数 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 模式状态 shang按钮上 xia按钮下键 seding设定键值 qiting启停键变量 rest复位键变量
sfk上阀开 sfg上阀关 xfk下阀开 xfg下阀关 dj定时器延时标志位
jsgz计时工作 flg计时工作工作时间倒计时减标志位 x阀位连续开关状态 err错误时用闪烁
e计时工作时间 jsjg计时工作间隔时间 time阀开到位等待进放料时间
time2阀门开到位等待时间存在E2ROM值 flg1阀开到位倒计时标志位 flg2上下阀启动但位置信号不复位
fqwz上下阀开关启动多久位置没变化 fqwz2上下阀开关启动多久们没变化设定值
sd1设定有逻辑故障是否继续工作 ys测试阀电机得电几秒钟没到位 flag3阀电机得电没到位标志位倒计时
ys1存EEPROM阀得电几秒没到位 js_jg能调整数值EEPROM存,赋给值 js_gz能调整数值EEPROM存,赋值
jisu计数倒计数值 cbz错标志位复位用
//jisu time2 js_jg js_gz */
/*led数码管段选位选*/
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,} ;
/**************毫秒延时函数*****************/
void delay(unsigned int a)
{
unsigned int i,x;
for(i=0;i<a;i++)
for(x=0;x<110;x++);
}
/*********按键扫描函数************/
void key_scan()
{
// uchar k; //定义变量返回值
ms_key=1; //送高电平到模式位
if(ms_key!=1) //检测如果不等于高电平
{
delay(5); //延时
if(ms_key!=1)
ms=ms+1; // 确定,计时模0或计数模式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; //计数LED灯亮
jsms_led=1; //计时模式LED灯灭
}
else //如果模式是0
{
jsms_led=0; //计时LED灯亮
jsums_led=1; //计数LED灯灭
}
}
/****************显示数码管函数*********************/
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; //开总中断
}
/*******************触发********************************/
void goon()
{
enable();
ISP_TRIG|=0x46;
ISP_TRIG|=0xb9;
}
/******************读一个字节**************************/
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(); //触发
disable(); //关闭
return ISP_DATA; //返回读出数据
}
/*****************写一个字节****************************/
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(); //触发
// disable(); //关闭
ISP_DATA=c; //把要写入字节赋给寄存器
}
/******************擦除扇区*****************************/
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(); //触发
disable(); //关闭
}
/*******************写入调整好的数值数组到EEPROM******************/
void write()
{
uchar *pa=0x2000; //定义指针变量地址是2000
uchar x,y;
table[0]=js_gz; //计时工作工作时间 (e)
table[1]=js_jg; //计时间隔数值 (jsjg)
table[2]=jisu; //计数数值 (jisu)
table[3]=time2; //阀门开到位待待进,放料时间 (time)
table[4]=ys1; //电机得电检测没到位时间 (ys)
table[5]=fqwz2; //电机启动检测没离开位置时间 (fqwz)
sector_erase(pa); //擦除2000地址扇区
for(x=0;x<8;x++) //循环
{
write_byte(pa+x,table[x]); //把数组写入EEPROM里
}
disable(); //关ISP
}
/***********开机初始化阀门回关位置显示INI**************/
void initia()
{
uchar a=4,x; //定义延时变量
uchar *pa=0x2000; //定义指针变量并赋值为2000
P3=0x0f; //把P3口初化下
for(x=0;x<8;x++) //循环
{
table[x]=read_byte(pa+x); //读出EEPROM 2000以后连续数赋给数组
}
js_gz=table[0]; //把读出来数赋给计时工作变量
js_jg=table[1]; //把读出来数赋给计时间隔变量
jisu=table[2]; //把读出来数赋给计数变量
time2=table[3]; //把读出来数赋给阀开到位进,放料等待变量
ys1=table[4]; //把读出来数赋给检测电机得电多久没到位变量
// fqwz2=table[5]; //把读出来数赋给检测电机得电多久位置没动变量
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; //如果下阀没在关的位置,启协关下阀电机
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)) //如果过了设定延时,上开位还没到进行死循环
{
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)) //如果过了设定延时,上关位还没到进行死循环
{
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)) //如果过了设定延时,下开位还没到进行死循环
{
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)) //如果过了设定延时,下关位还没到进行死循环
{
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) //倒计时数等于0时间到,上阀还在关的位置
{ sd1=1;
while(sd1) //如果设定数为(内参)进行循环显示错误码
{
error(); //错误函数
if(err)sgdw_led=~sgdw_led; //上关到位LED灯闪烁
skq=0; //关上阀开电机
}
// if(err)sgdw_led=~sgdw_led; //如果设定(内参)为0只上关到位LED闪显示
}
}
}
if(sgq) //如果上阀关电机得电,
{
flg2=1; //置倒计时标志位为1
if(sfg)flg2=0; //如果上阀在关位置,倒计时标志位清0
else //如果上阀没在关的位置
if((fqwz==0)&sfk) //倒计时数等于0时间到,上阀还在开的位置
{ sd1=1;
while(sd1) //如果设定数为(内参)进行循环显示错误码
{
error(); //错误函数
if(err)skdw_led=~skdw_led; //上开到位LED灯闪烁
sgq=0; //关上阀关电机
}
// if(err)skdw_led=~skdw_led; //如果设定(内参)为0只上开到位LED闪显示
}
}
if(xkq) //如果下阀开电机得电,
{
flg2=1; //置倒计时标志位为1
if(xfk)flg2=0; //置倒计时标志位为1
else if((fqwz==0)&xfg) //倒计时数等于0时间到,下阀还在关的位置
{ sd1=1;
while(sd1) //如果设定数为(内参)进行循环显示错误码
{
error(); //错误函数
if(err)xgdw_led=~xgdw_led; //下关到位LED灯闪烁
xkq=0; //关下阀关电机
}
// if(err)xgdw_led=~xgdw_led; //如果设定(内参)为0只下关到位LED闪显示
}
}
if(xgq) //如果下阀关电机得电,
{
flg2=1; //置倒计时标志位为1
if(xfg)flg2=0; //置倒计时标志位为1
else if((fqwz==0)&xfk) //倒计时数等于0时间到,下阀还在开的位置
{ sd1=1;
while(sd1) //如果设定数为(内参)进行循环显示错误码
{
error(); //错误函数
if(err)xkdw_led=~xkdw_led; //下开到位LED灯闪烁
skq=0;
} //关下阀开电机
// if(err)xkdw_led=~xkdw_led; //如果设定(内参)为0只下开到位LED闪显示
}
}
}
/*************待机状态*************/
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); //显示间隔数字十位
display(b,1); //显示间隔数字个位
}
else //或者变量DJ等于0
{
display(11,7);
display(c,2); //显示工作时间0
display(d,1); //显示工作时间
}
}
/**********计时工作运行函数***************/
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) //如果计时间隔数值倒计时为0
{
e=js_gz; //把计时工作时间重新赋给E
TR1=0; //关闭定时器1,停止计时间隔倒计时
}
if(dj)display(10,7); //每隔一秒闪一次显示间隔字符
display(14,7); //点小数点
display(a,2); //显示间隔时间
display(b,1); //显示间隔时间
if(xfg&sfg) //工作模式工作没完成,上下阀都在关
{
skq=0; //开上阀电机停
xkq=0; //开下阀电机停
sgq=0; //关上阀电机停
xgq=0; //关下阀电机停
}
else
{
switch(x)
{
case 0: //状态等于0执行上阀开动作
{ if(sfk==0)skq=1; //如果上阀没要开位,上开阀电机得电启动
else
{
skq=0; //或者上开阀电机停
flg1=1; //阀开到位倒计时标志位
if(time==1)x=1; //改状态为1 //上阀开到位,等待时间到
}
} break;
case 1: //如果状态是1执行上阀关
{
flg1=0; //阀开到位倒计时标志位
sgq=1; //上阀关电机启动
if(sfg==1) //如果上阀关到位,上阀电机停
{
sgq=0; //上阀关电机启动
x=3; //改状态为3
}
} break;
case 3: //如果状态为3执行下阀开电机启动
{
if(xfk==0)xkq=1; //如果下阀没开到位下开电机得电
else
{
xkq=0; //或下阀开到位,下阀开电机停
flg1=1; //阀开到位倒计时标志位
if(time==1)x=4; //等待时间到改状态字为4
}
}
break;
case 4: //状态字为4执行下阀关
{
flg1=0; //阀开到位倒计时标志位
if(xfk==1) xgq=1; //如果状态为4下阀关电机启动
if(xfg==1) // 如果下阀到关位置,
{
xgq=0; //下阀关电机停
// z=0;
x=0; //状态字改为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: //状态等于0执行上阀开动作
{ if(sfk==0)skq=1; //如果上阀没要开位,上开阀电机得电启动
else
{
skq=0; //或者上开阀电机停
flg1=1; //阀开到位倒计时标志位
if(time==1)x=1; //改状态为1 //上阀开到位,等待时间到
}
} break;
case 1: //如果状态是1执行上阀关
{
flg1=0; //阀开到位倒计时标志位
sgq=1; //上阀关电机启动
if(sfg==1) //如果上阀关到位,上阀电机停
{
sgq=0; //上阀关电机启动
x=3; //改状态为3
}
} break;
case 3: //如果状态为3执行下阀开电机启动
{
if(xfk==0)xkq=1; //如果下阀没开到位下开电机得电
else
{
xkq=0; //或下阀开到位,下阀开电机停
flg1=1; //阀开到位倒计时标志位
if(time==1)x=4; //等待时间到改状态字为4
}
}
break;
case 4: //状态字为4执行下阀关
{
flg1=0; //阀开到位倒计时标志位
if(xfk==1) xgq=1; //如果状态为4下阀关电机启动
if(xfg==1) // 如果下阀到关位置,
{
xgq=0; //下阀关电机停
// z=0;
x=0; //状态字改为0
}
}break;
}
}
}
/*****************计数待机模式********************/
void jsudaiji()
{
uchar a,b;
a=jisu/10;
b=jisu%10;
display(16,7); //显示倒计数字符
display(a,2); //显示倒计数字十位
display(b,1); //显示倒计数数字个位
}
/****************计数模式运行函数*****************/
void jsugzuo()
{
uchar a,b,c,d;
a=jisu/10;
b=jisu%10;
yx_led=0; //运行灯点亮
if(dj)display(16,7); //显示倒计数字符
display(c,2); //显示倒计数字十位
display(d,1); //显示倒计数数字个位
}
/************计时计数工作模式数值调整************/
void jstz()
{
uchar a,b,c,d,e,f;
if((ms==0)&(~qiting)&(seding==1)) //如果工作在计时待机模式,调整间隔数值
{
a=js_jg/10;
b=js_jg%10;
display(10,7); //显示R字符
if(dj) //如果T0里计时变量DJ是1
{
display(a,2); //显示间隔数字十位
display(b,1); //显示间隔数字个位
}
if(shang)js_jg++; //如果上按键按下,计时间隔变量加1
if(xia)js_jg--; //如果下按键按下,计时间隔变量减1
while(shang|xia) //检测等待上,下按键抬起
{
key_scan(); //循环扫描按键
}
}
if((ms==0)&(~qiting)&(seding==2)) //如果工作在计时待机模式,调整计时工作数值
{
c=js_gz/10;
d=js_gz%10;
display(11,7); //显示o字符
if(dj) //如果T0里计时变量DJ是1
{
display(c,2); //显示间隔数字十位
display(d,1); //显示间隔数字个位
}
if(shang)js_gz++; //如果上按键按下,计时工作变量加1
if(xia)js_gz--; //如果下按键按下,计时工作变量减1
while(shang|xia) //等待上,下按键抬起
{
key_scan(); //循环扫按键
}
write(); //把修改后数值写入EEPROM
}
if((ms==1)&(~qiting)&(seding==1))//如果工作在计数待机模式,调整计数数值
{
e=jisu/10;
f=jisu%10;
display(16,7); //显示倒计数字符
if(dj)
{
display(e,2); //显示倒计数字十位
display(f,1); //显示倒计数数字个位
}
if(shang)jisu++; //如果上按键按下,计数变量加1
if(xia)jisu--; //如果下按键按下,计数变量减1
while(shang|xia) //检测等待上,下按键抬起
{
key_scan(); //循环扫描按键
}
write(); //把修改后数值写入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; //阀门电机得电多久没到位时间赋值
}
/****************计时,计数变量赋值*******************/
void fz()
{
}
void main()
{
// uchar d ,c; //定义变量
initime0(); //定时器初始化
initia(); //开机初始化
while(1) //大循环
{
fmwz(); //阀门位置
fled(); //阀门位置灯
key_scan(); //键盘扫描
if(cbz&rest)ISP_CONTR=0x20; //如果有错误复位按键按下
// if((sfk&sfg)||(xfk&xfg)) //如果阀门位置有逻辑错误
scan_error(); //检测阀位置逻辑错误
// else
{
jstz(); //计时数值调整函数
if((qiting==0)&(ms==0)&(seding==0)) //启停按钮,模式,设定都是0,执行待机程序
{
jsdaiji(); //计时待机
jsjg=js_jg; //把设定的好的计时间隔时间传递给计时间隔变量
e=js_gz;
}
if(qiting&(ms==0)) //启停按钮和计时模式都是1,执行计时程序
{
jsigzuo(); //计时工作函数
}
if((qiting==0)&(ms==1))jsudaiji(); //如果启停按钮和计数模式都是1,执行计数程序
if(qiting&(ms==1)) jsugzuo(); //计数工作函数
}
}
}
/**********定时器0中断函数***************/
void time0()interrupt 1
{
static a,er; //定义静态变量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中断函数****************/
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.51hei.com/bbs/)
Powered by Discuz! X3.1