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

📄 111.c

📁 该资源 是 自动测量温度大小车 很有用的 希望大家放心的下载
💻 C
字号:

  #include<AT89X51.H>
  #include <INTRINS.H> 
  
  
  sbit cs=P1^0;
  sbit sid=P1^1;
  sbit sclk=P1^2;
  sbit fang=P1^3;    // squart wave
  sbit ensp=P2^5;
  sbit dr=P2^4;      //dangerous distance led
  sbit hy=P2^3;      //hold distance led
  sbit sg=P2^2;      //safe distance led
  sbit dpl=P2^1;     //drop power led
  sbit re=P2^7;      //receive  led
  sbit vc=P3^0;      //voltage compare
  sbit dq=P1^4;      //18B20 data bit
  sbit hold=P2^6;     //hold 
  sbit play=P2^7;    //play
  
//****************************************************************

  bit ff;
  bit flag;
  bit comflag;
  unsigned char pf=3;             //显示警告标志

  unsigned char  soubuf[6];
  unsigned char  disbufs[7];   //distance memory
  unsigned char  disbuft[8];   //temperature memory
  unsigned char timeh,timel;   //time memory
  unsigned char temp[2];      //temp[1]温度的高位与temp[0]低位
 
  unsigned char code word[9]={"当前距离:"};
  unsigned char code wordt[5]={"温度:"};
  unsigned char code wordd[8]={"危险距离"};
  unsigned char code wordh[8]={"保持距离"};
  unsigned char code words[8]={"安全距离"};
  unsigned char code wordpower[12]={"电源电压正常"};
  unsigned char code worddrop[12]={"请您更换电池"};
  unsigned char code check[13]={"系统正在自检!"};
  unsigned char code sound[10]={74,10,16,22,30,37,43,51,58,67};  //声音地址 点:92;米: 83
//***************************************************************
    void lcdbusy(void);
    void sendbyte(unsigned char ds); 
    void wrlcd(unsigned char sta,ks);
    void ex0(void);
	//void t00(void);
    void computers(unsigned int v);
    void display(void);
	void send0(void);
    void send1(void);
	void intlcd(void);
	unsigned int computerv(void);
   
    void de750ms(void);
    void init18b20(void);
    void wr18b20(unsigned char ks);
    unsigned read18b20(void);
    void gettemper(void);
    void computert(void);
    void checkself(void);
	void speak(void);
 //******************************************************
  void init18b20(void)   // 初始化18B20
     { unsigned char i;
 	    dq=1;
        _nop_();
        dq=0;
       for(i=255;i>0;i--);
        dq=1;
       for(i=30;i>0;i--);
       for(i=120;i>0;i--)
         if(dq==0)  {flag=1;break;}//led=0; 
       for(i=100;i>0;i--);
       dq=1;        
       }
 //*************************************************************
     void wr18b20(unsigned char ks)
	  {unsigned char i,j;
       for(i=8;i>0;i--)
	    {		 
		 dq=0;
		 for(j=6;j>0;j--) ;
		 _nop_();
		 dq=(bit)(ks&0x01);
		 for(j=24;j>0;j--);
		 dq=1;
		 ks=ks>>1;
		} 
	  }
//*************************************************************
    unsigned read18b20(void)              //先读出的是低位后读出的是高位,读一个字节子程序
     {unsigned char i,j,tdata;
	   tdata=0;
	  for(j=8;j>0;j--)
	   {tdata=tdata>>1;
	   dq=0;
	   for(i=6;i>0;i--);
	   _nop_();
	   dq=1;
	   for(i=6;i>0;i--);  
	   if(dq==1)  tdata=tdata|0x80;	   
	   for(i=28;i>0;i--);
	   dq=1;	   
       }	   
	  return(tdata); 	    
	 }
//*******************************************************************
    void gettemper(void)
      { 
	   init18b20();
       if(flag==1) 
	      {		          //跳过ROM匹配
		   wr18b20(0xcc);  
		                //发出温度转换命令
  		   wr18b20(0x44);	
           flag=0;
          
           }	   
		   de750ms();
		   
		init18b20();
          if(flag==1) {		  	 
		   	wr18b20(0xcc);		   	                     //读温度命令
		   	wr18b20(0xbe);
		   	temp[0]=read18b20();
			temp[1]=read18b20();
		   	flag=0;
		   
		  }
         
		else flag=0;
 	  }

