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

📄 wendu.c

📁 此为18B20的温度检测以及键盘控制和液晶显示程序.好用.
💻 C
📖 第 1 页 / 共 2 页
字号:
	i = 4;
	while (i>0)	i--;
}

/* 等待应答脉冲 */
void RxWait(void)
{
	uint i;
	while(DQ);
	while(~DQ);			// 检测到应答脉冲 
	i = 4;
	while (i>0)	i--;
}

/* 读取数据的一位,满足读时隙要求 */ 
bit RdBit(void)
{
	uint i;
	bit b;
	DQ = 0;
	i++;
	DQ = 1;
	i++;i++;			// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
	b = DQ;
	i = 8;
	while(i>0) i--;
	return (b);
}

/* 读取数据的一个字节 */
uchar RdByte(void)
{
	uchar i,j,b;
	b = 0;
	for (i=1;i<=8;i++)
	{
		j = RdBit();
		b = (j<<7)|(b>>1);
	}
	return(b);
}

/* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
	uint i;
	uchar j;
	bit btmp;
	for(j=1;j<=8;j++)
	{
		btmp = b&0x01;
		b = b>>1;		// 取下一位(由低位向高位)
		if (btmp)
		{
			/* 写1 */
			DQ = 0;
			i++;
                        i++;	// 延时,使得15us以内拉高
			DQ = 1;
			i = 8;
			while(i>0) i--;	// 整个写1时隙不低于60us 
	   	}
		else
		{
			/* 写0 */
			DQ = 0;			
			i = 8;
			while(i>0) i--;	// 保持低在60us到120us之间
			DQ = 1;
			i++;
			i++;
		}
	}
}

/* 启动温度转换 */
void convert(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20
	RxWait();			// 等待DS18B20给出应答脉冲
	delay2(1);			// 延时
	WrByte(0xcc);		        // skip rom 命令
	WrByte(0x44);		        // convert T 命令
}

/* 读取温度值 */
void RdTemp(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20 
	RxWait();			// 等待DS18B20给出应答脉冲
	delay2(1);			// 延时
	WrByte(0xcc);		        // skip rom 命令
	WrByte(0xbe);		        // read scratchpad 命令
	tplsb = RdByte();	        // 温度值低位字节(其中低4位为二进制的“小数”部分)
	tpmsb = RdByte();	        // 高位值高位字节(其中高5位为符号位)		
}

void cmpare(void)
{   
  	  alert=0;
   if(num[tem1[1]]>d[0]) alert=1;
   else if(num[tem1[1]]==d[0]) 
     {if(num[tem1[2]]>=d[1])  alert=1;
	  else alert=0;
	  }
	else alert=0;
     
}

tempreture()
{
      uchar i,j;
	  lcd_wrcmd(0x80);
	   for(i=0;i<15;i++)
	   lcd_wrdata(str2[i]);
    
	while(1)
	{
      delay2(1);
      convert();
      delay2(500);
      RdTemp();
	  temp1=(tpmsb<<4)|(tplsb>>4);
	  temp2=tplsb&0x0f;
/*	  for(i=0;i<3;i++)
	 {  k=10^(2-i); 
	  tem1[i]=temp1/k;
	   temp1=temp1%k;
	   lcd_wrcmd(0xc0+i);
	   lcd_wrdata(num[tem1[i]]); 
	   }  
	   lcd_wrdata('.');
	   temp2=temp2*625;
	    for(i=0;i<4;i++)
	 { tem2[i]=temp2/(10^(3-i));
	   temp2=temp2%(10^(3-i));
	   lcd_wrcmd(0xc4+i);
	   lcd_wrdata(num[tem2[i]]); 
	   } 
	   lcd_wrdata(2);
	   lcd_wrdata(3);

*/	 
         j=getkey();			 //返回
	     if(j==0)
		 {  lcd_wrcmd(1);
		   state=1;
		   break;
		  }

	  tem1[0]=temp1/100;
	   temp1=temp1%100;
	  tem1[1]=temp1/10;
	   temp1=temp1%10;
	   tem1[2]=temp1;



	   temp2=temp2*625;
	   tem2[0]=temp2/1000;
	   temp2=temp2%1000;
	   tem2[1]=temp2/100;
	   temp2=temp2%100;
	   tem2[2]=temp2/10;
	   temp2=temp2%10;
	   tem2[3]=temp2;  

	   lcd_wrcmd(0xc0);	   //显示当前温度
	  for(i=0;i<3;i++)
	   lcd_wrdata(num[tem1[i]]);

	   lcd_wrdata('.');

	   lcd_wrcmd(0xc4);
	  for(i=0;i<4;i++)
		lcd_wrdata(num[tem2[i]]);
		lcd_wrdata(2);
		lcd_wrdata('C'); 
		  
	   lcd_wrcmd(0xcc);	   //显示比较温度
		for(i=0;i<2;i++)
		lcd_wrdata(d[i]);
		lcd_wrdata(2);
		lcd_wrdata('C'); 

      cmpare();	    //比较

	 	 
	
	    
	  }

}
	   


