⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 song.c

📁 单片机C语言15个实验附有原理图和程序 是我的课程作业 以经过实践验证
💻 C
字号:
#include<stdio.h>
#include<reg51.h>

#define POINT_NUM 36

sbit clk=P0^0;
sbit sda=P0^1;
sbit P17=P1^7;
sbit P03=P0^3;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P32=P3^2;
sbit P07=P0^7;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P10=P1^0;
sbit P14=P1^4;
sbit P16=P1^6;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P37=P3^7;

#define hi 0x3c 
#define lo 0xb0
#define hi1 0x01
#define lo1 0x01 
unsigned char code ledk[10]={0x3f,0x30,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f};
unsigned char dsp[4];
int ms;//测距
unsigned char speedl;///////左轮脉冲
unsigned char speedr;///////右轮脉冲
unsigned char pwm_count;/////总脉宽
int distance[5];////存储铁块距?
unsigned char tie_flag;///检测铁片起始标志
unsigned char stopFlag;//停车标志
unsigned char _5s_count;//几时5秒
unsigned char Second_5;//倒几时
unsigned char count;//铁片计数
unsigned char index;
unsigned char t0_count;//定时器0计数
unsigned char time;
unsigned char show_tie_juli;//显示铁片的距离
unsigned char show_tie_time;//显示铁片的距
unsigned char turn_l_time;
unsigned char turn_r_time;
unsigned char turn_count;
unsigned char zawFlag;
int ms1;//铁片起点的脉冲个数
int ms2;//铁片终点的脉冲个数
unsigned Status;

///////////////////////////////////
void stop_5s();
void display();
void c_sun();
void ceju();
void zaw();
void cheting();
void ButtonAction();
void delay(unsigned int n);
void shift(unsigned char dd);
void t0();
//void hextodec(unsigned char xx);
void black();
////////////////////////////////////////


void main(void)
{
   
  PT1=1;
  EA=1;
   EX0=1;
   IT0=1;
   EX1=1;
   IT1=1; 
   TMOD=0x21;
   ET0=1;
   TH0=hi;
   TL0=lo;
   TR0=1;
   TR1=1;
   ET1=1;
   ET0=1;
   TH1=hi1;
   TL1=lo1;
   speedl=180;
   speedr=180;
   P10=P12=1;
   tie_flag=0;
   stopFlag = 0;
   zawFlag = 0;
   Second_5 = 5;
   count=0;
   //P14 =0;
   //P03 =0;
   Status = 1;
   show_tie_juli = 0;
   
   while(1)
   {
     display();
    // ceju();
     switch (Status)
     {
          case 1://AC路段检测
          {
            black();
            // if(time>20) 
            // stop_5s();
             break;
          }
      
          case 2://障碍物检测
         {  
             if (P06 ==0)
        	 {
        	    
                zawFlag=1;
                Status=3;
        	 }
              
             break;
         }
         case 3://检测到障碍物后转玩90度
         {
             zaw();
             break;
         }
         case 4://寻光源,定方向
         {
            c_sun();
            break;
         }
         case 5://停车入库
         {   
            cheting();
            break;
         }

         case 6:
    	 {
            
            ButtonAction();
            break;
    	 }
     }
  }
}

///////////////////////////////
////////////////////////////////////延时    
void delay (unsigned int n)
  {unsigned int i,j;
     for(i=0;i<n;i++)
        for(j=0;j<n;j++);
}
////////////////////////////////////164串并行
void shift(unsigned char dd)
  {static unsigned char d;
    unsigned char j=0;
    d=dd;while(j<8)
              {			
                        if((d&0x80)!=0)
                        sda=1;
                    	else sda=0;
                        clk=0;delay(1);clk=1;
                    	d<<=1;j++;}
        				
        				} 

