找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5498|回复: 0
打印 上一主题 下一主题
收起左侧

stm32驱动NBlot模块程序实例

[复制链接]
跳转到指定楼层
楼主
ID:404189 发表于 2018-9-29 21:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NBlot+stm32单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "USART.h"
  3. #include "dht11.h"
  4. #include "delay.h"
  5. #include "string.h"


  6. char error[6]={"ERROR"};
  7. u8 num1,num2;
  8. int jieshou(u16 i)
  9. {
  10.         u16 t,n=0;
  11.         while(1)
  12.         {
  13.     if(flag)
  14.                 {               
  15.                         if((n==0)&&(strstr(USART_RX_BUF,error)!=NULL))
  16.       {
  17.                             flag=0;
  18.                             length=0;
  19.                             return 1;
  20.                         }           
  21.                         for(t=0;t<length;t++)
  22.                         {
  23.                                 USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
  24.                                 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  25.                         }
  26.                         flag=0;
  27.                         length=0;
  28.                         n++;
  29.                 }
  30.                 if(n==i) return 0;
  31.         }
  32. }
  33. void delay(int x)
  34. {
  35.         int y,z;
  36.         for(z=0;z<x;z++)
  37.           for(y=0;y<7000;y++);
  38. }

  39. //extern uint8_t ucTemp1,ucTemp2;
  40. int main()
  41. {
  42.         int h=0;
  43.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  44.         delay_init();
  45.         uart_init(115200);         //串口初始化为115200
  46.         usart2_init(9600);
  47.         DHT11_Init();
  48.   delay(6000);
  49.         USART2_SendData("AT+MIPLCREATE=49,130031F10003F2002304001100000000000000123138332E3233302E34302E34303A35363833000131F30008C000000000,0,49,0\r\n");
  50.         jieshou(2);
  51.         USART2_SendData("AT+MIPLADDOBJ=0,3303,1,\"1\",1,0\r\n");
  52.         jieshou(1);
  53.         USART2_SendData("AT+MIPLADDOBJ=0,3304,1,\"1\",1,0\r\n");
  54.         jieshou(1);
  55.         USART2_SendData("AT+MIPLNOTIFY=0,0,3303,0,5700,4,4,\"29.8\",0,0\r\n");
  56.         jieshou(1);
  57.         USART2_SendData("AT+MIPLNOTIFY=0,0,3304,0,5700,4,4,\"29.8\",0,0\r\n");
  58.         jieshou(1);
  59.         
  60.         USART2_SendData("AT+MIPLOPEN=0,3000,30\r\n");
  61.         while(jieshou(6))
  62.                 USART2_SendData("AT+MIPLOPEN=0,3000,30\r\n");
  63.         k=1;        
  64.         while(1)        
  65.         {
  66.                 if(DHT11_Read_Data(&num1,&num2)==0)
  67.                 {
  68.         usart2_send1(num1);
  69.                           usart2_send2(num2);

  70.                 }
  71.                 for(h=0;h<5;h++)
  72.                    delay_ms(1000);
  73.         }
  74.         
  75.         
  76.         
  77. }
