写一段代码基于STC15F2K60S2该数字温度计能够采集温度信息,并通过LCD1602进行实时显示。 能显示2分钟之内的最低温度和最高温度。设定27度为报警门限,超过此温度蜂鸣器发声报警。
时间: 2024-02-18 20:05:24 浏览: 27
好的,下面是我为您编写的基于STC15F2K60S2的数字温度计的代码,能够采集温度信息,并通过LCD1602进行实时显示,显示2分钟内的最低温度和最高温度,并设定了27度为报警门限,当温度超过此值时,蜂鸣器会发声报警:
```
#include <STC15F2K60S2.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Beep=P3^5; //蜂鸣器
sbit RS=P2^0; //LCD1602控制线
sbit RW=P2^1;
sbit EN=P2^2;
#define LCD_data P0 //LCD1602数据线
uchar min_temp=255; //2分钟内最低温度
uchar max_temp=0; //2分钟内最高温度
uchar temp[5]; //存放温度值
uchar second_cnt=0; //秒计数器
uchar minute_cnt=0; //分钟计数器
bit flag=0; //标志位,用于指示是否需要更新最高/最低温度
void Delay1Ms(uint y)
{
uchar x;
while(y--)
{
for(x=0;x<110;x++);
}
}
void WriteCommand(uchar cmd)
{
LCD_data=cmd;
RS=0;
RW=0;
EN=1;
_nop_();
_nop_();
EN=0;
}
void WriteData(uchar dat)
{
LCD_data=dat;
RS=1;
RW=0;
EN=1;
_nop_();
_nop_();
EN=0;
}
void InitLcd1602()
{
WriteCommand(0x38);
Delay1Ms(5);
WriteCommand(0x38);
Delay1Ms(5);
WriteCommand(0x38);
Delay1Ms(5);
WriteCommand(0x0c);
Delay1Ms(5);
WriteCommand(0x06);
Delay1Ms(5);
WriteCommand(0x01);
Delay1Ms(5);
}
void DisplayLcd1602(uchar *p)
{
uchar i=0;
while(p[i]!='\0')
{
WriteData(p[i]);
i++;
}
}
void BeepAlarm()
{
Beep=1;
Delay1Ms(100);
Beep=0;
Delay1Ms(100);
}
void ReadTemperature()
{
uchar temp_h,temp_l;
WriteCommand(0x01); //清屏
WriteCommand(0x80); //设置光标位置
DisplayLcd1602("Temp:");
WriteCommand(0x8c); //设置光标位置
WriteData('?');
WriteData('C');
WriteCommand(0xc0); //设置光标位置
DisplayLcd1602("Min: Max:");
while(1)
{
WriteCommand(0x8c); //设置光标位置
WriteData('?');
WriteData('C');
WriteCommand(0x8e); //设置光标位置
temp_h=DS18B20_ReadChar();
temp_l=DS18B20_ReadChar();
WriteData(temp_h/10+'0');
WriteData(temp_h%10+'0');
WriteData('.');
WriteData(temp_l/100+'0');
WriteData(temp_l%100/10+'0');
WriteData(temp_l%10+'0');
WriteData('C');
if(temp_h>max_temp) //更新最高温度
{
max_temp=temp_h;
flag=1;
}
if(temp_h<min_temp) //更新最低温度
{
min_temp=temp_h;
flag=1;
}
if(flag) //更新最高/最低温度
{
WriteCommand(0xc5); //设置光标位置
WriteData(min_temp/10+'0');
WriteData(min_temp%10+'0');
WriteData(' ');
WriteData(max_temp/10+'0');
WriteData(max_temp%10+'0');
WriteData(' ');
flag=0;
}
if(temp_h>27) //温度超过报警门限
{
BeepAlarm();
}
second_cnt++; //秒计数器加1
if(second_cnt>=60) //1分钟到达
{
second_cnt=0;
minute_cnt++; //分钟计数器加1
if(minute_cnt>=2) //2分钟到达
{
minute_cnt=0;
min_temp=255; //重置最低温度
max_temp=0; //重置最高温度
}
}
Delay1Ms(500);
}
}
void main()
{
InitLcd1602();
while(1)
{
if(DS18B20_Init()) //DS18B20初始化成功
{
DS18B20_WriteChar(0xcc); //跳过ROM指令
DS18B20_WriteChar(0x44); //温度转换指令
ReadTemperature();
}
else //DS18B20初始化失败
{
DisplayLcd1602("DS18B20 Error!");
}
}
}
```
请注意,这段代码中的函数DS18B20_Init()、DS18B20_ReadChar()和DS18B20_WriteChar()是用于驱动DS18B20数字温度传感器的函数,如果您没有这些函数的代码,请先编写这些函数。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)