//****************************************************
//
//
// 智能水龙头
//
//
//****************************************************
#include "main.h"
//定义变量
unsigned int Temp_Buffer = 0; //温度存放
unsigned int Count = 0; //流量计脉冲数
unsigned char Temp_Top = 60; //温度上限
unsigned char Temp_Down = 20; //温度下限
unsigned char KEY_NUM = 0; //键值
unsigned char Flag_connect; //温度传感器是否连接 00表示连接
//****************************************************
//主函数
//****************************************************
void main()
{
initial();
Init_LCD1602(); //初始化LCD1602
LCD1602_write_com(0x80); //指针设置到第一行
LCD1602_write_word("Welcome to use!"); //显示内容
LCD1602_write_com(0x80+0x40+5); //指针设置到第二行
LCD1602_write_word("Beetle v0.1"); //显示内容
while(1)
{
unsigned int t=0;
if(BAT100 == 0) //没满电
{
BAT=1; //充电
}else
{
BAT=0; //充满
}
t=MAX6675_ReadReg(); //读温度**************
Flag_connect=t&0x04; //读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,该位为0表示连接
Flag_connect=Flag_connect>>2; //MAX6675是否在线
t = t<<1; //读出来的数据的D3~D14是温度值
t = t>>4;
Temp_Buffer = t/4;
//测得的温度单位是0.25,所以要乘以0.25(即除以4)才能得到以度为单位的温度值
water();
Water = 0;
LED_Open = 0;
//show
}
}
void water()
{
unsigned int mL = 0; //流量(毫升)
unsigned int i = 0;
unsigned int t =0;
if(INF == 0 )//检测到有人
{
if( Temp_Buffer <= Temp_Top && Temp_Buffer >= Temp_Down && Flag_connect == 0) //温度正常
{
Water = 1;
LED_Open = 1;
LED_Err = 0;
for(i = 0; i++ ;i<300) //持续流水三秒,并显示水量水温
{
if(Temp_Buffer > Temp_Top || Temp_Buffer > Temp_Down || Flag_connect != 0) //温度异常提示
{
Buzzer = 0;
Delay_ms(1000);
Buzzer = 1;
}
t=MAX6675_ReadReg(); //读温度**************
Flag_connect=t&0x04; //读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,该位为0表示连接
Flag_connect=Flag_connect>>2; //MAX6675是否在线
t = t<<1; //读出来的数据的D3~D14是温度值
t = t>>4;
Temp_Buffer = t/4; //测得的温度单位是0.25,所以要乘以0.25(即除以4)才能得到以度为单位的温度值
mL = Count * 1000 /450;//每升水450个脉冲
//show
Delay_ms(100);
}
}else //温度异常报警1秒
{
Water = 0;
LED_Open = 0;
LED_Err = 1;
Buzzer = 0;
Delay_ms(1000);
Buzzer = 1;
}
water(); //递归,再次检查
}
Count = 0;//清空计数器
}
//****************************************************
//按键扫描程序
//****************************************************
void Scan_Key()
{
if( KEY1 == 0 ) //按键1扫描
{
Delay_ms(10); //延时去抖
if( KEY1 == 0 )
{
while(KEY1 == 0); //等待松手
KEY_NUM = 1;
}
}
if( KEY2 == 0 ) //按键2扫描
{
Delay_ms(10); //延时去抖
if( KEY2 == 0 )
{
while(KEY2 == 0); //等待松手
KEY_NUM = 2;
}
}
if( KEY3 == 0 ) //按键2扫描
{
Delay_ms(10); //延时去抖
if( KEY3 == 0 )
{
while(KEY3 == 0); //等待松手
KEY_NUM = 3;
}
}
if( KEY4 == 0 ) //按键2扫描
{
Delay_ms(10); //延时去抖
if( KEY4 == 0 )
{
while(KEY4 == 0); //等待松手
KEY_NUM = 4;
}
}
}
//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
//****************************************************
//单片机初始化
//****************************************************
void initial()
{
IT0=1;// 外部中断0工作方式(下降沿有效)
EA=1;
EX0=1;
TR0=1; //开中断
Buzzer = 1;
BAT = 1;
Water = 0;
LED_Open = 0;
LED_Err = 0;
}
//计数器(流量)
void exter0() interrupt 0
{
Count++;
}
|