单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机GSM模块小型气象站制作(原理图+PCB源文件+源程序)

  [复制链接]
跳转到指定楼层
楼主
以单片机为控制器的小型GSM模块发送到手机。

功能:温度,湿度,压强,PM2.5显示,并可通过GSM模块讲述据发送到手机

方案:STC12C5A60S2 + DHT11 + BMP085 + GP2Y1050AU0F

读取传感器数据并通过LCD12864显示

将数据通过GSM发送到手机

实物图.jpg (1.35 MB, 下载次数: 10)

实物图.jpg

原理图.png (45.6 KB, 下载次数: 15)

原理图.png

PCB图.png (18.01 KB, 下载次数: 8)

PCB图.png

程序文件.jpg (102.89 KB, 下载次数: 8)

程序文件.jpg

电路.jpg (67.4 KB, 下载次数: 11)

电路.jpg

资料.jpg (77.71 KB, 下载次数: 11)

资料.jpg

程序.rar

85.04 KB, 下载次数: 56, 下载积分: 黑币 -5

电路.rar

12.96 MB, 下载次数: 56, 下载积分: 黑币 -5

资料.rar

8.76 MB, 下载次数: 56, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

沙发
admin 发表于 2018-1-31 16:25 | 只看该作者
楼主的主程序:
  1. /*************************************************************************
  2. * PRO -- 小型气象站
  3. *  
  4. * 功能:温度,湿度,压强,PM2.5显示,并可通过GSM模块讲述据发送到手机
  5. * 方案:STC12C5A60S2 + DHT11 + BMP085 + GP2Y1050AU0F
  6. *  
  7. * 读取传感器数据并通过LCD12864显示
  8. * 将数据通过GSM发送到手机
  9. * 要使用GSM模块时,注意修改GSM_SendSensorDat()函数中的手机号
  10. *************************************************************************/
  11. #include <reg52.h>
  12. #include "bmp085.h"
  13. #include "dht11.h"
  14. #include "pm2_5_sensor.h"
  15. #include "sim900.h"
  16. #include "lcd12864.h"

  17. uchar code table1[] = "温度:";
  18. uchar code table2[] = "湿度:";
  19. uchar code table3[] = "压强:";
  20. uchar code table4[] = "PM2.5:0000ug/m^3";

  21. void DisRefresh(void);
  22. void GSM_SendSensorDat(void);
  23. void delay100ms(void);
  24. void delay200ms(void);
  25. void delay300ms(void);


  26. void main(void)
  27. {
  28.         uchar i = 0;
  29.    
  30.         /* 相关器件初始化 ------------------------------------------------------------ */
  31.         LCD12864_Init();    // 液晶显示初始化
  32.         BMP085_Init();      // 气压计初始化
  33.         UART2_Init();       // 与PM2.5模块通信
  34.         UART1_Init();       // 与GSM模块通信

  35.         /* GSM模块相关设置 ------------------------------------------------------------ */
  36.         UART1_PrintStr("AT\r\n");  delay100ms();   
  37.         UART1_PrintStr("ATI\r\n");  delay100ms();               // 同步波特率
  38.         UART1_PrintStr("AT+CMGF=1\r\n");  delay100ms();         // 设置为英文模式   
  39.         UART1_PrintStr("AT+CSCS=\"GSM\"\r\n");  delay100ms();   // 设置GSM字符集
  40.         UART1_PrintStr("AT+CNMI=2,1\r\n");  delay100ms();       // 设置新消息提示       

  41.     LCD12864_Dis(0, 0, table1);
  42.         LCD12864_Dis(1, 0, table2);
  43.         LCD12864_Dis(2, 0, table3);
  44.         LCD12864_Dis(3, 0, table4);
  45.        
  46.         /* 上电延时一小段时间将数据发送到手机 ------------------------------------- */
  47.         for(i=0; i<10; i++) {
  48.                 DisRefresh();       
  49.                 delay300ms();
  50.         }               
  51.         DisRefresh();               
  52.         GSM_SendSensorDat();  

  53.         while(1) {
  54.                
  55.                 /* 读取数据,更新显示 */
  56.                 DisRefresh();                      
  57.                 delay200ms();               
  58.         }
  59. }       

  60. /**
  61. * 读取传感器数据,并更新显示
  62. */
  63. unsigned int Vout;
  64. unsigned char dis[4];
  65. void DisRefresh(void)
  66. {
  67.         uchar i;
  68.        
  69.         /* 读取气压计数据并更新到显示 */
  70.         BMP085_Convert();  
  71.   
  72.     /* 读取温湿度传感器数据并更新到显示,此处只用到湿度数据,温度数据采用BMP085传感器的数据因其精度相对较高 */       
  73.         ReadHumidityTemperature();   
  74.        
  75.         /* 读取PM2.5传感器数据 */
  76.         Vout = (unsigned char)((Vo[1]*256 + Vo[2])/1024.0*5*0.2*1000);  // Vo[]中的数据在USART2中断中更新   
  77.                 dis[0] = Vout/1000 + 0x30;
  78.                 dis[1] = Vout%1000/100 + 0x30;
  79.                 dis[2] = Vout%100/10 + 0x30;  
  80.                 dis[3] = Vout%100%10 + 0x30;  
  81.         if (Vout > 1000) {
  82.                 dis[0] = Vout/1000 + 0x30;
  83.                 dis[1] = Vout%1000/100 + 0x30;
  84.                 dis[2] = Vout%100/10 + 0x30;  
  85.                 dis[3] = Vout%100%10 + 0x30;  
  86.         } else if(Vout > 100) {
  87.                 dis[0] = 0x20;
  88.                 dis[1] = Vout%1000/100 + 0x30;
  89.                 dis[2] = Vout%100/10 + 0x30;  
  90.                 dis[3] = Vout%100%10 + 0x30;  
  91.         } else if (Vout > 10) {
  92.                 dis[0] = 0x20;
  93.                 dis[1] = 0x20;
  94.                 dis[2] = Vout%100/10 + 0x30;  
  95.                 dis[3] = Vout%100%10 + 0x30;  
  96.         } else {
  97.                 dis[0] = 0x20;
  98.                 dis[1] = 0x20;
  99.                 dis[2] = 0x20;
  100.                 dis[3] = Vout%100%10 + 0x30;  
  101.         }
  102.        
  103.         /* 将更新的数据更新到GSM发送缓存中 */
  104.         for (i=0; i<4; i++) {
  105.                 SMS_Content[42+i] = dis[i];   
  106.         }
  107.        
  108.         /* 将读取PM2.5模块的数据更新到液晶显示 */
  109.         LCD12864_WriteCmd(0x9B);
  110.         LCD12864_WriteDat(dis[0]);   LCD12864_WriteDat(dis[1]);          LCD12864_WriteDat(dis[2]);  LCD12864_WriteDat(dis[3]);   
  111. }

  112. /* ======================================== Short Message Service ======================================== */
  113. uchar SMS_Content[52] = "Temp:22.2, Pres:101.3KPa, Humi:50%, PM2.5:  30ug/m^3";   // 短信内容
  114. /**
  115. * 发送传感器数据
  116. * @param[in] temp:温度
  117. * @param[in] hum:湿度
  118. * @param[in] dust:PM2.5浓度--ug/m^3
  119. */
  120. void GSM_SendSensorDat(void)
  121. {
  122.     /* 加载要发送的数据-->设置短信格式-->设置数据长度-->发送信息 */
  123.         UART1_PrintStr("AT+CSCS=\"GSM\"\r\n");  delay300ms();
  124.         UART1_PrintStr("AT+CMGF=1\r\n");  delay300ms();                // 设置为文本模式
  125.         UART1_PrintStr("AT+CMGS=\"18813331234\"\r\n");  delay300ms();  // 此处修改为对方的电话号
  126.         UART1_PrintStr(SMS_Content);                                   // 修改短信内容
  127.         UART1_PrintChar(0x1A);  
  128. }

  129. void delay100ms(void)   
  130. {
  131.     unsigned char a,b,c;
  132.     for(c=89;c>0;c--)
  133.         for(b=230;b>0;b--)
  134.             for(a=12;a>0;a--);
  135. }
  136. void delay200ms(void)   
  137. {
  138.     unsigned char a,b,c;
  139.     for(c=187;c>0;c--)
  140.         for(b=215;b>0;b--)
  141.             for(a=26;a>0;a--);
  142. }
  143. void delay300ms(void)   
  144. {
  145.     unsigned char a,b,c;
  146.     for(c=89;c>0;c--)
  147.         for(b=230;b>0;b--)
  148.             for(a=36;a>0;a--);
  149. }
复制代码
回复

使用道具 举报

板凳
阿凡提 发表于 2018-2-4 08:31 | 只看该作者
楼主数据测的准确吗?
回复

使用道具 举报

地板
xiefengjie 发表于 2018-6-12 10:42 | 只看该作者
楼主,这个传感器哪里能买到啊? GP2Y1050AU0F
回复

使用道具 举报

5#
yuki_ring 发表于 2018-6-13 14:49 | 只看该作者
膜拜!高手!!!
回复

使用道具 举报

6#
6726234500 发表于 2018-6-17 15:08 | 只看该作者
能用吗
回复

使用道具 举报

7#
无效楼层,该帖已经被删除
8#
11153130 发表于 2019-1-10 18:31 | 只看该作者
挺不错的资料呢
回复

使用道具 举报

9#
wsytjwps 发表于 2019-1-11 19:41 | 只看该作者
感谢分享!学习一下
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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