标题: 关于单片机+ds18b02的一些小问题,等级判定应该怎么解决? [打印本页]

作者: 茉莉星瞳    时间: 2021-11-4 15:42
标题: 关于单片机+ds18b02的一些小问题,等级判定应该怎么解决?
温度已经能正常显示了,但是蜂鸣器和led灯一直不合适,这个逻辑应该怎么改



以下是主程序的代码,根据开发板的程序修改出来的,显示完全没问题,就是判定等级的逻辑不合适,我觉得我写的逻辑应该没啥大问题,但是根据读取的温度来判定等级就是不合适,判定逻辑应该没什么大问题,请大佬帮我看看

单片机源程序如下:
#include<common.h>
#include<l1602.h>
#include<temp.h>
sbit led1=P3^0;
sbit dz=P3^3;//蜂鸣器
uchar buf[20];
u8 s;
void LcdDisplay(int temp);
void level(int temp);
void Delay500ms()  [url=]//@12.000MHz[/url]
{
unsigned char i, j, k;

i = 23;
j = 205;
k = 120;
do
{
  do
  {
   while (--k);
  } while (--j);
} while (--i);
}
void main()
{
int x1;
float x;
led1=1;dz=1;
LCD1602_Init();//初始化液晶
delay(10);
// LCD_Clear();//清屏
// Delay500ms();
SetRowCol(0,0);
DispString("Temp:       C");
  SetRowCol(0,0);
DispString("Temp:       C");
while(1)
{
  dz=1;
  LcdDisplay(Ds18b20ReadTemp());
  Delay1ms(1000);//1秒一次
  x1=Ds18b20ReadTemp();
  x=(Ds18b20ReadTemp())*0.0625*100+0.5;
// x=22;
     
/***************************等级判定***************************/
  if(x>=20&&x<=30)
      {
      SetRowCol(1,14);
      DispString((u8*)"L");
      //LCD_Write_Char(14,1,'L');
      Delay1ms(1000);
      led1=~led1;
      Delay1ms(1000);
      dz=0;
      }
      else if(x>30&&x<=40)
      {
//      LCD_Write_Char(14,1,'N');
//      Delay1ms(1000);
      led1=~led1;
      Delay1ms(1000);
      dz=~dz;
      }
      else if(x>40&&x<=50)
      {
//      LCD_Write_Char(14,1,'H');
//      Delay1ms(1000);
      led1=~led1;
      Delay1ms(1000);
      dz=~dz;
      }
      else
      {
//      LCD_Write_String(0,1,"                ");
      led1=led1;
      dz=dz;

      }
}
  
  
/******************************************************************/

}
void LcdDisplay( int temp)   //lcd显示
{
   float tp;
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组

if(temp< 0)    //当温度值为负数
   {
   LCD_Write_Char(5,0,'-');//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
   temp=temp-1;
   temp=~temp;
   tp=temp;
   temp=tp*0.0625*100;
  }
  
else
  {
   LCD_Write_Char(5,0,'+');
   tp=temp;
   temp=tp*0.0625*100;
  }
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LCD_Write_Char(6,0,datas[0]+0x30);
LCD_Write_Char(7,0,datas[1]+0x30);
LCD_Write_Char(8,0,datas[2]+0x30);
LCD_Write_Char(9,0,'.');
LCD_Write_Char(10,0,datas[3]+0x30);
LCD_Write_Char(11,0,datas[4]+0x30);
}




以上是主程序,以下是18b20最后的读取温度程序

int Ds18b20ReadTemp()
{
int temp=0;
unsigned char tmh,tml;
Ds18b20ChangTemp();     //先写入转换命令
Ds18b20ReadTempCom();   //然后等待转换完后发送读取温度命令
tml=Ds18b20ReadByte();  //读取温度值共16位,先读低字节
tmh=Ds18b20ReadByte();  //再读高字节
temp=tmh;
temp<<=8;
temp|=tml;
return temp;
}



wendu.zip

96.65 KB, 下载次数: 1


作者: AUG    时间: 2021-11-4 16:40
先确定你的分级是啥样的,不同等级时蜂鸣器和LED的显示是什么个状态,然后再去实现




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1