找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1972|回复: 1
打印 上一主题 下一主题
收起左侧

想做一个智能汽车雨刷器,网上买的散件已经焊接好,想再加点功能,求大神看下

[复制链接]
跳转到指定楼层
楼主
做了一个智能雨刷器,有手动和自动两种模式,想在手动模式下加一些功能:在手动模式下(想在此模式下也用到雨滴传感器,同时加上蜂鸣器),驾驶员需手动操作雨刷器。当检测到湿度处于上下限之间时(此时若未打开雨刷器,电机未转动 ),报警器报警提示驾驶员打开雨刷器;当检测到湿度大于上限时(此时若雨刷器低速运行),报警器报警提示驾驶员切换档位(高速档)。请问下面这个程序要怎么修改???


#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();

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:757752 发表于 2020-5-21 20:50 来自手机 | 只看该作者
你好,楼主,单片机大作业想借鉴一下你的这个作品,可以吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表