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

📄 ds18b20-lcd1602-c51.c

📁 ds18b20温度显示程序 C语言编写的程序 1602 液晶显示
💻 C
📖 第 1 页 / 共 2 页
字号:
     { display[0]=display[0]+0x37;}
    else{display[0]=display[0]+0x30;}          
    lcd_wdat(display[0]);        //高位数显示 

    display[1]=(Temp&0x0f);
    if(display[1]>9)
     {display[1]=display[1]+0x37;}
    else {display[1]=display[1]+0x30;}           
    lcd_wdat(display[1]);        //低位数显示 
   }
}	 

/*******************************************************************/
/*                                                                 */
/* 读取温度                                                        */
/*                                                                 */
/*******************************************************************/
 Read_Temperature(void)
{
     uchar  i;
     TR0=0;                     //关中断,防止读数错误
     Init_DS18B20();
  
     WriteOneChar(0xCC);        //跳过读序号列号的操作
     WriteOneChar(0x44);        //启动温度转换

     Init_DS18B20();

     WriteOneChar(0x55);         //匹配ROM命令
     for(i=0;i<8;i++)
     WriteOneChar(RomCode[i]);

     WriteOneChar(0xBE);         //读取温度寄存器

     temp_data[0] = ReadOneChar();   //温度低8位
     temp_data[1] = ReadOneChar();   //温度高8位
     temp_alarm[0] = ReadOneChar();  //温度报警TH
	 temp_alarm[1] = ReadOneChar();  //温度报警TL

	 temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
                                   //取温度整数值
     TR0=1;        //开中断
}
/*******************************************************************/
/*                                                                 */
/* 数据转换与温度显示                                              */
/*                                                                 */
/*******************************************************************/
 Disp_Temperature()
{
   uchar s=0;
   if(temp_data[1]>127)                  //温度为负值
   {                                        
    temp_data[0]=(~temp_data[0])+1;     //取反加一,将补码变成原码
    if((~temp_data[0])>=0xff)
    temp_data[1]=(~temp_data[1])+1;
    else temp_data[1]=~temp_data[1];
    s=1;
   }
	
   display[4]=temp_data[0]&0x0f;
   display[0]=(display[4]*10/16)+0x30;
  
   display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
   display[3]=display[4]/100+0x30;
   display[1]=display[4]%100;
   display[2]=display[1]/10+0x30;
   display[1]=display[1]%10+0x30;

    if(display[3]==0x30)        //高位为0,不显示
   { 
     display[3]=0x20;              
     if(display[2]==0x30)       //次高位为0,不显示
     display[2]=0x20;
   }
   if(s)
   display[3]=0x2d;            //显示负号
    
    lcd_pos(0x07);             
    lcd_wdat(display[3]);      //百位数显示             
    lcd_wdat(display[2]);      //十位数显示              
    lcd_wdat(display[1]);      //个位数显示  
    lcd_wdat('.');            
    lcd_wdat(display[0]);      //小数位数显示
 	lcd_wdat(0x00);            //显示自定义字符
    lcd_wdat('C');             //显示C
}	 

/*******************************************************************/
/*                                                                 */
/* 蜂鸣器响一声                                                    */
/*                                                                 */
/*******************************************************************/
void beep()
{
    unsigned char y;
    for (y=0;y<100;y++)
    {
      Delay(70);
      BEEP=!BEEP;                //BEEP取反
    } 
    BEEP=1;                      //关闭蜂鸣器
	Delay(25000);
}

/*******************************************************************/
/*                                                                 */
/* ROMCORD 显示菜单                                                */
/*                                                                 */
/*******************************************************************/
void  RomCode_Menu ()
{ 
    uchar  m;
    lcd_init();                //初始化LCD
 
    lcd_pos(0);                //设置显示位置为第一行
    for(m=0;m<16;m++)          //显示字符
    lcd_wdat(cdis1[m]);
     
    Read_RomCord();            //读取64位序列码
    CRC8();                    //CRC效验
    if(crc==0)                 //CRC效验正确
    {
	  Disp_RomCode(2);	       //显示64位序列码
    }
}

/*******************************************************************/
/*                                                                 */
/* DS18B20 ERROR 显示菜单                                          */
/*                                                                 */
/*******************************************************************/
void  Error_Menu ()
{
     uchar  m;
     lcd_init();                //初始化LCD 
	
  	 lcd_pos(0);                //设置显示位置为第一行的第1个字符
     for(m=0;m<16;m++) 
     lcd_wdat(cdis3[m]);        //显示字符
    
     lcd_pos(0x40);             //设置显示位置为第二行第1个字符
     for(m=0;m<16;m++) 
     lcd_wdat(cdis4[m]);        //显示字符
}

