做了一个智能雨刷器,有手动和自动两种模式,想在手动模式下加一些功能:在手动模式下(想在此模式下也用到雨滴传感器,同时加上蜂鸣器),驾驶员需手动操作雨刷器。当检测到湿度处于上下限之间时(此时若未打开雨刷器,电机未转动
),报警器报警提示驾驶员打开雨刷器;当检测到湿度大于上限时(此时若雨刷器低速运行),报警器报警提示驾驶员切换档位(高速档)。请问下面这个程序要怎么修改???
#include <REGX52.H>
#include <ADC0832.H>
#include <LCD1602.H>
#include <eeprom52.H>
uchar i=0;
uint dat;
uint dat1=0;
uint dat2=0;
uint dat_value=0;
uint DJ_dat=0,ms=0,ms_1=0;
uchar loop=0;
sbit key_1=P3^1;
sbit key_2=P3^2;
sbit key_3=P3^3;
sbit key_4=P3^4;
sbit led0=P2^0;
sbit led1=P2^1;
bit key_1_flag=0;
bit key_2_flag=0;
bit key_3_flag=0;
bit key_4_flag=0;
bit A_M=1;
uchar speed_flag=0;
uint Value=1000;
uint water_h=0;
uint water_l=0;
uchar state=0;
bit star_off=1,zheng_fan=1,s0=0,ir_on=0;
uchar zz[]= //正转数据
{
0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
};
uchar fz[]= //反转数据
{
0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
};
void display()
{
void LCD1602_Write_Cmd(uchar cmd)
{
Read_Busy(); //判断忙,忙则等待
LCD1602_RS = 0;
LCD1602_RW = 0; //拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节
LCD1602_DB = cmd;//写入命令
LCD1602_EN = 1; //拉高使能端 数据被传输到LCD1602内
LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
}
/*=================================================
*函数名称:LCD1602_Write_Dat
*函数功能:写LCD1602数据
*调用:Read_Busy();
*输入:dat:需要写入的数据
=================================================*/
void LCD1602_Write_Dat(uchar dat)
{
Read_Busy();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_EN = 1;
LCD1602_EN = 0;
}
/*=================================================
*函数名称:LCD1602_Dis_OneChar
*函数功能:在指定位置显示一个字符
*调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
*输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
dat:需要显示的数据以ASCLL形式显示
=================================================*/
void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
if(y) x |= 0x40;
x |= 0x80;
LCD1602_Write_Cmd(x);
LCD1602_Write_Dat(dat);
}
LCD1602_write(0,0x80);
LCD1602_writebyte("Water:");
if(dat>99) LCD1602_write(1,0x30+dat/100%10);
else LCD1602_write(1,' ');
if(dat>9) LCD1602_write(1,0x30+dat/10%10);
else LCD1602_write(1,' ');
LCD1602_write(1,0x30+dat%10);
LCD1602_writebyte("% ");
if(A_M==0) LCD1602_writebyte("A ");
else LCD1602_writebyte("M ");
if(star_off==0) LCD1602_writebyte("K ");
else LCD1602_writebyte("G ");
LCD1602_write(1,0x30+speed_flag%10);
LCD1602_writebyte(" ");
dat_value=dat;
LCD1602_write(0,0xC0);
LCD1602_writebyte("H:");
if(state==1&&s0) LCD1602_writebyte(" ");
else
{
if(water_h>99) LCD1602_write(1,0x30+water_h/100%10);
else LCD1602_write(1,' ');
if(water_h>9) LCD1602_write(1,0x30+water_h/10%10);
else LCD1602_write(1,' ');
LCD1602_write(1,0x30+water_h%10);
}
LCD1602_writebyte("% ");
LCD1602_writebyte("L:");
if(state==2&&s0) LCD1602_writebyte(" ");
else
{
if(water_l>99) LCD1602_write(1,0x30+water_l/100%10);
else LCD1602_write(1,' ');
if(water_l>9) LCD1602_write(1,0x30+water_l/10%10);
else LCD1602_write(1,' ');
LCD1602_write(1,0x30+water_l%10);
}
LCD1602_writebyte("%");
}
void key_dispose()
{
if(key_1==0)
{
LCD1602_delay(20);
if(key_1_flag)
{
key_1_flag=0;
state=(state+1)%3;
}
}
else key_1_flag=1;
if(key_2==0)
{
LCD1602_delay(20);
if(key_2_flag)
{
key_2_flag=0;
if(state==1)
{
if(water_h<100) water_h++;
SectorErase(0x2000);
byte_write(0x2000,water_h);
}
if(state==2)
{
if(water_l<water_h-1) water_l++;
SectorErase(0x2200);
byte_write(0x2200,water_l);
}
if(state==0)
{
A_M=~A_M; star_off=1;
}
}
}
else key_2_flag=1;
if(key_3==0)
{
LCD1602_delay(20);
if(key_3_flag)
{
key_3_flag=0;
if(state==1)
{
if(water_h>water_l+1) water_h--;
SectorErase(0x2000);
byte_write(0x2000,water_h);
}
if(state==2)
{
if(water_l>0) water_l--;
SectorErase(0x2200);
byte_write(0x2200,water_l);
}
if(state==0)
{
if(A_M==1)
{
star_off=~star_off;
if(star_off==0) speed_flag=1;
else speed_flag=0;
}
}
}
}
else key_3_flag=1;
if(key_4==0)
{
LCD1602_delay(20);
if(key_4_flag)
{
key_4_flag=0;
if(A_M)
{
speed_flag=(speed_flag+1)%3;
}
}
}
else key_4_flag=1;
if(A_M==0)
{
led0=0;
led1=1;
}
else
{
led1=0;
led0=1;
}
if(speed_flag==2)
{
Value=260;
}
else if(speed_flag==1||speed_flag==0)
{
Value=500;
}
}
void police_dispose()
{ ir_on=0;
if(dat_value>water_h)
{
star_off=0; speed_flag=2;
}
else if(dat_value>=water_l&&dat_value<=water_h)
{
star_off=0; speed_flag=1;
}
else if(dat_value<water_l)
{
star_off=1; speed_flag=0;
}
}
void main()
{
water_h=byte_read(0x2000);
water_l=byte_read(0x2200);
if(water_h<water_l||water_h>100||water_l<0)
{
water_h=60;
water_l=10;
}
TMOD=0x11;
TH1=0x3c;
TL1=0xb0;
TH0=0x3c;
TL0=0xb0;
ET1=1;
ET0=1;
EA=1;
TR0=1;
TR1=1;
LCD1602_cls();
while(1)
{
if(A_M==0)
{ police_dispose();
if(star_off==0)
{
if(DJ_dat==0) loop=0;
while(DJ_dat<180)
{
P1=P1&0xf0|zz[loop];
loop=(loop+1)%8;
if(loop==0) DJ_dat++;
LCD1602_delay(Value);
}
if(DJ_dat==120)loop=0;
while(DJ_dat!=0)
{
P1=P1&0xf0|fz[loop];
loop=(loop+1)%8;
if(loop==0) DJ_dat--;
LCD1602_delay(Value);
}
}
}
else
{
if(speed_flag!=0)
{
if(star_off==0)
{
if(DJ_dat==0) loop=0;
while(DJ_dat<180)
{
P1=P1&0xf0|zz[loop];
loop=(loop+1)%8;
if(loop==0) DJ_dat++;
LCD1602_delay(Value);
}
if(DJ_dat==120)loop=0;
while(DJ_dat!=0)
{
P1=P1&0xf0|fz[loop];
loop=(loop+1)%8;
if(loop==0) DJ_dat--;
LCD1602_delay(Value);
}
}
}
else
{
loop=0; DJ_dat=0;
}
}
}
//1毫秒定时
}
void time_1(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;
ms_1++;
if(i<10)
{
i++;
dat1+=A_D(0); //满量程0-255 实际完全浸入水中是255-36= 219 0-219
}
else
{
i=0;
dat1=dat1/10;
if(dat1<=36) dat1=36;
dat1=dat1-36;
dat=100-(dat1/2.19); dat1=0;
}
if(ms_1>=10)
{
ms_1=0;
s0=~s0;
}
}
void time_0(void) interrupt 3
{
TH1=0x3c;
TL1=0xb0;
display();
key_dispose();
}
|