完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
上次帮学弟参加学校比赛做的一个简单的智能家居管理系统,控制芯片为STC89C52。由于自己水平有限界面写的很简单,搞了半个月界面就实现了时间、温度、烟雾、人体感应、打电话、发短信、红外遥控和计算器等功能,菜单也写的比较简单,使用数组完成。一共三级菜单。由于菜单图片较多只是上传一部分,如果想要玩GSM模块和写简单菜单的朋友可看看!附件有原理图和程序~~
主界面: 主菜单: 二级子菜单: 三级子菜单: 键盘: 原理图: 。。。。。。。。。。。。。。。。。。。。。。。。。想看其他功能就自己做实物看吧!! STC_DIY.pdf (284.64 KB ) ceshi_5.zip (171.27 KB ) |
|
相关推荐
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 ); } |
|
|
|
|
|
我根据我板子配套的程序改了一下你的红外程序,编译是通过了,但连接怎么也不通过,可不可以麻烦你看一下,哪里出问题了?红外用到外部中断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();}}} 错误截图: |
|
|
|
|
|
|
|
|
呵呵!你的程序我也不知道怎么说,自己写的自己应该好找问题写吧,要不你去百度搜搜你遥控型号的程序,我最近也有很多的事,没及时帮到你我感到抱歉~~
|
|
|
|
|
|
看起来真的很不错哦!
|
|
|
|
|
|
那是必须的
|
|
|
|
|
|
兄弟我自愧不如,顶~~~
|
|
|
|
|
|
|
|
|
|
|
|
你是说字反转吗, 你看我的程序,有个反白函数
/*********************************************************** * 函数名称: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 y++; } LCD12864_Write_Data( LCD12864_COM,0x32); LCD12864_Write_Data( LCD12864_COM,0x30); }> |
|
|
|
|
|
恩恩,O(∩_∩)O谢谢!!!
比我之前写的个开关电源的界面漂亮多了,程序我已经下来了,仔细研究研究 你主程序只有不到十行,又秒杀我不到30行的记录 提个小建议(不要见怪哦): 像DS18B20 那些采集取样的东西最好是用定时器定时采样显示的比较好呢,而检测报警的当然就得一直刷了 |
|
|
|
|
只有小组成员才能发言,加入小组>>
1599 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4738 浏览 0 评论
4229 浏览 9 评论
3822 浏览 16 评论
4398 浏览 1 评论
4212浏览 3评论
2381浏览 0评论
3394浏览 0评论
1159浏览 0评论
2844浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 10:05 , Processed in 1.088982 second(s), Total 96, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2486