OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 60555|回复: 160

基于STC89C52单片机的智能家居管理系统

  [复制链接]

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
发表于 2013-1-4 22:04:53 | 显示全部楼层 |阅读模式
上次帮学弟参加学校比赛做的一个简单的智能家居管理系统,控制芯片为STC89C52。由于自己水平有限界面写的很简单,搞了半个月界面就实现了时间、温度、烟雾、人体感应、打电话、发短信、红外遥控和计算器等功能,菜单也写的比较简单,使用数组完成。一共三级菜单。由于菜单图片较多只是上传一部分,如果想要玩GSM模块和写简单菜单的朋友可看看!附件有原理图和程序~~

              主界面:




                  
                    主菜单:



          二级子菜单:
     









三级子菜单:

    


  
    键盘:
     





       原理图:






。。。。。。。。。。。。。。。。。。。。。。。。。想看其他功能就自己做实物看吧!!
        


STC_DIY.pdf

284.64 KB, 下载次数: 9512

ceshi_5.zip

171.27 KB, 下载次数: 9939

多努力一点点,少遗憾一点点!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-5-8 23:10:44 | 显示全部楼层
回复【49楼】胖呼呼~呼呼:
---------------------------------
呵呵!没事共同学习,共同进步,你说的对,但是我不想再改了~
希望你写的更好,更漂亮!写好后要跟大家一起共享哦~
多努力一点点,少遗憾一点点!!!
回复 支持 1 反对 0

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-3-11 22:10:50 | 显示全部楼层
楼主我照着做怎么老在发短信啊  

回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-1-5 00:16:30 | 显示全部楼层
谢谢分享.cool!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2011-9-3
在线时间
4 小时
发表于 2013-1-5 19:52:35 | 显示全部楼层
不错!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-1-10
在线时间
0 小时
发表于 2013-1-10 14:03:51 | 显示全部楼层
学习一下!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2013-1-11
在线时间
0 小时
发表于 2013-1-11 12:24:11 | 显示全部楼层
哥啊  你就是神人..顶礼膜拜ing
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-1-11 15:01:22 | 显示全部楼层
回复【4楼】247730102:
---------------------------------
回复【5楼】sogan:
---------------------------------
呵呵!互相学习
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-12-27
在线时间
0 小时
发表于 2013-1-13 23:45:06 | 显示全部楼层
楼主几年级,学弟几年级,膜拜中,不解释
我爱你
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2012-12-23
在线时间
0 小时
发表于 2013-1-20 10:43:09 | 显示全部楼层
谢谢楼主分享!!!
回复 支持 反对

使用道具 举报

12

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2012-12-29
在线时间
15 小时
发表于 2013-1-21 20:50:15 | 显示全部楼层
学习了!
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-3-11 22:29:38 | 显示全部楼层
回复【10楼】1989090518shu:
---------------------------------
你仔细看看程序,这个程序如果温度过高就会发短息,先检查你的温度传感器,或者把温度报警标志调高;还有就是看你的烟雾传感器,因为有烟雾也会发短信报警的;

如果还有问题再告诉我好吧,呵呵!
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-3-12
在线时间
0 小时
发表于 2013-3-13 14:54:08 | 显示全部楼层
怎么能够再创新一点囊?
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-3-13 21:01:48 | 显示全部楼层
回复【11楼】JZHG1992:
---------------------------------
传感器  是p2.0 吗   该为高还是低
sbit DOUT=0xec;是什么

温度标志在哪没找到,

没有gtm会不会那样吗?我没有gtm
我是菜鸟希望得到楼主的帮忙非常感谢
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-3-13 21:04:40 | 显示全部楼层
回复【11楼】JZHG1992:
---------------------------------
传感器  是p2.0 吗   该为高还是低
sbit DOUT=0xec;是什么

温度标志在哪没找到,

没有gsm会不会那样吗?我没有gsm模块
我是菜鸟希望得到楼主的帮忙非常感谢
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-3-14 08:47:13 | 显示全部楼层
回复【14楼】1989090518shu:
---------------------------------
你说的是什么传感器?如果你想知道外围设备的控制引脚,你可以看原理图,或者看程序中各设备的头文件,
还有没有GSM应该不会发生你说的情况。
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-3-14 09:04:43 | 显示全部楼层
回复【12楼】魅影骑士:
---------------------------------
呵呵!这只是粗略的写了个框架,你可以自己改进啊,使功能更完善,菜单更漂亮。
比如:1、你可以把菜单写成有中文字模式、英文模式、图型模式啊
      2、你可以自己做个电压控制模块啊,监控自家用电情况等
      3、硬件你可以改啊。。。。。
