标题: 源基于STC89C52单片机的智能家居管理系统源程序 [打印本页]

作者: duhuan502    时间: 2018-7-31 17:56
标题: 源基于STC89C52单片机的智能家居管理系统源程序
源基于STC89C52单片机的智能家居管理系统ceshi_5

单片机源程序如下:
  1. /*****************************
  2. * @File Name: MENU.C
  3. * @Author        : JZHG
  4. * @Time     : 2012-12-06
  5. * @Version  : V1.0
  6. ******************************/

  7. #include "MENU.h"
  8. #include "LCD12864.h"
  9. #include "KEY.h"
  10. #include "IRDA.h"
  11. #include "DS1302.h"
  12. #include "DS18B20.h"
  13. #include "GTM900.h"
  14. #include "JD.h"
  15. #include "yanwu.h"
  16. #include "Counter.h"

  17. u8 Alarm_Temp=200;

  18. /***********************************************************
  19. * 函数名称:MENU_X
  20. * 函数功能:系统菜单函数
  21. *           入口参数:无     出口参数:无
  22. ***********************************************************/


  23. /*********************************
  24.         一级菜单
  25. **********************************/

  26. void MENU_A0( void )
  27. {
  28.       LCD12864_Clear();        // 清屏函数
  29.             LCD12864_Show_hz(0,0,"★〓〓主菜单〓〓");
  30.           LCD12864_Show_hz(0,1,"1.家电  2.通信  ");
  31.           LCD12864_Show_hz(0,2,"3.设置  4.工具  ");
  32.           LCD12864_Show_hz(0,3,"5.娱乐  6.退出  ");
  33. }

  34. /*********************************
  35.         二级菜单
  36. **********************************/

  37. void MENU_B0( void )
  38. {
  39.       LCD12864_Clear();        // 清屏函数
  40.             LCD12864_Show_hz(0,0,"〓〓  家电  〓〓");
  41.           LCD12864_Show_hz(0,1,"1.电灯  2.电冰箱");
  42.           LCD12864_Show_hz(0,2,"3.空调  4.饮水机");
  43.           LCD12864_Show_hz(0,3,"5.音箱  6.电风扇");
  44. }

  45. void MENU_B1( void )
  46. {
  47.       LCD12864_Clear();        // 清屏函数
  48.             LCD12864_Show_hz(0,0,"〓〓  通信  〓〓");
  49.           LCD12864_Show_hz(0,1,"拨电话    挂电话");
  50.           LCD12864_Show_hz(0,2,"接电话    发短信");
  51.           LCD12864_Show_hz(0,3,"通讯录    收件箱");
  52. }

  53. void MENU_B2( void )
  54. {
  55.       LCD12864_Clear();        // 清屏函数
  56.       LCD12864_Show_hz(0,0,"〓〓  设置  〓〓");
  57.           LCD12864_Show_hz(0,1,"报警温度  时间  ");
  58.       LCD12864_Show_hz(0,2,"报警号码  铃声  ");
  59.           LCD12864_Show_hz(0,3,"模式设置  背光  ");
  60. }

  61. void MENU_B3( void )
  62. {        
  63.   LCD12864_Clear();        // 清屏函数                                   
  64.   LCD12864_Show_hz(0,0,"〓〓  工具  〓〓");
  65.   LCD12864_Show_hz(0,1,"1.计算器  2.闹钟");
  66.   LCD12864_Show_hz(0,2,"3.收音机  4.秒表");                                         
  67.   LCD12864_Show_hz(0,3,"5.手电筒  6.版本");  
  68. }

  69. void MENU_B4( void )
  70. {
  71.   LCD12864_Clear();        // 清屏函数
  72.   LCD12864_Show_hz(0,0,"〓〓  娱乐  〓〓");
  73.   LCD12864_Show_hz(0,1,"1.相机  2.音乐  ");
  74.   LCD12864_Show_hz(0,2,"3.小说  4.电影  ");
  75.   LCD12864_Show_hz(0,3,"5.图库  6.游戏  ");  
  76. }

  77. /*********************************
  78.         三级菜单
  79. **********************************/

  80. void MENU_NULL( void )
  81. {
  82.   LCD12864_Clear();        // 清屏函数
  83.   LCD12864_Show_hz(0,0,"尊敬的用户您好!");
  84.   LCD12864_Show_hz(0,1,"该功能暂不支持  ");
  85.   LCD12864_Show_hz(0,2,"  请按返回键    ");
  86.   LCD12864_Show_hz(0,3,"  返回上一级    ");
  87. }

  88. /************************************
  89. *                   计算器菜单
  90. *************************************/

  91. void MENU_Counter( void )
  92. {
  93.          LCD12864_Clear();        // 清屏函数
  94.          counter( ); // 计算器函数
  95. }



  96. /************************************
  97. *                   家电菜单
  98. *************************************/

  99. void MENU_JD( u8 num )
  100. {
  101.   static state_value[5]={0}; // 保存状态值
  102.   LCD12864_Clear();        // 清屏函数
  103.   switch ( num )
  104.   {
  105.           case 0:LCD12864_Show_hz(0,0,"〓〓  电灯  〓〓");break;
  106.         case 1:LCD12864_Show_hz(0,0,"〓  电冰箱  〓  ");break;
  107.         case 2:LCD12864_Show_hz(0,0,"〓〓  空调  〓〓");break;
  108.         case 3:LCD12864_Show_hz(0,0,"〓  饮水机  〓  ");break;
  109.         case 4:LCD12864_Show_hz(0,0,"〓〓  音箱  〓〓");break;
  110.         case 5:LCD12864_Show_hz(0,0,"〓  电风扇  〓  ");break;
  111.         default: break;
  112.   }
  113.   LCD12864_Show_hz(0,1,"1.开启  2.关闭  ");
  114.   LCD12864_Show_hz(0,2,"按返回键:返回  ");
  115.   if  ( state_value[num] == 1 )LCD12864_Show_hz(0,3,"当前状态:开启  ");
  116.   else LCD12864_Show_hz(0,3,"当前状态:关闭  ");
  117.    while ( IRDA_key != 12)
  118.     {
  119.           IRDA_key=255;
  120.           while( IRDA_key==255 );
  121.           if ( IRDA_key==1 )
  122.           {
  123.                    JD_Drive( num ,ON); // 家电驱动函数
  124.                  LCD12864_Show_hz(5,3,"开启");
  125.              state_value[num]=1;
  126.           }
  127.           else if ( IRDA_key==2)
  128.           {
  129.             
  130.                   JD_Drive( num ,OFF); // 家电驱动函数
  131.                 LCD12864_Show_hz(5,3,"关闭");
  132.                 state_value[num]=0;
  133.           }
  134.    }
  135. }


  136. void MENU_Version( void )
  137. {
  138.   LCD12864_Clear();        // 清屏函数
  139.   LCD12864_Show_hz(0,0,"智能家居管理系统");
  140.   LCD12864_Show_hz(0,1,"制作人:刘清泉  ");
  141.   LCD12864_Show_hz(0,2,"        双  锋  ");   
  142.   LCD12864_Show_hz(0,3,"版  本:V1.0    ");
  143. }

  144. void MENU_CallON( void )
  145. {

  146.     LCD12864_Clear();        // 清屏函数
  147.     LCD12864_Show_hz(0,0,"拨号......");
  148.     Call(CALLON);   // 拨号
  149.         LCD12864_Show_hz(0,0,"拨号: ");
  150.         LCD12864_Show_hz(2,0,CALL_ON+3);
  151.         LCD12864_Show_hz(0,1,"成功 ^_^");
  152.     LCD12864_Show_hz(0,2,"    请按返回键  ");
  153.     LCD12864_Show_hz(0,3,"        返回    ");

  154. }
  155. void MENU_CallOFF( void )
  156. {

  157.     LCD12864_Clear();        // 清屏函数
  158.     LCD12864_Show_hz(0,0,"挂电话中......");
  159.     Call(CALLOFF);   // 拨号
  160.           LCD12864_Show_hz(0,0,"挂机: ");
  161.         LCD12864_Show_hz(2,0,CALL_ON+3);
  162.         LCD12864_Show_hz(0,1,"成功 ^_^");
  163.         LCD12864_Show_hz(2,2,"请按返回键");
  164.     LCD12864_Show_hz(3,3,"返回");

  165. }
  166. void MENU_GetCall( void )
  167. {

  168.     LCD12864_Clear();        // 清屏函数
  169.         if ( USART_flag )
  170.         {
  171.                 USART_flag=0;
  172.             LCD12864_Show_hz(0,0,"连接中......");
  173.             Call(GETCALL);   // 拨号
  174.                   LCD12864_Show_hz(0,0,"连接:  ");
  175.                 LCD12864_Show_hz(2,0,CALL_ON+3);
  176.                 LCD12864_Show_hz(0,1,"成功 ^_^");
  177.                 Delay_nms(500);
  178.         }
  179.         else
  180.         {
  181.             LCD12864_Show_hz(0,0,"尊敬的用户您好!");
  182.                 LCD12864_Show_hz(0,1,"没收到来电!!");        
  183.         }
  184.   LCD12864_Show_hz(2,2,"请按返回键");
  185.   LCD12864_Show_hz(3,3,"返回");
  186. }

  187. void MENU_News( void )
  188. {
  189.   LCD12864_Clear();        // 清屏函数
  190.   LCD12864_Show_hz(0,0,"发送短信。。。");
  191.   Send_ENNews(  );  // 发送英文短信
  192.   if ( USART_flag )
  193.   {
  194.      USART_flag = 0;
  195.            LCD12864_Show_hz(0,0,"发送短信成功 ^_^");
  196.   }
  197.   else
  198.   {
  199.            LCD12864_Show_hz(0,0,"发送短信失败....");
  200.   }
  201.   LCD12864_Show_hz(2,2,"请按返回键");
  202.   LCD12864_Show_hz(3,3,"返回");
  203. }

  204. //void MENU_SetNewsNum( void )
  205. //{
  206. //    u8 cnt=0;
  207. //
  208. //    IRDA_key=255;
  209. //    LCD12864_Clear();        // 清屏函数
  210. //    LCD12864_Show_hz(0,0,"请输入手机号码");
  211. //    IRDA_key=255;
  212. //    while(IRDA_key==255);
  213. //        LCD12864_SetXY(0,2);            // LCD设置坐标函数
  214. //    while(IRDA_key!=12)                     //不是返回键
  215. //    {
  216. //                if(IRDA_key<10&&cnt<11)                        //11位手机号码
  217. //                {
  218. //                    
  219. //                        NEWS_LENGT[(cnt++)+3]=IRDA_key+48;
  220. //                LCD12864_Write_Data( LCD12864_DAT,IRDA_key+48);                                                               
  221. //                }
  222. //        IRDA_key=255;
  223. //        while(IRDA_key==255);                        //等待有键按下              
  224. //    }
  225. //    IRDA_key=255;
  226. //        LCD12864_Show_hz(0,2,NEWS_LENGT);
  227. //        LCD12864_Show_hz(2,3,"输入成功!");
  228. //        Delay_nms(500);
  229. //}

  230. void MENU_SetTime( void )
  231. {
  232.         u8 temp=0,i, cnt=0;
  233.         for(i=6;i>0;i--) //星期不设置
  234.         {
  235.                 LCD12864_Clear();        // 清屏函数
  236.                         switch(i)
  237.                         {
  238.                                 case 6:LCD12864_Show_hz(0,0,"请输入年:");break;
  239.                                 case 5:LCD12864_Show_hz(0,0,"请输入月:");break;
  240.                                 case 4:LCD12864_Show_hz(0,0,"请输入日:");break;
  241.                                 case 3:LCD12864_Show_hz(0,0,"请输入时:");break;
  242.                                 case 2:LCD12864_Show_hz(0,0,"请输入分:");break;
  243.                                 case 1:LCD12864_Show_hz(0,0,"请输入秒:");break;
  244.                                 default:break;
  245.                         }
  246.                     temp=0; // 清零
  247.                 LCD12864_SetXY(0,2);         // LCD设置坐标函数
  248.                     while(cnt<2)                              //输入的是两位数
  249.                 {
  250.                                   IRDA_key=255;  
  251.                             while(IRDA_key==255);                //等待有键按下
  252.                     temp=(temp*10)+IRDA_key;
  253.                     LCD12864_Write_Data( LCD12864_DAT, IRDA_key+48);  
  254.                                 cnt++;
  255.                 }
  256.                    temp = ((temp /10)<<4) +(temp%10);           // 转化BCD码
  257.                    DS1302_WriteByteToAddr( DS1302_CONTROL_WRITE, WP_STOP );// 取消写保护
  258.                    switch(i)
  259.                    {
  260.                                    case 1: DS1302_WriteByteToAddr( DS1302_SECOND_WRITE, temp);break; // 调节的时间
  261.                                 case 2: DS1302_WriteByteToAddr( DS1302_MINUTE_WRITE, temp);break; // 调节的时间
  262.                                 case 3: DS1302_WriteByteToAddr( DS1302_HOUR_WRITE,   temp);break; // 调节的时间
  263.                                 case 4: DS1302_WriteByteToAddr( DS1302_DATE_WRITE,   temp);break; // 调节的时间
  264.                                 case 5: DS1302_WriteByteToAddr( DS1302_MONTH_WRITE,  temp);break; // 调节的时间
  265.                         case 6: DS1302_WriteByteToAddr( DS1302_YEAR_WRITE,   temp);break; // 调节的时间
  266.                                 default: break;
  267.                    }
  268.                    DS1302_WriteByteToAddr( DS1302_CONTROL_WRITE, WP_START );//
  269.                    IRDA_key=255;  
  270.                    while(IRDA_key==255);                //等待有键按下
  271.                    cnt=0;
  272.                 }
  273.                 IRDA_key=255;
  274.                 LCD12864_Show_hz(2,3,"修改成功!");
  275. }

  276. void MENU_SetAlarmTemp( void )
  277. {
  278.     u8 temp=0;
  279.     LCD12864_Clear();        // 清屏函数
  280.     LCD12864_Show_hz(0,0,"请输入报警温度");
  281.     IRDA_key=255;
  282.     while(IRDA_key==255);
  283.           LCD12864_SetXY(0,2);         // LCD设置坐标函数
  284.     while(IRDA_key!=12)                                     //不是确认键
  285.     {
  286.         temp=(temp*10)+IRDA_key;
  287.         LCD12864_Write_Data( LCD12864_DAT,IRDA_key+48);
  288.         IRDA_key=255;
  289.         while(IRDA_key==255);                        //等待有键按下              
  290.     }                                         
  291.     IRDA_key=255;
  292.     Alarm_Temp=temp;                   //更新报警温度
  293.         LCD12864_Show_hz(2,3,"修改成功!");
  294. }
  295. /***********************************************************
  296. * 函数名称:MENU_ShowTime
  297. * 函数功能:显示时间函数
  298. *           入口参数:无    出口参数:无
  299. ***********************************************************/

  300. void MENU_ShowTime( void )
  301. {           

  302.    u8 T[8], D[8];
  303.    DS1302_ReadTime( );// DS1302读取时间保存在时间结构体中
  304.    T[0]= CurrentTime.Hour >>4;                // 时
  305.    T[1]= CurrentTime.Hour &0x0f;
  306.    T[2]= -3;
  307.    T[3]= CurrentTime.Minute >>4;        // 分
  308.    T[4]= CurrentTime.Minute &0x0f;
  309.    T[5]= -3;
  310.    T[6]= CurrentTime.Second >>4;        // 秒
  311.    T[7]= CurrentTime.Second &0x0f;

  312.    D[0]= CurrentTime.Year >>4;            // 年
  313.    D[1]= CurrentTime.Year &0x0f;
  314.    D[2]= -3;
  315.    D[3]= CurrentTime.Month >>4;            // 月
  316.    D[4]= CurrentTime.Month &0x0f;
  317.    D[5]= -3;
  318.    D[6]= CurrentTime.Date >>4;            // 日
  319.    D[7]= CurrentTime.Date &0x0f;
  320. //   D[8]= CurrentTime.Week&0x0f;     // 星期
  321.    LCD12864_Show_hz(0,2,"日期:"); // LCD显示字符函数
  322.    LCD12864_Show_hz(0,3,"时间:"); // LCD显示字符函数
  323. //   LCD12864_ShowChar(2,0,"星期:"); // LCD显示字符函数

  324.    LCD12864_ShowNumS(3,2,8,D);        // 显示日期
  325.    LCD12864_ShowNumS(3,3,8,T);        // 显示时间
  326. //   LCD12864_ShowNum( 2, 3, D[8]); // LCD显示一位数字函数
  327. }

  328. /***********************************************************
  329. * 函数名称:MENU_ShowTemperature
  330. * 函数功能:处理显示温度函数
  331. *           入口参数: 无     出口参数:无
  332. ***********************************************************/

  333. void MENU_ShowTemperature(void)
  334. {
  335.         LCD12864_Show_hz(0,0,"智能家居管理系统");
  336.         LCD12864_Show_hz(0,1,"环境温度:");
  337.         Read_18B20();
  338.         LCD12864_SetXY(5,1);          // LCD设置坐标函数
  339.         LCD12864_Write_Data( LCD12864_DAT,(zhengshu%100)/10+48);
  340.         LCD12864_Write_Data( LCD12864_DAT,zhengshu%10+48);
  341.         LCD12864_Write_Data( LCD12864_DAT,'.');
  342.         LCD12864_Write_Data( LCD12864_DAT,xiaoshu1+48);
  343.         LCD12864_Show_hz(7,1,"℃");
  344.         while(zhengshu>=Alarm_Temp)
  345.         {
  346.                 LCD12864_Clear();    // LCD清除文本函数
  347.                 LCD12864_Show_hz(0,0,"发送短信....");
  348.                 Delay_nms(500);
  349.                 Send_CHNews();  // 发送中文短信
  350.                 if ( USART_flag )
  351.                   {
  352.                      USART_flag = 0;
  353.                            LCD12864_Show_hz(0,0,"发送短信成功 ^_^");
  354.                   }
  355.                 Read_18B20();
  356.         }
  357. }
  358. /***********************************************************
  359. * 函数名称:MENU_Yanwu
  360. * 函数功能:处理烟雾传感器函数
  361. *           入口参数: 无     出口参数:无
  362. ***********************************************************/

  363. void MENU_YANWU( void )
  364. {
  365.         YanWu();   //
  366. }


  367. /***********************************************************
  368. * 函数名称:MENU_FB
  369. * 函数功能:菜单反白函数
  370. *           入口参数:loca, mode    出口参数:无
  371. ***********************************************************/

  372. void MENU_FB(u8 loca,u8 mode)
  373. {
  374. u8 temp[6]={0};
  375. if ( mode )   // mode=1 反白
  376. {
  377.          temp[loca]=0xff;
  378.          LCD12864_FB(0,1,temp[0],8);  LCD12864_FB(4,1,temp[1],8);
  379.          LCD12864_FB(8,0,temp[2],8);  LCD12864_FB(12,0,temp[3],8);
  380.          LCD12864_FB(8,1,temp[4],8);  LCD12864_FB(12,1,temp[5],8);
  381. }  
  382. else
  383. {
  384.             temp[loca]=0x00;
  385.          LCD12864_FB(0,1,temp[0],8);  LCD12864_FB(4,1,temp[1],8);
  386.          LCD12864_FB(8,0,temp[2],8);  LCD12864_FB(12,0,temp[3],8);
  387.          LCD12864_FB(8,1,temp[4],8);  LCD12864_FB(12,1,temp[5],8);
  388. }
  389. }

  390. /***********************************************************
  391. * 函数名称:System_Init
  392. * 函数功能:系统初始化函数
  393. *           入口参数:无     出口参数:无
  394. ***********************************************************/

  395. void System_Init( void )
  396. {
  397.         USART_Init();                         // 串口初始化函数
  398.         KEY_Init( );                                                // 按键初始化函数
  399.         Red_Init();
  400.         DS1302_Init();          // DS1302初始化函数
  401.         Read_18B20();
  402.         LCD12864_Init( );                                     // LCD初始化函数
  403.         LCD12864_Clear_GDRAM( );                        // 扩充指令清屏函数
  404.         LCD12864_Clear();                                    // 清屏函数
  405. }


  406. /***********************************************************
  407. * 函数名称:MENU_KEYHandle
  408. * 函数功能:菜单按键处理函数
  409. *           入口参数:无     出口参数:无
  410. ***********************************************************/

  411. void MENU_Handle( void )
  412. {
  413.         u8 key;
  414.         u8 caidan[3]={0};
  415.         u8 caidan_ji=0;
  416.         u8 flag=0;        // 按键标志
  417.           MENU_YANWU( );  // 烟雾传感器
  418.           MENU_ShowTemperature();// 处理显示温度函数
  419.           MENU_ShowTime( );      // 显示时间菜单函数
  420.           if ( IRDA_key==17 )
  421.           {
  422.                           flag=1;
  423.                         LCD12864_Clear();                                                 // 清屏函数
  424.                         MENU_A0();
  425.           }
  426.           else flag=0;
  427.                   while(flag)
  428.                   {
  429.                           while(1)
  430.                          {
  431.                                   key=KEY_Scan();
  432.                                   if((key==1)||(IRDA_key==10))
  433.                                   {
  434.                                            IRDA_key = 255;
  435.                                            if(caidan[caidan_ji]>0)
  436.                                             caidan[caidan_ji]--;
  437.                                            else
  438.                                             caidan[caidan_ji]=5;
  439.                                   }
  440.                                  
  441.                                   if((key==2)||(IRDA_key==11))
  442.                                   {
  443.                                        IRDA_key = 255;
  444.                                            if(caidan[caidan_ji]<5)
  445.                                             caidan[caidan_ji]++;
  446.                                            else
  447.                                             caidan[caidan_ji]=0;
  448.                                   }
  449.                                  
  450.                                   if((key==3)||(IRDA_key==13))
  451.                                   {
  452.                                    if(caidan_ji<2)
  453.                                     caidan_ji++;
  454.                                   }
  455.                                  
  456.                                   if((key==4)||(IRDA_key==12))
  457.                                   {
  458.                                    if(caidan_ji>0)
  459.                                     caidan_ji--;
  460.                               }
  461.                                   if((key==3)||(key==4)||(IRDA_key==12)||(IRDA_key==13))
  462.                                     { IRDA_key = 255; break;}
  463.                                 if ( (caidan_ji!=2) )
  464.                                   MENU_FB(caidan[caidan_ji], 1 );
  465.                          }
  466.                          switch(caidan_ji)
  467.                          {
  468.                                   case 0:
  469.                                   {   
  470.                                           MENU_A0();
  471.                                       caidan[1]=0;
  472.                                   }break;
  473.                                   case 1:
  474.                                   {
  475.                                           switch(caidan[0])
  476.                                             {
  477.                                                      case 0 :
  478.                                                          {
  479.                                                           MENU_FB(caidan[1], 1);
  480.                                                                   MENU_B0();
  481.                                                      }break;
  482.                                                      case 1 :
  483.                                                          {
  484.                                                           MENU_FB(caidan[1], 1);
  485.                                                                   MENU_B1();
  486.                                                        }break;
  487.                                                      case 2 :
  488.                                                          {
  489.                                                           MENU_FB(caidan[1], 1);
  490.                                                                   MENU_B2();
  491.                                                      }break;
  492.                                                      case 3 :
  493.                                                          {
  494.                                                               MENU_FB(caidan[1], 1);
  495.                                                                   MENU_B3();
  496.                                                      }break;
  497.                                                      case 4 :
  498.                                                          {
  499.                                                           MENU_FB(caidan[1], 1);
  500.                                                                   MENU_B4();
  501.                                                      } break;
  502.                                                      case 5 :
  503.                                                          {
  504.                                                           flag=0;
  505.                                                                   MENU_FB(caidan[1], 0);
  506.                                                      }break;
  507.                                                  default: break;
  508.                                             }
  509.                           }break;
  510.                           case 2:
  511.                           {        
  512.                                    switch (caidan[0])
  513.                                  {
  514.                                      case 0:
  515.                                     {
  516.                                               switch(caidan[1])// 三级菜单
  517.                                             {         
  518.                                                      case 0:MENU_JD(0);break;
  519.                                                          case 1:MENU_JD(1);break;
  520.                                                          case 2:MENU_JD(2);break;
  521.                                                          case 3:MENU_JD(3);break;
  522.                                                          case 4:MENU_JD(4);break;
  523.                                                          case 5:MENU_JD(5);break;
  524. ……………………

  525. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
源基于STC89C52单片机的智能家居管理系统ceshi_5.zip (171.27 KB, 下载次数: 24)




作者: admin    时间: 2018-7-31 18:14
本帖需要补全原理图后才可获得积分




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1