基本信息
- 项目名称:
- 手机节能远程控制
- 来源:
- 第十二届“挑战杯”省赛作品
- 小类:
- 机械与控制
- 大类:
- 科技发明制作A类
- 简介:
- 目前,物联网是全球研究的热门课题,国内外都把它的发展提到了国家级的战略高度,称之继及计算机、互联网之后的世界信息产业的第三次浪潮。 以“物联网”为概念、以“节能”为标准、以“家居智能化”为目的。设计了一款手机节能远程控制样品。本作品可以实现对家电的远距离无线控制,还有效的利用了太阳能,实现了节能环保的理念。
- 详细介绍:
- 手机远程节能控制使用说明 引言 21世纪是信息化的世纪,各种电信和互联网新技术推动了人类文明的巨大进步。随着计算机技术和通信技术的飞速发展,人类的生活水平有着日新月异的变化, “以人为本、舒适、便利、智能化”已成为家居系统的重要设计理念,家居智能化控制系统力求创造安全、舒适的生活环境的设计理念。 近年来,随着科技的快速发展,智能家电在人们的生活中逐渐崛起,其简约时尚,安全可靠,等好处将带领人们走进更智能化的生活。智能家电控制系统不仅具有传统的居住功能,提供舒适安全、高品位且宜人的家庭生活空间。还将原来的被动静止结构转变为具有能动智慧的工具,提供全方位的信息交换功能,帮助家庭与外部保持信息交换畅通,优化人们的生活方式,帮助人们有效安排时间,增强家居生活的安全性,甚至为各种能源费用节约资金。 短信控制是一种基于无线GTM技术的 工业级的MODEM,是一种内嵌GTM无线通信模块,插入移动运营商的手机SIM卡,可以与移动运营商的短信中心建立无线连接,可以实现一系列的自由的短信收发来进行不同的家电控制。本系统采用的主控芯片是STC 12C5A60S2单片机,GTM模块采用GTM900-C短消息模块,设计的过程充分利用了各个模块与单片机的标准接口,根据单片机良好的控制性能完成了报警信号采集和分析、键盘输入、各模块控制和通信、数据显示、强电控制信号处理、与PC机通信以及对无线遥控等功能。 远程智能控制系统主要分为个5个系统:单片机控制、短信远程控制、太阳能给蓄电池充电、传感器控制、无线控制。 一、系统设计主要任务 本文利用STC 12C5A60S2、SIM卡、GTM900-C和各类家居传感器设计制作一款手机远程节能控制样品。实验样品的设计包括:系统硬件的设计与调试和控制软件的编写与调试。 1、硬件部分 智能家居控制系统其硬件部分主要由五大部分构成,即手机交换网程控交换信令部分、控制单元、传感器数据采集系统、GTM模块GTM900-C与接口和电源部分。SIM卡部分电压检测元件组成,它是系统中控制部分关键的元件,它与控制单元组成控制部分功能;传感器数据采集系统、GTM模块GTM900-C和控制单元完成报警等信号的处理和发送;电源部分则为各个部分提供工作电源。 2、软件部分 软件设计部分主要由五大部分构成:即数据采集与数据分析部分、手机短信控制的识别与分析部分、GTM模块GTM900-C接口程序部分、分析控制部分。其中数据采集与数据分析部分和手机交换网程控交换信令识别需要作实时处理;GTM模块GTM900-C接口程序部分和分析控制部分则是根据采集和手机短信控制进行分时操作有利于提高系统效率。 二、单片机控制部分 主单片机采用的是STC12C5A60S2,该单片机是宏晶科技生产的单时钟/机器周期(IT)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,单速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250/S),针对电机控制,强干扰场合。 本系统采用该单片机,因为该单片机运行速度快,当有传感器发出信号时可以很快的对该信号进行处理,同时也能较快的去控制其他外围电路的工作。 此板为51系列单片机实验板:可做LED/LED 1602 液晶、单片机ISP/IAP 程序下载器、符合7816-3 的逻辑加密卡、温度湿度读取,PT2272/2262 无线收发器、I2C存储、,单片机其它功能实验、GTM/GPRS 模块的GPRS 上网,TCP/UDP 协议传输,无线抄表,远程短信控制、工业控制、线路防盗、家庭防盗、短信收发器及学习短信开发、群发器,语音通话等功能,以上功能只要改动源代码就可以实现,突出控制功能:如对外部信息的捕捉、对控制对象实时控制和有突出控制功能的指令系统(I/O控制、位操作和转移指令等)。 三.短信远程控制 1、GTM900-C的介绍 华为GTM900-C 无线模块是一款两频段GTM/GPRS 无线模块(内嵌TCP/IP协议:支持多链接,提供ACK应答,提供大容量缓存)。它支持标准的AT 命令及增强AT 命令,电路型数据业务,集群功能(组呼、广播和私密呼叫等GTM900-C模块支持)STK功能(通过增强的AT命令支持STK功能)ROHS环保(符合ROHS环保认证要求)补充业务(来电显示、呼叫转移、呼叫保持、呼叫等待和三方通话)等功能,是高速数据传输等各种应用的理想解决方案。 GTM900-C 使用AT 命令集,通过UART接口与STC 12C5A60S2通信,经过CPU的处理和分析实现无线发送和接收,基带处理和控制单片机I/O口的功能。 2、作品使用方法 (1)首先程序里的电话号码 13462424976要改成自己 的手机号码然后下载到单片机里面这时才可以实现短信控制功能。(本模块以设置好,按如下操作就可以使用) (2)在板上插入一个SIM卡(任意一手机卡有号码就可以,为方便操作本模块已经装SIM 卡 号码15239136372),然后打开主板电源开关(并把受控电源插头通电蓝色指示灯亮),当听到蜂鸣器响一下(主板红色指示灯亮),说明SIM卡接触良好,这时模块可以工作了,如果蜂鸣器响声过长说明SIM卡没插好,需重新放置,如SIM卡接触良好,等大约30S蜂鸣器又响一下,这时模块就如初始化状态。 (3)然后用程序里面设置的手机号码(号码可以改动。注:本作品为方便操作,附带有设置好的手机卡插入任意手机就可以使用。)向模块里的手机号发送START控制模块上的继电器使电灯发光和1START控制无线发射器件使插座带电,并回复短信说设置成功。(大约30S, 跟手机信号有关,信号好了时间更短一些,信号不好时间稍长一些。)发送END或者1END关闭相应的功率器件,并回复短信报告设置情况。 (4)红外释热传感器感应到有人时会给设定的手机号码发信息提示,红外对管中间感应到物体时也给设定的手机号码发信息提示(在运输途中对管可能会错位使其无法工作,操作时把两管对正即可)。 3、短信远程控制。 此通信电路主要完成短消息收发、与微机通信、软件流控制等功能。 四、太阳能给蓄电池充电 1、太阳能是一种干净的可再生的新能源,越来越受到人们的亲睐,在人们生活、工作中有广泛的作用, 其中之一就是将太阳能转换为电能,太阳能电池就是利用太阳能工作的。而太阳能热电站的工作原理则是利用汇聚的太阳光,把水烧至沸腾变为水蒸气,然后用来发电。 2、太阳能工作原理:太阳能直接照射太阳能电池板,通过光电转换转化为电能对产品内置锂离子电池充电。然后蓄电池给模块供电,真正意义上实现“节能环保,让阳光买单”。 3、太阳能的优点: 1)普遍:太阳光普照大地,没有地域的限制无论陆地或海洋,无论高山或岛屿,都处处皆有,可直接开发和利用,且无须开采和运输。 2)无害:开发利用太阳能不会污染环境,它是最清洁能源之一,在环境污染越来越严重的今天,这一点是极其宝贵的。 3)巨大:每年到达地球表面上的太阳辐射能约相当于130万亿吨煤,其总量属现今世界上可以开发的最大能源。 4)长久:根据目前太阳产生的核能速率估算,氢的贮量足够维持上百亿年,而地球的寿命也约为几十亿年,从这个意义上讲,可以说太阳的能量是用之不竭的。 4、太阳能电池板的应用范围: 给蓄电池充电,太阳能路灯,太阳能交通指示牌,太阳能发电系统,太阳能通信站,太阳能水泵等等。 五、传感器的控制 (1)防盗传感器 1)特点 采用PIR热释电传感器、菲涅尔低功耗、静态功耗50uA宽电压范围、DC 4.5-20V电路板小体积38*28mm(32*24*mm)可重复/不可重复触发方式,选择使用简单、电源+ -信号输出,感应距离7米,感应角度110° 2、电气参数 工作电压范围 直流电压4.5-20V,静态电 50uA,输出电平高3.3 V /低0V,触发方式 L不可重复触发/H重复触发,电路板外形 38*28mm(32*24*mm),感应角度 110°,感应距离 7米 3、应用范围 ■ 安防产品 ■ 人体感应玩具 ■人体感应灯具 ■ 工业自动化控制等 热释电红外开关是BISS0001配以热释电红外传感器和少量外接元器件构成的被动式红外开关。它能自动快速开启各类白炽灯、荧光灯、蜂鸣器、自动门、电风扇、烘干机和自动洗衣机等装置,是一种高技术产品。特别适用于企业,宾馆、商场、库房及家庭的过道、走廊等敏感区域,或用于安全区域的自动灯光、照明和报警系统。 ■功能特点1: 1) 全自动感应:人进入其感应范围则输出高电平, 人离开感应范围则自动延时关闭高电平,输出低电平。 2) 光敏控制(可选择,出厂时未设):可设置光敏控制,白天或光线强时不感应。 3) 温度补偿(可选择,出厂时未设):在夏天当环境温度升高至30~32℃,探测距离稍变短,温度补偿可作一定的性能补偿。 2、 两种触发方式:(可跳线选择) 1)不可重复触发方式:即感应输出高电平后,延时时间段一结束,输出将自动从高电平变为低电平; 2)可重复触发方式:即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。 3、具有感应封锁时间(默认设置:2.5S封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(此时间可设置在零点几秒—几十秒钟)。 4、工作电压范围宽:默认工作电压DC4.5V-20V。 5、微功耗:静态电流<50微安,特别适合干电池供电的自动控制产品。 6、输出高电平信号:可方便与各类电路实现对接。 ■使用说明2: 1)感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出0-3次,一分钟后进入待机状态。 2)应尽量避免灯光等干扰源近距离直射模块表面的透镜,以免引进干扰信号产生误动作;使用环境尽量避免流动的风,风也会对感应器造成干扰。 3)感应模块采用双元探头,探头的窗口为长方形,双元(A元B元)位于较长方向的两端,当人体从左到右或从右到左走过时,红外光谱到达双元的时间、距离有差值,差值越大,感应越灵敏,当人体从正面走向探头或从上到下或从下到上方向走过时,双元检测不到红外光谱距离的变化,无差值,因此感应不灵敏或不工作;所以安装感应器时应使探头双元的方向与人体活动最多的方向尽量相平行,保证人体经过时先后被探头双元所感应。为了增加感应角度范围,本模块采用圆形透镜,也使得探头四面都感应,但左右两侧仍然比上下两个方向感应范围大、灵敏度强,安装时仍须尽量按以上要求。 注:调节距离电位器顺时针旋转,感应距离增大(约7米),反之,感应距离减小(约3米)。 调节延时电位器顺时针旋转,感应延时加长(约300S),反之,感应延时减短(约5S)。 4、本模块防盗传感器的作用: 防盗报警的作用:当有非法侵入时,模块将以短信方式通知家人。另外,可以通过程序设定报警装置的等级和报警器的灵敏度。 六、红外对管 1)红外对管控制 原理图:对管的原理大约就是一个红外(或红外激光)管,发射出一道光线,对面有个光敏的接收器件检测这个光,如果光线被挡住,就可以实现报警功能。 2)红外对管的性能及参数: 红外发射管就是发射红外线的二极管.波长有940nm和850nm两种工作电流一般在50mA。 3)使用功能:若感应到有人经过,输出端口输出一个高电平给单片机,单片机发送短信给主人,以此来实现防盗。 1、无线发射模块介绍 (1)发射模块型号:T1000BS1。 (2)发射模块说明: 该模块工艺成熟、性能优秀,电磁转换效率高、发射功率大、功耗低,采用声表器件(SAW)稳频,6﹒5G超高频三极管, 编码芯片品种繁多,满足各个方面、层次的应用。 适用范围:1)汽车、摩托车防盗器;2)家庭防盗报警器;3)各种遥控控制,电灯控制,插座控制,各种家电的控制; 2、技术指标: 工作电压 6-12V 工作电流 5-40mA 振荡方式 SAW谐振 调制方式 ASK 工作频率 315MHz, 433.92MHz, 特殊频率可定制 频率偏差 ±150kHz(max) 发射功率 m W 编码格式 PT2262 3、性能特征:1)四位并行数据;2)高稳定性,采用SMT进口贴片元件,声表面谐振器稳频(SAW),6﹒5G超高频三极管; 4、 外形尺寸:36mmX23mmX8 mm。 5、参考应用线路。 6、使用说明: 1)本模块传输距离与收发天线、工作电压、数据速率、占空比等因素有关。2)使用时应接上天线(长度约为250mm )并尽量拉直悬空使用,天线应尽量远离大的金属体。3)应尽量避免电磁干扰和金属屏蔽。 7、接收模块型号:R03BS (1)技术指标 1)工作电压:5VDC 2)工作电流:<5mA 3)接收频率:315MHz 4)接收方式:超再生 5)接收灵敏度:-103dBm 6)解码芯片:PT2272-M4(L4),有四路并行数据输出,一路解码有效指示输出(非锁),八位三态地址码。 7)解码有效时输出TTL高电平 8)输出方式:有两种,一种为非锁(M)方式(即点动或脉冲方式),另一种为互锁(L)方式(即信号锁存方式) 9)外形尺寸:49×20×7mm 8、无线接收模块使用说明 1)使用范围:各种工业遥控,遥测,防盗报警器信号接收,各种家用电器的遥控等。 2)本模块接收频率已固定在315MHz,应用时请勿调节模块中的电感元件。以免影响接收效果。 3)天线用软导线或其它硬质金属(如拉杆天线),长度为250mm,既不能过长也不能过短,否则会影响接收距离。若使用软导线,请拉直悬空使用,并尽量不要靠近金属物体。 4)应尽量避免电磁干扰和金属屏蔽。 5)电源电压要求稳定且波纹系数低,需多级滤波(如增加磁珠﹑电感﹑电容等)。 6)若配合单片机使用建议MCU时钟频率在4MHZ以下并且晶体尽量远离RF接收模块,否则晶体的高次谐波会影响通讯距离。 9、参考应用电路(四路遥控继电器开关) 10、无线接收模块使用说明 1)无线发射P2262与单片机相连接通过单片机的控制I/O端口的高低电平,来控制发射头发射无线电波方式。 2)无线接收P2272模块接收到发射信号是继电器工作控制家电。 3)1START控制无线发射器件13端口,无线接收模块D0口通过相应电路使继电器工作控制插座通电情况,并回复短信OUT ON OK1(说明设置成功),发送1END可以关闭插座导通,并回复短信 OUT OFF OK1(说明关闭成功)。 四.手机节能控制作品程序 /==********************************************************** //--软件功能, 控制器可以是 PT2262无线发射器 ,接收可以是 PT2272接收板 //这里 PT2252 D0-D3的其中一个脚 要接到P25脚上才能实现 //程序里的电话号码 13462424976要改成自己 的手机号码才能发到你的手机上去 //读短信并回复 指令为 START END 1START 1END //============================================================ #include <cheshi.h> //#include <lcd.h> uchar data int_case; //中断标志 #define MAX_TM 100 // AT指收发数组最大缓冲 #define MAX_T 30 uchar idata uart_buff[MAX_TM]; //通信程序中的缓冲 uchar idata receive_count; //发送与接收 数组指针 uchar data para_temp[MAX_T]; //多用临时用 uchar data sms_num_tmp; ///读短信号码参数 uchar data sms_tmp; ///短信处理参数代码 uchar idata TEL_temp[15]; //存对方号码, //---定时延时用----------- uint data timercount; //50MS定时器, uchar data timer_1S_cnt; uchar data timer_10S_cnt; uchar data timer_S_cnt; //-------------------- bit P25_BIT; bit P25_BIT_ID; bit P24_BIT; bit P24_BIT_ID; bit P22_BIT; bit P22_BIT_ID; /* ********************************************************************************************************* ** 函数名称 dmsec() ** 函数功能 :延时 NS ** 入口参数 : ** 出口参数 : ********************************************************************************************************* */ //---延时S------------------------------ void dmsec (unsigned int count) { unsigned int i; while (count) { i =115; //单片机的不同,延时可以更改 while (i>0) i--; count--; } } //------------------------ //---------------------- /* ********************************************************************************************************* ** 函数名称 Int_Timer0() ** 函数功能 定时器中断位,是整个程序的心跳,如果停止,程序会死机 ** 全局变量或数组: ** 入口参数 : ** 出口参数 : ********************************************************************************************************* */ void Int_Timer0(void) interrupt 1 using 3 { TH0 = 0xB8; TL0 = 0x00; //20ms的时钟基准 //以下为自动 延时计时器, 程序里只要有以下 变量出现都为延时作用 timercount++; //自动累加器 0-255 用于程序里一些延时处理 timer_1S_cnt++; if(timer_1S_cnt==50) //20×50=1000MS =1S 1S中断处理 { timer_1S_cnt=0; timer_10S_cnt++; timer_S_cnt++; LED_S0=~LED_S0; //工作指示灯 } if(timer_10S_cnt==60) //60S 1分钟中断 { timer_10S_cnt=0; } /* 硬件 必须是 PT2272-M4接收板D0-D3 可以连其中一个脚便可 流程分析 PT2272 D0-D3输出脚 在没有收到信号时为低电平, 收到控制信号后变高电来,延时1S左右 后 变回低电平 软件实现 先 用IO 检测电平 应先是低电平 进入等待控制 ,如果先是高电平,不应该理会, 因为没有 插入PT2272 时IO电平就是高电平 */ P2_5=1; if(P2_5!=P25_BIT_ID) //PT2272电平接入 { if (P2_5==1) { P25_BIT=1; } P25_BIT_ID=P2_5; } P2_4=1; if(P2_4!=P24_BIT_ID) //PT2272电平接入 { if (P2_4==1) { P24_BIT=1; } P24_BIT_ID=P2_4; } P2_2=1; if(P2_2!=P22_BIT_ID) //PT2272电平接入 { if (P2_2==1) { P22_BIT=1; } P22_BIT_ID=P2_2; } //--------------------------------------------------------------------------------- } /* ********************************************************************************************************* ** 函数名称 Int_Uart() ** 函数功能 TC35 的命令列表,与中断服务程序 ** 全局变量或数组: receive_count 接收指针 uart_buff ring_bit ring_cnt ** 入口参数 : ** 出口参数 : 1-成功 0-失败 ********************************************************************************************************* */ void Int_Uart(void) interrupt 4 using 3 //串口的中断程序 { if(RI) //命令方式 { RI=0; if((receive_count<MAX_TM-1))//没有发送时才能进行接收 { //所有的命令返回都是处于 0x0A [Result] 0x0D 之间,其他命令,不会出现这种情况 uart_buff[receive_count++]=SBUF; } else { return; } //------------------------------------ }//End of if(RI) } /********************************************************************* * C51中字符串函数的扩充 * ** 函数名称 : strsearch () ** 函数功能 : 在指定的数组里连续找到相同的内容 ** 入口参数 : ptr2=要找的内容, ptr1 当前数组 **** 出口参数 : 0-没有 找到 >1 查找到 *********************************************************************/ uchar strsearch(uchar *ptr2,uchar *ptr1_at)//查字符串*ptr2在*ptr1中的位置 //本函数是用来检查字符串*ptr2是否完全包含在*ptr1中 //返回: 0 没有找到 // 1-255 从第N个字符开始相同 { //、 uchar max_length; uchar i,j,k; uchar flag; if(ptr2[0]==0) return(0); flag=0; for(i=0,j=0;i<MAX_TM-2;i++) { if(ptr1_at[i]==ptr2[j]) {//第一个字符相同 k=i; //for(k=i;k<MAX_TM-2;k++,j++) do { if(ptr2[j]==0)//比较正确 return(i+1); //返回值是整数,不含0 if(ptr1_at[k]!=ptr2[j]) break; k++;j++ ; } while(k<MAX_TM-2) ; j=0; } } return(0); } /********************************************************************* * C51中字符串函数的扩充 * ** 函数名称 : strsearch1() ** 函数功能 : 在指定的数组里连续找到相同的内容 ** 入口参数 : ptr2=要找的内容, ptr1 当前数组, id 数组开始的第一个位置 **** 出口参数 : 0-没有 找到 >1 查找到 *********************************************************************/ //------在指定移态的数组里连续找到相同的内容--------------------------------------- //i=传来的指令, *ptr2=要找的内容, uchar *ptr1 当前数组 uchar strsearch1(uchar i,uchar *ptr2,uchar *ptr1) { uchar j=0,k; k=i; do{ if(ptr1[k]==ptr2[j]) {j++;k++;} else return(0); if(ptr2[j]==0) return(k); }while(j<=60); return(0xff); } /* ********************************************************************************************************* ** 函数名称 CMGD_GSM() ** 函数功能 删除短信 uart_buff ** 全局变量或数组: uart_buff sms_num_tmp ** 入口参数 : AT指令 字符串 *str_at=要复制的内容/转AT指令 id 短信ID 供删除短信时用 ** 出口参数 : ********************************************************************************************************* */ //---------------------------------- //删除短信 uart_buff void CMGD_GSM(char* ptr1_at,uchar id) { uchar ptr1[3] ; ptr1[0]=(id/10)+0x30; ptr1[1]=(id%10)+0x30; ptr1[2]=0; Send_AT_Command(SMS_CMGD,ptr1_at,ptr1); //删除其它没有用的短信 Send_AT_Command(SMS_CMGD,ptr1_at,ptr1); } /* ********************************************************************************************************* ** 函数名称 CPMS_SM() ** 函数功能 功能 读短信报文 ,有短信就读短信 ,把有短信的ID找到,并读出内容 ** 全局变量或数组: receive_count 接收指针 uart_buff sms_num_tmp ** 入口参数 : AT指令 字符串 *str_at=要复制的内容/转AT指令 sms_num_tmp 短信ID 供删除短信时用 ** 出口参数 : 1-成功 0-失败 ********************************************************************************************************* */ uchar CPMS_SM(char* ptr1_at ) //---------------------- { uchar i,j,r,num_tmp1; Send_AT_Command(AT_INIT,ptr1_at,0); Send_AT_Command(AT_E,ptr1_at,0); Send_AT_Command(AT_CPMS,ptr1_at,0); if(i=strsearch("+CPMS:",ptr1_at)) //"SM" +CPMS: 0,20,0,45,0,45 { i=i+5; //+CPMS: 0,20,0,45,0,45 if(strsearch1(i,"\x20\x30,",ptr1_at)) //没有短信 { return(0); } else if((ptr1_at[i]==' ')&&((ptr1_at[i+1]>'1') //9以下短信处理 &&(ptr1_at[i+1]<='9'))&&(ptr1_at[i+2]==',')) { //+CPMS: 1,20,1,20,1,20 i=i+1; r=ptr1_at[i]-0x30; //有几个短个 i++;//, i++; //20 j=0; j=ptr1_at[i]-0x30; j=j*10; //高位 i++; j=j+(ptr1_at[i]-0x30); //低位 i++; if(ptr1_at[i]!=','&&ptr1_at[i+1]==',') //可以存100以上的 { j=j*10;i++; j=j+(ptr1_at[i]-0x30); } //返回是可以存多少短信 //r=j+10; } else if((ptr1_at[i]==' ')&&((ptr1_at[i+1]>'0') //10条短信以上处理 &&(ptr1_at[i+2]>='0'))&&(ptr1_at[i+3]==',')) { i=i+1; r=ptr1_at[i++]-0x30; r=r*10; //移到十位 r=r+ptr1_at[i++]-0x30; i++; //20 j=0; j=ptr1_at[i]-0x30; j=j*10; //高位 i++; j=j+(ptr1_at[i]-0x30); //低位 i++; if(ptr1_at[i]!=','&&ptr1_at[i+1]==',') //可以存100以上的 { j=j*10;i++; j=j+(ptr1_at[i]-0x30); } //返回是可以存多少短信 //r=j+10; } } else //出错处理 { if(ptr1_at[1]==0x0d&&ptr1_at[0]==0x34) { return(0); } } r=j; //---------下面有短信时,进行短信查找 从1-100------------------------------------ num_tmp1=1; do{ if(r>=100) //短信存储号不能超过100个 r=1; // if(r==1) //如果是一条发AT+CMGL=ALL或AT+CMGL=4 { Send_AT_Command(SMS_CMGL,ptr1_at,0); if(i=strsearch("+CMGL:\x20",ptr1_at)) //查短信代码回复是否对 { i=i+6; if(ptr1_at[i+1]==',') { num_tmp1=ptr1_at[i]-0x30; //当前短信存储号 10以内 } else //当前短信存储号 10以上 { num_tmp1=ptr1_at[i++]-0x30; num_tmp1=num_tmp1*10; num_tmp1=num_tmp1+ptr1_at[i++]-0x30; } sms_num_tmp=num_tmp1; return(1); } } else { i= READ_TEL(ptr1_at,num_tmp1) ; if(i) //有短信跳出 { i=i+7; sms_num_tmp=num_tmp1; return(1); } } r--; num_tmp1++; // }while(r!=0); //--------------------------------------------- return(0); } /* ********************************************************************************************************* ** 函数名称 read_sms() ** 函数功能 进行SIM卡的电话本读 ** 全局变量或数组: receive_count 接收指针 ** 入口参数 : AT指令 字符串str_code -para_temp str_at- uart_buff *str_at=要复制的内容/转AT指令 str_code 短信内容 *ptr_tel 电话号码 ** 出口参数 : 1-成功 0-失败 ********************************************************************************************************* */ //==================================================== uchar read_sms(char* ptr1_at,char* ptr1_code,char* ptr_tel) { uint i; uchar idata j, PDU_TEXT; if(!CPMS_SM(ptr1_at)) { return(0); } // 英文模式 //+CMGR: "REC READ","8613818120592",,"09/06/25,14:16:33+32",145,4,0,0,"8613800210500", //145,3 //END 0 // 2B 43 4D 47 52 3A 20 22 52 45 43 20 52 45 41 44 22 2C 22 38 36 31 33 38 31 38 31 32 30 35 39 32 22 //2C 2C 22 30 39 2F 30 36 2F 32 35 2C 31 34 3A 31 36 3A 33 33 2B 33 32 22 2C 31 34 35 2C 34 2C 30 2C 30 // 2C 22 38 36 31 33 38 30 30 32 31 30 35 30 30 22 2C //31 34 35 2C 33 0D 0A 45 4E 44 0D 0A 30 0D //READ"," if((i=strsearch("READ\",\"",ptr1_at))) { i=i+6; if((uart_buff[i]=='8')&&(uart_buff[i+1]=='6')) { i=i+2; } for(j=0;j<20;j++) { ptr_tel[j]=uart_buff[i++]; if(uart_buff[i]==0x22) break; } ptr_tel[j+1]=0; ptr_tel[j+2]=0x00; } //AT_CMGF1 timercount=0; while(timercount<8) ; //从短信代码中找到维一代码与内容间的字符 if((i=strsearch("\x0d\x0a",ptr1_at))) { i=i+1;//指针移动两位,指向内容的第一个字符 //----内容复制-将内容放到para_temp里------------ for(j=0;j<=MAX_T-3;j++) { ptr1_code[j]=ptr1_at[i++]; //大小写转换 toupper(ptr1_code[j]); if(ptr1_at[i]==0x0d) { ptr1_code[++j]=0; break; } if(i>=MAX_TM) break; } //--------------------- } else goto err_dll; PDU_TEXT=1;//文本 //------------------------------------------------------------ i=0; if(strsearch1(i,"START",ptr1_code)) { IO_OUT=0; //继电器吸合 strcpy(ptr1_code,"OUT ON OK\x1a"); return(1); } else if(strsearch1(i,"END",ptr1_code)) { IO_OUT=1; // 继电器断开 strcpy(ptr1_code,"OUT OFF OK\x1a"); return(1); } if(strsearch1(i,"1START",ptr1_code)) { IO_OUT1=1; //继电器吸合 strcpy(ptr1_code,"OUT ON OK1\x1a"); return(1); } else if(strsearch1(i,"1END",ptr1_code)) { IO_OUT1=0; // 继电器断开 strcpy(ptr1_code,"OUT OFF OK1\x1a"); return(1); } if(strsearch1(i,"2START",ptr1_code)) { IO_OUT2=1; //继电器吸合 strcpy(ptr1_code,"OUT ON OK2\x1a"); return(1); } else if(strsearch1(i,"2END",ptr1_code)) { IO_OUT2=0; // 继电器断开 strcpy(ptr1_code,"OUT OFF OK2\x1a"); return(1); } //------------------------------------------------------------------- else { //短信号码删除 AT+CMGD=01 err_dll: CMGD_GSM(ptr1_at, sms_num_tmp ); for(i=1;i<=MAX_TM-3;i++) { ptr1_at[i]=0; } Send_AT_Command(AT_CMGF1,ptr1_at,0); //中文方式 Send_AT_Command(AT_CNMI,ptr1_at,0);//AT+CNMI=2,1 } return(0); } /* ********************************************************************************************************* ** 函数名称 READ_TEL() ** 函数功能 进行SIM卡中的1到20条短信号码的读取 ** 全局变量或数组: receive_count 接收指针 ** 入口参数 : AT指令 字符串 str_at- uart_buff str_code -para_temp ** *str_at=要复制的内容/转AT指令 ** *str_code 短信内容 id 短信号 ** 出口参数 : 1-成功 0-失败 ********************************************************************************************************* */ //====================================================================== //====================================================================== //====================================================================== uchar READ_TEL(char* ptr1_at,uchar id) //读短信号码1-20个 { uchar idata ptr1[5],t; t=0; ptr1[t++]=(id/10)+0x30; ptr1[t++]=(id%10)+0x30; ptr1[t++]=0;ptr1[t++]=0x00; Send_AT_Command(SMS_CMGR,ptr1_at,ptr1); timercount=0; while(timercount<20) ; // if(t=strsearch("+CMGR: 0,,0",ptr1_at)) if(receive_count<10) {return(0); } return(1); } /* ********************************************************************************************************* ** 函数名称 Initialize_Model() ** 函数功能 : 模块初始化 ** 入口参数 :ptr1_at --uart_buff AT指令发送用 ptr1_code -para_temp 参数内容 ** 全局 变最 ptr1_at, uart_buff, receive_count ** 出口参数 : ********************************************************************************************************* */ void Initialize_Model(char* ptr1_at,char* ptr1_code) //初始化 PIN检测 { uchar i,j; GPS_ON=1; BELL=0; for(i=0;i<=100;i++) dmsec(1); BELL=1; // GPS_READ(ptr1_at,ptr1_code); ptr1_code[0]=0; for(i=0;i<15;i++) { //进行初始化,并显示 ATE0V0 = ATE0 ATV0 AT_E Send_AT_Command(AT_E,ptr1_at,0); Send_AT_Command(AT_INIT,ptr1_at,0); if(ptr1_at[1]==0x0d&&ptr1_at[0]==0x30) { break;} else if(ptr1_at[receive_count-1]==0x0d&&ptr1_at[receive_count-2]=='0') { break;} else if(i==1||i==7) { IO_IGT=0; timer_S_cnt=0; while(timer_S_cnt<3); IO_IGT=1; timer_S_cnt=0; while(timer_S_cnt<1); } timercount=0; while(timercount<60); } for(i=0;i<12;i++) { //读卡 AT+CPIN? Send_AT_Command(AT_E,ptr1_at,0); Send_AT_Command(AT_INIT,ptr1_at,0); Send_AT_Command(AT_CPIN,ptr1_at,0) ; //如有收到回应进行分析收到的信息, timercount=0; while(timercount<2); if(j=strsearch("READY",ptr1_at)) break; timercount=0; while(timercount<60); } Send_AT_Command(AT_IPR,ptr1_at,0);//波特率 AT+IPR=9600 Send_AT_Command(AT_CGMM,ptr1_at,0); //模块型号 AT+CGMM P25_BIT_ID=0;P25_BIT=0; P24_BIT_ID=0;P24_BIT=0; P22_BIT_ID=0;P22_BIT=0; timer_S_cnt=0; while(timer_S_cnt<15) ; BELL=0; for(i=0;i<=100;i++) dmsec(1); BELL=1; Send_AT_Command(AT_CNMI,ptr1_at,0); Send_AT_Command(AT_CMGF1,ptr1_at,0);//AT+CMGF=1 } /* ********************************************************************************************************* ** 函数名称 Sys_Init() ** 函数功能 : 单片机初始化 ** 入口参数 : ** 全局 变最 timer_1S_cnt receive_count ** 出口参数 : ********************************************************************************************************* */ void Sys_Init(void)//话机启动的初始化程序,包含键盘与定时器,串口等 { //TH0=(65536-46080)/256;//重新装入定时25mS的初值到TH0,TL0 56320 //TL0=(65536-46080)%256; //65536-(11.0592/12)*20MS*1000=To 18432 47104 //1ms定时 //11.0592/12 = 0.9216 M (记数频率) //1ms记数 921.6次 //16位 2^16 - x = 922 x=64614 FC66 //定时器里不断放fc66,不用怀疑51定时器得到的 1ms的精确性吗 TH0 = 0xB8; TL0 = 0x00; //20ms的时钟基准 //串口中断 TI=0; RI=0; SCON=0x50; //选用方式1 TMOD=0x20; TMOD = (TMOD & 0xf0) | 1;//MODE 1 // TH1=0xe8; //波特率为9600 // TL1=0xe8; TH1=0xfd; //波特率为9600 TL1=0xfd; PCON=0x00; //倍频0x80 IE = 0xb0; // EA XX ET2 ES ET0 EX0 ET1 EX1 TR1=1; //enable TIMER1 ES=1; //开串口开断 TR0=1; //串口接收中断 ET0=1; //T0 中断 ET1=0; // T1 中断 EA=1; P0=0xFF; P1=0xFF; P2=0xFF; P3=0xFF; // P4=0xff; timer_1S_cnt=0;receive_count=0; IO_IGT=1; } //====================================================== //这里为AT指令处理区,所有的AT指令都在这时对uart_buff数组进行赋值,并发送出去, //-正常情况下,AT指令反回也会在这里接收完 //------------------------ //----------------------- ///========================================== /* ********************************************************************************************************* ** 函数名称 :Send_AT_Command() ** 函数功能 :串口AT指令发送前处理, ** 全局变量或数组: receive_count 接收指针 ** 入口参数 : type =ID, 转向所有 AT指令 字符串 str_at- uart_buff str_code -para_temp ** *str_at=要复制的内容/转AT指令 ** *str_code 与*str_at合并的参数 //AT指令参数 ** 出口参数 : 1- 成功, 0- 失败 ********************************************************************************************************* */ uchar Send_AT_Command( uchar type,uchar *str_at ,uchar *str_code) //发送AT指令 //拨号时号码放在phone.number //其他用para_temp { uint i; GPS_ON=1; switch(type) { case AT_CPIN: //检查当前是否要输入PIN码 strcpy(str_at,"AT+CPIN?"); break; // AT_E case AT_E: //ATE0 功能关回显 ATE1 开回显 strcpy(str_at,"ATE0"); break; case AT_INIT: //ATV0 回复方式 30 0D ATV1 回复方式 OK strcpy(str_at,"ATV0"); break; //0D 0A 54 43 33 35 0D 0A case AT_CGMM: //模块版型号 strcpy(str_at,"AT+CGMM"); break; case AT_CMGF1: //SMS 接收方式, strcpy(str_at,"AT+CMGF=1"); break; // AT_CNMI case AT_CNMI: // AT+CNMI=2,1 strcpy(str_at,"AT+CNMI=2,1"); break; case AT_IPR: // 波特率 9600 strcpy(str_at,"AT+IPR=9600"); break; case SMS_CMGL: //读所有短信 strcpy(uart_buff,"AT+CMGL=\"ALL\""); // strcpy(str_at,"AT+CMGL=4"); // strcat(uart_buff,ptr); break; case SMS_CMGR: //读一个短信 strcpy(str_at,"AT+CMGR="); strcat(str_at,str_code); break; case SMS_CMGD: //删除一个短信 strcpy(str_at,"AT+CMGD="); strcat(str_at,str_code); break; case AT_CPMS: strcpy(str_at,"AT+CPMS=\x22SM\x22"); break; //AT_CPMS case SMS_CMGS: //写一个短信 strcpy(str_at,"AT+CMGS=\""); //AT+CMGS= "13818120592" strcat(str_at,str_code); strcat(str_at,"\""); break; //---------------------------------------------------- case CMGS_MUB: //发报警短信内容 strcpy(str_at,str_code); break; //---------------------------------------------------------- //----------------------------------------------- case AT_COMMAND: break; default: receive_count=0; return(TRUE); } ES=1; strcat(str_at,"\x0d\x00");//在命令后加入CR RI=0; //清除接收标志 TI=0; //------------------------------ for(i=0;i<MAX_TM;i++) { if(str_at[i]==0) break; SBUF=str_at[i]; while(!TI); TI=0; } //--------------------- receive_count=0; str_at[0]=0; str_at[1]=0;str_at[2]=0; i=0; timer_S_cnt=0; do{ dmsec(3); if(receive_count>1) { // dmsec(50); timercount=0; while(timercount<30); break; } }while(timer_S_cnt<3); // 延时是自动累加 在T0定时器中累加 return(TRUE); } /******************************************/ void main(void) { uchar j,i; uint r,t; bit y; Sys_Init(); P25_BIT=0; P24_BIT=0; P22_BIT=0; Initialize_Model(uart_buff,para_temp);//进行初始化 P0=1; //P25_BIT_ID=0;P25_BIT=0; P25_BIT=0; P24_BIT=0; P22_BIT=0; receive_count=0; j=0; //做PT2272插入 指示 r=0;t=0; y=1; while(1) { i=read_sms(uart_buff,para_temp,TEL_temp); //timer_S_cnt=0; if(i==0) { receive_count=0; timer_S_cnt=0; while(timer_S_cnt<60) { if(strsearch( "+CMTI:",uart_buff)) { break; } if(receive_count>=7) {break; } /* 硬件 必须是 PT2272-M4接收板D0-D3 可以连其中一个脚便可 流程分析 PT2272 D0-D3输出脚 在没有收到信号时为低电平, 收到控制信号后变高电来,延时1S左右 后 变回低电平 软件实现 先 用IO 检测电平 应先是低电平 进入等待控制 ,如果先是高电平,不应该理会, 因为没有 插入PT2272 时IO电平就是高电平 */ if(P25_BIT==1) //PT2272电平接入 { j=1; //当等于1才会发短信 P25_BIT=0; break; } if(P24_BIT==1) //PT2272电平接入 { j=1; //当等于1才会发短信 P24_BIT=0; break; } if(P22_BIT==1) //PT2272电平接入 { j=1; //当等于1才会发短信 P22_BIT=0; break; } j=0; } } else { //加入回复短信程序 Send_AT_Command(AT_CMGF1,uart_buff,0); Send_AT_Command(AT_CMGF1,uart_buff,0); timercount=0; while(timercount<20); //AT+CMGS= "13818120592" > Send_AT_Command(SMS_CMGS,uart_buff,TEL_temp); timercount=0; while(timercount<10); Send_AT_Command(CMGS_MUB,uart_buff,para_temp); timer_S_cnt=0; while(timer_S_cnt<10); j=0; CMGD_GSM(uart_buff,sms_num_tmp ); } if((j==1)) //有控制信号 接入 { Send_AT_Command(AT_CMGF1,uart_buff,0); timercount=0; while(timercount<10); //AT+CMGS= "15639183228" > strcpy(para_temp,"13462424976"); Send_AT_Command(SMS_CMGS,uart_buff,para_temp); strcpy(para_temp,"Please be careful"); strcat(para_temp,"\x1a"); Send_AT_Command(CMGS_MUB,uart_buff,para_temp); timer_S_cnt=0; while(timer_S_cnt<10); j=0; } } }
作品专业信息
设计、发明的目的和基本思路、创新点、技术关键和主要技术指标
- 目的:提高自己的动手能力,展现当代大学生创新能力风采,增强大学生的学习兴趣。 基本思路:综合运用单片机、传感器、太阳能、无线控制知识,实现家电智能控制。使用Protel软件设计电路板并完成制作与调试。 单片机控制、短信远程控制、太阳能给蓄电池充电、传感器控制、无线控制综合运用,实现基于单片机的复杂控制系统。C语言编程和功能执行的短信显示。
科学性、先进性
- (1)、采用单片机控制一系列系统,用单片机控制二极管发光间断显示标志。无线控制家电系统,使其运行自如。 (2)、将单片机与GTM900-C模块集成在一起,操作简便、方便,便于控制。 (3)、一个单片机控制多个系统,并用短信方式发送到手机,安全性高,可调性好,方便度增高,易于远程控制。 (4)、系统装有SIM卡,能随时随地控制家里电器的运行变状态。 (5)、模型采用红外传感器和红外对管传感器,具有防盗警报功能,为家居提供安全性。
获奖情况及鉴定结果
- 无
作品所处阶段
- 实验阶段
技术转让方式
- 无
作品可展示的形式
- 现场演示、图片、录像、样品
使用说明,技术特点和优势,适应范围,推广前景的技术性说明,市场分析,经济效益预测
- 作品使用方法:本作品为方便使用操作,附有两张SIM(手机)卡,其中模块接收卡(2)已安装在模块上,号码为(15239136372)。另一张 SIM卡(1)插入任意手机即可使用。 然后开启主板电源开关,并把接收端电源插头通电即可使用。发送START控制电灯工作,发送END关闭电灯。发送1START控制插座工作,发送1END 关闭插座工作,并回复设置的信息内容。(可同时控制,也可分开控制。手机信号差时请耐心等待大约30S)。 红外释热传感器感应到有人时会给设定的手机号码发信息提示,红外对管中间感应到物体时也给设定的手机号码发信息提示。 采用单片机控制一系列系统,用单片机控制二极管发光间断显示标志,智能防盗设置,无线控制家电系统,使其运行自如。 将单片机集成到一起,操作简便、方便,便于控制。一个单片机控制装置,可调性好。 运用所学知识,让智能家电控制走进人们生活中,让人们的生活更加惬意方便,展现用单片机控制的优点和带来的实用性为市场提供巨大的经济效益。
同类课题研究水平概述
- 当前GTM模块控制方式多样化,各种系统装置形式多样,比如带有全球定位系统,红外感应器,射频识别系统等。 附GTM模块是用手机数字信号传送方式: a、随着全球一体化,工业自动化和信息化进程的不断深入,手机和家电,防盗系统悄然来临。 b、智能控制模块是指具有对全面感知能力的物体及人的互联集合 c、GTM模块可以实现对各种物品(包括人)进行自能化识别、定位、跟踪、监控、成像和管理。 但归根结底还是利用GTM模块,传感器,无线控制和单片机控制,以及在此基础上的拓展和创新。