自己的DIY看你自己怎么做~
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-3-14 18:53:57 | 显示全部楼层
回复【16楼】JZHG1992:
--------------------------------问题是没有找到发信息的原因
一直在发   按键也没反应
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-3-14 19:15:20 | 显示全部楼层
一定要用遥控吗
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-3-14 22:00:49 | 显示全部楼层
回复【18楼】1989090518shu:
---------------------------------
请看菜单按键处理函数(MENU.c文件中的MENU_KEYHandle函数),如果你只是玩下菜单,可以不要遥控,其它功能要遥控,比如设置时间,计算器等,
你还是好好看看程序,再结合自己实际的硬件,去找问题,希望你能找到问题。。。、
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-3-14 23:44:55 | 显示全部楼层
回复【19楼】JZHG1992:
--------------------------------
我把烟雾去掉显示界面了时间也在走但是按键没反应
KEY的io口定义也是对的

这是改过的
/*****************************
* @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 0CD12864_Show_hz(0,0,"〓〓  电灯  〓〓");break;
case 1CD12864_Show_hz(0,0,"〓  电冰箱  〓  ");break;
case 2CD12864_Show_hz(0,0,"〓〓  空调  〓〓");break;
case 3CD12864_Show_hz(0,0,"〓  饮水机  〓  ");break;
case 4CD12864_Show_hz(0,0,"〓〓  音箱  〓〓");break; 
case 5CD12864_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 6CD12864_Show_hz(0,0,"请输入年:");break;
case 5CD12864_Show_hz(0,0,"请输入月:");break;
case 4CD12864_Show_hz(0,0,"请输入日:");break;
case 3CD12864_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;
         default:break; 
 }
 }break;
 case 1:
 {
  switch(caidan[1])// 三级菜单
    {
 case 0:MENU_CallON();break;
 case 1:MENU_CallOFF();break;
 case 2:MENU_GetCall();break;
 case 3:MENU_News();break;
 case 4:MENU_NULL();break;
 case 5:MENU_NULL();break;
         default: break;
}
 }break;
 case 2:
 {
  switch(caidan[1]) // 三级菜单
    {

 case 0:MENU_SetAlarmTemp();break;
     case 1:MENU_SetTime();break; 
     case 2:MENU_NULL();break;
 case 3:MENU_NULL();break;
 case 4:MENU_NULL();break;
 case 5:MENU_NULL();break;
         default: break;
 }
 }break;
 case 3:
 {
  switch(caidan[1]) // 三级菜单
    {
     case 0:MENU_Counter();break;
 case 1:MENU_NULL();break;
 case 2:MENU_NULL();break;
 case 3:MENU_NULL();break;
 case 4:MENU_NULL();break;
 case 5:MENU_Version();break;
        default:break; 
}
 }break;
     case 4:
 {
  switch(caidan[1]) // 三级菜单
    {
     case 0:MENU_NULL();break;
 case 1:MENU_NULL();break;
 case 2:MENU_NULL();break;
 case 3:MENU_NULL();break;
 case 4:MENU_NULL();break;
 case 5:MENU_NULL();break;
        default:break; 
}
 }break;
 default:LCD12864_Clear();break;
  }
  }break;

  default:break;
 } 
  }
}
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-3-15 08:28:41 | 显示全部楼层
頂啊,強
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-3-15 10:42:28 | 显示全部楼层

不好意思,我看错了,我看的是我以前调试的程序,没注意看,你的问题是不能用键盘是吗,请看下面红字部分你应该明白了:
/***********************************************************
* 函数名称: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 );
    }

因为要进入主菜单,则要按遥控,如果不要遥控,你就该一下吧
   if ( IRDA_key==17 ||这里加个按键就OK啦)
   {
     flag=1;
   LCD12864_Clear();       // 清屏函数
   MENU_A0();
   }
   else flag=0;

多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-3-15 10:43:38 | 显示全部楼层
回复【21楼】1501697860:
---------------------------------
谢谢~
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-3-15 22:26:27 | 显示全部楼层
楼主好人啊

还有一点小问题  就是温度还有一小问题
温度不变 一直显示16度 拔了也是加热还是
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-3-15 22:53:00 | 显示全部楼层
回复【22楼】1989090518shu:
---------------------------------
还有一个问题想请教楼主用什么样的gsm模块
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-3-16 14:13:38 | 显示全部楼层
回复【24楼】1989090518shu:
---------------------------------
哦,那你先检查程序中定义的IO口是否与硬件相对应,再检查你的硬件电路是否有断线,还有我用的是DS18b20,看你的此芯片坏了没有。。
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-3-16 14:22:42 | 显示全部楼层
回复【25楼】1989090518shu:
---------------------------------
是别人买的,好像型号是华为GTM900C
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-3-20
在线时间
0 小时
发表于 2013-3-21 12:38:49 | 显示全部楼层
膜拜,有时间也试试
路在脚下
回复 支持 反对

使用道具 举报

0

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2013-1-30
在线时间
7 小时
发表于 2013-3-23 10:42:35 | 显示全部楼层
谢谢分享!!
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-4-2
在线时间
0 小时
发表于 2013-4-2 15:06:58 | 显示全部楼层
不错
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-2-16
在线时间
0 小时
发表于 2013-4-2 22:21:37 | 显示全部楼层
大神,顶礼膜拜~啥时候才能达到这种境界啊
我将用我的坚毅来点燃我的兴趣与热情
回复 支持 反对

使用道具 举报

31

主题

64

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2012-10-27
在线时间
63 小时
发表于 2013-4-3 14:32:01 | 显示全部楼层
膜拜一下
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2012-12-14
在线时间
3 小时
发表于 2013-4-8 19:34:30 | 显示全部楼层
综合学习的好作品。一定要按这个自己做一个。
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-4-9 09:25:58 | 显示全部楼层
回复【33楼】wlmysx1:
---------------------------------
呵呵!希望做个更漂亮的,到时发出来大家一起共享啊~
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-3-11
在线时间
0 小时
发表于 2013-4-21 22:00:28 | 显示全部楼层
温度问题还没搞定不知程序那里出了问题,用别的温度程序是正常的
DS18b20没错    没找到原因
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-4-22
在线时间
0 小时
发表于 2013-4-22 10:32:45 | 显示全部楼层
LCD端口已改,但为什么LCD还是不显示?下面是和我的板子配套的程序,可以正常显示。麻烦楼主看一下,和您的LCD程序对比一下,要改哪些地方?谢谢!!!
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int
/*12864端口定义*/
#define LCD_data  0             //数据口
sbit LCD_RS  =  3^5;            //寄存器选择输入 
sbit LCD_RW  =  3^6;            //液晶读/写控制
sbit LCD_EN  =  3^4;            //液晶使能控制
sbit LCD_PSB =  3^1;            //串/并方式控制
sbit wela    =  2^6;
sbit dula    =  2^7;