//////////////////////////////////// T0定时计数
void t0() interrupt 1
{ unsigned char char_show;
  TH0=hi;TL0=lo;/////50ms
   t0_count++;
   if(t0_count>=20)
   {
       time++;
       if (time>30)
       {
          PX0=1;
       }
       t0_count=0;
       if (show_tie_juli == 1) 
       {
           show_tie_time ++;
       }
       if (show_tie_time >= 3)
       {
           show_tie_juli= 0;
           show_tie_time =0;
           dsp[2]= 0;
       }


       if (show_tie_juli == 0)
       {
           char_show = (unsigned char)time / 10;
           char_show = ledk[char_show];
     
           dsp[1] = char_show;
     
           char_show = time %10;
           char_show = ledk[char_show];
     
           dsp[0] = char_show;

       }

       if(time>=90)
        {
            stop_5s();
            TR0=0;
            Status=6;
    	}
    	

   }
     ///电机停止信号
     
     /////////////////////////
     if (Status ==3)
     {
      
         turn_count++;
         if (turn_count>=20)
    	 {
            turn_count=0;
            turn_l_time++;
            if (turn_l_time >=8)
    		{
               Status =4;
               //turn_l_time = 0;
    		}
    	 }

     }

     if(Status ==4)
     {
        turn_count++;
        if (turn_count>=20)
    	 {
            turn_count=0;
            turn_r_time++;
            if (turn_r_time >=8)
    		{
               Status =5;
        	   
               //turn_r_time=0;
    		}
    	 }
     }
     ///////////////////////////

   if (stopFlag == 1)
    {
        char_show = ledk[Second_5];
        dsp[3] = char_show;
        _5s_count++;
    	 
        if(_5s_count<=10)
           P17=0;
        if(_5s_count>10)
           P17=1;

         if (_5s_count == 20)
    	 {
            
            Second_5 --;
            _5s_count=0;
            char_show = ledk[Second_5];
            dsp[3] = char_show;
            if (Second_5 == 0)
    		{
              stopFlag = 0;
              TR1 = 1;
              EX0=0;//关外部0中断,不再检测铁片+

              Status = 2; 
              //P04=0;
              //P05=0;
              speedr=180;
              speedl=230;
            }
    	 }
    }
        
}
///////////////////////////////////  
/*void hextodec(unsigned char xx)
{unsigned char B;
  B=xx/10; 
  dsp[3]=B;
  xx=xx%10;
  B=xx;
  dsp[2]=B;
}*/
///////////////////////////////////检测黑线子涵数
void  black()
 {
    if(P04==1) 
    {
      speedl=2;    ///////左轮压黑线 
      speedr=250;
    }
    else  
    {
       speedl=250;
       //speedr=180;
    }

    if(P05==1) 
    {
       speedr=2; ///右轮压黑线
       speedl =250;
    }
    else 
    {
      speedr=250; //没压黑线
      //speedl=180;
      
    }
    if(P04==0&&P05==0)
    {
     speedl =250;
     speedr =250;
    }
}
//////////////////////////////
void PWM() interrupt 3
{ if(pwm_count==speedl)
    P10=1;
   
  if(pwm_count==speedr)
    P12=1;
  ++pwm_count;
  if(pwm_count==255)
    {pwm_count=0;
     P10=0;
     P12=0;}
  
 
}
///////////////金属数目检测及显示涵数
void int0() interrupt 0
{
 unsigned char i,char_show;
  
   display();
   if ( P32 ==1)
   return;

   ms1=ms;
   if (time>30)
 {
   
   stop_5s();
   stopFlag = 1;
 }

 
 tie_flag=1;
 count++;  
 char_show = ledk[count];
 dsp[3] = char_show;
 P17=0;//声光信息
 for (i=0;i<20;i++)
 {
   display();
 }
 P17=1;


 

}   
/////////////////////外部1中断检测脉冲数
//void ceju()
void int1() interrupt 2
{
 //unsigned char ms0, s1;
// float juli_real;
 unsigned char juli_int;
 unsigned char tie_juli_start;
 unsigned char tie_juli_end;
 unsigned char round_int;
 unsigned char round_real;
 
      //if(P07==1)
     // { ms++;
      // P07=0;
     // }
    ms++;
    
    if(P32==1&&tie_flag==1)
      { 
        show_tie_juli = 1;
        ms2=ms;
        tie_flag=0;
        //ms0=(ms2-ms1)/4;
        //s1=(ms2-ms1) * 20/2/4;
        //distance[count]=ms*20 / 4 +(ms2-ms1) * 20/2/4;
        round_int = ms1 /POINT_NUM;
        round_real = ms1 % POINT_NUM;
        round_real = round_real *6;
        round_real= round_real/10;
        tie_juli_start = round_real + round_int * 20;

        round_int = ms2 /POINT_NUM;
        round_real = ms2 % POINT_NUM;
        round_real = round_real *6;
        round_real= round_real/10;
        tie_juli_end= round_real  + round_int * 20;

        distance[count]=(tie_juli_start +tie_juli_end) / 2;
        juli_int  = distance[count]/100;
        dsp[2] = ledk[juli_int];
        //dsp[2] = dsp[2] | 0x80;
        juli_int = distance[count] %100 /10;
        dsp[1] = ledk[juli_int];

        juli_int = distance[count] %10;
        dsp[0] = ledk[juli_int];
        //juli_real = (float)(distance[count]/100.0 - juli_int);
        
        
        
        }
 
   
}
/////////////////////////////////////
void display()
{
   unsigned char i;
   for ( i= 0;i<4;i++)
   {
      //dsp[i] = ledk[dsp[i]];
      shift(dsp[i]);
      
      switch ( i)
      {
         case 0:
           P2 = 0xfe;delay(25);
           break;
         case 1:
           P2 = 0xfd;delay(25);
           break;
         case 2:
           P2 = 0xfb;delay(25);
           break;
         case 3:
           P2 = 0xf7;delay(25);
           break;
      }

   }
   
}
///////////////////////////小车停五秒子函数
void stop_5s(void)
{unsigned char s_sec=0,i;
  //if(P32==0)
  //{
   //TH0=hi;TL0=lo;
   //stop_count++;
   //if(stop_count==20)
    //s_sec++;
    TR1=0;
   
    P10=1;
    P11=1;
    P12=1;
    P13=1;
   //if(s_sec<=5)
   //{
   if(time<30)
    { 
     P17=0;//停车声光信息
    for (i=0;i<20;i++)
     {
        display();
      }
     P17=1;
     }
    
    //}
   //else 
   //{P10=0;P12=0;}
   
 }
 /////////////////////////检测障碍物子函数
 void zaw(void)
  {
    //unsigned char i;
    
  ///////////////////////

  if(turn_l_time<3)
  {
     speedl=1;
     speedr=254;
  }
  else
  {
     speedr=180;
      speedl=230;
  }
  return;
  /////////////////////

  } 
   
   
   
  // 
   ////////////////////
 void c_sun(void)
{ 
  ///////////////////////
  
  if(turn_r_time<5)
   
  {
     speedr=5;
     speedl=250;
  }
  else 
  {   speedr=180;
      speedl=230;
  }


  /*if(P03==1&&P14==1)
  {
     speedr=180;
     speedl=230;
  }
  else
  {

     if(P03==1 && P14==0)
     {   speedl=1;
         speedr=250;
    
     }
     
       if(P14==1 && P03==0)
      {
         speedr=1;
         speedl=250;
      }
      
   }*/

  
 
  return;
  ///////////////////////
  

}
/////////////////
void cheting(void)
{ /*unsigned char i;
   if(P06==0)
     {
      
    TR1=0;
   
    P10=1;
    P11=1;
    P12=1;
    P13=1;
   //if(s_sec<=5)
   //{
    P17=0;//停车声光信息
for (i=0;i<20;i++)
 {
   display();
 }
    P17=1;
      }*/

  //if(P03==1&&P14==1)
  {
     speedr=180;
     speedl=230;
  }
  //else
  {

     if(P03==1 && P14==0)
     {   speedl=1;
         speedr=250;
    
     }
     
       if(P14==1 && P03==0)
      {
         speedr=1;
         speedl=250;
      }
      
   }
   if(P03==0&&P14==0)
   {  
       TR1=0;
       Status=5;

   }
        

   if(P04==1&&P05==1)
    {
       TR1=0;
       Status=5;
     }
     return;
}

