本人校赛做了一个双机通信加gps远程手机控制电机调速装置,现在发上来与大家分享。
所有资料51hei提供下载:
直流电机 互联网 调速系统程序.rar
(398.62 KB, 下载次数: 14)
一 硬件构成
1 l298n一个 stc12c60s2最小系统2个(与51最小系统基本相同 具体百度)
2 1.8寸tft屏(淘宝)
3 sim808模块
4 直流减速电机 霍尔传感器
5 1802电池三节 电池盒
6 其他 自己想
二 说明
1 tft屏幕档位初始值不可控 现初始值为8 原因未知 解决
2 tft屏档位及实时速度加减速度上下限未设置
3 调速范围实际0—60转每分钟 范围过小 由经费不足 电机调速范围有限所致
想改可以花钱买好电机
4 经纬度无法实时显示在tft上 能力知识所限 以后解决
5 程序还有不懂 待消化 程序臃肿 待优化
6 调速过程稍慢 远程调速与近程调速无法继承 例如 远程开启电机后近程无法关闭
只能单独远程或近程
7 远程开关启停信息代码会显示在档位上
8 实时转速无法发送给手机
gps远程调速部分程序:
本程序通过GPRS服务器控制LED的亮灭
使用单片机串口1与模块通信;接法如下
STC单片机 GPRS模块
P3.0(RXD1)->RXD
P3.1(TXD1)->TXD
GND ->GND
晶振选用11.0592MHz
1、1、板子上电后运行指示灯RUNING_LED会以一秒的频率闪烁;
2、通过单片机的串口1,可以监视模块的登录情况;
3、手机发送“onled”点亮LED;
4、手机发送“offled”熄灭LED;
5、单片机每隔10秒会向服务器发送心跳帧“OK”
6、通过串口助手监控单片机的串口1可以看到服务器发送的信息;
单片机源程序如下:
- /**********************************************************************************
- * 工程名 :GPRS
- * 描述 :测试GPRS连接,并且服务器可以通过GPRS控制LED
- * 实验平台:C51
- * 库版本 :
- * 软件功能说明
- 板子上电后运行指示灯RUNING_LED会以一秒的频率闪烁
- 服务器发送“onled”点亮LED;
- 服务器发送“offled”熄灭LED;
- 单片机每隔10秒会向服务器发送心跳帧“OK”
- **********************************************************************************/
- #include "config.h"
- #include "string.h"
- #include "delay.h"
- #include "uart.h"
- #define Automatic_Startup 1 //定义自启动 V1.2版本起有自启动功能
- #define Buf2_Max 200
- #define Buf1_Max 200 //串口2缓存长度
- /************* 本地常量声明 **************/
- xdata unsigned char content[100]="GPS positioning success";//发送短信内容
- static unsigned char *phone="\"18800435381\""; //短信接收方手机号
- //const u8 *string = "AT+CIPSTART=\"TCP\",\"116.31.51.113\",9015"; //IP登录服务器
- //sbit RUNING_LED = P1^1; //运行指示灯
- //sbit LED = P1^2; //控制指示灯
- char flag1=0;
- /************* 本地变量声明 **************/
- xdata u8 Uart1_Buf[Buf1_Max];
- xdata u8 Uart2_Buf[Buf2_Max];
- u8 Times=0,First_Int = 0,shijian=0;
- u8 key_buf=0;
- char *p2;
- //u16 Heartbeat=0;
- //u8 Time_count=0;
- bdata u8 Flag;//定时器标志位
- sbit Timer0_start =Flag^0; //定时器0延时启动计数器
- //sbit Heart_beat =Flag^1; //发送心跳帧标志位
- sbit KEY=P3^5;
- sbit RUNING_LED=P1^0;
- /************* 本地函数声明 **************/
- void GPIO_config(void);
- void Timer0Init(void);
- void CLR_Buf1(void);
- u8 Find(u8 *a);
- void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);
- //void Set_ATE0(void);
- //void Connect_Server(void);
- //void Rec_Server_Data(void);
- void Wait_CREG(void);
- //void Send_OK(void);
- void Set_Text_Mode(void); //设置短信为TEXT模式
- void Check_New_Message(void); //查询新短信
- /************* 外部函数和变量声明*****************/
- /*******************************************************************************
- * 函数名 : Uart1
- * 描述 : 串口1中断服务入口函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Uart1() interrupt 4
- {
- if (RI)
- {
- RI = 0; //清除RI位
- Uart1_Buf[First_Int] = SBUF; //将接收到的字符串存到缓存中
- First_Int++; //缓存指针向后移动
- if(First_Int > Buf1_Max) //如果缓存满,将缓存指针指向缓存的首地址
- {
- First_Int = 0;
- }
- }
- if (TI)
- {
- TI = 0; //清除TI位
- }
- }
- void Timer0Init(void) //20毫秒@11.0592MHz
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //
- TMOD |= 0x01; //设置定时器模式,16位定时器
- TL0 = 0x00; //设置定时器初值
- TH0 = 0xB8; //设置定时器初值
- TF0 = 0; //清TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
- void Timer0_ISR() interrupt 1
- {
- static u8 Time_count=0;
- TR0=0;//关定时器
- TL0 = 0x00; //重设定时器初值
- TH0 = 0xB8; //重设定时器初值
- Time_count++;
- if(Time_count>=50)//1秒运行指示灯闪烁
- {
- Time_count = 0;
- RUNING_LED =~RUNING_LED;
- }
- /*if(count_20ms) //20ms延时计数器
- count_20ms--;*/
- /*Heartbeat++;
- if(Heartbeat>500)//每10秒发送心跳帧
- {
- Heartbeat=0;
- Heart_beat=1;
- } */
- if(Timer0_start)
- Times++;
- if(Times > (50*shijian))
- {
- Timer0_start = 0;
- Times = 0;
- }
- TR0=1;//开定时器
- }
- void CLR_Buf1(void)
- {
- u16 k;
- for(k=0;k<Buf1_Max;k++) //将缓存内容清零
- {
- Uart1_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存储位置
- }
- void Wait_CREG(void)
- {
- u8 i;
- u8 k;
- i = 0;
- CLR_Buf1();
- while(i == 0)
- {
- CLR_Buf1();
- UART1_SendString("AT+CREG?");
- UART1_SendLR();
- delay_ms(250);
- for(k=0;k<Buf1_Max;k++)
- {
- if(Uart1_Buf[k] == ':')
- {
- if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5'))
- {
- i = 1;
- break;
- }
- }
- }
- }
- }
- u8 Find(u8 *a)
- {
- if(strstr(Uart1_Buf,a)!=NULL)
- return 1;
- else
- return 0;
- }
- /*******************************************************************************
- * 函数名 : Timer0_ISR
- * 描述 : 定时器0中断服务入口函数,20ms中断一次
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /*******************************************************************************
- * 函数名 : Timer0Init
- * 描述 : 定时器0初始化,20ms定时
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /*******************************************************************************
- * 函数名 : CLR_Buf1
- * 描述 : 清除串口2缓存数据
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /*******************************************************************************
- * 函数名 : Wait_CREG
- * 描述 : 等待模块注册成功
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /*******************************************************************************
- * 函数名 : Find
- * 描述 : 判断缓存中是否含有指定的字符串
- * 输入 :
- * 输出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- /*******************************************************************************
- * 函数名 : Second_AT_Command
- * 描述 : 发送AT指令函数
- * 输入 : 发送数据的指针、发送等待时间(单位:S)
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)
- {
- u8 i;
- u8 *c;
- c = b; //保存字符串地址到c
- CLR_Buf1();
- i = 0;
- while(i == 0)
- {
- if(!Find(a))
- {
- if(Timer0_start == 0)
- {
- b = c; //将字符串地址给b
- for (b; *b!='\0';b++)
- {
- UART1_SendData(*b);
- }
- UART1_SendLR();
- Times = 0;
- shijian = wait_time;
- Timer0_start = 1;
- }
- }
- else
- {
- i = 1;
- Timer0_start = 0;
- }
- }
- // CLR_Buf1();
- }
- /*******************************************************************************
- * 函数名 : Set_ATE0
- * 描述 : 取消回显
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /*void Set_ATE0(void)
- {
- Second_AT_Command("ATE0","OK",3); //取消回显
- }*/
- /*******************************************************************************
- * 函数名 : Connect_Server
- * 描述 : GPRS连接服务器函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /*void Connect_Server(void)
- {
- UART1_SendString("AT+CIPCLOSE=1"); //关闭连接
- delay_ms(5);
- Second_AT_Command("AT+CIPSHUT","SHUT OK",2); //关闭移动场景
- Second_AT_Command("AT+CGCLASS=\"B\"","OK",2);//设置GPRS移动台类别为B,支持包交换和数据交换
- Second_AT_Command("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",2);//设置PDP上下文,互联网接协议,接入点等信息
- Second_AT_Command("AT+CGATT=1","OK",2);//附着GPRS业务
- Second_AT_Command("AT+CIPCSGP=1,\"CMNET\"","OK",2);//设置为GPRS连接模式
- Second_AT_Command("AT+CIPHEAD=1","OK",2);//设置接收数据显示IP头(方便判断数据来源,仅在单路连接有效)
- Second_AT_Command(string,"OK",5);
- delay_ms(5);
- CLR_Buf1();
- } */
- /*******************************************************************************
- * 函数名 : Rec_Server_Data
- * 描述 : 接收服务器数据函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /*void Rec_Server_Data(void)
- {
- if(strstr(Uart1_Buf,"+IPD")!=NULL) //若缓存字符串中含有^SISR
- {
- Heartbeat=0; //清除心跳帧计数器
- Heart_beat=0;
- delay_ms(10);
- if(strstr(Uart1_Buf,"onled")!=NULL)
- {
- LED = 0;
- }
- else if(strstr(Uart1_Buf,"offled")!=NULL)
- {
- LED = 1;
- }
- CLR_Buf1();
- Heart_beat=1;//发送应答数据,告诉服务器收到数据
- }
- } */
- /*******************************************************************************
- * 函数名 : Send_OK
- * 描述 : 发送数据应答服务器的指令,该函数在有两功能
- 1:接收到服务器的数据后,应答服务器
- 2:服务器无下发数据时,每隔10秒发送一帧心跳,保持与服务器连接
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /*void Send_OK(void)
- {
- Second_AT_Command("AT+CIPSEND",">",2);
- Second_AT_Command("OK\32\0","SEND OK",8);; //回复OK
- delay_ms(10);
- CLR_Buf1();
- }
- */
- /*******************************************************************************
- * 函数名 : Set_Text_Mode
- * 描述 : 设置短信为TEXT文本模式
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Set_Text_Mode(void)
- {
- //unsigned char temp[25]="AT+CSCA=";
- Second_AT_Command("ATE0","OK",3); //取消回显
- Second_AT_Command("AT+CMGF=1","OK",3); //TEXT模式
- Second_AT_Command("AT+CSCS=\"GSM\"","OK",3);//所有操作都在SIM卡中进行
- Second_AT_Command("AT+CSMP=17,167,0,241","OK",3);
- Second_AT_Command("AT+CNMI=3,2,0,0,0","OK",3);
- Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3); //所有操作都在SIM卡中进行
-
- Second_AT_Command("AT+CSCA?","OK",3);
- // strcat(temp,SMS_Num); //字符串拼接函数(库函数)
- //Second_AT_Command(temp,"OK",3);//设置短信中心号
- }
- void Check_New_Message(void)
- {
- u8 temp=0;
- if(strstr(Uart1_Buf,"+CMT")!=NULL) //若缓存字符串中含有"+CMT"就表示有新的短信
- {
- delay_ms(3);//等待数据全部接收完成
- if(strstr(Uart1_Buf,"aa")!=NULL) ///短信识别短信内容 通过串口2发送给另一个单片机信息
- {
- UART2_SendString("11105");
- }
- else
- if(strstr(Uart1_Buf,"ab")!=NULL)
- {
- UART2_SendString("11106");
- }
- else
- if(strstr(Uart1_Buf,"ac")!=NULL)
- {
- UART2_SendString("11107");//前三位为速度开关信息
- }
- else
- if(strstr(Uart1_Buf,"ad")!=NULL)
- {
- UART2_SendString("11108");
- }
- else
- if(strstr(Uart1_Buf,"ae")!=NULL)
- {
- UART2_SendString("11109");
- }
- else
- if(strstr(Uart1_Buf,"af")!=NULL)
- {
- UART2_SendString("11110");
- }
- else
- if(strstr(Uart1_Buf,"ag")!=NULL)
- {
- UART2_SendString("11111");
- }
- else
- if(strstr(Uart1_Buf,"ah")!=NULL)
- {
- UART2_SendString("11112");
- }
- else
- if(strstr(Uart1_Buf,"ai")!=NULL)
- {
- UART2_SendString("11113");
- }
- else
- if(strstr(Uart1_Buf,"aj")!=NULL)
- {
- UART2_SendString("11114");
- }
- else
- if(strstr(Uart1_Buf,"ak")!=NULL)
- {
- UART2_SendString("11115");
- }
- else
- if(strstr(Uart1_Buf,"al")!=NULL)
- {
- UART2_SendString("11116");
- }
- else
- if(strstr(Uart1_Buf,"am")!=NULL)
- {
- UART2_SendString("11117");
- }
- else
- if(strstr(Uart1_Buf,"an")!=NULL)
- {
- UART2_SendString("11118");
- }
- if(strstr(Uart1_Buf,"ao")!=NULL)
- {
- UART2_SendString("11119");
- }
- else
- if(strstr(Uart1_Buf,"ap")!=NULL)
- {
- UART2_SendString("11120");
- }
- else
- if(strstr(Uart1_Buf,"aq")!=NULL)
- {
- UART2_SendString("11121");
- }
- else
- if(strstr(Uart1_Buf,"ar")!=NULL)
- {
- UART2_SendString("11122");
- }
- else
- if(strstr(Uart1_Buf,"as")!=NULL)
- {
- UART2_SendString("11123");
- }
- else
- if(strstr(Uart1_Buf,"at")!=NULL)
- {
- UART2_SendString("11124");
- }
- else
- if(strstr(Uart1_Buf,"au")!=NULL)
- {
- UART2_SendString("11125");
- }
- else
- if(strstr(Uart1_Buf,"av")!=NULL)
- {
- UART2_SendString("11126");
- }
- else
- if(strstr(Uart1_Buf,"aw")!=NULL)
- {
- UART2_SendString("11127");
- }
- else
- if(strstr(Uart1_Buf,"ax")!=NULL)
- {
- UART2_SendString("11128");
- }
- else
- if(strstr(Uart1_Buf,"ay")!=NULL)
- {
- UART2_SendString("11129");
- }
- else
- if(strstr(Uart1_Buf,"az")!=NULL)
- {
- UART2_SendString("11130");
- }
- else
- if(strstr(Uart1_Buf,"ba")!=NULL)
- {
- UART2_SendString("11131");
- }
- else
- // *****************************************************************//
- if(strstr(Uart1_Buf,"bb")!=NULL)
- {
- UART2_SendString("11132");
- }
- else
- if(strstr(Uart1_Buf,"bc")!=NULL)
- {
- UART2_SendString("11133");
- }
- else
- if(strstr(Uart1_Buf,"bd")!=NULL)
- {
- UART2_SendString("11134");
- }
- else
- if(strstr(Uart1_Buf,"be")!=NULL)
- {
- UART2_SendString("11135");
- }
- else
- if(strstr(Uart1_Buf,"bf")!=NULL)
- {
- UART2_SendString("11136");
- }
- else
- if(strstr(Uart1_Buf,"bg")!=NULL)
- {
- UART2_SendString("11137");
- }
- else
- if(strstr(Uart1_Buf,"bh")!=NULL)
- {
- UART2_SendString("11138");
- }
- else
- if(strstr(Uart1_Buf,"bi")!=NULL)
- {
- UART2_SendString("11139");
- }
- else
- if(strstr(Uart1_Buf,"bj")!=NULL)
- {
- UART2_SendString("11140");
- }
- else
- if(strstr(Uart1_Buf,"bk")!=NULL)
- {
- UART2_SendString("11141");
- }
- else
- if(strstr(Uart1_Buf,"bl")!=NULL)
- {
- UART2_SendString("11142");
- }
- else
- if(strstr(Uart1_Buf,"bm")!=NULL)
- {
- UART2_SendString("11143");
- }
- else
- if(strstr(Uart1_Buf,"bn")!=NULL)
- {
- UART2_SendString("11144");
- }
- else
- if(strstr(Uart1_Buf,"bo")!=NULL)
- {
- UART2_SendString("11145");
- }
- else
- if(strstr(Uart1_Buf,"bp")!=NULL)
- {
- UART2_SendString("11146");
- }
- else
- if(strstr(Uart1_Buf,"bq")!=NULL)
- {
- UART2_SendString("11147");
- }
- else
- if(strstr(Uart1_Buf,"br")!=NULL)
- {
- UART2_SendString("11148");
- }
- else
- if(strstr(Uart1_Buf,"bs")!=NULL)
- {
- UART2_SendString("11149");
- }
- else
- if(strstr(Uart1_Buf,"bt")!=NULL)
- {
- UART2_SendString("11150");
- }
- else
- if(strstr(Uart1_Buf,"bu")!=NULL)
- {
- UART2_SendString("11151");
- }
- else
- if(strstr(Uart1_Buf,"bv")!=NULL)
- {
- UART2_SendString("11152");
- }
- else
- if(strstr(Uart1_Buf,"bw")!=NULL)
- {
- UART2_SendString("11153");
- }
- else
- if(strstr(Uart1_Buf,"bx")!=NULL)
- {
- UART2_SendString("11154");
- }else
- if(strstr(Uart1_Buf,"by")!=NULL)
- {
- UART2_SendString("11155");
- }else
- if(strstr(Uart1_Buf,"bz")!=NULL)
- {
- UART2_SendString("11156");
- } else
- if(strstr(Uart1_Buf,"ca")!=NULL)
- {
- UART2_SendString("11157");
- }else
- if(strstr(Uart1_Buf,"cb")!=NULL)
- {
- UART2_SendString("11158");
- }else
- if(strstr(Uart1_Buf,"cc")!=NULL)
- {
- UART2_SendString("11159");
- }else
- if(strstr(Uart1_Buf,"cd")!=NULL)
- {
- UART2_SendString("11160");
- }else
- if(strstr(Uart1_Buf,"ce")!=NULL)
- {
- UART2_SendString("11161");
- }else
- if(strstr(Uart1_Buf,"cf")!=NULL)
- {
- UART2_SendString("11162");
- }else
- if(strstr(Uart1_Buf,"cg")!=NULL)
- {
- UART2_SendString("11163");
- }else
- if(strstr(Uart1_Buf,"G")!=NULL)
- {
- UART2_SendString("004");
- }else
- if(strstr(Uart1_Buf,"Z")!=NULL)
- {
- UART2_SendString("002");
- }else
- if(strstr(Uart1_Buf,"F")!=NULL)
- {
- UART2_SendString("003");
- }
- CLR_Buf1();
- Second_AT_Command("AT+CMGD=1,4","OK",3);//删除短信
- }
- }
- /*******************************************************************************
- * 函数名 : Send_Text_Sms
- * 描述 : 发送TEXT文本短信
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Send_Text_Sms(void)
- {
- unsigned char temp[50]="AT+CMGS=";
-
- strcat(temp,phone); //字符串拼接函数(库函数)
- Second_AT_Command(temp,">",3); //等待接收到“>”才发送短信内容
- UART1_SendString(content); //发送短信内容
- UART1_SendData(0X1A); //发送结束符
- }
- void main(void)
- {
- Timer0Init();
- EA=1; //开总中断
- Uart1Init();
- Uart2Init();
- Wait_CREG(); //查询等待模块注册成功
- Set_Text_Mode();//设置短信为TEXT模式
- Second_AT_Command("AT+CGNSPWR=1\r\n","OK",2); //打开GPS电源
- /**************************************************************/
-
- Send_Text_Sms();//发送一条短消息
-
- /*************************************************************/
- while(1)
- {
- Check_New_Message();
- // if(!KEY)delay_ms(10);//按键松开
- // {
-
- // if(KEY==0)//按键按下
- // {
- // UART2_SendString("16\r\n");
- if(Find("CRING")|Find("RING")) //有新来电
- {
- CLR_Buf1();
- UART1_SendString("ATH\r\n");//挂断来电
- flag1=1;
- }
- delay_ms(250);
- if(flag1)
- {
- flag1=0;
- content[0]=0;//添加字符串结束符
- strcat(content,"GPS data:");
- Second_AT_Command("AT+CGNSINF\r\n","OK",3);
- if((p2=(char*)strstr(Uart1_Buf,"OK")),(p2!=NULL))//寻找结束符
- {
- *p2=0;//添加结束符
- p2=strtok(Uart1_Buf,",");
- p2=(char*)strtok(NULL,",");
- p2=(char*)strtok(NULL,",");
- p2=(char*)strtok(NULL,",");
- strcat(content,"latitude:");
- strcat(content,(char *)p2);
- p2=(char*)strtok(NULL,",");
- strcat(content,"longitude:");
- strcat(content,(char *)p2);
- p2=(char*)strtok(NULL,",");
- strcat(content,"elevation:");
- strcat(content,(char *)p2);
- Send_Text_Sms();//发送定位信息
- delay_ms(1000);
- CLR_Buf1();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
|