/*******************************************************************/
/*                                                                 */
/* DS18B20 正常显示菜单                                            */
/*                                                                 */
/*******************************************************************/
void  Natural_Menu ()
{
   uchar  m;
   lcd_init();                //初始化LCD 

   lcd_pos(0);                //设置显示位置为第一行的第1个字符
   for(m=0;m<16;m++) 
   lcd_wdat(cdis5[m]);        //显示字符

   lcd_pos(0x40);             //设置显示位置为第二行第1个字符
   for(m=0;m<16;m++) 
   lcd_wdat(cdis6[m]);        //显示字符

   Read_Temperature();
   Disp_Temp_alarm(0x43,0);   //显示TH值
   Disp_Temp_alarm(0x4b,1);   //显示TL值
   Disp_Temperature();        //显示实时温度值
}


/*********************************************************/
// 显示报警温度
/*********************************************************/
void Disp_Temp_alarm(uchar addr,uchar num)
{   //0=TH,1=TL
   display1[2]=temp_alarm[num]/100+0x30;
   display1[0]=temp_alarm[num]%100;
   display1[1]=display1[0]/10+0x30;
   display1[0]=display1[0]%10+0x30;

    if(display1[2]==0x30)        //高位为0,不显示
    { 
      display1[2]=0x20;              
      if(display1[1]==0x30)      //次高位为0,不显示
      display1[1]=0x20;
    }

    lcd_pos(addr);
    lcd_wdat(display1[2]);        //百位数显示             
    lcd_wdat(display1[1]);        //十位数显示              
    lcd_wdat(display1[0]);        //个位数显示
}    

/**********************************************************/
// Time0中断函数
/**********************************************************/
void Time0(void) interrupt 1 using 0
{
   TH0=0x4c;        //50ms定时
   TL0=0x00;
   timecount++;
   if(timecount>9)
   {
    timecount=0;
    flag=~flag;         
   }
}

/*********************************************************/
/*                                                       */
/*小喇叭闪动                                             */
/*                                                       */
/*********************************************************/
void  spk(uchar addr)
{
   if(flag)
   {
     lcd_pos(addr);
     lcd_wdat(0x01);      //小喇叭显示
   }
   else
   {
     lcd_pos(addr);
     lcd_wdat(0x20);      //清屏
   }
}

/*********************************************************/
// 温度比较函数
/*********************************************************/
void temp_compare()
{    
    if(temp_comp >= temp_alarm[0])      //比较 TH 值
     {
       compare_th=1;                    
	 }
	else  compare_th=0;

    if(temp_comp < temp_alarm[1])        //比较 TL 值
	 {
	   compare_tl=1;
	 }
	else  compare_tl=0;
     
	if(compare_th)
	 {
	   spk(0x46);            //小喇叭闪动
       if(!alarm_on_off)     //静音选择
	   beep();
	   count=temp_alarm[0];
	 }
	else 
	 {
       lcd_pos(0x46);
       lcd_wdat(0x20);
	 }
	if(compare_tl)
	 {
	   spk(0x4e);           //小喇叭闪动
       if(!alarm_on_off)    //静音选择
	   beep();
	   count=temp_alarm[1];
	 }
	else 
	 {
       lcd_pos(0x4e);
       lcd_wdat(0x20);
	 }
}   

/*********************************************************/
// 温度报警值闪动
/*********************************************************/
void  Set_tempalarm_Flash(uchar addr,uchar num)
{
   if(flag)
   {
     temp_alarm[num]=count;
     Disp_Temp_alarm(addr,num);  //显示温度报警值
   }
   else
   {
     lcd_pos(addr);
     lcd_wdat(0x20);
	 lcd_wdat(0x20);
	 lcd_wdat(0x20);
   }
}


/*******************************************************************/
/*                                                                 */
/* 主函数                                                          */
/*                                                                 */
/*******************************************************************/
void main()
 {
	uchar  m;
	TMOD=0x01; TH0=0x4c; TL0=0x00; 				//50ms定时
	EA=1; ET0=1; TR0=1;
	P0=0;
	P2&=0x1F;
	Init_DS18B20();
	Write_Temperature_alarm();					//设定报警上下限温度值
	if(presence)
    {
    	Error_Menu ();
		do
		{  
			Init_DS18B20();
			beep();
		}
		while(presence);
    }
    
	RomCode_Menu ();      						//显示RomCode
	for(m=0;m<10;m++)
	Delay(50000);
    Natural_Menu ();							//正常显示界面
	Delay(50000);
	while(1)
	{
		Read_Temperature();						//读取当前温度
		Delay(50000);
		Disp_Temperature();						//更新当前温度
		temp_compare();							//温度上下限比较
		if(compare_th)
		{
			Set_tempalarm_Flash(0x43,0);		//上限报警
		}
		if(compare_tl)
		{
			Set_tempalarm_Flash(0x4b,1);		//下限报警
		}
  }//end of while(1)
}  //end of main()


/**********************************************************/

⌨️ 快捷键说明

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