完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
上次帮学弟参加学校比赛做的一个简单的智能家居管理系统,控制芯片为STC89C52。由于自己水平有限界面写的很简单,搞了半个月界面就实现了时间、温度、烟雾、人体感应、打电话、发短信、红外遥控和计算器等功能,菜单也写的比较简单,使用数组完成。一共三级菜单。由于菜单图片较多只是上传一部分,如果想要玩GSM模块和写简单菜单的朋友可看看!附件有原理图和程序~~
主界面: 主菜单: 二级子菜单: 三级子菜单: 键盘: 原理图: 。。。。。。。。。。。。。。。。。。。。。。。。。想看其他功能就自己做实物看吧!! STC_DIY.pdf (284.64 KB ) ceshi_5.zip (171.27 KB ) |
|
相关推荐
49个回答
|
|
回复【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; } } } |
|
|
|
頂啊,強
|
|
|
|
不好意思,我看错了,我看的是我以前调试的程序,没注意看,你的问题是不能用键盘是吗,请看下面红字部分你应该明白了:
/*********************************************************** * 函数名称: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; |
|
|
|
谢谢~
|
|
|
|
|
|
|
|
还有一个问题想请教楼主用什么样的gsm模块
|
|
|
|
哦,那你先检查程序中定义的IO口是否与硬件相对应,再检查你的硬件电路是否有断线,还有我用的是DS18b20,看你的此芯片坏了没有。。
|
|
|
|
是别人买的,好像型号是华为GTM900C
|
|
|
|
膜拜,有时间也试试
|
|
|
|
谢谢分享!!
|
|
|
|
|
|
大神,顶礼膜拜~啥时候才能达到这种境界啊
|
|
|
|
膜拜一下
|
|
|
|
综合学习的好作品。一定要按这个自己做一个。
|
|
|
|
呵呵!希望做个更漂亮的,到时发出来大家一起共享啊~
|
|
|
|
|
|
|
|
LCD端口已改,但为什么LCD还是不显示?下面是和我的板子配套的程序,可以正常显示。麻烦楼主看一下,和您的LCD程序对比一下,要改哪些地方?谢谢!!!
#include #include #define uchar unsigned char #define uint unsigned int /*12864端口定义*/ #define LCD_data  0 //数据口 ***it LCD_RS =  3^5; //寄存器选择输入 ***it LCD_RW =  3^6; //液晶读/写控制 ***it LCD_EN =  3^4; //液晶使能控制 ***it LCD_PSB =  3^1; //串/并方式控制 ***it wela =  2^6; ***it 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); } |
|
|
|
我的DS18b20驱动程序不是太好,因为没有严格按照时序来操作,DS18B20是一个单总线器件,一定要严格按照时序操作才能正常驱动,所以你自己可以改写这驱动程序,或者看看我写的另一个程序,你对照改改罗~DS18B20.zip (31.6 KB )
|
|
|
|
呵呵!不好意思,还是你自己改吧~
|
|
|
|
红外解码,弄了半天,实在是弄不出来,请问楼主的编码是PWM的吗?我是用TC9012的,好像是PPM编码,楼主能不能帮忙看一下,如何修改成PPM编码的
我配套的程序如下,可以显示 /*----------------------------------------------- 名称:遥控器红外解码数码管显示 内容:按配套遥控器上1-9会在数码管上对应显示 ------------------------------------------------*/ #include ***it IR=P3^2; //红外接口标志 #define DataPort 0 //定义数据端口 程序中遇到DataPort 则用P0 替换 ***it LATCH1=P2^6;//定义锁存使能端口 段锁存 ***it 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(); } } } |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2951 浏览 16 评论
3455 浏览 1 评论
8984 浏览 16 评论
4045 浏览 18 评论
1096浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2299浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 15:24 , Processed in 1.455817 second(s), Total 86, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号