📄 xiyiji.c
字号:
#include <initial.h>
//-----初始化--------------------------------------------------------------------------
void init(void)
{
WDT_CONTR=0x00; //关闭看门狗
AUXR=0x01; //关闭ALE输出
AUXR1=0x00;
EA=1; //开中断
ET1=1;
ET0=1;
TMOD=0x11;
TH1=0x3c, TL1=0xb0;
}
//-----1ms延时程序----------------------------------------------------------------------
void delay_ms(unsigned char timedata)
{
unsigned char aa=250,cc=0;
cc=timedata;
while(cc--)
{
while(--aa);
}
}
void delay(unsigned char timedata)
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<timedata;t1++)
{
for(t2=0;t2<1000;t2++) //---定时125/8ms(15625us)
{}
}
}
void sing()
{
flag=1;
TH0=BTH0;
TL0=BTL0;
if(BTH0!=0||BTL0!=0)
TR0=1;
else TR0=0;
delay(time2);
flag=0;
}
//--我是奥运小福娃歌曲编码-------------------------------------------------------------------------------------
unsigned char code gqbm[]={
1,5,2, 1,8,2, 1,8,5,
1,5,2, 1,1,2, 1,1,5,
1,5,2, 1,8,2, 2,1,2, 1,8,2,
1,10,7,
1,5,2, 1,8,5, 2,1,2,
1,10,5, 1,8,5,
1,5,2, 1,1,2, 1,8,2, 1,5,2,
1,3,7,
1,5,2, 1,8,2, 1,8,5,
1,5,2, 1,1,2, 1,1,5,
1,5,2, 1,8,2, 2,1,2, 1,10,2,
1,10,7,
1,8,2, 2,1,2, 2,1,2, 1,10,2,
1,8,2, 1,10,2, 1,5,5,
1,3,2, 1,1,2, 1,3,2, 1,5,2,
1,8,6, 1,10,2,
1,8,2, 1,5,2, 1,3,2, 1,5,2,
1,1,7,
0,0,5, 0,0,5,
9,9,9
};
//-----数码管位选----------------------------------------------------------------------
void WX_SM(unsigned char c,unsigned char b,unsigned char a)
{
a0=a;
a1=b;
a2=c;
}
//-----led数据传送---------------------------------------------------------------------
void sendbyte(unsigned int num)
{
unsigned char c;
send=0;
for(c=0;c<16;c++)
{
CLK=0;
DAT=num&0x0001;
CLK=1;
num>>=1;
}
send=1;
}
//-----键盘扫描------------------------------------------------------------------------
void key_saomiao(void)
{
key3=0;key4=1;
if(key5==0) s1_biao=0;
if(key6==0) s2_biao=0;
if((key5==1)&&(key6==1))
{
key3=1;key4=0;
if(key5==0) s3_biao=0;
if(key6==0) s4_biao=0;
if((key5==1)&&(key6==1))
{
key3=1;key4=1;
}
else key_que();
}
else key_que();
}
//-----去抖动,是否有键按下-------------------------------------------------------------
void key_que(void)
{
switch(KeyState)
{
case 0:
if((key5==0)||(key6==0)) //有键
{
KeyState=1;
delay_ms(20);
}
break;
case 1:
if((key5==0)||(key6==0)) //有键
{
KeyState=2;
flag=1;
BTH0=0xfe;
BTL0=0xf4;
TH0=0xfe;
TL0=0xf4;
key_han();
TR0=1;
delay(1);
TR0=0;
flag=0;
delay_ms(100);
}
else
{
KeyState = 0;
}
break;
case 2:
if((key5==0)||(key6==0)) //有键
{
KeyState=3;
flag=1;
BTH0=0xfe;
BTL0=0xf4;
TH0=0xfe;
TL0=0xf4;
key_han();
TR0=1;
delay(1);
TR0=0;
flag=0;
delay_ms(50);
}
else
{
KeyState = 0;
}
break;
case 3:
if((key5==0)||(key6==0)) //有键
{
flag=1;
BTH0=0xfe;
BTL0=0xf4;
TH0=0xfe;
TL0=0xf4;
key_han();
TR0=1;
delay(1);
TR0=0;
flag=0;
delay_ms(200);
}
else
{
KeyState = 0;
}
break;
default:
break;
}
}
//-----读取键值--------------------------------------------------------------------------
void key_han(void)
{
if(key3==0)
{
if((key5==0)&&(s1_biao==0))
{
s1_biao=1;
cout=1;
}
if((key6==0)&&(s2_biao==0))
{
s2_biao=1;
cout=2; //2键表示增加
}
}
if(key4==0)
{
if((key5==0)&&(s3_biao==0))
{
s3_biao=1;
cout=3; //3键表示减少
}
if((key6==0)&&(s4_biao==1))
{
s4_biao=1;
cout=4;
}
}
}
//-----进水程序------------------------------------------------------------------------------
void xy_jinshui(void)
{
jinsf=0; //进水阀打开
m1=0,m0=0,s1=2,s0=0;
TR1=1; //定时器1开始进水20分钟计时
while(flag!=1) //等待进水
{
if(((k==4)&&(gaos==0)&&(dis==0)&&(pais==0))||((k==5)&&(gaos==1)&&(dis==0)&&(pais==0))) //判断是否达到设置高低水位
{
TR1=0; //达到设置水位,关闭定时器T1,关闭进水阀
jinsf=1;
flag=1;
}
while(dsd==1) //当20分钟内还未到达设置水位,则声光报警
{
m1=0,m0=0,s1=20,s0=0;
TR1=1;
errcode=1; //设置故障代码:1表示在20分钟内未注入设定的水量
alarm();
key_saomiao();
if(cout==4) dsd=0,stop=0; //4键关闭报警
//报警20分钟若无任何人为动作,则自动关机
}
led();
}
flag=0;
P0=0xff;
}
//-----洗涤程序------------------------------------------------------------------------------------------
void xy_xidi(void)
{
while(q!=0)
{
q--;
if(qr==6) //当判断为强洗时
{
zhengz=0;
delay_s(4); //正转4s
zhengz=1;
delay_s(1); //停止1s
fanz=0;
delay_s(4); //反转4s
fanz=1;
delay_s(1); //停止1s
}
if(qr==7) //当判断为弱洗时
{
zhengz=0;
delay_s(3); //正转3s
zhengz=1;
delay_s(2); //停止2s
fanz=0;
delay_s(3); //反转3s
fanz=1;
delay_s(2); //停止2s
}
}
}
//-----排水程序-------------------------------------------------------------------------
void xy_paishui(void)
{
while(flag!=1)
{
if((gaos==1)&&(dis==1)&&(pais==1)) //排水是否完成
{
TR1=0;
flag=1;
}
while(dsd==1) //当20分钟内还未到达设置水位,则声光报警
{
TR1=1;
errcode=2; //设置故障代码:2表示在20分钟内洗涤水未排干净
alarm();
key_saomiao();
if(cout==4) dsd=0; //4键关闭报警
if(gj==1) stop=0; //报警20分钟若无任何人为动作,则自动关机
}
led();
}
flag=0;
}
//-----间歇脱水----------------------------------------------------------------------------------
void tuoshui_jianxie(void)
{
zhengz=0;
delay_s(4);
zhengz=1;
delay_s(3);
}
//-----衣物离心修正函数-------------------------------------------------------------------------------------------------------
void xiuzheng(void)
{
zhengz=0;
paisf=1;
xy_jinshui();
m1=0,m0=1,s1=0,s0=0;
TR1=1;
while(dsd!=1) //强洗涤1分钟
{
zhengz=0;
delay_s(4); //正转4s
zhengz=1;
delay_s(1); //停止1s
fanz=0;
delay_s(4); //反转4s
fanz=1;
delay_s(1); //停止1s
}
dsd=0;
}
//-----报警子函数------------------------------------------------------------------------------------------
void alarm(void)
{
P0=led_code[errcode]; //报警同时显示故障代码
WX_SM(1,1,1);
senddata=tab[15];
senddata=senddata&lastdata;
sendbyte(senddata);
delay_ms(10);
q=80;
while(q--!=0)
{
feng=0;delay_ms(1);
feng=1;delay_ms(1);
}
flag=0;
P0=0xff;
senddata=tab[16];
senddata=senddata&lastdata;
sendbyte(senddata);
delay_ms(200);
}
//-----显示子函数-------------------------------------------------------------------------------------------
void led(void)
{
P0=led_code[s0]; //倒数计时个位
WX_SM(1,1,1);
delay_ms(2);
P0=led_code[s1];
WX_SM(1,1,0);
delay_ms(2);
P0=led_code[m0]; //倒数计时分钟位
WX_SM(1,0,1);
delay_ms(2);
P0=led_code[m1];
WX_SM(1,0,0);
delay_ms(2);
P0=0xff;
}
void int_0(void) interrupt 0 using 1
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -