|
#include <reg51.h>
#include <1602.h>
#include <DS18b20.h>
#include <intrins.h>
sbit speak=P1^5;
sbit keyadj=P3^3;//調整按鍵
sbit keyup=P3^4; //加
sbit keydown=P3^5;//減
uchar DisplayData[6];//定義數組存放溫度值
int num,temp;
uchar almhigh=40,almlow=15; //報警的上下限初始值
void almspeak() //報警響0.5秒
{
uint i=500;
while(i--)
{
speak=~speak;
Delay1ms(1);
}
}
void Display()
{
uchar i;
num=Ds18b20ReadTemp(); //讀取溫度傳感器的數據
temp=num*0.0625*100+0.5; //轉換為十進制數值
DisplayData[0] = temp / 10000; //以下為數值的拆分
DisplayData[1] = temp % 10000 / 1000;
DisplayData[2] = temp % 1000 / 100 ;
DisplayData[3] ='.';
DisplayData[4] = temp % 100 / 10;
DisplayData[5] = temp % 10;
LCD1602_write_com(0x80);
LCD1602_write_word("tempreture is:");
LCD1602_write_com(0xc4);
for(i=0;i<6;i++)
{
if(i==3)LCD1602_write_data(DisplayData[i]);
else LCD1602_write_data(DisplayData[i]+48);
}
if((temp/100+0.5)>=almhigh||(temp/100+0.5)<=almlow)almspeak(); //溫度超出上下限就報警
}
void Display_adj()
{
LCD1602_write_com(0x01); //清屏指令
LCD1602_write_com(0x80); //重新定位
LCD1602_write_word("adjust almtemp");
}
void disp2() //調整上下限溫度的畫面
{
LCD1602_write_com(0xc0);
LCD1602_write_word("high");
LCD1602_write_data(almhigh/10+48);
LCD1602_write_data(almhigh%10+48);
LCD1602_write_word(",low");
LCD1602_write_data(almlow/10+48);
LCD1602_write_data(almlow%10+48);
}
void disp3() //調整上限溫度的畫面
{
LCD1602_write_com(0xc0);
LCD1602_write_word("* almhigh=");
LCD1602_write_data(almhigh/10+48);
LCD1602_write_data(almhigh%10+48);
LCD1602_write_word(" *");
}
void disp4() //調整下限溫度的畫面
{
LCD1602_write_com(0xc0);
LCD1602_write_word("* almlow=");
LCD1602_write_data(almlow/10+48);
LCD1602_write_data(almlow%10+48);
LCD1602_write_word(" * ");
}
void keyscan() //按鍵檢測
{
if(keyadj==0) //第一次檢測到按鍵按下,進入調整界面
{
Delay1ms(500);
Display_adj();
while(keyadj==1); //按鍵沒有按第二次就等待
if(keyadj==0)//第二次按下調整按鍵,進行上限調整
{
Delay1ms(500);
disp2();
while(keyadj==1)
{
disp3();
if(keyup==0){Delay1ms(500);almhigh++; disp3();}
if(keydown==0){Delay1ms(500);almhigh--;disp3();}
}
}
if(keyadj==0)//第三次按下調整按鍵,進行下限調整
{
Delay1ms(500);
while(keyadj==1)
{
disp4();
if(keyup==0){Delay1ms(500);almlow++;disp4();}
if(keydown==0){Delay1ms(500);almlow--;disp4();}
}
}
if(keyadj==0)//第四次按下調整按鍵,退出調整
{
Delay1ms(500);
while(keyadj==0);
LCD1602_write_com(0x01);//退出之前進行清屏
}
}
}
void main()
{
Init_LCD1602();
Ds18b20Init();
while(1)
{
Display();
keyscan();
}
}
|
|