#include "reg52.h"
#include "ds1302.h"
#include "onewire.h"
#include "iic.h"
//interface:用于母界面显示的变量,model:用于回显子界面显示的变量,count:记录触发温度的次数的变量,T_dat1:触发温度的平均数,T_dat_max:记录温度最大值
unsigned char interface,model,count,T_dat1,T_dat_max=0;
//LEDState:用于检测LED状态,countLED:用于记录LED亮灭,JudageHumidity:用于查看湿度是否超过90%,JudageData:用于检测光敏电阻的亮暗状态
//TriggerTimes:记录触发次数,count1:记录触发湿度的次数,count_t:记录脉冲周期,count_t=50时,时间为1s,a,b:为用于转换温度数据,state:用于记录触发时的状态,state=1时,湿度小于90%,大于10%
//TriggerDuration:记录触发时长,LED_State:检测LED状态
unsigned char LEDState,countLED,JudageHumidity,JudageData,TriggerTimes,count1,count_t,a,b,state,TriggerDuration,LED_State=0;
//TemperatureParameters:温度参数
unsigned int TemperatureParameters=30;
//count_f:用于检测1s内发生多少脉冲次数,dat_f:显示脉冲次数,dat_f1:用于计算湿度平均数,dat_f2:用于计算湿度的小数点后一位,dat_f_max:记录湿度的最大值
unsigned int count_f,dat_f,dat_f1,dat_f2,dat_f_max=0;
//T_dat:实时温度数值,KeyTime:用于记录按下s9按键的时长
unsigned int T_dat,KeyTime=0;
//T_dat2:用在LED_Control上判断温度是否超过温度参数
unsigned int T_dat2=0;
//Write_DS1302_adrr[7]:写入DS1302数据地址
unsigned char code Write_DS1302_adrr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
//Read_DS1302_adrr[7]:读取DS1302数据地址
unsigned char code Read_DS1302_adrr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
//Timer[7]:用于记录DS1302上的时间
unsigned char Timer[7]={0x50,0x59,0x19,0x06,0x02,0x02,0x24};
//SMG_NoDot[10]:数码管上从0-10数字的段码值,没有小数点
unsigned char code SMG_NoDot[10]={0xc0,0xf9,
0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//SMG_IsDot[10]:数码管上从0-10数字的段码值,有小数点
unsigned char code SMG_IsDot[10] = {0x40,0x79,0x24,
0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//TriggerTime[2]:用于记录触发时间的时分
unsigned char TriggerTime[2];
//Temperature[10]:用于存储触发温度的数组
unsigned char Temperature[20];
//Humidity[20]:用于存储触发湿度的数组
unsigned char Humidity[20];
sfr P4=0xC0;
sfr AUXR=0x8e;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C2=P4^2;
sbit C1=P4^4;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
sbit L6=P0^5;
/**
* @brief IO模式下选择哪种外设的控制电路
* @param
* @retval channel
*/
void SelectHC573(unsigned char channel);
/**
* @brief 初始化定时器,定时器0为8位重装计数器,定时1为16位定时器模式
* @param 无
* @retval 无
*/
void Timer1_Init();
/**
* @brief 扫描矩阵键盘按键
* @param 无
* @retval 无
*/
void ScanKeyMulti();
/**
* @brief 判断界面模式
* @param 无
* @retval 无
*/
void Judgment_Interface();
/**
* @brief 数码管清屏,防止屏闪
* @param value
* @retval value
*/
void DisplaySMG_ALL(unsigned char value);
/**
* @brief 数码管显示,pos为位选,value为段码
* @param pos value
* @retval 无
*/
void DisplaySMG_Bit(unsigned char pos,unsigned char value);
/**
* @brief 数码管动态显示延时
* @param time
* @retval 无
*/
void DelaySMG(unsigned int time);
/**
* @brief 初始化DS1302芯片函数
* @param 无
* @retval 无
*/
void DS1302_Config();/**
* @brief 读取DS1302时间
* @param 无
* @retval 无
*/
void Read_DS1302_Timer();
/**
* @brief 显示时间界面
* @param 无
* @retval 无
*/
void DisplayTimeInterface();
/**
* @brief 判断回显界面的子界面
* @param 无
* @retval 无
*/
void Judgment_Model();
/**
* @brief 读取温度的延时函数
* @param 无
* @retval t
*/
void Delay(unsigned int t);
/**
* @brief 读取温度数据
* @param 无
* @retval 无
*/
void Read_Temperature();
/**
* @brief 回显显示温度界面
* @param 无
* @retval 无
*/
void DisplayTemperature();
/**
* @brief 回显显示湿度数据
* @param 无
* @retval 无
*/
void DisplayHumidity();
/**
* @brief 回显显示触发时间和触发次数
* @param 无
* @retval 无
*/
void DisplayTriggerTime();
/**
* @brief 显示温度参数
* @param 无
* @retval 无
*/
void DisplayParameterInterface();
/**
* @brief 判断是否触发
* @param 无
* @retval 无
*/
void Judgment_Trigger();
/**
* @brief 显示温湿度界面
* @param 无
* @retval 无
*/
void DisplayTemperatureHumidity();
/**
* @brief 延时1s,用于长按S9清除数据
* @param 无
* @retval 无
*/
void Delay1000ms();
/**
* @brief 延时0.1s
* @param 无
* @retval 无
*/
void Delay100ms();
/**
* @brief LED控制函数,控制LED亮灭
* @param 无
* @retval 无
*/
void LED_Control();
void main()
{
Timer1_Init();
DS1302_Config();
while(1)
{
//LED_Control();
KeyTime=0;
Judgment_Trigger();
Judgment_Interface();
LED_Control();//LED灯控制
}
}
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2&0x1f)|0x80;break;
case 5:
P2=(P2&0x1f)|0xa0;break;
case 6:
P2=(P2&0x1f)|0xc0;break;
case 7:
P2=(P2&0x1f)|0xe0;break;
}
}
void Timer1_Init()
{
TMOD=0x16;
TH1=(65536-20000)/256;
TL1=(65536-2000)%256;
TH0=0xff;
TL0=0xff;
ET1=1;
ET0=1;
EA=1;
TR1=1;
TR0=1;
}
void ScanKeyMulti()
{
char i=0;
R3=0;
R4=1;
C1=C2=1;
if(C1==0)
{
while(C1==0);
model++;
if(model==3)
{
model=0;
}
}
else if(C2==0)
{
Delay100ms();Delay100ms();
if(interface==2&&C2!=0)
{
KeyTime=1;
}
else if(interface=2&&C2==0)
{ Delay1000ms();
if(C2==0){KeyTime=2;}
}
switch(KeyTime)
{
case 1:TemperatureParameters--;break;
case 2:interface=2;
for(i=0;i<20;i++)
{
Temperature[i]=0;
Humidity[i]=0;
}
T_dat_max=0;dat_f_max=0;
TriggerTimes=0;TemperatureParameters=0;
T_dat1=0;
dat_f1=0;count=0;count1=0;
TriggerTime[1]=0;
TriggerTime[0]=0;
break;
}
}
R4=0;
R3=1;
C1=C2=1;
if(C1==0)
{
Delay100ms();
if(C1==0)
{
interface++;
if(interface==3)
{
interface=0;
}
}
}
else if(C2==0)
{
while(C2==0);
if(interface==2)
{
TemperatureParameters++;
}
}
}
void Judgment_Interface()
{
if(interface==0)
{
DisplayTimeInterface();//显示时间界面
}
else if(interface==1)
{
Judgment_Model();//判断回显界面的子界面
}
else if(interface==2)
{
DisplayParameterInterface();//显示温度参数界面
}
}
void DisplaySMG_ALL(unsigned char value)
{
SelectHC573(7);
P0=value;
SelectHC573(6);
P0=0xff;
}
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
SelectHC573(7);
P0=0xff;
SelectHC573(6);
P0=(0x01<<pos);
SelectHC573(7);
P0=value;
}
void DelaySMG(unsigned int time)
{
while(time--);
}
void DS1302_Config()
{
char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302_Byte(Write_DS1302_adrr[i],Timer[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void Read_DS1302_Timer()
{
char i;
for(i=0;i<7;i++)
{
Timer[i]=Read_Ds1302_Byte(Read_DS1302_adrr[i]);
}
}//JudageHumidity,JudageData,
void DisplayTimeInterface()
{
Read_DS1302_Timer();
DisplaySMG_Bit(0,SMG_NoDot[Timer[2]/16]);
DelaySMG(100);
DisplaySMG_Bit(1,SMG_NoDot[Timer[2]%16]);
DelaySMG(100);
DisplaySMG_Bit(2,0xbf);
DelaySMG(100);
DisplaySMG_Bit(3,SMG_NoDot[Timer[1]/16]);
DelaySMG(100);
DisplaySMG_Bit(4,SMG_NoDot[Timer[1]%16]);
DelaySMG(100);
DisplaySMG_Bit(5,0xbf);
DelaySMG(100);
DisplaySMG_Bit(6,SMG_NoDot[Timer[0]/16]);
DelaySMG(100);
DisplaySMG_Bit(7,SMG_NoDot[Timer[0]%16]);
DelaySMG(100);
DisplaySMG_ALL(0xff);
}
void Delay(unsigned int t)
{
while(t--)
{
if(state==1)
{
LED_Control();
DisplaySMG_Bit(0,0x86);
DelaySMG(100);
DisplaySMG_Bit(3,SMG_NoDot[(T_dat/100)%10]);
DelaySMG(100);
DisplaySMG_Bit(4,SMG_NoDot[(T_dat/10)%10]);
DelaySMG(100);
DisplaySMG_Bit(5,0xbf);
DelaySMG(