标题:
源基于STC89C52单片机的智能家居管理系统源程序
[打印本页]
作者:
duhuan502
时间:
2018-7-31 17:56
标题:
源基于STC89C52单片机的智能家居管理系统源程序
源基于STC89C52单片机的智能家居管理系统ceshi_5
单片机源程序如下:
/*****************************
* @File Name: MENU.C
* @Author : JZHG
* @Time : 2012-12-06
* @Version : V1.0
******************************/
#include "MENU.h"
#include "LCD12864.h"
#include "KEY.h"
#include "IRDA.h"
#include "DS1302.h"
#include "DS18B20.h"
#include "GTM900.h"
#include "JD.h"
#include "yanwu.h"
#include "Counter.h"
u8 Alarm_Temp=200;
/***********************************************************
* 函数名称:MENU_X
* 函数功能:系统菜单函数
* 入口参数:无 出口参数:无
***********************************************************/
/*********************************
一级菜单
**********************************/
void MENU_A0( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"★〓〓主菜单〓〓");
LCD12864_Show_hz(0,1,"1.家电 2.通信 ");
LCD12864_Show_hz(0,2,"3.设置 4.工具 ");
LCD12864_Show_hz(0,3,"5.娱乐 6.退出 ");
}
/*********************************
二级菜单
**********************************/
void MENU_B0( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"〓〓 家电 〓〓");
LCD12864_Show_hz(0,1,"1.电灯 2.电冰箱");
LCD12864_Show_hz(0,2,"3.空调 4.饮水机");
LCD12864_Show_hz(0,3,"5.音箱 6.电风扇");
}
void MENU_B1( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"〓〓 通信 〓〓");
LCD12864_Show_hz(0,1,"拨电话 挂电话");
LCD12864_Show_hz(0,2,"接电话 发短信");
LCD12864_Show_hz(0,3,"通讯录 收件箱");
}
void MENU_B2( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"〓〓 设置 〓〓");
LCD12864_Show_hz(0,1,"报警温度 时间 ");
LCD12864_Show_hz(0,2,"报警号码 铃声 ");
LCD12864_Show_hz(0,3,"模式设置 背光 ");
}
void MENU_B3( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"〓〓 工具 〓〓");
LCD12864_Show_hz(0,1,"1.计算器 2.闹钟");
LCD12864_Show_hz(0,2,"3.收音机 4.秒表");
LCD12864_Show_hz(0,3,"5.手电筒 6.版本");
}
void MENU_B4( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"〓〓 娱乐 〓〓");
LCD12864_Show_hz(0,1,"1.相机 2.音乐 ");
LCD12864_Show_hz(0,2,"3.小说 4.电影 ");
LCD12864_Show_hz(0,3,"5.图库 6.游戏 ");
}
/*********************************
三级菜单
**********************************/
void MENU_NULL( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"尊敬的用户您好!");
LCD12864_Show_hz(0,1,"该功能暂不支持 ");
LCD12864_Show_hz(0,2," 请按返回键 ");
LCD12864_Show_hz(0,3," 返回上一级 ");
}
/************************************
* 计算器菜单
*************************************/
void MENU_Counter( void )
{
LCD12864_Clear(); // 清屏函数
counter( ); // 计算器函数
}
/************************************
* 家电菜单
*************************************/
void MENU_JD( u8 num )
{
static state_value[5]={0}; // 保存状态值
LCD12864_Clear(); // 清屏函数
switch ( num )
{
case 0:LCD12864_Show_hz(0,0,"〓〓 电灯 〓〓");break;
case 1:LCD12864_Show_hz(0,0,"〓 电冰箱 〓 ");break;
case 2:LCD12864_Show_hz(0,0,"〓〓 空调 〓〓");break;
case 3:LCD12864_Show_hz(0,0,"〓 饮水机 〓 ");break;
case 4:LCD12864_Show_hz(0,0,"〓〓 音箱 〓〓");break;
case 5:LCD12864_Show_hz(0,0,"〓 电风扇 〓 ");break;
default: break;
}
LCD12864_Show_hz(0,1,"1.开启 2.关闭 ");
LCD12864_Show_hz(0,2,"按返回键:返回 ");
if ( state_value[num] == 1 )LCD12864_Show_hz(0,3,"当前状态:开启 ");
else LCD12864_Show_hz(0,3,"当前状态:关闭 ");
while ( IRDA_key != 12)
{
IRDA_key=255;
while( IRDA_key==255 );
if ( IRDA_key==1 )
{
JD_Drive( num ,ON); // 家电驱动函数
LCD12864_Show_hz(5,3,"开启");
state_value[num]=1;
}
else if ( IRDA_key==2)
{
JD_Drive( num ,OFF); // 家电驱动函数
LCD12864_Show_hz(5,3,"关闭");
state_value[num]=0;
}
}
}
void MENU_Version( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"智能家居管理系统");
LCD12864_Show_hz(0,1,"制作人:刘清泉 ");
LCD12864_Show_hz(0,2," 双 锋 ");
LCD12864_Show_hz(0,3,"版 本:V1.0 ");
}
void MENU_CallON( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"拨号......");
Call(CALLON); // 拨号
LCD12864_Show_hz(0,0,"拨号: ");
LCD12864_Show_hz(2,0,CALL_ON+3);
LCD12864_Show_hz(0,1,"成功 ^_^");
LCD12864_Show_hz(0,2," 请按返回键 ");
LCD12864_Show_hz(0,3," 返回 ");
}
void MENU_CallOFF( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"挂电话中......");
Call(CALLOFF); // 拨号
LCD12864_Show_hz(0,0,"挂机: ");
LCD12864_Show_hz(2,0,CALL_ON+3);
LCD12864_Show_hz(0,1,"成功 ^_^");
LCD12864_Show_hz(2,2,"请按返回键");
LCD12864_Show_hz(3,3,"返回");
}
void MENU_GetCall( void )
{
LCD12864_Clear(); // 清屏函数
if ( USART_flag )
{
USART_flag=0;
LCD12864_Show_hz(0,0,"连接中......");
Call(GETCALL); // 拨号
LCD12864_Show_hz(0,0,"连接: ");
LCD12864_Show_hz(2,0,CALL_ON+3);
LCD12864_Show_hz(0,1,"成功 ^_^");
Delay_nms(500);
}
else
{
LCD12864_Show_hz(0,0,"尊敬的用户您好!");
LCD12864_Show_hz(0,1,"没收到来电!!");
}
LCD12864_Show_hz(2,2,"请按返回键");
LCD12864_Show_hz(3,3,"返回");
}
void MENU_News( void )
{
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"发送短信。。。");
Send_ENNews( ); // 发送英文短信
if ( USART_flag )
{
USART_flag = 0;
LCD12864_Show_hz(0,0,"发送短信成功 ^_^");
}
else
{
LCD12864_Show_hz(0,0,"发送短信失败....");
}
LCD12864_Show_hz(2,2,"请按返回键");
LCD12864_Show_hz(3,3,"返回");
}
//void MENU_SetNewsNum( void )
//{
// u8 cnt=0;
//
// IRDA_key=255;
// LCD12864_Clear(); // 清屏函数
// LCD12864_Show_hz(0,0,"请输入手机号码");
// IRDA_key=255;
// while(IRDA_key==255);
// LCD12864_SetXY(0,2); // LCD设置坐标函数
// while(IRDA_key!=12) //不是返回键
// {
// if(IRDA_key<10&&cnt<11) //11位手机号码
// {
//
// NEWS_LENGT[(cnt++)+3]=IRDA_key+48;
// LCD12864_Write_Data( LCD12864_DAT,IRDA_key+48);
// }
// IRDA_key=255;
// while(IRDA_key==255); //等待有键按下
// }
// IRDA_key=255;
// LCD12864_Show_hz(0,2,NEWS_LENGT);
// LCD12864_Show_hz(2,3,"输入成功!");
// Delay_nms(500);
//}
void MENU_SetTime( void )
{
u8 temp=0,i, cnt=0;
for(i=6;i>0;i--) //星期不设置
{
LCD12864_Clear(); // 清屏函数
switch(i)
{
case 6:LCD12864_Show_hz(0,0,"请输入年:");break;
case 5:LCD12864_Show_hz(0,0,"请输入月:");break;
case 4:LCD12864_Show_hz(0,0,"请输入日:");break;
case 3:LCD12864_Show_hz(0,0,"请输入时:");break;
case 2:LCD12864_Show_hz(0,0,"请输入分:");break;
case 1:LCD12864_Show_hz(0,0,"请输入秒:");break;
default:break;
}
temp=0; // 清零
LCD12864_SetXY(0,2); // LCD设置坐标函数
while(cnt<2) //输入的是两位数
{
IRDA_key=255;
while(IRDA_key==255); //等待有键按下
temp=(temp*10)+IRDA_key;
LCD12864_Write_Data( LCD12864_DAT, IRDA_key+48);
cnt++;
}
temp = ((temp /10)<<4) +(temp%10); // 转化BCD码
DS1302_WriteByteToAddr( DS1302_CONTROL_WRITE, WP_STOP );// 取消写保护
switch(i)
{
case 1: DS1302_WriteByteToAddr( DS1302_SECOND_WRITE, temp);break; // 调节的时间
case 2: DS1302_WriteByteToAddr( DS1302_MINUTE_WRITE, temp);break; // 调节的时间
case 3: DS1302_WriteByteToAddr( DS1302_HOUR_WRITE, temp);break; // 调节的时间
case 4: DS1302_WriteByteToAddr( DS1302_DATE_WRITE, temp);break; // 调节的时间
case 5: DS1302_WriteByteToAddr( DS1302_MONTH_WRITE, temp);break; // 调节的时间
case 6: DS1302_WriteByteToAddr( DS1302_YEAR_WRITE, temp);break; // 调节的时间
default: break;
}
DS1302_WriteByteToAddr( DS1302_CONTROL_WRITE, WP_START );//
IRDA_key=255;
while(IRDA_key==255); //等待有键按下
cnt=0;
}
IRDA_key=255;
LCD12864_Show_hz(2,3,"修改成功!");
}
void MENU_SetAlarmTemp( void )
{
u8 temp=0;
LCD12864_Clear(); // 清屏函数
LCD12864_Show_hz(0,0,"请输入报警温度");
IRDA_key=255;
while(IRDA_key==255);
LCD12864_SetXY(0,2); // LCD设置坐标函数
while(IRDA_key!=12) //不是确认键
{
temp=(temp*10)+IRDA_key;
LCD12864_Write_Data( LCD12864_DAT,IRDA_key+48);
IRDA_key=255;
while(IRDA_key==255); //等待有键按下
}
IRDA_key=255;
Alarm_Temp=temp; //更新报警温度
LCD12864_Show_hz(2,3,"修改成功!");
}
/***********************************************************
* 函数名称:MENU_ShowTime
* 函数功能:显示时间函数
* 入口参数:无 出口参数:无
***********************************************************/
void MENU_ShowTime( void )
{
u8 T[8], D[8];
DS1302_ReadTime( );// DS1302读取时间保存在时间结构体中
T[0]= CurrentTime.Hour >>4; // 时
T[1]= CurrentTime.Hour &0x0f;
T[2]= -3;
T[3]= CurrentTime.Minute >>4; // 分
T[4]= CurrentTime.Minute &0x0f;
T[5]= -3;
T[6]= CurrentTime.Second >>4; // 秒
T[7]= CurrentTime.Second &0x0f;
D[0]= CurrentTime.Year >>4; // 年
D[1]= CurrentTime.Year &0x0f;
D[2]= -3;
D[3]= CurrentTime.Month >>4; // 月
D[4]= CurrentTime.Month &0x0f;
D[5]= -3;
D[6]= CurrentTime.Date >>4; // 日
D[7]= CurrentTime.Date &0x0f;
// D[8]= CurrentTime.Week&0x0f; // 星期
LCD12864_Show_hz(0,2,"日期:"); // LCD显示字符函数
LCD12864_Show_hz(0,3,"时间:"); // LCD显示字符函数
// LCD12864_ShowChar(2,0,"星期:"); // LCD显示字符函数
LCD12864_ShowNumS(3,2,8,D); // 显示日期
LCD12864_ShowNumS(3,3,8,T); // 显示时间
// LCD12864_ShowNum( 2, 3, D[8]); // LCD显示一位数字函数
}
/***********************************************************
* 函数名称:MENU_ShowTemperature
* 函数功能:处理显示温度函数
* 入口参数: 无 出口参数:无
***********************************************************/
void MENU_ShowTemperature(void)
{
LCD12864_Show_hz(0,0,"智能家居管理系统");
LCD12864_Show_hz(0,1,"环境温度:");
Read_18B20();
LCD12864_SetXY(5,1); // LCD设置坐标函数
LCD12864_Write_Data( LCD12864_DAT,(zhengshu%100)/10+48);
LCD12864_Write_Data( LCD12864_DAT,zhengshu%10+48);
LCD12864_Write_Data( LCD12864_DAT,'.');
LCD12864_Write_Data( LCD12864_DAT,xiaoshu1+48);
LCD12864_Show_hz(7,1,"℃");
while(zhengshu>=Alarm_Temp)
{
LCD12864_Clear(); // LCD清除文本函数
LCD12864_Show_hz(0,0,"发送短信....");
Delay_nms(500);
Send_CHNews(); // 发送中文短信
if ( USART_flag )
{
USART_flag = 0;
LCD12864_Show_hz(0,0,"发送短信成功 ^_^");
}
Read_18B20();
}
}
/***********************************************************
* 函数名称:MENU_Yanwu
* 函数功能:处理烟雾传感器函数
* 入口参数: 无 出口参数:无
***********************************************************/
void MENU_YANWU( void )
{
YanWu(); //
}
/***********************************************************
* 函数名称:MENU_FB
* 函数功能:菜单反白函数
* 入口参数:loca, mode 出口参数:无
***********************************************************/
void MENU_FB(u8 loca,u8 mode)
{
u8 temp[6]={0};
if ( mode ) // mode=1 反白
{
temp[loca]=0xff;
LCD12864_FB(0,1,temp[0],8); LCD12864_FB(4,1,temp[1],8);
LCD12864_FB(8,0,temp[2],8); LCD12864_FB(12,0,temp[3],8);
LCD12864_FB(8,1,temp[4],8); LCD12864_FB(12,1,temp[5],8);
}
else
{
temp[loca]=0x00;
LCD12864_FB(0,1,temp[0],8); LCD12864_FB(4,1,temp[1],8);
LCD12864_FB(8,0,temp[2],8); LCD12864_FB(12,0,temp[3],8);
LCD12864_FB(8,1,temp[4],8); LCD12864_FB(12,1,temp[5],8);
}
}
/***********************************************************
* 函数名称:System_Init
* 函数功能:系统初始化函数
* 入口参数:无 出口参数:无
***********************************************************/
void System_Init( void )
{
USART_Init(); // 串口初始化函数
KEY_Init( ); // 按键初始化函数
Red_Init();
DS1302_Init(); // DS1302初始化函数
Read_18B20();
LCD12864_Init( ); // LCD初始化函数
LCD12864_Clear_GDRAM( ); // 扩充指令清屏函数
LCD12864_Clear(); // 清屏函数
}
/***********************************************************
* 函数名称:MENU_KEYHandle
* 函数功能:菜单按键处理函数
* 入口参数:无 出口参数:无
***********************************************************/
void MENU_Handle( void )
{
u8 key;
u8 caidan[3]={0};
u8 caidan_ji=0;
u8 flag=0; // 按键标志
MENU_YANWU( ); // 烟雾传感器
MENU_ShowTemperature();// 处理显示温度函数
MENU_ShowTime( ); // 显示时间菜单函数
if ( IRDA_key==17 )
{
flag=1;
LCD12864_Clear(); // 清屏函数
MENU_A0();
}
else flag=0;
while(flag)
{
while(1)
{
key=KEY_Scan();
if((key==1)||(IRDA_key==10))
{
IRDA_key = 255;
if(caidan[caidan_ji]>0)
caidan[caidan_ji]--;
else
caidan[caidan_ji]=5;
}
if((key==2)||(IRDA_key==11))
{
IRDA_key = 255;
if(caidan[caidan_ji]<5)
caidan[caidan_ji]++;
else
caidan[caidan_ji]=0;
}
if((key==3)||(IRDA_key==13))
{
if(caidan_ji<2)
caidan_ji++;
}
if((key==4)||(IRDA_key==12))
{
if(caidan_ji>0)
caidan_ji--;
}
if((key==3)||(key==4)||(IRDA_key==12)||(IRDA_key==13))
{ IRDA_key = 255; break;}
if ( (caidan_ji!=2) )
MENU_FB(caidan[caidan_ji], 1 );
}
switch(caidan_ji)
{
case 0:
{
MENU_A0();
caidan[1]=0;
}break;
case 1:
{
switch(caidan[0])
{
case 0 :
{
MENU_FB(caidan[1], 1);
MENU_B0();
}break;
case 1 :
{
MENU_FB(caidan[1], 1);
MENU_B1();
}break;
case 2 :
{
MENU_FB(caidan[1], 1);
MENU_B2();
}break;
case 3 :
{
MENU_FB(caidan[1], 1);
MENU_B3();
}break;
case 4 :
{
MENU_FB(caidan[1], 1);
MENU_B4();
} break;
case 5 :
{
flag=0;
MENU_FB(caidan[1], 0);
}break;
default: break;
}
}break;
case 2:
{
switch (caidan[0])
{
case 0:
{
switch(caidan[1])// 三级菜单
{
case 0:MENU_JD(0);break;
case 1:MENU_JD(1);break;
case 2:MENU_JD(2);break;
case 3:MENU_JD(3);break;
case 4:MENU_JD(4);break;
case 5:MENU_JD(5);break;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
源基于STC89C52单片机的智能家居管理系统ceshi_5.zip
(171.27 KB, 下载次数: 24)
2018-7-31 17:56 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2018-7-31 18:14
本帖需要补全原理图后才可获得积分
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1