void ButtonAction()
{
   int juli;
   unsigned char char_show ,i;
   unsigned char Sw_Press;

   P24=0;
   P25=0;
   P26=0;
   P27=0;

   if ( P37==0)
   {
      for (i=0;i<10;i++)
        display();
      if (P37==0)
      {
         
         P2=P2 & 0x0f;
         P2=P2 |0xe0;
         if(P37==0)
           Sw_Press=1;//P24按下

         P2=P2 & 0x0f;
         P2=P2 |0xd0;
         if(P37==0)
           Sw_Press=2;//P25按下

         P2=P2 & 0x0f;
         P2=P2 |0xb0;
         if(P37==0)
           Sw_Press=3;//P26按下

         P2=P2 & 0x0f;
         P2=P2 |0x70;
         if(P37==0)
           Sw_Press=4;//P27按下
           
      }
     
   }

   switch(Sw_Press)
   {
      case 1://P24按下
         juli = (ms *20) /POINT_NUM;
         char_show = juli /100;
         dsp[2]=ledk[char_show];
         char_show=(juli % 100)/10;
         dsp[1]= ledk[char_show];
         char_show=juli%10;
         dsp[0]=ledk[char_show];
         break;

      case 2://P25按?
        
        index++;
        distance[index]=(ms*20 / POINT_NUM +ms1 * 20/POINT_NUM) / 2;
        juli  = distance[index]/100;
        dsp[2] = ledk[juli];
        //dsp[2] = dsp[2] | 0x80;
        juli = distance[index] %100 /10;
        dsp[1] = ledk[juli];

        juli = distance[index] %10;
        dsp[0] = ledk[juli];

        dsp[3]=ledk[index+1];

        
        if (index>count)
           index=0;
    	
         break;

      case 3://P26按下
         break;

      case 4://P27按下
         break;
   }
    return;
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -