概述
硬件方案
本设计介绍了基于单片机的智能手表定位系统的设计与实现,控制系统采用STM32核心芯片,外围电路含有液晶显示器LCD1602,GPS,GSM电路,按键和LED灯电路组成,通过LCD模块能够将实时时间以及定位经纬度显示出来。系统可以通过GSM模块直接发送定位信息到指定的手机用户上。
整体电路主要由STM32单片机核心板,LCD1602液晶显示电路,GPS模块,GSM模块,按键电路,LED灯电路及电源电路组成;原理图如图:
设计功能
- 液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换显示。
- 通过GPS定位,获取当前的经纬度信息(可以通过浏览器查看具体位置)。
- 通过电位器可以调节液晶屏的清晰度。
- 具有手电筒功能,通过另外一个按键,按下,灯亮,再次按下,灯灭。
- 通过第3个按键来发送经纬度信息给指定手机,按下后,开始发短信;
- 短信处理过程有指示灯显示;
- 接受短信的手机号码可以主动获取经纬度信息,发送"GET"给设备手机号,设备会回复信息给发送者.
软件设计
主程序
int main(void)
{
unsigned char i ;
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化为115200
uart2_init(9600) ;
TIM3_Int_Init(499,7199);//50ms
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
led_gsm =0 ; ligh =1;//上电初始化
Lcd_GPIO_init(); //初始化lcd 接口
Lcd_Init(); //初始化函数
delay_ms(200);
ligh =0;//关闭led
Lcd_Puts(0,0,(u8 *)Lin0_No);//显示
Lcd_Puts(0,1,(u8 *)Lin1_Ea);//显示
i=60;
while(i--) delay_ms(100);//延时
UART_SendStr(USART1 ,"AT+CMGF=1rn",11); //设置字符集
i=7;
while(i--) delay_ms(100);//延时
UART_SendStr(USART1 ,"AT+CSCS="GSM"rn",15);//设置文本
i=7;
while(i--) delay_ms(100);//延时
UART_SendStr(USART1 , "AT+CMGDA="DEL ALL"rn",20); //删除所有短信
for(i=0;i<5;i++)
delay_ms(100); //延时有助于稳定
led_gsm = 1;
while(1)
{
key_scan();
if(disFlag ==1) //定时更新显示
{
disFlag =0;
if(sysmode_GPS==1) //gps有效
{
// sysmode_GPS=0;
dealGps();
if(disNum==0)
{
Lcd_Puts(0,0,(u8 *)Lin0_No);//显示
Lcd_Puts(0,1,(u8 *)Lin1_Ea);//显示
}
else
{
Lcd_Puts(0,0,(u8 *)dis0);//显示
Lcd_Puts(0,1,(u8 *)dis1);//显示
}
}
}
if(key_m==0) //发送按键按下
{
delay_ms(10);
if(key_m==0)
{
led_gsm = 0;
UART_SendStr(USART1 ,"AT+CMGF=1rn",11); //设置字符集
i=3;
while(i--) delay_ms(100);//延时
UART_SendStr(USART1 ,"AT+CSCS="GSM"rn",15);//设置文本
i=3;
while(i--) delay_ms(100);//延时
UART_SendStr(USART1 ,"AT+CMGS="+8618xxxxxxxxx"rn",26); //测试号码
i=3;
while(i--) delay_ms(100);//延时
if(sysmode_GPS==1) //gps有效
{
sysmode_GPS=0;
dealGps();
UART_SendStr(USART1 ,Lin0_No,12); //发送纬度
UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度
}
else
{
UART_SendStr(USART1 ,"gps linking...",14); //gps无信号
}
delay_ms(200);
UART_SendStr(USART1 ,( char *)Crtl_Z, 1); //发送
i=30;
while(i--) delay_ms(100);//延时发送
led_gsm = 1;
}
}
if(readFlag==1) //读取短信息标志
{
readFlag=0; //读取标志清零
readMesIng = 1;//读取短信过程中
timeCount++ ;
if((stepNum == 0)&&(timeCount>=4)) //定时读取短信
{
UART_SendStr(USART1 , "AT+CMGF=1rn",11); //设置字符集
timeCount = 0;//延时设置量
stepNum++;//进入操作过程1
}
else if((stepNum == 1)&&(timeCount>=4)) //定时读取短信
{
for(i=0;i<SIZEBUF;i++)
{
timebuf[i]='0'; //清空timebuf
}
UART_SendStr(USART1 ,"AT+CMGR=1rn",11);
timeCount = 0;//延时设置量
stepNum++;//进入操作过程1
}
else if((stepNum == 2)&&(timeCount >= 4)) //定时读取短信
{
rebackMesFlag=INIT;
for(i=0;i<(SIZEBUF-3);i++)
{
if((timebuf[i]=='G')&&(timebuf[i+1]=='E')&&(timebuf[i+2]=='T')) //查询是否接收到GET
{
rebackMesFlag=OPEN_01; //状态标识打开
break ;
}
if((timebuf[i]=='+')&&(timebuf[i+1]=='8')&&(timebuf[i+2]=='6'))//查询短信息中的号码
{
led_gsm = 0;
rebackMesFlag = SOMEONE; //有人发送短信
AT_CMGS[9]=timebuf[i+0]; //提取号码
AT_CMGS[10]=timebuf[i+1];
AT_CMGS[11]=timebuf[i+2];
AT_CMGS[12]=timebuf[i+3];
AT_CMGS[13]=timebuf[i+4];
AT_CMGS[14]=timebuf[i+5];
AT_CMGS[15]=timebuf[i+6];
AT_CMGS[16]=timebuf[i+7];
AT_CMGS[17]=timebuf[i+8];
AT_CMGS[18]=timebuf[i+9];
AT_CMGS[19]=timebuf[i+10];
AT_CMGS[20]=timebuf[i+11];
AT_CMGS[21]=timebuf[i+12];
AT_CMGS[22]=timebuf[i+13];
}
}
AT_CMGS[23]='"'; //整理字符串
AT_CMGS[24]=0x0d;
AT_CMGS[25]=0x0a;
if(rebackMesFlag != INIT)
{
UART_SendStr(USART1 ,"AT+CMGDA="DEL ALL"rn",20);//删除所有短信
for(i=0;i<5;i++)
delay_ms(100); //延时有助于稳定
UART_SendStr(USART1 ,"AT+CMGF=1rn",11); //设置字符集
for(i=0;i<3;i++)
delay_ms(100); //延时有助于稳定
UART_SendStr(USART1 ,"AT+CSCS="GSM"rn",15); //设置干什么、
for(i=0;i<3;i++)
delay_ms(100); //延时有助于稳定
UART_SendStr(USART1 , ( char *)AT_CMGS,26);//准备发送短信
for(i=0;i<2;i++)
delay_ms(100); //延时有助于稳定
if(rebackMesFlag==OPEN_01)
{
UART_SendStr(USART1 ,Lin0_No,12); //发送纬度
UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度
}
else
{
UART_SendStr(USART1 ,"CMD_ERR",7); //发送短信息命令错误
}
delay_ms(100);
UART_SendStr(USART1 ,(char *)Crtl_Z, 1); //发送
for(i=0;i<20;i++)
delay_ms(100); //延时有助于稳定
}
timeCount = 0;//延时设置量
stepNum++ ;//进入操作过程1
}
else if((stepNum == 3)&&(timeCount >= 4)) //定时读取短信
{
clearMesFlag++;
if(clearMesFlag>10)
{
clearMesFlag = 0;
UART_SendStr(USART1 ,"AT+CMGDA="DEL ALL"rn",20);//删除所有短信
}
timeCount = 0;//延时设置量
stepNum = 0 ;//进入操作过程1
led_gsm=1; //关闭指示灯
readMesIng = 0;//读取短信过程中
}
}
}
}
资料链接:https://pan.baidu.com/s/1for_ky8Pn21kkzPMUgef6g?pwd=zadp
提取码:zadp
最后
以上就是忧虑水杯为你收集整理的基于STM32单片机的智能手表设计的全部内容,希望文章能够帮你解决基于STM32单片机的智能手表设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复