发 帖  
原厂入驻New
智能家居管理系统分享!
472 智能家居 STC89C52
分享
上次帮学弟参加学校比赛做的一个简单的智能家居管理系统,控制芯片为STC89C52。由于自己水平有限界面写的很简单,搞了半个月界面就实现了时间、温度、烟雾、人体感应、打电话、发短信、红外遥控和计算器等功能,菜单也写的比较简单,使用数组完成。一共三级菜单。由于菜单图片较多只是上传一部分,如果想要玩GSM模块和写简单菜单的朋友可看看!附件有原理图和程序~~
              主界面:

                  
                    主菜单:

          二级子菜单:
      




三级子菜单:
     
  
    键盘:
     
       原理图:
。。。。。。。。。。。。。。。。。。。。。。。。。想看其他功能就自己做实物看吧!!
         
STC_DIY.pdf (284.64 KB )
ceshi_5.zip (171.27 KB )
0
2019-11-3 15:09:35   评论 分享淘帖 邀请回答
49个回答
你可以改成你的解码啊,该我的程序就行了,把我程序中用到遥控按键解码的地方换成你的遥控解码就OK了!
改下面IRDA_key的值。
/***********************************************************
* 函数名称: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 );
 }
2019-11-4 07:26:25 评论

举报

我根据我板子配套的程序改了一下你的红外程序,编译是通过了,但连接怎么也不通过,可不可以麻烦你看一下,哪里出问题了?红外用到外部中断0和定时器0 ,不知道放到红外初始化可不可以?谢谢!
修改后的程序:
#include "IRDA.h"
uchar IRDA_key=255;  //红外摇控的键值,无键按下时为255
uchar redchange(uchar rednum);
void Trans(void);
//红外初始化void Red_Init(void){ IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)    EX0 = 1;   //使能外部中断    TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1;    //开中断TR0=1;    Trans( );   
}
unsigned char  irtime;//红外用全局变量
bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];
void Ir_work(void);void Ircordpro(void);
void tim0_isr (void) interrupt 1 using 1{  irtime++;  //用于计数2个下降沿之间的时间}
void EX0_ISR (void) interrupt 0 //外部中断0服务函数{static unsigned char  i;             //接收红外信号处理static bit startflag;                //是否开始处理标志位
if(startflag)                         {if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms            i=0;    irdata=irtime;//存储每个电平的持续时间,用于以后判断是0还是1    irtime=0;    i++;   if(i==33)      {  irok=1;i=0;  }}else{irtime=0;startflag=1;}}
void Ir_work(void)//红外键值散转程序{       switch(IRcord[2])//判断第三个数码值         { case 0x0c:IRDA_key=1;break;//1  case 0x18:IRDA_key=2;break;//2 case 0x5e:IRDA_key=3;break;//3 case 0x08:IRDA_key=4;break;//4 case 0x1c:IRDA_key=5;break;//5 case 0x5a:IRDA_key=6;break;//6 case 0x42:IRDA_key=7;break;//7 case 0x52:IRDA_key=8;break;//8 case 0x4a:IRDA_key=17;break;//17             default:break; }
 irpro_ok=0;//处理完成标志
}void Ircordpro(void)//红外码值处理函数{ unsigned char i, j, k;unsigned char cord,value;
k=1;for(i=0;i<4;i++)      //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80;if(j<8){value>>=1;}k++;}IRcord=value;value=0;     } irpro_ok=1;//处理完毕标志位置1}
void Trans(void){while(1)//主循环{if(irok)                        //如果接收好了进行红外处理{   Ircordpro();irok=0;}if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}    
错误截图:

  
2019-11-4 07:37:13 评论

举报

2019-11-4 07:44:33 评论

举报

呵呵!你的程序我也不知道怎么说,自己写的自己应该好找问题写吧,要不你去百度搜搜你遥控型号的程序,我最近也有很多的事,没及时帮到你我感到抱歉~~
2019-11-4 07:53:48 评论

举报

看起来真的很不错哦!
2019-11-4 08:08:04 评论

举报

2019-11-4 08:23:21 评论

举报

兄弟我自愧不如,顶~~~
2019-11-4 08:33:37 评论

举报

界面做的好票凉,LCD12864怎么设置成把字体镂空的?不会是加载图片吧?
求教······呜呜
你是说字反转吗, 你看我的程序,有个反白函数
/***********************************************************
* 函数名称: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);
 } 
}
/***********************************************************
* 函数名称:LCD12864_FB
* 函数功能:LCD任意反白函数
*           入口参数:x, y, value, font_num   出口参数:无
***********************************************************/
void LCD12864_FB(u8 x, u8 y, u8 value, u8 font_num)

 u8 i,j;
 LCD12864_Write_Data( LCD12864_COM,0x32);      //绘图
 LCD12864_Write_Data( LCD12864_COM,0x36);   //扩展指令集开
 y<<=4;        //从第几个小个开始
 for(i=0;i<16;i++)
 {
   LCD12864_Write_Data( LCD12864_COM,0x80+y);  //行   地址为0x80或0x90,0x80时为一三行,0x90时为二四行
   LCD12864_Write_Data( LCD12864_COM,0x80+x);  //列   x值的范围为0~15之间的偶数
  for(j=0;j<font_num;j++)
   LCD12864_Write_Data( LCD12864_DAT,value);
  y++;
 }
 LCD12864_Write_Data( LCD12864_COM,0x32);
 LCD12864_Write_Data( LCD12864_COM,0x30);
}>
恩恩,O(∩_∩)O谢谢!!!
比我之前写的个开关电源的界面漂亮多了,程序我已经下来了,仔细研究研究
你主程序只有不到十行,又秒杀我不到30行的记录
提个小建议(不要见怪哦):
像DS18B20 那些采集取样的东西最好是用定时器定时采样显示的比较好呢,而检测报警的当然就得一直刷了
2019-11-4 09:02:32 评论

举报

只有小组成员才能发言,加入小组>>

123

954个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表