unsigned char code zhu[]= //图片代码
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x50,0x00,0x50,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x04,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x01,0x0B,0x15,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x88,0x00,0x00,0x06,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x80,0x00,0x60,0x00,0x00,0x05,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x03,0x90,0x00,0x01,0xB6,0x36,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00,0x01,0xFE,0x36,0x00,0x00,0x00,
0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x02,0x20,0x00,0x01,0xB6,0x36,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x02,0xA0,0x00,0x03,0x6F,0xFF,0x00,0x00,0x00,
0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x00,0x2C,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xC0,0x00,0x00,0x00,0x28,0x00,0x00,0x00,
0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x80,0x00,0x00,0x1F,0x08,0x47,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x20,0x00,0x00,0x3D,0x13,0x0C,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x08,0x10,0x00,0x00,0x27,0xA0,0x18,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x10,0x00,0x00,0x3F,0x80,0x38,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x03,0xE0,0x00,0x33,0x90,0x3F,0xC7,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0xB0,0x00,0x33,0x10,0x7F,0x87,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x08,0x24,0xF0,0x0C,0x0E,0x00,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xF0,0xC2,0x00,0x00,0xFE,0x1F,0x81,0xB3,0xE6,0xD8,0xF0,0x00,
0x00,0x00,0x08,0x46,0x71,0x06,0x00,0x08,0x3F,0x1F,0x01,0xF6,0x67,0xF9,0xB0,0x00,
0x00,0x00,0x00,0x03,0x20,0x98,0x00,0x00,0x3F,0xFF,0x01,0xB6,0xC6,0xD9,0x80,0x00,
0x00,0x00,0x08,0x40,0xC0,0x24,0x00,0x04,0x3F,0x1F,0x03,0x7F,0xFD,0xBE,0xFC,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x1E,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x01,0x0E,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x87,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x08,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x88,0x00,0x01,0x8C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x01,0x8E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xB6,0x06,0xDB,0x6C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0x06,0xDB,0x6C,0x00,
0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x94,0xA4,0x68,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x14,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

