找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 493|回复: 1
打印 上一主题 下一主题
收起左侧

关于单片机+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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:313048 发表于 2021-11-4 16:40 | 只看该作者
先确定你的分级是啥样的,不同等级时蜂鸣器和LED的显示是什么个状态,然后再去实现
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表