一個智能家居的控制,有興趣的可以練練手,里面有程序。
0.png (56.39 KB, 下載次數: 112)
下載附件
2018-5-29 18:22 上傳
單片機源程序如下:
- /*****************************
- * @File Name: MENU.C
- * @Author : JZHG
- * @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提供下載:
智能家居.zip
(392.5 KB, 下載次數: 297)
2018-5-29 13:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|