#include<reg51.h> //定义头文件
#define uint unsigned int //定义字符uint
#define uchar unsigned char //定义字符uchar
#define TIME0H 0xff //定时器0计数器高位
#define TIME0L 0x9c //定时器0计数器低位
#define TIME1H 0x3c //定时器1计数器高位
#define TIME1L 0xb0 //定时器1计数器低位
#define MOTOR_COUNT 100 //PWM波输出周期计数
#define sol 0x6c //将"so"宏定义为低音"5"的频率 784Hz
#define Dol 0x44 //将"Do"宏定义为中音"1"的频率 523Hz
#define Rel 0xac //将"Re"宏定义为中音"2"的频率 587Hz
#define Mil 0x09 //将"Mi"宏定义为中音"3"的频率 659Hz
#define Fal 0x34 //将"Fa"宏定义为中音"4"的频率 698Hz
#define Sol 0x82 //将"So"宏定义为中音"5"的频率 784Hz
#define Lal 0xc8 //将"La"宏定义为中音"6"的频率 880Hz
#define Sil 0x05 //将"Si"宏定义为中音"7"的频率 523H
#define soh 0xfc //将"so"宏定义为低音"5"的频率 784Hz
#define Doh 0xfc //将"Do"宏定义为中音"1"的频率 523Hz
#define Reh 0xfc //将"Re"宏定义为中音"2"的频率 587Hz
#define Mih 0xfd //将"Mi"宏定义为中音"3"的频率 659Hz
#define Fah 0xfd //将"Fa"宏定义为中音"4"的频率 698Hz
#define Soh 0xfd //将"So"宏定义为中音"5"的频率 784Hz
#define Lah 0xfd //将"La"宏定义为中音"6"的频率 880Hz
#define Sih 0xfe //将"Si"宏定义为中音"7"的频率 523H
//定义宏变量
sbit speaker =P2^6; //蜂鸣器控制引脚
sbit RS=P1^5; //LCD RS引脚
sbit R_W=P1^6; //LCD 读写信号
sbit EN=P1^7; //LCD 使能引脚
sbit motor_high=P1^0; //PWM输出高电平引脚
sbit motor_low=P1^1; //PWM输出低电平引脚
sbit motor_1_en=P1^2; //进水阀门引脚
sbit motor_2_en=P1^3; //出水阀门引脚
sbit motor_3_en=P1^4; //洗衣机电动使能引脚
sbit EOC=P2^4; //AD EOC
sbit START=P2^5; //AD START
sbit con=P3^5; //AD CON
sbit add_A=P3^0; //位选信号A
sbit lock_OE=P3^1; //74ls373锁存控制引脚
//定义全局变量
uchar process; //当前洗衣机运行状态全局变量
uchar method; //当前洗衣机运行方式全局变量
uchar speed; //当前电动机速度全局变量
uchar flag; //标志位
uchar state; //洗衣机运行状态选择
uint ad_level; //水位采样全局变量
uint ad_voltage; //电压采样全局变量
uint time_count; //定时器0中断次数全局变量
uint time_count1; //定时器1中断次数全局变量
uint MOTOR_ON,MOTOR_NOW; //电动机pwm控制计数,高电平脉冲数和当前脉冲数
uchar st_pau; //当前洗衣机运行全局变量
uchar step; //当前洗衣机运行步骤全局变量
uint Cl=0; //
uint Ch=0; //
uchar close=0;
//声明子函数
void init_LCM(); //lcd初始化函数
void clearLCD(); //lcd清屏函数
void write_data(char date); //lcd写数据函数
void write_com(char command); //lcd写指令函数
void display()reentrant; //lcd显示函数
void check_BF(); //lcd检查忙碌函数
void fangshi1(); //洗衣机运行方式1
void fangshi2(); //洗衣机运行方式2
void fangshi3(); //洗衣机运行方式3
void fangshi4(); //洗衣机运行方式4
void translate(int keycode); //按键值释放函数
void clrpara(); //复位所有参数
void speaker_on(); //蜂鸣器
void delay(); //80ms延时程序
unsigned char f_TAB[][2]={ /**/{Sol,Soh},{Lal,Lah},{Sol,Soh},{Fal,Fah},{Mil,Mih},{Dol,Doh},//, //音调
/**/{Sol,Soh},{Lal,Lah},{Sol,Soh},{Fal,Fah},{Mil,Mih},{Dol,Doh},/**/{Dol,Doh},{sol,soh},{Dol,Doh},
/**/{Dol,Doh},{sol,soh},{Dol,Doh},/**/{0xff,0xff}};
uchar time_TAB[]={3,1,3,1,4,4,/**/3,1,3,1,4,4,/**/4,4,4,8,/**/4,4,4,8}; //节拍
/*****************************80ms延时*****************************/
void delay()
{
uchar i,j; //定义变量i,j
for(i=0;i<100;i++) //外循环
for(j=0;j<250;j++); //内循环
}
/***************************按键信息翻译***************************/
void translate(int keycode)
{
int key; //定义临时变量key,用来判断(开始/暂停)按键次数
switch(keycode) //根据不同传入的keycode值,进行全局变量赋值
{
case 0: //方式一
method = '1'; //将方式全局变量赋值为‘1’
//return '0'; //返回‘0’结果
break; //跳出分支判断
case 1: //方式三
method = '3'; //将方式全局变量赋值为‘3’
//return '1'; //返回‘1’结果
break; //跳出分支判断
case 2: //速度1/4
speed = '1'; //赋值速度全局变量为1
MOTOR_ON = 25; //设置PWM占空比为25/100
//return '2'; //返回‘2’结果
break; //跳出分支判断
case 3: //速度3/4
speed = '3'; //赋值速度全局变量为3
MOTOR_ON = 75; //设置PWM占空比为75/100
//return '3'; //返回‘3’结果
break; //跳出分支判断
case 4: //方式二
method = '2'; //将方式全局变量赋值为‘2’
//return '4'; //返回‘4’结果
break; //跳出分支判断
case 5: //方式四
method = '4'; //将方式全局变量赋值为‘4’
//return '5'; //返回‘5’结果
break; //跳出分支判断
case 6: //速度2/4
speed = '2'; //赋值速度全局变量为2
MOTOR_ON = 50; //设置PWM占空比为50/100
//return '6'; //返回‘6’结果
break; //跳出分支判断
case 7: //速度4/4
speed = '4'; //赋值速度全局变量为4
MOTOR_ON = 100; //设置PWM占空比为100/100
//return '7'; //返回‘7’结果
break; //跳出分支判断
case 8: //ON
state =1; //赋值洗衣机运行状态选择1
//return '8'; //返回‘8’结果
break; //跳出分支判断
case 9: //OFF
state = 0; //赋值洗衣机运行状态选择0
//return '9'; //返回‘9’结果
break; //跳出分支判断
case 10: //START/PAUSE
{
if(key==0) //判断开始/暂停键是否按下,是继续
{
st_pau=1; //赋值洗衣机运行全局变量为1
key++; //key自加1
}
else
{
st_pau=2; //当前洗衣机运行全局变量为2
key--; //key自减1
}
//return 'A'; //返回‘A’结果
break; //跳出分支判断
}
}
}
/*****************************LCD显示******************************/
void display()reentrant
{
int level_1,level_2,level_3,voltage_1,voltage_2,voltage_3;
//定义水位、电压显示百位、十位、各位。由于显示直接采用返回AD转换值,所以需要按照百、十、个位进行显示
clearLCD(); //LCD清屏
//process: 1浸泡,2脱水,3洗涤,4进水,5漂洗,
//method:1方式一,2方式二,3方式三,4方式四
//speed:1速度1/4,2速度2/4,3速度3/4,4速度4/4
level_1 = ad_level / 100 + 48; //获得水位检测百位,同时转化为ASCII码
level_2 = (ad_level %100 ) /10 + 48; //获得水位检测值十位,同时转化为ASCII码
level_3 = (ad_level %10 ) + 48; //获得水位检测值个位,同时转化为ASCII码
voltage_1 = ad_voltage / 100 + 48; //获得电压转换值百位,转化为ASCII码
voltage_2 = (ad_voltage %100 ) /10 + 48; //获得电压转换值十位,转化为ASCII码
voltage_3 = (ad_voltage %10 ) + 48; //获得电压转换值个位,转化为ASCII码
if (state == 1) //如果洗衣机当前运行状态为on开启状态
{
switch(process) //根据不同的运行状态,在LCD第一行显示运行状态信息
{
case '1': //进水
write_data('J'); //显示字符‘J’
write_data('I'); //显示字符‘I’
write_data('N'); //显示字符‘N’
write_data('S'); //显示字符‘S’
write_data('H'); //显示字符‘H’
write_data('U'); //显示字符‘U’
write_data('I'); //显示字符‘I’
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data('L'); //显示字符‘L’
write_data(level_1); //显示水位检测百位值
write_data(level_2); //显示水位检测十位值
write_data(level_3); //显示水位检测个位值
write_data(' '); //显示空字符
write_data('V'); //显示字符‘V’
write_data(voltage_1); //显示电压检测百位值
write_data(voltage_2); //显示电压检测十位值
write_data(voltage_3); //显示电压检测个位值
motor_1_en = 1; //进水阀电动机驱动打开
motor_2_en = 0; //排水阀电动机驱动关闭
motor_3_en = 0; //洗衣机电动机驱动关闭
break; //跳出分支判断
case '2': //浸泡
write_data('J'); //显示字符‘J’
write_data('I'); //显示字符‘I’
write_data('N'); //显示字符‘N’
write_data('P'); //显示字符‘P’
write_data('A'); //显示字符‘A’
write_data('O'); //显示字符‘O’
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data('L'); //显示字符‘L’
write_data(level_1); //显示水位检测百位值
write_data(level_2); //显示水位检测十位值
write_data(level_3); //显示水位检测个位值
write_data(' '); //显示空字符
write_data('V'); //显示字符‘V’
write_data(voltage_1); //显示电压检测百位值
write_data(voltage_2); //显示电压检测十位值
write_data(voltage_3); //显示电压检测个位值
motor_1_en = 0; //进水阀电动机驱动关闭
motor_2_en = 0; //排水阀电动机驱动关闭
motor_3_en = 0; //洗衣机电动机驱动关闭
break; //跳出分支判断
case '3': //洗涤
write_data('X'); //显示字符‘X’
write_data('I'); //显示字符‘I’
write_data('D'); //显示字符‘D’
write_data('I'); //显示字符‘I’
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data('L'); //显示字符‘’
write_data(level_1); //显示水位检测百位值
write_data(level_2); //显示水位检测十位值
write_data(level_3); //显示水位检测个位值
write_data(' '); //显示空字符
write_data('V'); //显示字符‘V’
write_data(voltage_1); //显示电压检测百位值
write_data(voltage_2); //显示电压检测十位值
write_data(voltage_3); //显示电压检测个位值
motor_3_en = 1; //洗衣机电动机驱动打开
motor_1_en = 0; //进水阀电动机驱动关闭
motor_2_en = 0; //排水阀电动机驱动关闭
break; //跳出分支判断
case '4': //漂洗
write_data('P'); //显示字符‘P’
write_data('I'); //显示字符‘I’
write_data('A'); //显示字符‘A’
write_data('O'); //显示字符‘O’
write_data('X'); //显示字符‘X’
write_data('I'); //显示字符‘I’
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data('L'); //显示字符‘L’
write_data(level_1); //显示水位检测百位值
write_data(level_2); //显示水位检测十位值
write_data(level_3); //显示水位检测个位值
write_data(' '); //显示空字符
write_data('V'); //显示字符‘V’
write_data(voltage_1); //显示电压检测百位值
write_data(voltage_2); //显示电压检测十位值
write_data(voltage_3); //显示电压检测个位值
motor_3_en = 1; //洗衣机电动机驱动打开
motor_1_en = 0; //进水阀电动机驱动关闭
motor_2_en = 0; //排水阀电动机驱动关闭
break; //跳出分支判断
case '5': //脱水
write_data('T'); //显示字符‘T’
write_data('U'); //显示字符‘U’
write_data('O'); //显示字符‘O’
write_data('S'); //显示字符‘S’
write_data('H'); //显示字符‘H’
write_data('U'); //显示字符‘U’
write_data('I'); //显示字符‘I’
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data('L'); //显示字符‘L’
write_data(level_1); //显示水位检测百位值
write_data(level_2); //显示水位检测十位值
write_data(level_3); //显示水位检测个位值
write_data(' '); //显示空字符
write_data('V'); //显示字符‘V’
write_data(voltage_1); //显示电压检测百位值
write_data(voltage_2); //显示电压检测十位值
write_data(voltage_3); //显示电压检测个位值
motor_1_en = 0; //进水阀电动机驱动关闭
motor_2_en = 1; //排水阀电动机驱动打开
motor_3_en = 0; //洗衣机电动机驱动关闭
break; //跳出分支判断
}
if(st_pau==2) //当前洗衣机运行全局变量为2
{
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data(' '); //显示空字符
write_data('P'); //显示字符‘P’
write_data('A'); //显示字符‘A’
write_data('U'); //显示字符‘U’
write_data('S'); //显示字符‘S’
write_data('E'); //显示字符‘E’
}
else
{
switch(method) //判断方式全局变量
{
case '1': //方式一
write_data('M'); //显示字符‘M’
write_data('E'); //显示字符‘E’
write_data('T'); //显示字符‘T’
write_data('H'); //显示字符‘H’
write_data('O'); //显示字符‘O’
write_data('D'); //显示字符‘D’
write_data(':'); //显示字符‘:’
write_data('1'); //显示字符‘1’
write_data(' '); //显示空字符
break; //跳出分支判断
case '2': //方式二
write_data('M'); //显示字符‘M’
write_data('E'); //显示字符‘E’
write_data('T'); //显示字符‘T’
write_data('H'); //显示字符‘H’
write_data('O'); //显示字符‘O’
write_data('D'); //显示字符‘D’
write_data(':'); //显示字符‘:’
write_data('2'); //显示字符‘2’
write_data(' '); //显示空字符
break; //跳出分支判断
case '3': //方式三
write_data('M'); //显示字符‘M’
write_data('E'); //显示字符‘E’
write_data('T'); //显示字符‘T’
write_data('H'); //显示字符‘H’
write_data('O'); //显示字符‘O’
write_data('D'); //显示字符‘D’
write_data(':'); //显示字符‘:’
write_data('3'); //显示字符‘3’
write_data(' '); //显示空字符
break; //跳出分支判断
case '4': //方式四
write_data('M'); //显示字符‘M’
write_data('E'); //显示字符‘E’
write_data('T'); //显示字符‘T’
write_data('H'); //显示字符‘H’
write_data('O'); //显示字符‘O’
write_data('D'); //显示字符‘D’
write_data(':'); //显示字符‘:’
write_data('4'); //显示字符‘4’
write_data(' '); //显示空字符
break; //跳出分支判断
}
switch(speed) //判断速度全局变量
{
case '1': //速度一
write_data('S'); //显示字符‘S’
write_data('P'); //显示字符‘P’
write_data('E'); //显示字符‘E’
write_data('E'); //显示字符‘E’
write_data('D'); //显示字符‘D’
write_data(':'); //显示字符‘:’
write_data('1'); //显示字符‘1’
break; //跳出分支判断
case '2': //速度二
write_data('S'); //显示字符‘S’
write_data('P'); //显示字符‘P’
write_data('E'); //显示字符‘E’
write_data('E'); //显示字符‘E’
write_data('D'); //显示字符‘D’
write_data(':'); //显示字符‘:’
write_data('2'); //显示字符‘2’
break; //跳出分支判断
case '3': //速度三
write_data('S'); //显示字符‘S’
write_data('P'); //显示字符‘P’
write_data('E'); //显示字符‘E’
write_data('E'); //显示字符‘E’
write_data('D'); //显示字符‘D’
write_data(':'); //显示字符‘:’
write_data('3'); //显示字符‘3’
break; //跳出分支判断
case '4': //速度四
write_data('S'); //显示字符‘S’
write_data('P'); //显示字符‘P’
write_data('E'); //显示字符‘E’
write_data('E'); //显示字符‘E’
write_data('D'); //显示字符‘D’
write_data(':'); //显示字符‘:’
write_data('4'); //显示字符‘4’
break; //跳出分支判断
}
}
}
else
{
write_data('N'); //显示字符‘N’
write_data('O'); //显示字符‘O’
write_data('W'); //显示字符‘W’
write_data(' '); //显示空字符
write_data('M'); //显示字符‘M’
write_data('A'); //显示字符‘A’
write_data('C'); //显示字符‘C’
write_data('H'); //显示字符‘H’
write_data('I'); //显示字符‘I’
write_data('N'); //显示字符‘N’
write_data('E'); //显示字符‘E’
write_data(' '); //显示空字符
write_data('I'); //显示字符‘I’
write_data('S'); //显示字符‘S’
write_data(' '); //显示空字符
write_data('O'); //显示字符‘O’
write_data('F'); //显示字符‘F’
write_data('F'); //显示字符‘F’
write_data(' '); //显示空字符
write_data(' '); //显示空字符
}
//P0 = 0XFF;
}
/****************************LCD初始化*****************************/
void init_LCM()
{
write_com(0x30); //发送控制命令0x30
write_com(0x30); //发送控制命令0x30
write_com(0x30); //发送控制命令0x30,做一个延时
write_com(0x38); //发送控制命令0x38
write_com(0x08); //发送控制命令0x08
write_com(0x01); //发送控制命令0x01
write_com(0x06); //发送控制命令0x06
write_com(0x0e); //发送控制命令0x0e
}
/***************************LCD写数据函数**************************/
void write_data(char date)
{
RS=1; //写指令电平置为高,进入写数据状态
R_W=0; //读指令电平置为低,无效
EN=1; //使能信号开
P0=date; //将数据送入p0口
EN=0; //使能信号关
check_BF(); //等待LCD繁忙状态结束
}
/***************************LCD写指令函数**************************/
void write_com(char command)
{
RS=0; //写指令电平置为低,进入写指令状态
R_W=0; //读写指令命令置为低电平
EN=1; //使能信号开
P0=command; //将数据送入p0口
EN=0; //使能信号关
check_BF(); //等待LCD繁忙状态结束
}
/**************************LCD检查忙碌函数*************************/
void check_BF()
{
char i,x=0x80; //定义字符变量i,x
P0=0xff; //P0口输出高电平,使得P0口电平输入允许
while(x&0x80) //当LCD还是处于繁忙状态时,进入循环
{
RS=0; //写指令置为1,读取指令状态
R_W=1; //读引脚电平置为高,为读取信息状态
EN=1; //LCD使能信号开
P0=0XFF; //P0口输出高电平,使得P0口电平输入允许
x=P0; //将P0口电平信息赋给x
EN=0; //LCD使能信号关闭
for (i=0;i<10;i++); //循环等待
}
EN=0; //关闭使能信号
}
/****************************LCD清屏函数***************************/
void clearLCD()
{
write_com(0x01); //写入LCD清屏指令
}
/******************************方式一******************************/
void fangshi1()
{
switch(step) //判断洗衣机当前运行步骤
{
case 0: //步骤0
process = '1'; //进水
break; //跳出分支判断
case 1: //步骤1
process = '2'; //浸泡
break; //跳出分支判断
case 2: //步骤2
process = '3'; //洗涤
break; //跳出分支判断
case 3: //步骤3
process = '5'; //脱水
break; //跳出分支判断
case 4: //步骤4
process = '1'; //进水
break; //跳出分支判断
case 5: //步骤5
process = '4'; //漂洗
break; //跳出分支判断
case 6: //步骤6
process = '5'; //脱水
break; //跳出分支判断
case 7: //步骤7
process = '1'; //进水
break; //跳出分支判断
case 8: //步骤8
process = '4'; //漂洗
break; //跳出分支判断
case 9: //步骤9
process = '5'; //脱水
break; //跳出分支判断
case 10: //步骤10
clrpara(); //复位所有参数
break; //跳出分支判断
}
}
/******************************方式二******************************/
void fangshi2()
{
switch(step) //判断洗衣机当前运行步骤
{
case 0: //步骤0
process = '1'; //进水
break; //跳出分支判断
case 1: //步骤1
process = '3'; //洗涤
break; //跳出分支判断
case 2: //步骤2
process = '5'; //脱水
break; //跳出分支判断
case 3: //步骤3
process = '1'; //进水
break; //跳出分支判断
case 4: //步骤4
process = '4'; //漂洗
break; //跳出分支判断
case 5: //步骤5
process = '5'; //脱水
break; //跳出分支判断
case 6: //步骤6
process = '1'; //进水
break; //跳出分支判断
case 7: //步骤7
process = '4'; //漂洗
break; //跳出分支判断
case 8: //步骤8
process = '5'; //脱水
break; //跳出分支判断
case 9: //步骤9
clrpara(); //复位所有参数
break; //跳出分支判断
}
}
/******************************方式三******************************/
void fangshi3()
{
switch(step) //判断洗衣机当前运行步骤
{
case 0: //步骤0
process = '1'; //进水
break; //跳出分支判断
case 1: //步骤1
process = '3'; //洗涤
break; //跳出分支判断
case 2: //步骤2
process = '5'; //脱水
break; //跳出分支判断
case 3: //步骤3
process = '1'; //进水
break; //跳出分支判断
case 4: //步骤4
process = '4'; //漂洗
break; //跳出分支判断
case 5: //步骤5
process = '5'; //脱水
break; //跳出分支判断
case 6: //步骤6
clrpara(); //复位所有参数
break; //跳出分支判断
}
}
/******************************方式四******************************/
void fangshi4()
{
switch(step) //判断洗衣机当前运行步骤
{
case 0: //步骤0
process = '5'; //脱水
break; //跳出分支判断
case 1: //步骤1
clrpara(); //复位所有参数
break; //跳出分支判断
}
}
/*******************************复位*******************************/
void clrpara()
{
EX0=0;
TR0=0;
st_pau=2; //洗衣机是否运行全局变量为2
step=0; //洗衣机运行步骤全局变量为0
//P2=0xff; //P0输出0xff信息
state=0; //洗衣机运行状态设置为OFF状态
process='1'; //洗衣机过程全局变量为1
method='1'; //洗衣机方式全局变量为1
speed='1'; //电动机速度全局变量为1
ad_level=0; //水位AD监测值为0
ad_voltage=0; //电压AD检测值为0
motor_1_en = 0; //进水阀驱动机关闭
motor_2_en = 0; //排水阀驱动机关闭
motor_3_en = 0; //洗衣机电动机关闭
TR1=0;
flag=1; //标志位为1,开始播放音乐
//TR1=1; //启动定时器0
init_LCM(); //LCD初始化程序
display(); //LCD刷新显示
//speaker_on(); //音乐播放程序
}
/***************************音乐播放程序***************************/
void speaker_on()
{
uchar i,j; //定义变量i,j
i=0; //变量i赋值为0
while(f_TAB[i][0]!=0xff)//判断
{
Ch=f_TAB[i][1]; //TH0赋值
Cl=f_TAB[i][0]; //TL0赋值
TH1=Ch; //TH0赋值
TL1=Cl; //TL0赋值
TR1=1;
for(j=0;j<time_TAB[i];j++) //控制节拍数
delay(); //延时 1 个节拍单位
TR1=0; //关闭定时器 T0
i++; //播放下一个音符
}
}
/****************************主程序入口****************************/
void main()
{
//中断0按键
IT0 = 1; //中断方式为下降沿
EX0 = 1; //开启外部中断
//定时器0、1,定时器0、1中断,用于状态改变计数,pwm调制计数
TMOD = 0x11; //定时器为定时中断模式1
TH0 = TIME0H; //定时器0计数高位加载
TL0 = TIME0L; //定时器0计数低位加载
TH1 = TIME1H; //定时器1计数高位加载
TL1 = TIME1L; //定时器1计数低位加载
ET0 = 1; //定时器0中断允许
ET1 = 1; //定时器1中断允许
TR0 = 1; //定时器0计数器启动
TR1 = 1; //定时器1计数器启动
P2 = 0xff; //P0输出0xff信息
state = 0; //洗衣机运行状态设置为OFF状态
process = '1'; //洗衣机过程全局变量为‘1’
method = '1'; //洗衣机方式全局变量为‘1’
speed = '1'; //电动机速度全局变量为‘1’
st_pau = '0'; //洗衣机是否运行全局变量为‘0’
step = 0 ; //洗衣机运行步骤全局变量为‘0’
MOTOR_ON = 25; //电动机PWM控制计数为25
ad_level = 0; //水位AD监测值为0
ad_voltage = 0; //电压AD检车值为0
time_count = 0; //定时0中断计数器全局变量为0
time_count1 = 0; //定时1中断计数器全局变量为0
flag=0; //标志位为0
speaker = 0; //蜂鸣器关闭
init_LCM(); //初始化LCD
display(); //刷新显示
EA = 1; //开启单片机中断允许位,允许中断开始
P0 = 0xff; //P0输出高电平,使得可以进行外部电压信号输入
while(1)
{
//测试水位
while(flag==0)
{
con = 0; //AD转换输出关闭
add_A = 0; //选择水位模拟信号进行AD转换
START = 1; //设置START引脚为高电平
START = 0; //设置START引脚为低电平,得到下降沿,启动AD检测
while(!EOC); //等待AD转换结束
lock_OE = 0; //74ls373锁存信号为低,通道开启
P0 = 0xff; //P0引脚输出高电平,允许引脚电平的读入
con = 1; //AD转换芯片输出使能
ad_level = P0; //将AD转换赋值为AD_LEVEL全局变量
con = 0; //AD转换芯片输出禁止
lock_OE = 1; //74ls373锁存信号开启,进行电平锁存
add_A = 1; //选择AD模块为1号通道信号进行模数转换,即电压信号
START = 1; //START引脚输出高电平
START = 0; //START引脚输出低电平,开始AD转换
while(!EOC); //等待AD转换结束
lock_OE = 0; //74ls373锁存信号关闭,AD转换信号可以输出
P0 = 0xff; //P0输出高电平,使得外部电压可以进行输入
con = 1; //AD转换结果使能
ad_voltage = P0; //将P0引脚的AD转换结果赋值给电压检测全局变量
con = 0; //AD转化结果输出关闭
lock_OE = 1; //74ls373锁存信号开启,使得P0口与AD转换引脚隔离
}
if(flag==1)
{
speaker_on();
flag=0;
}
}
}
/**************************外部中断0子程序*************************/
void int_0() interrupt 0
{
uint temp; //定义变量temp,用来读取P2信息
temp = P2; //temp读取P2信息
translate(temp&0x0f); //与0x0f相与,得到低四位电平信号,并传入translate()函数
display(); //LCD显示刷新
}
/***************************定时0中断入口**************************/
void time_0() interrupt 1
{
time_count1 ++; //全局定时中断计数自加1
if (time_count1 > 6) //如果全局定时中断次数大于6,则
{
time_count1 = 0; //全局定时中断次数置零
}
//只考虑正转
if(st_pau==1) //如果洗衣机处于运行状态,则
{
MOTOR_NOW++; //PWM计数次数自加1
if (MOTOR_NOW > MOTOR_ON) //如果PWM计数次数大于高电平计数值
{
motor_high = 0; //PWM高电平引脚输出低电平
}
else
{
motor_high = 1; //PWM高电平输出高电压
}
if (MOTOR_NOW > MOTOR_COUNT) //如果PWM计数值大于PWM计数周期
{
MOTOR_NOW = 0; //PWM计数值置零
}
motor_low = 0; //PWM低电平输出低电平
}
TH0=TIME0H; //定时器0高位计数载入
TL0=TIME0L; //定时器低位计数载入
}
/***************************定时1中断入口**************************/
void vTimer0() interrupt 3
{
if(flag==0)
{
TR1=0;
if(st_pau==1)
{
time_count++;
if(time_count> 5)
{
time_count=0;
step++;
display();
}
}
switch(method)
{
case '1': //方式一
fangshi1();
break;
case '2': //方式二
fangshi2();
break;
case '3': //方式三
fangshi3();
break;
case '4': //方式四
fangshi4();
break;
}
TH1=TIME1H;
TL1=TIME1L;
TR1=1;
}
else
{
speaker=~speaker; //取反
TH1=Ch; //TH1赋值
TL1=Cl; //TL1赋值
}
}
|