void delay0(uchar x);  //x*0.14MS
void beep();
void  dataconv();
void lcd_pos(uchar X,uchar Y);  //确定显示位置

void delay(int ms)
{
    while(ms--)
{
      uchar i;
  for(i=0;i<250;i++)  
   {
    _nop_();    
_nop_();
_nop_();
_nop_();
   }
}
}

/*******************************************************************/
/*                                                                 */
/*检查LCD忙状态                                                    */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
/*                                                                 */
/*******************************************************************/
bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result); 
 }
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0; 
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()


    LCD_PSB = 1;         //并口方式
    
    lcd_wcmd(0x34);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
}

/*******************************************
函数名称raw_PM
功    能:在整个液晶屏幕上画图
参    数:无
返回值:无
********************************************/
void Draw_PM(const uchar *ptr)
{
    uchar i,j,k;
    wela=0;
dula=0; 
lcd_wcmd(0x34);        //打开扩展指令集
i = 0x80;            
for(j = 0;j < 32;j++)
{
        lcd_wcmd(i++);
        lcd_wcmd(0x80);
   for(k = 0;k < 16;k++)
   {
       lcd_wdat(*ptr++);
   }
}
i = 0x80;
  for(j = 0;j < 32;j++)
{
      lcd_wcmd(i++);
        lcd_wcmd(0x88);    
   for(k = 0;k < 16;k++)
   {
        lcd_wdat(*ptr++);
    } 
}  
    lcd_wcmd(0x36);        //打开绘图显示
lcd_wcmd(0x30);        //回到基本指令集
}

main()
 {
wela=0;
dula=0; 
lcd_init();                //初始化LCD    
    Draw_PM(zhu);                       //显示可爱猪的图片
  while(1);
 }
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-4-22 14:01:31 | 显示全部楼层
回复【35楼】 1989090518shu :
温度问题还没搞定不知程序那里出了问题,用别的温度程序是正常的 DS18b20没错    没找到原因
---------------------------------
我的DS18b20驱动程序不是太好,因为没有严格按照时序来操作,DS18B20是一个单总线器件,一定要严格按照时序操作才能正常驱动,所以你自己可以改写这驱动程序,或者看看我写的另一个程序,你对照改改罗~

DS18B20.zip

31.6 KB, 下载次数: 2345

多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-4-22 14:02:33 | 显示全部楼层
回复【36楼】xbs2013:
LCD端口已改,但为什么LCD还是不显示?下面是和我的板子配套的程序,可以正常显示。麻烦楼主看一下,和您的LCD程序对比一下,要改哪些地方?谢谢!!! #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint  unsigned int /*12864端口定义*/ #define LCD_data  0             //数据口 sbit LCD_RS  =  3^5;            //寄存器选择输入  sbit LCD_RW  =  3^6;            //液晶读/写控制 sbit LCD_EN  =  3^4;            //液晶使能控制 sbit LCD_PSB =  3^1;            //
......
---------------------------------
呵呵!不好意思,还是你自己改吧~
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-4-22
在线时间
0 小时
发表于 2013-4-22 20:49:38 | 显示全部楼层
红外解码,弄了半天,实在是弄不出来,请问楼主的编码是PWM的吗?我是用TC9012的,好像是PPM编码,楼主能不能帮忙看一下,如何修改成PPM编码的

我配套的程序如下,可以显示

/*-----------------------------------------------
  名称:遥控器红外解码数码管显示
  内容:按配套遥控器上1-9会在数码管上对应显示
------------------------------------------------*/
#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit IR=P3^2;   //红外接口标志

