目录
具体实现功能
本设计由STM32单片机+LCD1602液晶显示电路+GPS模块+GSM模块+按键电路+LED灯电路+电源电路组成。
1、液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换显示。
2、通过GPS定位,获取当前的经纬度信息。
3、通过电位器可以调节液晶屏的清晰度。
4、具有手电筒功能,通过另外一个按键,按下,灯亮,再次按下,灯灭。
5、通过第3个按键来发送经纬度信息给指定手机,按下后,开始发短信。
6、短信处理过程有指示灯显示。
7、接受短信的手机号码可以主动获取经纬度信息,发送"GET"给设备手机号,设备会回复信息给发送者。
设计介绍
51单片机简介
51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
51系列单片机具有以下标准功能:
8k字节Flash,512字节RAM,
32位I/O口线,看门狗定时器,
内置4KB EEPROM,
MAX810复位电路,
三个16位定时器/计数器,
一个6向量2级中断结构,
全双工串行口。
另外, 51系列在空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到下一个中断或硬件复位为止。本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。
设计思路
文献研究法:搜集整理相关研究资料,阅读文献,为研究做准备;
调查研究法:通过调查、分析、具体实验等方法,发现相关存在问题和解决办法;
比较分析法:比较不同设计的具体原理,以及同一类传感器性能的区别,分析系统的研究现状与发展前景;
软硬件设计法:通过软硬件设计实现硬件,最后测试各项功能是否满足要求。
设计内容
原理图(AD19)
本系统原理图设计采用Altium Designer19,具体如图。
程序(Keil5)
本设计利用KEIL5软件实现程序设计,主函数如下:
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)
{
if((key_c==0)||(key_l==0))//按键按下
{
if(rekey == 0)
{
delay_ms(10);
if((key_c==0)||(key_l==0))//确认按键
{
if(key_c==0) //按键显示切换
{
rekey =1;
if(disNum==0){disNum=1;}
else {disNum=0;}
}
else if(key_l==0) //led灯开关处理
{ligh=!ligh;rekey=1;}
}
}
}
else
{rekey =0;}
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=\"+8618105140357\"\r\n",26); //测试号码
// UART_SendStr(USART1 ,"AT+CMGS=\"+8615296556420\"\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;//读取短信过程中
}
}
}
}
代码运行截图:
全部资料
全部资料包括程序(KEIL5)、AD原理图(AD19)、参考论文(仅供参考)、开题报告、任务书、实物图、讲解视频、软硬件设计框图等,具体如图,全网最全!!
资料获取:
https://docs.qq.com/doc/DSWNKa3FEUkZUVXVB