基于STM32单片机的智能手表设计

硬件方案

        本设计介绍了基于单片机的智能手表定位系统的设计与实现,控制系统采用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=1\r\n",11); //设置字符集
    i=7;
    while(i--) delay_ms(100);//延时
    UART_SendStr(USART1 ,"AT+CSCS=\"GSM\"\r\n",15);//设置文本
    i=7;
    while(i--) delay_ms(100);//延时

    UART_SendStr(USART1 , "AT+CMGDA=\"DEL ALL\"\r\n",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=1\r\n",11); //设置字符集
                i=3;
                while(i--) delay_ms(100);//延时
                UART_SendStr(USART1 ,"AT+CSCS=\"GSM\"\r\n",15);//设置文本
                i=3;
                while(i--) delay_ms(100);//延时

                UART_SendStr(USART1 ,"AT+CMGS=\"+8618xxxxxxxxx\"\r\n",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=1\r\n",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=1\r\n",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\"\r\n",20);//删除所有短信                                                            
                    for(i=0;i<5;i++)
                    delay_ms(100);          //延时有助于稳定
                            
                    UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11);   //设置字符集
                    for(i=0;i<3;i++)
                    delay_ms(100);          //延时有助于稳定
                
                    UART_SendStr(USART1 ,"AT+CSCS=\"GSM\"\r\n",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\"\r\n",20);//删除所有短信
                }
                timeCount = 0;//延时设置量    
                stepNum = 0    ;//进入操作过程1                            
                led_gsm=1;      //关闭指示灯
                readMesIng = 0;//读取短信过程中
            }                                            
         }
                    
    }                                                
}

资料链接:https://pan.baidu.com/s/1for_ky8Pn21kkzPMUgef6g?pwd=zadp 
提取码:zadp

  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值