//*****************************************************************/
    void computert(void)    //温度处理子程序,temp[1]温度的高位与temp[0]低位
	 { unsigned char aa,i;
       unsigned int cc;	    
		aa=temp[1]&0xf8;
		if(aa==0xf8) {disbuft[5]=0x2d; //处理负温度
		              
		              temp[0]=~temp[0];					 
					  temp[1]=~temp[1];
					  if(temp[0]==0xff) temp[1]=temp[1]+1;
 					  temp[0]=temp[0]+1;
                      aa=(temp[1]&0x07)<<4;					                     
                      aa=aa|((temp[0]&0xf0)>>4);					 	
					  disbuft[4]=aa/10;
                      disbuft[3]=(aa%10);
		 aa=temp[0]&0x0f;
         cc=(int)(aa*625);
         disbuft[3]=cc/10000+disbuft[3];
		 if (disbuft[3]==10) {disbuft[3]=disbuft[3]&0xff;disbuft[4]=disbuft[4]+1;}
         cc=cc%10000;
         disbuft[2]=cc/1000;
         cc=cc%1000;
         disbuft[1]=cc/100;
         cc=cc%100;
         disbuft[0]=cc/10;
                     }
		else    {aa=((temp[1]&0x07)<<4);   //处理正温度
		         
   				 aa=aa|((temp[0]&0xf0)>>4);				 	 
				 disbuft[0]=aa/10;
                 disbuft[1]=aa%10;				 
         aa=temp[0]&0x0f;
         cc=(int)(aa*625);
         disbuft[1]=cc/10000+disbuft[1];
		 if (disbuft[1]==10) {disbuft[1]=0;disbuft[0]=disbuft[0]+1;}
         cc=cc%10000;
         disbuft[3]=cc/1000;
         cc=cc%1000;
         disbuft[4]=cc/100;
         cc=cc%100;
         disbuft[5]=cc/10;
         disbuft[6]=cc%10;

       for(i=0;i<7;i++)
	    disbuft[i]=disbuft[i]|0x30;
	   disbuft[2]=0x2e;
	    
		 }   
	 }
//*****************************************************************
  unsigned int computerv(void)
    {unsigned char a;
	 unsigned int v;
	  temp[1]=temp[1]&0x07;
	  a=temp[1]<<4;
	  a=a|(temp[0]>>4);
	  a=a*6;
	  v=3314+a;
	 return(v);
	 
	}

//*************************************************************
    void de750ms(void)              //750ms
	  {unsigned char i,j,k;
	    for(i=6;i>0;i--)
		 for(j=255;j>0;j--)
		   for(k=255;k>0;k--);
	  } 
//*************************************************************
  void lcdbusy(void)
    {unsigned char i,c;
	  while(1) 
	   {sendbyte(0xfc);
		sclk=1;
		c=sid;
		sclk=0;
	   for(i=0;i<15;i++)
	    {sclk=1;
		 sclk=0;}
       if(c==0) break;
	  }	  
   }	    
    
 //**********************************************************
  void sendbyte(unsigned char ds)    //向LCD中发送一个字节
   {unsigned char i;
     for(i=0;i<8;i++)
	   {sclk=1;
	    sid=ds&0x80;
	  // if((ds&0x80)==0x80)  sid=1;
	  // else sid=0;	   
	   sclk=0;
	   ds=ds<<1;}
   }
//*************************************************************
   void wrlcd(unsigned char sta,ks)  //向LCD中写入一个起始字节与一个数据
     {unsigned char hdata,ldata;	  
	  hdata=ks&0xf0;
	  ks=ks&0x0f;
	  ks=ks<<4;
	  ldata=ks;
	  cs=1;
	  lcdbusy();     
      sendbyte(sta);
	  sendbyte(hdata);  
	  sendbyte(ldata);  
      cs=0;
	 }	  
//****************************************************************
  void ex0(void) interrupt 0 using 0
    {EX0=0;
	 TR0=0;
	 timeh=TH0;
	 timel=TL0;
	 TH0=0;
	 TL0=0;
	 IE0=0;
	 ff=1;
	 re=0;
	 }
