标题:
单片机gps远程手机控制直流电机调速系统设计源码
[打印本页]
作者:
a135587
时间:
2018-1-24 17:46
标题:
单片机gps远程手机控制直流电机调速系统设计源码
本人校赛做了一个双机通信加gps远程手机控制电机调速装置,现在发上来与大家分享。
0.png
(43.72 KB, 下载次数: 48)
下载附件
2018-1-25 01:01 上传
所有资料51hei提供下载:
直流电机 互联网 调速系统程序.rar
(398.62 KB, 下载次数: 14)
2018-1-24 17:45 上传
点击文件名下载附件
硬件组成和bug有说明 有兴趣的可以修改
下载积分: 黑币 -5
一 硬件构成
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黑下载附件…………
复制代码
0.png
(15.92 KB, 下载次数: 35)
下载附件
2018-1-25 01:07 上传
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1