/*tempreture()
{ uchar i;
lcd_wrcmd(offset+0x00);
	for(i=0;i<4;i++)   
	 {
       lcd_wrdata(d[i]);    
      } 
} */



input()
{     
       uchar i,j,cnt=0;	 // 假如将cnt定义成全局变量,当退出这个界面时,cnt仍然保存原来的值   	  
	   lcd_wrcmd(0x80);	 //会出现光标乱跳的错误
	   lcd_wrcmd(0xce);
	   lcd_wrdata(2);
	   lcd_wrdata('C');
	   lcd_wrcmd(0x81);
       for(i=0;i<13;i++)lcd_wrdata(am[i]);
	   lcd_wrcmd(0x0f);
	   lcd_wrcmd(0xc0);
	   while(1)	                 //按键处理
	   { 
	       i=getkey();
	       
		    if(i==0)
		    {
		         state=1;
				 lcd_wrcmd(0x0c);
				 lcd_wrcmd(1);
				 lcd_wrcmd(0x80);
				 break;
	    	}
		    else if(i==2)
			{
			    cnt=0;					 					 
			    lcd_wrcmd(0xc0);
				for(j=0;j<=10;j++)
			    lcd_wrdata(' ');
			    lcd_wrcmd(0xc0);    
			}
			else if(i<16)
	       {	 cnt++;
	  		     if(cnt<=2)
				 	
				 {     lcd_wrcmd(0xc0+cnt-1);
			           lcd_wrdata(table[i]);
					    d[cnt-1]=table[i];
			           	
			     }	
				 			 
			     else
				 {	 
				     cnt=0;					 					 
					 lcd_wrcmd(0xc0);
					 for(j=0;j<=3;j++)
					     lcd_wrdata(' ');
					 lcd_wrcmd(0xc0);
			     }
		    }
		}
     
}

