在实际设计过程中那个报警温度的设定,可以直接对那个变量进行加减的,例如
void actfuntion(unsigned char temp)
{
temp++
}
然后在检测到按键有电平跳变的时候,就调用这个含参子函数对定义的温度设定值进行加 *** 作,减 *** 作也是一样,还可以在调用的后面进行最大值或者最小值的判断。
如果觉得这样一下一下的按太麻烦了,可以对按键进行长按连续触发进行判断,就是在定时器里进行判断按下时间,然后不停的调用这个子函数。
当然这个设定值是需要考虑掉电保存的,或者是按键保存。可以在设定好温度值之后,在按下其他的按键,进行把温度设定值 保存到单片机内部eeprom就可以了,不需要保存太多数据的情况下,现在市面上很多单片机都有的内部eeprom就够用的了,不需要进行外部扩展。
然后在单片机上电,也就是主函数的开头进行读取eeprom中保存的设定值。
/*************** writer:shopping.w ******************/
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ = P3^6
uchar code DSY_CODE[] =
{ 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00}
uchar code df_Table[] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}
uchar CurrentT = 0
uchar Temp_Value[]={0x11,0x22}
uchar Display_Digit[]={0,0,0,0}
bit DS18B20_IS_OK = 1
void Delay(uint x)
{
while(--x)
}
uchar Init_DS18B20()
{
uchar status
DQ = 1
Delay(8)
DQ = 0
Delay(90)
DQ = 1
Delay(8)
DQ = 1
return status
}
uchar ReadOneByte()
{
uchar i,dat=0
DQ = 1
_nop_()
for(i=0i<8i++)
{
DQ = 0
dat >>= 1
DQ = 1
_nop_()
_nop_()
if(DQ)
dat |= 0X80
Delay(30)
DQ = 1
}
return dat
}
void WriteOneByte(uchar dat)
{
uchar i
for(i=0i<8i++)
{
DQ = 0
DQ = dat& 0x01
Delay(5)
DQ = 1
dat >>= 1
}
}
void Read_Temperature()
{
if(Init_DS18B20() ==1 )
DS18B20_IS_OK = 0
else
{
WriteOneByte(0xcc)
WriteOneByte(0x44)
Init_DS18B20()
WriteOneByte(0xcc)
WriteOneByte(0xbe)
Temp_Value[0] = ReadOneByte()
Temp_Value[1] = ReadOneByte()
DS18B20_IS_OK=1
}
}
void Display_Temperature()
{
uchar i
uchar t=150
uchar ng=0, np=0
if ( (Temp_Value[1] & 0xf8) == 0xf8)
{
Temp_Value[1] = ~Temp_Value[1]
Temp_Value[0] = ~Temp_Value[0]+1
if (Temp_Value[0] == 0x00) Temp_Value[1]++
ng=1np=0xfd
}
Display_Digit[0] = df_Table[ Temp_Value[0] & 0x0f ]
CurrentT = ((Temp_Value[0] & 0xf0)>>4) | ((Temp_Value[1] & 0x07)<<4)
Display_Digit[3] = CurrentT / 100
Display_Digit[2] = CurrentT % 100 / 10
Display_Digit[1] = CurrentT % 10
if (Display_Digit[3] == 0)
{
Display_Digit[3] = 10
np = 0xfb
if (Display_Digit[2] == 0)
{
Display_Digit[2] = 10
np = 0xf7
}
}
for (i=0i<30i++)
{
P0=0x39P2=0x7fDelay(t)P2=0xFF
P0=0x63P2=0xbfDelay(t)P2=0xff
P0=DSY_CODE[Display_Digit[0]]
P2=0xDFDelay(t)P2=0xff
P0=(DSY_CODE[Display_Digit[1]]) | 0x80
P2=0xefDelay(t)P2=0xff
P0=DSY_CODE[Display_Digit[2]]
P2=0xf7Delay(t)P2=0xff
P0=DSY_CODE[Display_Digit[3]]
P2=0xfb Delay(t) P2=0xff
if (ng)
{
P0 = 0x40 P2 = np Delay(t) P2=0xff
}
}
}
void main()
{
Read_Temperature()
Delay(50000)
Delay(50000)
while(1)
{
Read_Temperature()
if(DS18B20_IS_OK)
Display_Temperature()
}
}
先设定一个全局变量, 通过按键设置温度的上上下限,即按键1 代表加一,按键2代表减一, 按键3代表左移,按键4代表右移,这样设置的温度阈值,然后主函数读取你设定的温度阈值,再与实时监控的温度值 作比较,用if语句设定高于或者低于温度阈值时候应该怎么写TH 上限 TL下限 T 实际
if(key=1)
plusshi()//十位加一
if(key=2)
plusge()//个位加一
if(key=3)
left()//左移一位
if(key=4)
right()//右移一位
read(TL)
READ(TH)
if(T<TL)
kongtiao()//温度高的时候,采取降温措施
if(T>TH)
nuanqi()//温度低的时候,采取升温措施
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)