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

📄 ds18b20-lcd1602-c51.c

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 C
📖 第 1 页 / 共 2 页
字号:

     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 main()
 {
   uchar  m;
   TMOD=0x01; TH0=0x4c; TL0=0x00; //50ms定时
   EA=1; ET0=1; TR0=1;

   while(1)
   {
    Init_DS18B20();
    if(presence)
    {
      Error_Menu ();
	 do
	 {  
	   Init_DS18B20();
	   beep();
     }
	 while(presence);
    }
    
     RomCode_Menu ();      //显示RomCode
     for(m=0;m<10;m++)
     Delay(50000);

    Natural_Menu ();
    do
    { 
     Read_Temperature();
     Disp_Temperature();
     temp_compare();
     set_temp_alarm();	
	 if(!K4)
	  {
	    beep();
		while(!K4);   //等待键释放
        alarm_on_off=~alarm_on_off;
	  }
       
	 if(!K1)
	  {
	    beep();
		while(!K1);           //等待键释放
        RomCode_Menu ();      //显示RomCode

        while(K2);            //等待K2键按下
        beep();
        Natural_Menu ();
	  }
   }
    while(!presence); 

  }//end of while(1)
}  //end of main()

/*********************************************************/
// 显示报警温度
/*********************************************************/
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();
	 }
	else 
	 {
       lcd_pos(0x46);
       lcd_wdat(0x20);
	 }
	if(compare_tl)
	 {
	   spk(0x4e);           //小喇叭闪动
       if(!alarm_on_off)    //静音选择
	   beep();
	 }
	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  key_set(uchar num)
{ 
   if(!K2)                //加键
   {
     beep();
     if(count!=num)
     count++; 
     else 
	 count=0;	 
   }
   if(!K1)               //减键
   {
     beep();
     if(count!=0)
     count--; 
     else count=num;
   }
}

/**********************************************************
温度报警值设定
***********************************************************/
void set_temp_alarm()
{ 
    if(!K3)
     {
	   beep();
	   temp_th=1;
       count=temp_alarm[0];          //取实时TH报警值
	 }
           	
    while(temp_th)
    {
       key_set(120);
       Set_tempalarm_Flash(0x43,0);

      if(!K3)
      {
	    beep();
		temp_th=0;
        temp_tl=1;
		flag=1;
        Set_tempalarm_Flash(0x43,0);  //显示温度报警TH值
        count=temp_alarm[1];          //取实时TL报警值
      }
    }
    while(temp_tl)
    {
      key_set(120);
      Set_tempalarm_Flash(0x4b,1);

      if(!K3)
      {
	    beep();
		temp_tl=0;
	    flag=1;
        Set_tempalarm_Flash(0x4b,1); //显示温度报警TL值
        Write_Temperature_alarm();   //报警值写入DS18B20
	    count=0;                     
      }
    }
}

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

⌨️ 快捷键说明

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