源基于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, 下载次数: 25)
|