|
温度已经能正常显示了,但是蜂鸣器和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;
}
|
|