//****************************************************************
  void computers(unsigned int v)
   {unsigned long  s;
    unsigned int ss;
	unsigned char i;
   	 v=v/2;	 
     s=timeh;
     s=s<<8;
     s=s+timel;
	// s=s*v;
	if(comflag==1)    s=s-270;          //时间修正-194
	else    s=s-142;                    //-177
 	s=s*v;	
 	
     //ss=s/100000;

	if(14000000<s&&s<19500000)  s=s+240000;
    else if(s>=19500000&&s<28500000) s=s+140000;
    else if(s>=36500000&&s<=40000000) s=s-30000;
    else if(s>49500000&&s<59500000)   s=s-25000;
    else if(s>=59500000&&s<=69500000) s=s-49000;
    else if(s>69500000)   s=s-700000;
	else  s=s;  
	 ss=s/100000;
	 disbufs[0]=s/100000000;
	 s=s%100000000;
	 disbufs[1]=s/10000000;
	 s=s%10000000;	 
	 disbufs[3]=s/1000000;
	 s=s%1000000;
	 disbufs[4]=s/100000;
     s=s%100000;
     disbufs[5]=s/10000;

	 
 	  soubuf[0]=sound[disbufs[0]];
	  soubuf[1]=sound[disbufs[1]];
	  soubuf[2]=92;
	  soubuf[3]=sound[disbufs[3]];
	  soubuf[4]=sound[disbufs[4]];
	  soubuf[5]=83;

	 for(i=0;i<6;i++)
	 disbufs[i]=disbufs[i]|0x30;
	 disbufs[2]=0x2e;
	 disbufs[6]=0x6d;
	  
	 if(ss<=200)  pf=0;
	 else if(ss>200&&ss<=300) pf=1;
	 else if(ss>300) pf=2;
	 else pf=3;
	}   
 //***********************************************************
   void display(void)
    {unsigned char i;
	 wrlcd(0xf8,0x80);
      for(i=0;i<9;i++)
       wrlcd(0xfa,word[i]);
	  for(i=0;i<7;i++)
	   wrlcd(0xfa,disbufs[i]);
	 wrlcd(0xf8,0x92);
        for(i=0;i<8;i++)	   
          {if(pf==0) {wrlcd(0xfa,wordd[i]);dr=0;sg=1;hy=1;}
		   if(pf==1) {wrlcd(0xfa,wordh[i]);hy=0;dr=1;sg=1;}
		   if(pf==2) {wrlcd(0xfa,words[i]);sg=0;dr=1;hy=1;}
		  }
	  wrlcd(0xf8,0x89);
	    for(i=0;i<12;i++)
		  {if (vc==1)  {wrlcd(0xfa,wordpower[i]);dpl=1;}
		   if (vc==0)  {wrlcd(0xfa,worddrop[i]);dpl=0;}
          }
	  wrlcd(0xf8,0x98);
	   for(i=0;i<5;i++)
	    wrlcd(0xfa,wordt[i]);
	   for(i=0;i<8;i++)
	    wrlcd(0xfa,disbuft[i]);	 
  	   wrlcd(0xf8,0x9e);
		wrlcd(0xfa,0xa1);
		wrlcd(0xfa,0xe6);
    }	 
//******************************************************************
   void speak(void)
    {unsigned char i,j,k,h;
	  for(i=1;i<6;i++)
	    {P1=soubuf[i];
		 play=0;
		  for(j=5;j>0;j--)
		   for(k=255;k>0;k--)
		    for(h=250;h>0;h--);
		 play=1;
		  for(j=190;j>0;j--)
		   for(k=255;k>0;k--);
		 }
	 }	  
 //******************************************************
 void send0(void)
 {unsigned char i,j;
   EX0=0;
   TH0=0;
   TL0=0;
   //re=1;
   ff=0;
   TR0=1;
   for(i=2;i>0;i--)        //20   //2
     {fang=1;
	   for(j=5;j>0;j--);
	  fang=0;
	   for(j=4;j>0;j--);
	  }
   //TR0=1;
   for(j=8;j>0;j--)        //延时消除余震3ms    3,255 //2,255//8,65
    for(i=65;i>0;i--);   
    IE0=0;
    EX0=1;
                         //等待中断回波
   for(i=139;i>0;i--)
     for(j=255;j>0;j--);
  }
//********************************************************************
   void send1(void)
 {unsigned char i,j;
   EX0=0;
   TH0=0;
   TL0=0;
   //re=1;
   ff=0;
   TR0=1;
   for(i=20;i>0;i--)        //20   //2
     {fang=1;
	   for(j=5;j>0;j--);
	  fang=0;
	   for(j=4;j>0;j--);
	  }
   //TR0=1;
   for(j=2;j>0;j--)        //延时消除余震3ms    3,255 //2,255//8,65
    for(i=255;i>0;i--);   
    IE0=0;
    EX0=1;
                         //等待中断回波
   for(i=139;i>0;i--)
     for(j=255;j>0;j--);
  }
//******************************************************************
  void intlcd(void)       //初始化LCD
    {//delay40();
     de750ms();
     wrlcd(0xf8,0x30);     //功能设定   
     wrlcd(0xf8,0x30);     //功能设定  
	 wrlcd(0xf8,0x30);     //功能设定
     wrlcd(0xf8,0x0c);     //显示状态    
     wrlcd(0xf8,0x06);     //显示右移
     }
//*****************************************************************
  void checkself(void)
   {unsigned char i;
    unsigned char j,k;
    P1=97;
    P2=0x00;
    wrlcd(0xf8,0x81);
    for(i=0;i<13;i++)
    wrlcd(0xfa,check[i]);
	  
    for(i=0;i<20;i++)
	 for(j=0;j<255;j++)
	  for(k=0;k<255;k++);
	play=1;
	P2=0x7f;
	
   }
//***************************************************************
 void main(void)
 {   
   TMOD=0x01;
   TH0=0;
   TL0=0;
   EA=1;
   EX0=0;
   IT0=1;
   IE0=0;
   ff=0;
   comflag=0;
 // ET0=0;
   P2=0xff;
   intlcd(); 
 // checkself();  
while(1)
{//se:
   send0();
   if(ff==0)  goto se;
   else  {comflag=0;goto ne;}
  
  se:
   send1();
   if(ff==0)  goto se;
   comflag=1;
  ne:
   ff=0;
  gettemper();
  computert();
  re=1;
  computers(computerv());
  display();
 if(ensp==0)
    speak();
  hl:
 if(hold==0)  goto hl;
 }
}
//*****************************************************************  

⌨️ 快捷键说明

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