基于-STM32-单片机的太阳能电池测试软件-源代码_第1页
基于-STM32-单片机的太阳能电池测试软件-源代码_第2页
基于-STM32-单片机的太阳能电池测试软件-源代码_第3页
基于-STM32-单片机的太阳能电池测试软件-源代码_第4页
基于-STM32-单片机的太阳能电池测试软件-源代码_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* 包含头文件 -*/#include stm32f1xx_hal.h#include stm32f1xx_it.h#include usart/bsp_debug_usart.h#include led/bsp_led.h#include key/bsp_key.h#include usart/bsp_usartx.h#include gsm/bsp_gsm.h#include #include spiflash/bsp_spiflash.h/* 私有类型定义 -*/* 私有宏定义 -*/#define GSM_PHONE_NUM 112/* 私有变量 -*/static uint8_t timecount=0;char testbuff100;uint8_t len;char * rebuff;/* 扩展变量 -*/* 私有函数原形 -*/* 函数体 -*/* * 函数功能: 系统时钟配置 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */void SystemClock_Config(void) RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; / 外部晶振,8MHz RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; / 9倍频,得到72MHz主时钟 HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; / 系统时钟:72MHz RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; / AHB时钟:72MHz RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; / APB1时钟:36MHz RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; / APB2时钟:72MHz HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); / HAL_RCC_GetHCLKFreq()/1000 1ms中断一次/ HAL_RCC_GetHCLKFreq()/100000 10us中断一次/ HAL_RCC_GetHCLKFreq()/1000000 1us中断一次 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); / 配置并启动系统滴答定时器 /* 系统滴答定时器时钟源 */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* 系统滴答定时器中断优先级配置 */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);/* * 函数功能: 简单的延时函数 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */static uint8_t timeout_40s(void) static uint16_t timeout_count; GSM_DELAY(10); timeout_count+; if(timeout_count4000) return GSM_TRUE; else return GSM_FALSE;/* * 函数功能: 主函数. * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */int main(void) char num20=0; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 板载LED初始化 */ LED_GPIO_Init(); /* 板子按键初始化 */ KEY_GPIO_Init(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); /* 初始化串行flash */ MX_SPIFlash_Init(); printf(GSM模块拨号例程n); GSM_USARTx_Init(); /* 检测模块响应是否正常 */ while(GSM_init()!= GSM_TRUE) printf(n模块响应测试不正常!n); printf(若模块响应测试一直不正常,请检查模块的连接或是否已开启电源开关n); GSM_DELAY(1000); GSM_tx_printf(ATL6r);/设置监听扬声器音量 GSM_DELAY(200); GSM_tx_printf(AT+CMIC=0,10r); / 设置麦克风输入增益 GSM_DELAY(200); GSM_tx_printf(AT+SIDET=0,10r);/ 设置侧音增益级别 GSM_DELAY(200); GSM_tx_printf(AT+CLVL=60r);/ 设置接收器音量级别 GSM_DELAY(200); GSM_tx_printf(AT+CRSL=60r);/设置来电音量级别 printf(n通过了模块响应测试,5秒后开始拨号测试.n); /* 延时5秒再发送命令到模块 */ GSM_DELAY(5000); /拨打电话 GSM_call(GSM_PHONE_NUM); /拨打112电话测试 rebuff = GSM_waitask(0); if(strstr(rebuff,OK) != NULL) /响应OK,表示模块正常接收到命令 printf(n正在呼叫n); GSM_CLEAN_RX(); /清除接收缓冲区 rebuff = GSM_waitask(timeout_40s); /重新等待消息 if(strstr(rebuff,NO CARRIER) != NULL) /响应NO CARRIER,通话结束 printf(通话结束n); else if(strstr(rebuff,NO ANSWER) != NULL) /响应NO ANSWER,无人接听 printf(你拨打的电话暂时无人接听,请稍后再拨n); else printf(对方电话忙,请稍后再拨n); printf(n进行接电话测试:使用另外一台手机拨打GSM模块手机号码n); GSM_TX(AT+CLIP=1r);GSM_CLEAN_RX(); / 清除接收缓冲区 /* 无限循环 */ while(1)if(timecount=100)if(IsRing(num)= GSM_TRUE)printf(Ringing:nFrom:%sn请按下KEY2接听或者按下KEY1挂断nr,num);timecount=0;if(KEY2_StateRead() = KEY_DOWN)GSM_HANGON();if(KEY1_StateRead() = KEY_DOWN)GSM_HANGOFF();timecount+;GSM_DELAY(10);/* 包含头文件 -*/#include #include #include #include usart/bsp_debug_usart.h#include usart/bsp_usartx.h#include GSM/bsp_GSM.h/* 私有类型定义 -*/* 私有宏定义 -*/* 私有变量 -*/static uint8_t MaxMessAdd=50;uint8_t aRxBuffer;/* 扩展变量 -*/extern uint16_t ff_convert(uint16_tsrc,uint32_tdir);/* 私有函数原形 -*/* 函数体 -*/* * 函数功能: 向GSM发送一个命令,并验证返回值是否正确 * 输入参数: cmd:命令 * replay:期待返回值 * waittime:等待时间 * 返 回 值: GSM_TRUE:成功 * GSM_FALSE:失败 * 说 明:无 */uint8_t GSM_cmd(char *cmd, char *reply,uint32_t waittime ) GSM_CLEAN_RX(); /清空了接收缓冲区数据 GSM_TX(cmd); /发送命令 if(reply = 0) /不需要接收数据 return GSM_TRUE; GSM_DELAY(waittime); /延时 return GSM_cmd_check(reply); /对接收数据进行处理/* * 函数功能: 验证命令的返回值是否正确 * 输入参数: replay:期待返回值 * 返 回 值: GSM_TRUE:成功 * GSM_FALSE:失败 * 说 明:无 */uint8_t GSM_cmd_check(char *reply) uint8_t len; uint8_t n; uint8_t off; char *redata; redata = GSM_RX(len); /接收数据 n = 0; off = 0; while(n + off)0x7F) return GSM_FALSE; str+; return GSM_TRUE;/* * 函数功能: GBK编码转unicode编码 * 输入参数: ucs2:Unicode编码缓冲区 * gbk:GBK编码缓冲区 * 返 回 值: 无 * 说 明:无 */void GSM_gbk2ucs2(char *ucs2,char *gbk) uint16_t tmp; while(*gbk) if(*gbk&0xFF) 4; *hex = numhex ch & 0x0F;/* * 函数功能: GBK编码转unicode编码16进制字符串 * 输入参数: ucs2:Unicode编码16进制字符串缓冲区 * gbk:GBK编码缓冲区 * 返 回 值: 无 * 说 明:无 */void GSM_gbk2ucs2hex(char * ucs2hex,char * gbk) uint16_t tmp; while(*gbk) if(*gbk&0xFF) 8); ucs2hex+=2; GSM_char2hex(ucs2hex,(char)tmp); ucs2hex+=2; gbk+=2; *ucs2hex=0;/* * 函数功能: 发送短信(支持中英文,中文为GBK码) * 输入参数: num:对方手机号码 * smstext:短信内容 * 返 回 值: 无 * 说 明:无 */void GSM_sms(char *num,char *smstext) char ucsbuff160; char end2 = 0x1A,0x00; GSM_CLEAN_RX(); /清空了接收缓冲区数据 if(IsASSIC(smstext)=GSM_TRUE) /英文 GSM_tx_printf(AT+CSCS=GSMr); /GSM字符集 GSM_DELAY(100); GSM_tx_printf(AT+CMGF=1r); /文本模式 GSM_DELAY(100); GSM_tx_printf(AT+CMGS=%sr,num); /电话号码 GSM_DELAY(100); GSM_tx_printf(%s,smstext); /短信内容 else /中文 GSM_tx_printf(AT+CSCS=UCS2r); /UCS2字符集 GSM_DELAY(100); GSM_tx_printf(AT+CMGF=1r); /文本模式 GSM_DELAY(100); GSM_tx_printf(AT+CSMP=17,167,0,8r); / GSM_DELAY(100); GSM_gbk2ucs2hex(ucsbuff,num); GSM_tx_printf(AT+CMGS=%sr,ucsbuff); /UCS2的电话号码(需要转成 ucs2码) GSM_DELAY(100); GSM_gbk2ucs2hex(ucsbuff,smstext); GSM_tx_printf(%s,ucsbuff); /UCS2的文本内容(需要转成 ucs2码) GSM_DELAY(1); / GSM_tx_printf(%c,0x1A); GSM_tx_printf(%s,end);/while(USART2-SR&0X40)=0);/等待上一次数据发送完成 /GSM_USARTx-DR=(u32)0x1A;/发送十六进制数:0X1A,信息结束符号/* * 函数功能: 查询是否接收到新短信 * 输入参数: 无 * 返 回 值: 0:无新短信 * 非0:新短信地址 * 说 明:无 */uint8_t IsReceiveMS(void)char address3=0;uint8_t addressnum=0;char *redata; uint8_t len;/*- 查询是否有新短信并提取存储位置 -*/ if(GSM_cmd_check(+CMTI:) return 0; redata = GSM_RX(len); /接收数据/printf(CMTI:redata:%s,len=%dn,redata,len); if(len = 0) return 0; /第一个逗号后面的数据为:”短信存储地址“ while(*redata != ,) len-; if(len=0) return 0; redata+; redata+=1;/去掉;,address0= *redata+;address1= *redata+;address2= *redata+;if(address2=0)&(address2=0)&(address1%dn,address0,address1,address2,addressnum); return addressnum;/* * 函数功能: 读取短信内容 * 输入参数: messadd:短信地址 * num:保存发件人号码(unicode编码格式的字符串) * str:保存短信内容(unicode编码格式的字符串) * 返 回 值: 0:失败 * 1:成功读取到短信,该短信未读(此处是第一次读,读完后会自动被标准为已读) * 2:成功读取到短信,该短信已读 * 说 明:无 */uint8_t readmessage(uint8_t messadd,char *num,char *str)char *redata,cmd20=0; uint8_t len;char result=0;GSM_CLEAN_RX(); /清空了接收缓冲区数据if(messaddMaxMessAdd)return 0;/*- 读取短信内容 -*/sprintf(cmd,AT+CMGR=%dr,messadd);if(GSM_cmd(cmd,+CMGR:,500) != GSM_TRUE)return 0;redata = GSM_RX(len); /接收数据if(len = 0)return 0;/printf(CMGR:redata:%snlen=%dn,redata,len);if(strstr(redata,UNREAD)=0)result=2;elseresult=1;/第一个逗号后面的数据为:”发件人号码“while(*redata != ,)len-;if(len=0)return 0;redata+;redata+=2;/去掉,while(*redata != )*num+ = *redata+;len-;*num = 0; /字符串结尾需要清0while(*redata != +)len-;if(len=0)return 0;redata+;redata+=6;/去掉+32rwhile(*redata != r)*str+ = *redata+;*str = 0; /字符串结尾需要清0/printf(CMGR:result:%dn,result);return result;/* * 函数功能: unicode编码16进制字符串转GBK编码 * 输入参数: hexuni:Unicode编码16进制字符串缓冲区 * chgbk:GBK编码缓冲区 * 返 回 值: GSM_TRUE:成功 * GSM_FALSE:失败 * 说 明:无 */uint8_t hexuni2gbk(char *hexuni,char *chgbk)uint8_t len=0,i=0;uint16_t wgbk=0;uint16_t tmp=0;uint8_t unitmp4=0;GSM_CLEAN_RX();len=strlen(hexuni);if(!len)return GSM_FALSE;/printf(hexuni:%s:len:%dn,hexuni,len);for(i=0;i=0x41)unitmp0=hexuni4*i-0x41+10;elseunitmp0=hexuni4*i-0x30;if(hexuni4*i+1=0x41)unitmp1=hexuni4*i+1-0x41+10;elseunitmp1=hexuni4*i+1-0x30;if(hexuni4*i+2=0x41)unitmp2=hexuni4*i+2-0x41+10;elseunitmp2=hexuni4*i+2-0x30;if(hexuni4*i+3=0x41)unitmp3=hexuni4*i+3-0x41+10;elseunitmp3=hexuni4*i+3-0x30;tmp=unitmp0*0x1000+unitmp1*0x100+unitmp2*16+unitmp3;wgbk=ff_convert(tmp,0);/printf(tmp:%X-wgbk:%Xn,tmp,wgbk);if(wgbk8);chgbk+;*chgbk=(char)wgbk;chgbk+;*chgbk=0;return GSM_TRUE;/*- GPRS 功能 -*/* * 函数功能: GPRS功能环境初始化 * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */void GSM_gprs_init(void) GSM_tx_printf(AT+CGCLASS=Br); /设置移动台类别为B GSM_DELAY(100); GSM_tx_printf(AT+CGDCONT=1,IP,CMNETr); /PDP上下文标识1,互联网协议,接入点名称:CMNET GSM_DELAY(100); GSM_tx_printf(AT+CGATT=1r); /附着 GPRS 网络 GSM_DELAY(100); GSM_tx_printf(AT+CIPCSGP=1,CMNETr); /设置为 GPRS 连接模式 ,接入点为CMNETGSM_DELAY(100);/* * 函数功能: GPRS功能:TCP通信协议配置 * 输入参数: localport:本地端口 * serverip:远端服务器IP地址 * serverport:远端服务器端口 * 返 回 值: GSM_TRUE:成功 * GSM_FALSE:失败 * 说 明:无 */uint8_t GSM_gprs_tcp_link(char *localport,char * serverip,char * serverport) char *redata;GSM_tx_printf(AT+CLPORT=TCP,%sr,localport); /获取本地端口 GSM_DELAY(100); GSM_CLEAN_RX(); /设置服务器IP和端口 GSM_tx_printf(AT+CIPSTART=TCP,%s,%sr,serverip,serverport);redata=GSM_waitask(0);GSM_CLEAN_RX();redata=GSM_waitask(0);if(strstr(redata,OK) = NULL)&(strstr(redata,ALREADY)=NULL) return GSM_FALSE; return GSM_TRUE;/* * 函数功能: GPRS功能:UDP通信协议配置 * 输入参数: localport:本地端口 * serverip:远端服务器IP地址 * serverport:远端服务器端口 * 返 回 值: GSM_TRUE:成功 * GSM_FALSE:失败 * 说 明:无 */uint8_t GSM_gprs_udp_link(char *localport,char * serverip,char * serverport)char *redata; GSM_tx_printf(AT+CLPORT=UDP,%sr,localport); /获取本地端口 GSM_DELAY(100);GSM_CLEAN_RX(); GSM_tx_printf(AT+CIPSTART=UDP,%s,%sr,serverip,serverport); /设置服务器IP和端口redata=GSM_waitask(0);GSM_CLEAN_RX();redata=GSM_waitask(0);if(strstr(redata,OK) = NULL) return GSM_FALSE; return GSM_TRUE;/* * 函数功能: GPRS功能:数据发送 * 输入参数: str:数据缓冲区 * 返 回 值: GSM_TRUE:成功 * GSM_FALSE:失败 * 说 明:无 */uint8_t GSM_gprs_send(con

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论