复制代码
  1. #include "sys.h"
  2. #include "usart.h"         
  3. #include "string.h"
  4. //////////////////////////////////////////////////////////////////////////////////         
  5. //如果使用ucos,则包括下面的头文件即可.
  6. #if SYSTEM_SUPPORT_OS
  7. #include "includes.h"                                        //ucos 使用         
  8. #endif

  9. //加入以下代码,支持printf函数,而不需要选择use MicroLIB         
  10. #if 1
  11. #pragma import(__use_no_semihosting)            
  12. //标准库需要的支持函数                 
  13. struct __FILE
  14. {
  15.         int handle;

  16. };

  17. FILE __stdout;      
  18. //定义_sys_exit()以避免使用半主机模式   
  19. _sys_exit(int x)
  20. {
  21.         x = x;
  22. }
  23. //重定义fputc函数
  24. int fputc(int ch, FILE *f)
  25. {      
  26.         while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
  27.     USART2->DR = (u8) ch;      
  28.         return ch;
  29. }
  30. #endif

  31. #if EN_USART1_RX   //如果使能了接收
  32. //串口1中断服务程序
  33. //注意,读取USARTx->SR能避免莫名其妙的错误           
  34. char USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

  35. u16 USART_RX_STA=0;       //接收状态标记         
  36. u16 length=0,len;
  37. u8 flag=0;
  38. u8 k=0;
  39. char ok[3]={"OK"};
  40. void uart_init(u32 bound){
  41.   //GPIO端口设置
  42.   GPIO_InitTypeDef GPIO_InitStructure;
  43.         USART_InitTypeDef USART_InitStructure;
  44.         NVIC_InitTypeDef NVIC_InitStructure;
  45.          
  46.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
  47.   
  48.         //USART1_TX   GPIOA.9
  49.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  50.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  51.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  52.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
  53.    
  54.   //USART1_RX          GPIOA.10初始化
  55.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  56.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  57.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  58.   //Usart1 NVIC 配置
  59.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  60.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
  61.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
  62.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  63.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  64.   
  65.    //USART 初始化设置

  66.         USART_InitStructure.USART_BaudRate = bound;//串口波特率
  67.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  68.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  69.         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  70.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  71.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  72.   USART_Init(USART1, &USART_InitStructure); //初始化串口1
  73.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  74.         USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);

  75.   USART_Cmd(USART1, ENABLE);                    //使能串口1

  76. }

  77. void usart2_init(u32 bound)
  78. {
  79.                 NVIC_InitTypeDef NVIC_InitStructure;
  80.                 USART_InitTypeDef USART2_InitStructure;
  81.                 GPIO_InitTypeDef GPIO_InitStructure;
  82.         
  83.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//打开串口2时钟
  84.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GPIOA时钟
  85.         
  86. //初始化USART2-TX        
  87.         
  88.                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
  89.                 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  90.                 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  91.         
  92.                 GPIO_Init(GPIOA, &GPIO_InitStructure);
  93.         
  94. //初始化USART2-RX               
  95.         
  96.                 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
  97.                 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  98.                 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  99.         
  100.                 GPIO_Init(GPIOA, &GPIO_InitStructure);

  101. //USART2中断优先级设置

  102.         NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  103.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
  104.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //子优先级3
  105.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  106.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

  107. //USART2——初始化设置

  108.         USART2_InitStructure.USART_BaudRate=bound;
  109.         USART2_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
  110.         USART2_InitStructure.USART_Parity=USART_Parity_No;
  111.         USART2_InitStructure.USART_StopBits=USART_StopBits_1;
  112.         USART2_InitStructure.USART_WordLength=USART_WordLength_8b;
  113.         USART2_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  114.         
  115.         USART_Init(USART2, &USART2_InitStructure);
  116.         
  117.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接收中断
  118.         USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启空闲中断
  119.   USART_Cmd(USART2, ENABLE);                    //使能串口

  120. while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);

  121. }


  122. void USART2_SendData(char* buf)
  123. {
  124.         u8 i;
  125.         i=strlen((char *)buf);

  126.         for(;i>0;i--)
  127.         {
  128.                 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
  129.                 USART_SendData(USART2,*buf++);
  130.         }
  131. }


  132. void Usart_SendByte(USART_TypeDef * pUSARTX,uint8_t ch)
  133. {
  134.         USART_SendData(pUSARTX,ch);
  135.         while(USART_GetFlagStatus(pUSARTX,USART_FLAG_TXE)==RESET);   //等待发送寄存器为空
  136. }

  137. void Usart_SendString(USART_TypeDef * pUSARTX,char *str)
  138. {
  139.         unsigned int k=0;
  140.         while(*(str+k)!='\0')
  141.         {
  142.            Usart_SendByte(pUSARTX,*(str+k));
  143.                 k++;
  144.         }
  145.         while(USART_GetFlagStatus(pUSARTX,USART_FLAG_TC)==RESET);
  146. }

  147. void USART2_IRQHandler(void)   
  148. {
  149.           u8 Res;
  150.                 if(USART_GetITStatus(USART2,USART_IT_RXNE)==!RESET)
  151.                 {
  152.                
  153.                         USART_RX_BUF[length++]=USART2->DR;
  154.                         USART_ClearITPendingBit(USART2,USART_IT_RXNE);
  155.                
  156.                 }
  157.                 if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET)
  158.                 {
  159.                         Res=Res;
  160.                         Res=USART2->SR;  //状态寄存器
  161.                         Res=USART2->DR;
  162.                         flag=1;               
  163.                 }
  164.           if(k!=0)
  165.                 {
  166.                         if(flag)
  167.                         {               
  168.                                         for(len=0;len<length;len++)
  169.                                         {
  170.                                         USART_SendData(USART1, USART_RX_BUF[len]);//向串口1发送数据
  171.                                         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  172.                                         }
  173.                                         flag=0;
  174.                                         length=0;
  175.                                 
  176.                         }
  177.                 }
  178.         
  179. }

  180. void usart2_send1(u8 y)
  181. {
  182.           u8 ge,shi;
  183.     ge=y%10+48;
  184.           shi=y/10+48;
  185.                 Usart_SendString(USART2,"\r\nAT+MIPLNOTIFY=0,0,3303,0,5700,4,4,\"");        
  186.                 Usart_SendByte(USART2,shi);
  187.           Usart_SendByte(USART2,ge);
  188.                 Usart_SendString(USART2,"\",0,0\r\n");
  189. }

  190. void usart2_send2(u8 y)
  191. {
  192.           u8 ge,shi;
  193.     ge=y%10+48;
  194.           shi=y/10+48;
  195.                 Usart_SendString(USART2,"\r\nAT+MIPLNOTIFY=0,0,3304,0,5700,4,4,\"");        
  196.                 Usart_SendByte(USART2,shi);
  197.           Usart_SendByte(USART2,ge);
  198.                 Usart_SendString(USART2,"\",0,0\r\n");
  199. }

  200. #endif        
复制代码


所有资料51hei提供下载:
NB IOT 串口.rar (371.74 KB, 下载次数: 61)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表