////////////////////////////////////////////////////////////////////////////////////
menu()
{
     uchar i,ii,cnt=1;

     lcd_wrcmd(0x83);
	 for(i=0;i<10;i++)
	     lcd_wrdata(str4[i]);
	 lcd_wrcmd(0xc3);
	 i=0;
	 while(str5[i]!='\0')
	 {
	    lcd_wrdata(str5[i]);
		i++;
	 }
	 lcd_wrcmd(0x80);
	 lcd_wrdata('-');
	 lcd_wrdata('>');


	 while(1)
	 {
	     ii=getkey();
       ///////////////////////////翻屏///////////////////////////////
		 if(ii==2)        
		 {	 cnt++;
		     if(cnt==5) cnt=1;
			 if(cnt==1)
			 {
			     //////////////////////
				 // ->1: FREQENCY
				 //	  2: PHASE
				 /////////////////////
			     lcd_wrcmd(1);//clear
			     lcd_wrcmd(0x83);        //frequency
	             for(i=0;i<10;i++)
	                 lcd_wrdata(str4[i]);

	             lcd_wrcmd(0xc3);       //phase
	             i=0;
	              while(str5[i]!='\0')
	              {
	                   lcd_wrdata(str5[i]);
	                   i++;
	              }
				  lcd_wrcmd(0x80);
	              lcd_wrdata('-');
	              lcd_wrdata('>');			     
			 }

			 else if(cnt==2)
			 {
			     //////////////////////
				 //     1: FREQENCY
				 //	  ->2: PHASE
				 /////////////////////
				 lcd_wrcmd(1);//clear

			     lcd_wrcmd(0x83);        //frequency
	             for(i=0;i<10;i++)
	                 lcd_wrdata(str4[i]);

	             lcd_wrcmd(0xc3);       //phase
	             i=0;
	              while(str5[i]!='\0')
	              {
	                   lcd_wrdata(str5[i]);
	                   i++;
	              }
				  lcd_wrcmd(0xc0);
	              lcd_wrdata('-');
	              lcd_wrdata('>');
			 }
			 else if(cnt==3)
			 { 

				 //////////////////////
				 //     2: PHASE
				 //	 -> 3: Amplitude 
				 /////////////////////
			     lcd_wrcmd(1);

			     lcd_wrcmd(0xc3);	        //Amplitude 
	             for(i=0;i<8;i++)
	                 lcd_wrdata(str6[i]);        

	              lcd_wrcmd(0x83);
	              i=0;
	              while(str5[i]!='\0')      //phase
	              {
	                   lcd_wrdata(str5[i]);
	                   i++;
	              }
				  lcd_wrcmd(0xc0);
	              lcd_wrdata('-');
	              lcd_wrdata('>');
			 }
			 else if(cnt==4)
			 {

				 //////////////////////
				 //     3: Amplitude 
				 //	 -> 4: HELP
				 /////////////////////
			     lcd_wrcmd(1);
			     lcd_wrcmd(0x83);	        //setting
	             for(i=0;i<8;i++)
	                 lcd_wrdata(str6[i]);        
	             lcd_wrcmd(0xc3);
	             for(i=0;i<7;i++)
				     lcd_wrdata(str7[i]);   //help				
				 lcd_wrcmd(0xc0);
	             lcd_wrdata('-');
	             lcd_wrdata('>'); 
			 }
			 
					 		    
		 }
/////////////////////////OK进入///////////////////////////////////////
		 else if(ii==0)
		 {
		     if(cnt==1)
			 {
			     state=2;
				 lcd_wrcmd(1);
				 break;
			  }
			  else if(cnt==2)
			  {
			      state=3;
				  lcd_wrcmd(1);
				  break;
			  }
			  else if(cnt==3)
			  {
			      state=4;
				  lcd_wrcmd(1);
				  break;
			  }				    
			  else if(cnt==4)     //help
			  {
			      state=5;
				  lcd_wrcmd(1);
				  break;
			  }
	     }
////////////////////////快捷键///////////////////////////////////////////
		 else if(ii==15)
		 {
		      state=2;
			  lcd_wrcmd(1);
			  break;
		 }
		 else if(ii==11)
		 {
		      state=3;
		      lcd_wrcmd(1);
			  break;
		 }
		 else if(ii==7)
		 {
		      state=4;
			  lcd_wrcmd(1);
			  break;
		 }
		 else if(ii==3)
		 {
		       state=5;
			  lcd_wrcmd(1);
	           break;
		 }    


	 }




}


help()
{
    uchar i,ii;
	lcd_wrcmd(0x80);
    for(i=0;i<16;i++)
	{
	    lcd_wrdata(he[i]);
	}
	while(1)
	{
	    ii=getkey();
		if(ii!=0xff)
		{
		    lcd_wrcmd(1);
			state=1;
			break;
		 }
		
	    
	}

}


main()
{
       lcd_bus=0xff;
       lcd_ini();
    while(1)
	   {
	       if(state==0)        welcome();
		   else if(state==1)   menu();
		   else if(state==2)   voltage();
		   else if(state==3)   tempreture();
		   else if(state==4)   input();
		   else if(state==5)   help();
	   }
		   
}
			



	    	    

⌨️ 快捷键说明

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