#define DataPort 0  //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^6; //定义锁存使能端口 段锁存
sbit LATCH2=P2^7; //                 位锁存

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
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 TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00; //重载值
TL0=0x00; //初始化值
ET0=1;    //开中断
TR0=1;    
}
void EX0init(void)
{
 IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
 EX0 = 1;   //使能外部中断
 EA = 1;    //开总中断
}
void Ir_work(void)//红外键值散转程序
{
       switch(IRcord[2])//判断第三个数码值
         {
 case 0x0cataPort=dofly_DuanMa[1];break;//1 显示相应的按键值
 case 0x18ataPort=dofly_DuanMa[2];break;//2
 case 0x5eataPort=dofly_DuanMa[3];break;//3
 case 0x08ataPort=dofly_DuanMa[4];break;//4
 case 0x1cataPort=dofly_DuanMa[5];break;//5
 case 0x5aataPort=dofly_DuanMa[6];break;//6
 case 0x42ataPort=dofly_DuanMa[7];break;//7
 case 0x52ataPort=dofly_DuanMa[8];break;//8
 case 0x4aataPort=dofly_DuanMa[9];break;//9
             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 main(void)
{
EX0init(); //初始化外部中断
TIM0init();//初始化定时器
DataPort=0xfe; //取位码 第一位数码管选通,即二进制1111 1110
LATCH2=1;      //位锁存
LATCH2=0;
while(1)//主循环
{
if(irok)                        //如果接收好了进行红外处理
{   
Ircordpro();
irok=0;
}
if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
Ir_work();
}
}
}
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-4-23 08:40:59 | 显示全部楼层
回复【39楼】xbs2013:
---------------------------------
你可以改成你的解码啊,该我的程序就行了,把我程序中用到遥控按键解码的地方换成你的遥控解码就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 );
 }
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-4-22
在线时间
0 小时
发表于 2013-4-23 15:58:45 | 显示全部楼层
我根据我板子配套的程序改了一下你的红外程序,编译是通过了,但连接怎么也不通过,可不可以麻烦你看一下,哪里出问题了?红外用到外部中断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();
}
}
}
  
  
错误截图:



  



回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-4-22
在线时间
0 小时
发表于 2013-4-23 16:00:52 | 显示全部楼层


回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-4-23 22:09:42 | 显示全部楼层
回复【41楼】xbs2013:
---------------------------------
呵呵!你的程序我也不知道怎么说,自己写的自己应该好找问题写吧,要不你去百度搜搜你遥控型号的程序,我最近也有很多的事,没及时帮到你我感到抱歉~~
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-4-28
在线时间
0 小时
发表于 2013-4-28 23:50:07 | 显示全部楼层
看起来真的很不错哦!
回复 支持 反对

使用道具 举报

27

主题

774

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1473
金钱
1473
注册时间
2013-4-12
在线时间
77 小时
发表于 2013-4-29 00:09:16 | 显示全部楼层
回复【44楼】梓叶之林:
---------------------------------
那是必须的
简单是多么的快乐,而快乐就因你而简单!微芯动力LTKKS
回复 支持 反对

使用道具 举报

23

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2013-3-28
在线时间
0 小时
发表于 2013-5-4 10:00:13 | 显示全部楼层
兄弟我自愧不如,顶~~~
好好赚钱,养家糊口。
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-5-7
在线时间
0 小时
发表于 2013-5-7 10:51:39 | 显示全部楼层
界面做的好票凉,LCD12864怎么设置成把字体镂空的?不会是加载图片吧?
求教······呜呜
回复 支持 反对

使用道具 举报

10

主题

86

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2012-2-11
在线时间
8 小时
 楼主| 发表于 2013-5-7 14:59:21 | 显示全部楼层
回复【47楼】胖呼呼~呼呼:
界面做的好票凉,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);
}>
多努力一点点,少遗憾一点点!!!
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-5-7
在线时间
0 小时
发表于 2013-5-8 10:53:35 | 显示全部楼层
回复【48楼】JZHG1992:
---------------------------------
恩恩,O(∩_∩)O谢谢!!!
比我之前写的个开关电源的界面漂亮多了,程序我已经下来了,仔细研究研究
你主程序只有不到十行,又秒杀我不到30行的记录
提个小建议(不要见怪哦):
像DS18B20 那些采集取样的东西最好是用定时器定时采样显示的比较好呢,而检测报警的当然就得一直刷了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 10:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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