#include
#define uchar unsigned char //类型定义,方便书写
#define uint unsigned int
uchar code roundz[] ={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; //步进电机正转控制数组
uchar code roundf[] ={0x08,0x0C,0x04,0x06,0x02,0x03,0x01,0x09}; //步进电机反转控制数组
uchar code disptab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极LED显示器显示码
sbit beep=P2^7;
sbit baiwei=P2^0;
sbit shiwei=P2^1;
sbit gewei=P2^2; //数码管位选
uint num,sec;
#define K1 0x06
#define K20x5
#define K3 0x3 //按键码,分别检测三个按键是否有按下
sbit in_water=P3^3;
sbit out_water=P3^4;
sbit LED_bz=P3^5;
sbit LED_qr=P3^6;
sbit LED_sg=P3^7; //5个LED灯,分别为进水,出水,标准,轻柔和甩干
//**************基本延迟函数************************************************
void delay(uint dcnt) // 延迟时间为dcntms
{
uint i,j;
for(i=dcnt;i>0;i--)
for(j=120;j>0;j--);
}
//************定时器0控制倒计时*****************************************
void count_down() interrupt 1
{
int count ;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //定时器0每50ms产生一次中断;
count ++;
if(count == 20) //每50*20=1s sec的值减1
{
count =0;
sec--;
if(sec==0) //计时结束时,关闭总中断,电机停止转动。
{
EA=0;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
while(1);
}
}
}
//***************倒计时的数码管显示程序*******************************
void display() interrupt 3 //利用定时器1来进行数码管显示
{
TH1=(65536-5000)/256; //每5ms扫描一次
TL1=(65536-5000)%256;
num=(num%3);
P0=0xff; //消影
switch(num)
{
case 0:
P0=disptab[sec/100];
baiwei=1; shiwei=0;gewei=0;
break;
case 1:
P0=disptab[(sec/10)%10];
baiwei=0; shiwei=1; gewei=0;
break;
case 2:
P0=disptab[sec%10];
baiwei=0; shiwei=0; gewei=1;
break;
default:break;
}
num++;
}
//************************步进电机正转控制函数******************************
void RotateWise(uinttime,uchar stepcnt) //time为转一步时间,stepcnt为圈数
{
uchar i ,j;
for(i=0;i
{
for(j=0;j<8;j++)
{
P1= roundz[j] ;
delay (time); //更改delay里数值可改变转速,转一圈时间为time*8 ms
}
}
}
//***********************步进电机反转控制函数****************************
void ContraRotate(uinttime,uchar stepcnt) //time为转一步时间,stepcnt为圈数
{
uchar i ,j;
for(i=0;i
{
for(j=0;j<8;j++)
{
P1= roundf[j] ; //更改delay里数值可改变转速,转一圈时间为time*8 ms
delay (time);
}
}
}
//**************************洗涤子程序****************************************
void xidi()
{
uint i;
in_water = 0;
delay(9000); //开水阀,进水9s
in_water = 1; //关水阀
delay(1000);
for(i=10;i>0;i--) //转动十次
{
RotateWise(50,10) ; //正转10圈,转速为50ms*8
delay(1000); //停止一秒
ContraRotate(50,10) ; //反转10圈,转速为50ms*8
delay(1000);
}
}
//**************************漂洗子程序****************************************
void piaoxi()
{
uint i;
in_water = 0;
delay(9000); //开水阀,进水9s
in_water = 1; //关水阀
delay(1000);
for(i=5;i>0;i--) //转动五次
{
RotateWise(100,10) ; //正转10圈,转速为100ms*8
delay(1000); //停止一秒
ContraRotate(100,10) ; //反转10圈,转速为100ms*8
delay(1000);
}
}
//*********************脱水子程序*******************************************
void tuoshui()
{
uint i;
out_water = 0; //打开排水阀
delay(9000); //排水9s
for(i=10;i>0;i--) //转动十次
{
RotateWise(50,10) ; //正转10圈,转速为50ms*8
}
beep=0;
delay(1000); //蜂鸣器警报
beep=1;
out_water =1 ; //甩干完毕,关闭水阀
}
//********************标准模式************************************************
void biaozhun()
{ sec=360; //设定倒计时数目
LED_bz = 0; //点亮“标准”LED灯
xidi(); //洗涤
piaoxi();
piaoxi(); //2次漂洗
tuoshui(); //脱水
LED_bz=1; //熄灭LED灯
}
//*********************轻揉模式********************************************
void qingrou()
{ sec=250; //设定倒计时数目
LED_qr = 0; //点亮“轻揉”LED灯
piaoxi();
piaoxi(); //2次漂洗
tuoshui(); //脱水
LED_qr = 1; //熄灭LED灯
}
//**********************甩干模式********************************************
void shuaigan()
{
sec=50; //设定倒计时数目
LED_sg = 0; //点亮“甩干”LED灯
tuoshui(); //脱水
LED_sg = 1; //熄灭LED灯
}
//********************键盘扫描程序****************************************
uchar scankey()
{
int key;
if((P3&0x07)== 0x07)
return(0xff); //消抖
delay(30);
if((P3&0x07)== 0x07)
return(0xff);
key = P3&0x07;
while ((P3&0x07)!=0x07); //当有按键按下的时候,返回key值,判断哪个按键被按下
return key;
}
//******************主函数************************************************
void main()
{
TMOD|=0x11; //定时器0和定时器1模式 工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //定时0器寄存器装初值,每50ms产生一次中断
EA=0; //关总中断
ET0=1; //开定时器0中断
TH1=(65536-5000)/256; //定时器1寄存器装初值,没5ms产生一次中断
TL1=(65536-5000)%256;
ET1=1; //打开定时器1中断
TR0=1;
TR1=1; //打开定时器0和定时器1
while(1)
{
uchar key = scankey();
if (key == K1)
{
EA=1; //开总中断[em12]
biaozhun();
}
if (key == K2)
{
EA=1;
qingrou();
}
if (key == K3)
{
EA=1;
shuaigan();
} } }