仿真图:
芯片/模块的特点:
AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。
AT89C52的主要特点如下:
内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。
RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。
外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。
通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。
定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。
串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。
低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。
宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。
L298特点:
高驱动能力:L298具有高驱动电流能力,能够提供最高4安培的峰值输出电流。这使得它可以驱动较大功率的直流电机,适用于许多高性能应用。
双全桥结构:L298具有双全桥结构,即两个独立的H桥电路,可以分别控制两个直流电机的运行方向和速度。这种结构使得同时控制多个电机变得更加方便。
输入控制灵活:L298的输入控制接口可以使用标准的逻辑电平(TTL或CMOS)来控制电机的运行。它可以接受脉冲宽度调制(PWM)信号来实现速度控制,并且支持正向、反向和制动模式的控制。
内置保护功能:L298具有内置的过流保护和过温保护功能,可以保护芯片和外部电路免受损坏。当输出电流超过设定值或芯片温度过高时,保护功能会自动触发。
低功耗待机模式:L298具有低功耗待机模式,可以通过控制输入信号将芯片置于低功耗状态。这有助于节省电能和延长电池寿命。
多种封装形式:L298可提供不同的封装形式,如多引脚直插式封装(DIP)和表面贴装技术(SMT)封装。这使得L298适应不同应用的安装需求。
主程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num=0,num1=0,num2=0,num3=0,num4=0,num5=0,num6=0,flag=0,flag1=0,flag4=0,flag5=0,circle=0;
sbit ledbiaozhun=P1^0; //LED指示灯
sbit ledjingji =P1^1;
sbit leddandu =P1^2;
sbit ledpaishui =P1^3;
sbit ledqiangxi =P1^4;
sbit ledruoxi =P1^5;
sbit ledxidi =P1^6;
sbit ledpiaoxi =P1^7;
sbit ledtuoshui =P2^2;
sbit paishui=P2^6; //排水阀控制
sbit jinshui=P2^7; //进水阀控制
sbit U2=P2^0;
sbit U3=P2^1;
sbit k1=P3^4; // 步进改变"标准、经济、单独、排水"四种方式
sbit k2=P3^5; //强洗、弱洗
sbit k3=P3^2; //运行、暂停和解除报替功能
void init()
{
uchar a=0,b=0,c=0;
TMOD=0x01; //T0工作于方式1
TH0=(65536-50000)/256; //定时时间50ms
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开T0中断
TR0=0; //关闭T0
EX0=1; //开外部中断0
IT0=1; //外部中断0边沿触发方式
U2=1; //电机停转
U3=1;
P0=0xff;
}
void delayms(uint xms) //延时
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void key() //控制按键
{
circle=1;
if(k1==0) //标准、经济、单独、排水按下
{
delayms(10); //延时消抖
if(k1==0) //再判
{
num++; //K1按下次数加1
if(num==4)
num=0; //等于4,按下次数清0
while(!k1); //等待按键释放
}
}
if(k2==0) //强弱选择
{
delayms(10); //延时消抖
if(k2==0) //再判
{
num1++; //按下次数加1
if(num1==2)
num1=0; //等于2,按下次数清0
while(!k2); //等待按键释放
}
}
}
void qiang() //强
{
if(flag4==0) //电机正转
{
U2=0;
U3=1;
}
if(flag4==1) //电机反转
{
U2=1;
U3=0;
}
}
void ruo() //弱
{
if(flag5==0) //电机正转
{
U2=0;
U3=1;
}
if(flag5==1) //电机反转
{
U2=1;
U3=0;
}
}
void qbiaozhun() //强标准
{
/*******洗涤********/
num=0;
num1=0;
ledbiaozhun=0;//标准洗LED亮
ledqiangxi=0; //强洗LED亮
jinshui=0; //打开进水阀
ledxidi=1; //洗涤
ledpiaoxi=1; //漂洗LED亮
ledtuoshui=1; //脱水LED亮
delayms(5000);//水位监测
jinshui=1; //关闭进水阀
ledxidi=0;
flag1=1; //
TR0=1; //启动定时器T0
while(flag==0)//flag为洗涤次数标志位
{
if(flag==0&&num2==1)
{
TR0=1;
flag1=1; //
qiang();
}
if(flag==0&&num2==2)
{
TR0=0; //关闭定时器T0
U2=1; //电机停止
U3=1;
}
};
//漂洗
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0; //排水
ledtuoshui=1;
ledpiaoxi=1;
ledxidi=1;
delayms(5000);
paishui=1; //关闭排水
delayms(100);
jinshui=0; //打开进水
delayms(5000);
jinshui=1; //关闭进水
ledpiaoxi=0;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==1)
{
if(flag==1&&num2==1)//强漂洗
{
TR0=1;
flag1=2;
qiang();
}
if(flag==1&&num2==2)//暂停强漂洗
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;
ledtuoshui=1;
ledpiaoxi=0;
delayms(5000);
paishui=1;
delayms(100);
jinshui=0;
delayms(5000);
jinshui=1;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==2)
{
if(flag==2&&num2==1)
{
TR0=1;
flag1=2;
qiang();
}
if(flag==2&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
} ;
//脱水
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;//打开排水
ledtuoshui=0;
ledpiaoxi=1;
// while(sgai);
paishui=1;
delayms(1000);
flag1=3;
TR0=1;
num3=0;
num4=0;
while(flag==3)
{
if(flag==3&&num2==1)
{
TR0=1;
U2=0;
U3=1;
flag1=3;
}
if(flag==3&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
ledtuoshui=1;
U2=1;
U3=1;
flag1=0;
}
void qjingji() //强经济
{
/*******洗涤********/
num=0;
num1=0;
ledjingji=0;
ledqiangxi=0;
ledtuoshui=1;
ledpiaoxi=1;
ledxidi=1;
jinshui=0;
delayms(5000);
jinshui=1;
flag1=1; //控制定时器中的洗涤指示灯
TR0=1;
while(flag==0)
{
if(flag==0&&num2==1)
{
TR0=1;
flag1=1;
qiang();
}
if(flag==0&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
TR0=0;
U2=1;
U3=1;
flag1=0;
paishui=0;
ledjingji=0;
ledtuoshui=1;
ledxidi=1;
delayms(5000);
paishui=1;
delayms(100);
jinshui=0;
delayms(5000);
jinshui=1;
ledpiaoxi=0;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==1)
{
if(flag==1&&num2==1)
{
TR0=1;
flag1=2;
qiang();
}
if(flag==1&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
//脱水
TR0=0;
U2=1;
U3=1;
flag1=0;
paishui=0; //打开排水
ledjingji=0;
ledtuoshui=0;
ledpiaoxi=1;
delayms(5000);
// while(sgai);
paishui=1;
delayms(1000);
flag1=3;
TR0=1;
flag=2;
num3=0;
num4=0;
while(flag==2)
{
if(flag==2&&num2==1)
{
TR0=1;
U2=0;
U3=1;
flag1=3;
}
if(flag==2&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
ledtuoshui=1;
U2=1;
U3=1;
flag1=0;
}
void qdandu() //强单独
{
num=0;
num1=0;
ledqiangxi=0;
ledxidi=0;
leddandu=0;
jinshui=0;
delayms(5000);
jinshui=1;//关闭进水阀
flag1=1;
TR0=1;
while(flag==0)
{
if(flag==0&&num2==1)
{
TR0=1;
flag1=1;
qiang();
}
if(flag==0&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
flag1=0;
U2=1;
U3=1;
}
void rbiaozhun() //弱标准
{
/*******洗涤********/
num=0;
num1=0;
ledbiaozhun=0;
ledruoxi=0;
ledtuoshui=1;
ledpiaoxi=1;
jinshui=0;
delayms(5000);
jinshui=1;
ledxidi=0;
flag1=1;
TR0=1;
while(flag==0)
{
if(flag==0&&num2==1)
{
TR0=1;
flag1=1;
ruo();
}
if(flag==0&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;
ledtuoshui=1;
ledxidi=1;
delayms(5000);
paishui=1;
delayms(100);
jinshui=0;
delayms(5000);
jinshui=1;
ledpiaoxi=0;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==1)
{
if(flag==1&&num2==1)
{
TR0=1;
flag1=2;
ruo();
}
if(flag==1&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;
ledtuoshui=1;
ledpiaoxi=0;
delayms(5000);
paishui=1;
delayms(100);
jinshui=0;
delayms(5000);
jinshui=1;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==2)
{
if(flag==2&&num2==1)
{
TR0=1;
flag1=2;
ruo();
}
if(flag==2&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
}
//脱水
U2=1;
U3=1;
TR0=0;
flag1=0;
paishui=0;
delayms(5000);
ledtuoshui=0;
ledpiaoxi=1;
// while(sgai);
paishui=1;
delayms(1000);
flag1=3;
TR0=1;
num3=0;
num4=0;
while(flag==3)
{
if(flag==3&&num2==1)
{
TR0=1;
U2=0;
U3=1;
flag1=3;
}
if(flag==3&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
ledtuoshui=1;
U2=1;
U3=1;
flag1=0;
}
void rjingji() //弱经济
{
/*******洗涤********/
num=0;
num1=0;
ledjingji=0;
ledruoxi=0;
ledtuoshui=1;
ledpiaoxi=1;
ledxidi=1;
jinshui=0;
delayms(5000);
jinshui=1; //打开进水阀,进水
flag1=1;
TR0=1;
while(flag==0)
{
if(flag==0&&num2==1) //弱经济洗
{
TR0=1;
flag1=1;
ruo();
}
if(flag==0&&num2==2) //弱经济洗暂停
{
TR0=0;
U2=1;
U3=1;
}
};
//漂洗
TR0=0;
U2=1;
U3=1;
flag1=0;
paishui=0; //排水阀打开
ledjingji=0;
ledtuoshui=1;
ledxidi=1;
delayms(5000);
paishui=1; //排水阀关闭
delayms(100);
jinshui=0; //进水阀打开
delayms(5000);
jinshui=1; //进水阀关闭
ledpiaoxi=0;
flag1=2;
TR0=1;
num3=0;
num4=0;
while(flag==1)
{
if(flag==1&&num2==1)//漂洗
{
TR0=1;
flag1=2;
ruo();
}
if(flag==1&&num2==2)//漂洗暂停
{
TR0=0;
U2=1;
U3=1;
}
};
//脱水
TR0=0;
U2=1;
U3=1;
flag1=0;
ledjingji=0;
ledtuoshui=0;
ledpiaoxi=1;
paishui=0; //排水阀打开
delayms(5000);
// while(sgai);
paishui=1;
delayms(3000);
flag1=3;
TR0=1;
num3=0;
num4=0;
while(flag==2)
{
if(flag==2&&num2==1)
{
TR0=1;
U2=0;
U3=1;
flag1=3;
}
if(flag==2&&num2==2)
{
TR0=0;
U2=1;
U3=1;
}
};
ledtuoshui=1;
U2=1;
U3=1;
flag1=0;
}
void rdandu() //弱单独
{
num=0;
num1=0;
ledruoxi=0;
ledxidi=0;
leddandu=0;
jinshui=0; //打开进水阀,进水
delayms(5000);
jinshui=1;
flag1=1;
TR0=1; //启动定时器T0
while(flag==0)
{
if(flag==0&&num2==1) //弱单独洗
{
TR0=1;
flag1=1;
ruo();
}
if(flag==0&&num2==2)//弱单独洗暂停
{
TR0=0;
U2=1;
U3=1;
}
};
flag1=0;
U2=1;
U3=1;
}
void dpaishui() //排水/脱水
{
num=0;
num1=0;
ledpaishui=0;
ledtuoshui=0;
jinshui=1;
paishui=0;
delayms(3000);
// while(sgai);
delayms(3000);
flag1=3;
TR0=1;
num3=0;
num4=0;
while(flag==0)
{
if(flag==0&&num2==1) //脱水
{
TR0=1;
flag1=3;
U2=0;
U3=1;
}
if(flag==0&&num2==2)//暂停脱水
{
TR0=0;
U2=1;
U3=1;
}
};
U2=1;
U3=1;
flag1=0;
ledtuoshui=1;
paishui=1; 排水阀关闭
}
void main()
{
init();
while(1)
{
key(); //键扫描
if((num1==0&&num==0)&&circle==1) //标准 强洗
{
ledruoxi=1; //关闭弱洗LED
ledpaishui=1; //关闭排水LED
ledbiaozhun=0;//强标准LED亮
ledqiangxi=0; //强洗LED亮
if(num2==1)
{
qbiaozhun(); //强标准洗
}
if(num2>1) //K3键按下次数为2,暂停洗涤
{
;
}
circle=0;
}
if(num1==0&&num==1) //经济 强洗
{
ledruoxi=1;
ledbiaozhun=1;
ledqiangxi=0;
ledjingji=0;
if(num2==1)
{
qjingji(); //强经济洗
ledjingji=1;
}
circle=0;
}
if(num1==0&&num==2) //单独 强洗
{
ledruoxi=1;
ledjingji=1;
ledqiangxi=0;
leddandu=0;
if(num2==1)
{
qdandu(); //强单独洗
leddandu=1;
}
circle=0;
}
if(num1==0&&num==3)
{
ledruoxi=1; //排水 强洗
leddandu=1;
ledqiangxi=0;
ledpaishui=0;
if(num2==1)
{
dpaishui(); //单排水
ledpaishui=1;
}
circle=0;
}
if(num1==1&&num==0) //弱 标准
{
ledqiangxi=1;
ledpaishui=1;
ledruoxi=0;
ledbiaozhun=0;
if(num2==1)
{
rbiaozhun(); //弱标准洗
ledruoxi=1;
}
circle=0;
}
if(num1==1&&num==1) //弱经济
{
ledqiangxi=1;
ledbiaozhun=1;
ledruoxi=0;
ledjingji=0;
if(num2==1)
{
rjingji(); //弱经济洗
ledruoxi=1;
ledjingji=1;
}
circle=0;
}
if(num1==1&&num==2)
{
ledqiangxi=1;
ledjingji=1;
ledruoxi=0;
leddandu=0;
if(num2==1)
{
rdandu(); //弱单独洗
ledruoxi=1;
leddandu=1;
}
circle=0;
}
if(num1==1&&num==3)
{
ledqiangxi=1;
leddandu=1;
ledruoxi=0;
ledpaishui=0;
if(num2==1) //K3键
{
dpaishui(); //单排水
ledpaishui=1;
}
circle=0;
}
num2=0;
}
}
void T0_time() interrupt 1 //定时
{
TH0=(65536-50000)/256; //重赋初值
TL0=(65536-50000)%256;
num3++; //定时计数加1
if(num3==20) //1秒时间到
{
num3=0; //计数清0
if(flag1==1)
ledxidi=~ledxidi; //洗涤指示取反
if(flag1==2)
ledpiaoxi=~ledpiaoxi; //漂洗指示取反
if(flag1==3)
ledtuoshui=~ledtuoshui; //脱水指示取反
num4++;
num5++;
num6++;
if(num4==15) //洗涤定时,15秒到
{
num4=0; //清0
flag++; //标志洗涤次数
}
if(num5==5) //强洗周期,5秒到
{
num5=0;
flag4++; //强洗标志加1
if(flag4==2)
flag4=0;
}
if(num6==3) //弱洗周期 ,3秒到
{
num6=0;
flag5++; //弱洗标志加1
if(flag5==2)
flag5=0;
}
}
}
设计文件: