找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3380|回复: 7
收起左侧

MSP430单片机控制GSM模块的短信功能源码分享

[复制链接]
ID:423060 发表于 2018-11-8 16:05 | 显示全部楼层 |阅读模式
以msp430f5529作为主控,连接了一些传感器,可以将传感器的信息通过GSM模块发送到别的手机上
GSM模块中要插上sim卡
整个工程就在这里了

单片机源程序如下:
  1. /*************************************************
  2.   TXD 4.4   RST 76
  3.   RXD 4.5   TEST 71
  4.   CO2传感器    MGT811  5v   P6.1                    20.32
  5.     光强度传感器 BH1750  3.3v SDA-P3.1 SCL-P3.3   宽度 15.33
  6.     温湿度传感器 DHT11   3.3v P1.4                    14.27
  7.     电扇   P75     水泵    P77
  8.     加湿器  P76    窗帘    P62
  9. ************************************************/
  10. #include  "msp430f5529.h"
  11. #include  "strings.h"
  12. #include  "BH1750.h"
  13. #include  "AT.h"
  14. #include  "iic.h"
  15. #include  "math.h"
  16. #define CPU           (1000000)
  17. #define delay_us(x)   (__delay_cycles((double)x*CPU/1000000.0))
  18. #define delay_ms(x)   (__delay_cycles((double)x*CPU/1000.0))
  19. #define HIGH P1OUT|=BIT4;
  20. #define LOW  P1OUT&=~BIT4;

  21. #define FANOFF  P7OUT|=BIT5;
  22. #define FANON  P7OUT&=~BIT5;
  23. #define PUMPON  P7OUT|=BIT7;
  24. #define PUMPOFF  P7OUT&=~BIT7;

  25. char temph,templ,humdh,humdl,check;
  26. #define Max 200
  27. char Buff[Max];

  28. int light_flag,mode_flag;
  29. int getco2[2];
  30. extern unsigned char BUF[2];
  31. extern char content[];

  32. char high[6]="(high)";
  33. char cold[6]="(cold)";
  34. char hot[5]="(hot)";
  35. char dry[5]="(dry)";
  36. char damp[6]="(damp)";
  37. char normal[8]="(normal)";
  38. char light[10]="Light: ";
  39. char air[10] = "\r\nCO2: ";
  40. char temp[15]= "\r\ntempture: ";
  41. char wet[15] = "\r\nhumidity: ";
  42. void water_get(void);
  43. char receive(void);
  44. void ADCinit();
  45. void ATinit(void);
  46. void InitbSys(void);
  47. void light_get(void);
  48. void co2_get(void);
  49. void convert(void);
  50. void Delay(unsigned int time)
  51. {
  52.   unsigned int i,k;
  53.   for(i=0;i<255;i++)
  54.     for(k=0;k<time;k++)
  55.       _NOP();
  56. }

  57. //****************** 本地变量声明  *************************//
  58. int ss[2];
  59. int flag1=0,i=0;
  60. int flag2=0,flag3=0,flag4=0;   //读取短信内容用到的 flag
  61. u8  Times=0,First_Int = 0,shijian=0;
  62. vu8 Timer0_start;
  63. char NBUF[5],TBUF[5];
  64. char CBUF[5],T2BUF[5];
  65. char HBUF[5],T3BUF[5];
  66. char TEBUF[5],T4BUF[5];
  67. //***************** 开始吧!!!!  *************************//
  68. void roll(int p)
  69. {
  70.     for(i=1;i<p;i++)
  71.     {
  72.         P6OUT |= BIT2;;
  73.         delay_us(500);
  74.         P6OUT &= ~BIT2;
  75.         delay_ms(20);
  76.     }
  77. }
  78. void rollback(int p)
  79. {
  80.     for(i=1;i<p;i++)
  81.     {
  82.         P6OUT |= BIT2;;
  83.         delay_us(2500);
  84.         P6OUT &=~BIT2;
  85.         delay_ms(20);
  86.     }
  87. }
  88. void humon(void)
  89. {
  90.     P7OUT &=~ BIT6;
  91.     delay_ms(100);
  92.     P7OUT |= BIT6;
  93. }
  94. void send_buf( char *p)
  95. {
  96.     while(*p !='\0') //C语言里字符串末尾自动加“\0”(ASCII码值为0)
  97.     {
  98.           while (!(UCA1IFG&UCTXIFG));
  99.           UCA1TXBUF=*p; //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址
  100.           *p++;
  101.           Delay(40);
  102.     }
  103. }

  104. void main(void)
  105. {
  106.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  107.   P2DIR|=BIT3+BIT2+BIT1;
  108.   P2OUT|=BIT3+BIT2+BIT1;

  109.   P7DIR |= BIT4+BIT5+BIT6+BIT7;
  110.   P7OUT &=~(BIT4+BIT5+BIT6+BIT7);
  111.   P7OUT |= BIT6;
  112.   P6DIR|=BIT2;
  113.   FANOFF;

  114.   InitbSys();
  115.   ATinit();
  116.   ADCinit();

  117.   TA0CCTL0 = CCIE;
  118.   TA0CCR0 = 50000;
  119.   TA0CTL = TASSEL_2 + MC_1 + TACLR;

  120.   _EINT();
  121.    wait();
  122.    Set_Text_Mode();
  123.    Second_AT_Command("AT+CMGD=1,4","OK",3);
  124.    Delay(2000);
  125.   mode_flag=1;
  126.   light_flag=0;
  127.   while(1)
  128.   {


  129.       if(mode_flag==1)
  130.       {

  131.           P2OUT &=~ BIT1;
  132.           if((Find("C")||Find("M")||Find("T")||Find("I")))
  133.           {
  134.               P2OUT |= BIT1;

  135.               send_buf("AT+CMGR=1\r\n");
  136.               Delay(2000);

  137.               if(Find("aaa"))
  138.                   {
  139.                       roll(300);
  140.                       light_flag=1;
  141.                   }
  142.               else if(Find("bbb"))
  143.                   {
  144.                       rollback(270);
  145.                       light_flag=0;
  146.                   }
  147.               else if(Find("ccc"))
  148.                   {
  149.                     FANON;
  150.                   }
  151.               else if(Find("ddd"))
  152.                   {
  153.                     FANOFF;
  154.                   }
  155.               else if(Find("eee"))
  156.                   {
  157.                       PUMPON;
  158.                /*       Delay(5000);
  159.                       Delay(5000);
  160.                       Delay(5000);
  161.                       PUMPOFF;*/
  162.                   }
  163.               else if(Find("fff"))
  164.                   {
  165.                       PUMPOFF;
  166.                   }
  167.               else if(Find("ggg"))
  168.                   {
  169.                       humon();
  170.                   }

  171.               else if(Find("hhh"))
  172.                   {
  173.                       water_get();
  174.                       co2_get();
  175.                       light_get();
  176.                       convert();
  177.                       Send((char*)content);
  178.                   }
  179.               else if(Find("000"))
  180.                   {
  181.                   mode_flag=0;
  182.                   P2OUT &=~ BIT2;
  183.                   }

  184.               else{}

  185.               Clear();
  186.               Second_AT_Command("AT+CMGD=1,4","OK",3);
  187.               Delay(2000);
  188.               Second_AT_Command("AT+CMGD=1,4","OK",3);
  189.               Delay(2000);
  190.               Clear();
  191.           }
  192.        }
  193.       else
  194.       {
  195.           P2OUT &=~ BIT2;
  196.           P2OUT ^= BIT3;
  197.           light_get();
  198.           if((BUF[0]*255+BUF[1]>=300)&&(light_flag==0))
  199.               {
  200.                   roll(300);
  201.                   light_flag=1;
  202.               }
  203.           else if((BUF[0]*255+BUF[1]<=200)&&(light_flag==1))
  204.               {
  205.                   rollback(300);
  206.                   light_flag=0;
  207.               }
  208.           else{;}

  209.           water_get();
  210.           Delay(5000);

  211.           if((humdh*255+humdl>=9000)||(getco2[0]*100+getco2[1]>2300))
  212.           {
  213.               FANON;
  214.           }
  215.           else
  216.           {
  217.               FANOFF;
  218.           }
  219.           co2_get();

  220.       }
  221.    }

  222. // __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
  223. }

  224. #pragma vector=TIMER0_A0_VECTOR
  225. __interrupt void TIMER0_A0_ISP(void)
  226. {

  227.     if(Timer0_start)
  228.         Times++;
  229.     if(Times > (10*shijian))
  230.     {
  231.         Timer0_start = 0;
  232.         Times = 0;
  233.     }

  234. }


  235. #pragma vector=USCI_A1_VECTOR
  236. __interrupt void USCI_A1_ISR(void)
  237. {
  238.   switch(__even_in_range(UCA1IV,4))
  239.   {
  240.   case 0:break;                             // Vector 0 - no interrupt
  241.   case 2:                                   // Vector 2 - RXIFG
  242.       Buff[First_Int] = UCA1RXBUF;
  243.       First_Int++;
  244.       if(First_Int >= Max)
  245.           First_Int = 0;
  246.       break;
  247.   case 4:break;                             // Vector 4 - TXIFG
  248.   default: break;
  249.   }
  250. }

  251. #pragma vector=PORT2_VECTOR
  252. __interrupt void Key_interrput()
  253. {
  254.     if(P2IFG&BIT7)
  255.     {
  256.       Delay(200);
  257.       if(P2IFG&BIT7)
  258.       {
  259.           while((P2IN&BIT7)==0);//松手检测
  260.           P2IFG &= ~BIT7;  //清除中断标志位

  261.           if(mode_flag==0)
  262.               {
  263.                  P2OUT |= BIT2+BIT3;
  264.                  mode_flag=1;     //暗淡状态短信控制
  265.               }
  266.           else
  267.               {
  268.                  P2OUT &=~ BIT2;
  269.                  mode_flag=0;    //发光状态自动控制
  270.               }
  271. } } }

  272. #pragma vector=ADC12_VECTOR
  273. __interrupt void ADC12_ISR(void)
  274. {
  275.   switch(__even_in_range(ADC12IV,34))
  276.       {
  277.   case  0:break;
  278.   case  2:break;
  279.   case  4:break;
  280.   case  6:
  281.       getco2[0]=ADC12MEM0/100;
  282.       getco2[1]=ADC12MEM0%100;
  283.       //__bic_SR_register_on_exit(LPM0_bits);
  284.   case  8:break; case  9:break;   case  10:break; case  11:break;
  285.   case  12:break; case  13:break; case  14:break; case  15:break;
  286.   case  16:break; case  17:break; case  18:break; case  19:break;
  287.   case  20:break; case  21:break;
  288.   case  22:break; case  23:break; case  24:break; case  25:break;
  289.   case  26:break; case  27:break; case  28:break;
  290.   case  29:break; case  30:break; case  31:break; case  32:break;
  291.   case  33:break; case  34:break;
  292.   default:break;
  293.       }
  294. }
  295. void convert(void)
  296. {
  297.      int A,B,reall,realc,realh,realt;
  298.      for(i=0;i<200;i++)
  299.         content[i]=0;
  300.      ss[0]=getco2[0];
  301.      ss[1]=getco2[1];
  302. //*******************光强度获取值转换**********************//
  303.      reall=BUF[0]*255+BUF[1];
  304.      A=0;
  305.      for(i=0;i<5;i++)
  306.      {
  307.          NBUF[i] = (reall-A)/(pow(10,4-i));
  308.          A+=NBUF[i]*(pow(10,4-i));
  309.      }
  310.      for(i=0;i<5;i++)
  311.         NBUF[i]=NBUF[i]+48;
  312.      B=0;
  313.      for(i=0;i<5;i++)
  314.      {
  315.          if(NBUF[i]!=48)
  316.              {
  317.              TBUF[B]=NBUF[i];
  318.              B++;
  319.              }
  320.      }
  321. //*******************co2获取值转换**********************//
  322.      realc=getco2[0]*100+getco2[1];
  323.      A=0;
  324.      for(i=0;i<5;i++)
  325.       {
  326.           CBUF[i] = (realc-A)/(pow(10,4-i));
  327.           A+=CBUF[i]*(pow(10,4-i));
  328.       }
  329.       for(i=0;i<5;i++)
  330.          CBUF[i]=CBUF[i]+48;
  331.       B=0;
  332.       for(i=0;i<5;i++)
  333.       {
  334.           if(CBUF[i]!=48)
  335.               {
  336.               T2BUF[B]=CBUF[i];
  337.               B++;
  338.               }
  339.       }
  340. //*******************湿度获取值转换**********************//
  341.       realh=humdh*255+humdl;
  342.       A=0;
  343.       for(i=0;i<5;i++)
  344.        {
  345.            HBUF[i] = (realh-A)/(pow(10,4-i));
  346.            A+=HBUF[i]*(pow(10,4-i));
  347.        }
  348.        for(i=0;i<5;i++)
  349.            HBUF[i]=HBUF[i]+48;
  350.        B=0;
  351.        for(i=0;i<5;i++)
  352.        {
  353.            if(HBUF[i]!=48)
  354.                {
  355.                T3BUF[B]=HBUF[i];
  356.                B++;
  357.                }
  358.        }
  359. //*******************温度获取值转换**********************//
  360.        realt=temph*255+templ;
  361.        A=0;
  362.        for(i=0;i<5;i++)
  363.         {
  364.             TEBUF[i] = (realt-A)/(pow(10,4-i));
  365.             A+=TEBUF[i]*(pow(10,4-i));
  366.         }
  367.         for(i=0;i<5;i++)
  368.             TEBUF[i]=TEBUF[i]+48;
  369.         B=0;
  370.         for(i=0;i<5;i++)
  371.         {
  372.             if(TEBUF[i]!=48)
  373.                 {
  374.                 T4BUF[B]=TEBUF[i];
  375.                 B++;
  376.                 }
  377.         }
  378. //******************************************************//
  379.       strcat(content,(char*)light);
  380.       strcat(content,(char*)TBUF);
  381.       strcat(content,(char*)air);
  382.       strcat(content,(char*)T2BUF);
  383.       //if(realc>2500) strcat(content,(char*)high);
  384.       //else strcat(content,(char*)normal);

  385.       strcat(content,(char*)wet);
  386.       strcat(content,(char*)T3BUF);
  387.     //  if(realh>600) strcat(content,(char*)damp);
  388.     //  else if(realh<100) strcat(content,(char*)dry);
  389.     //  else strcat(content,(char*)normal);

  390.       strcat(content,(char*)temp);
  391.       strcat(content,(char*)T4BUF);
  392.      // if(realt>1800) strcat(content,(char*)hot);
  393.      // else if(realt<400)  strcat(content,(char*)cold);
  394.      // else strcat(content,(char*)normal);

  395. }
  396. void ATinit(void)
  397. {
  398.     P4SEL |=BIT4+BIT5 ;                       // P5.6,7 = USCI_A1 TXD/RXD
  399.     UCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**
  400.     UCA1CTL1 |= UCSSEL_2;                     // SMCLK
  401.     UCA1BR0 = 9;                              // 1MHz 115200 (see User's Guide)
  402.     UCA1BR1 = 0;                              // 1MHz 115200
  403.     UCA1MCTL |= UCBRS_1 + UCBRF_0;            // Modulation UCBRSx=1, UCBRFx=0
  404.     UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  405.     UCA1IE |= UCRXIE;                         // Enable USCI_A1 RX interrupt
  406. }

  407. void InitbSys()
  408. {
  409.     P2IE  |= BIT7; //设置p2.7可以中断
  410.     P2IES |= BIT7; //设置p2.7为下降沿中断
  411.     P2IFG &= ~BIT7;//设置p2.7为0 无中断请求
  412.     P2REN |= BIT7; //设置p2.7为上下拉电阻使能
  413.     P2OUT |= BIT7;

  414.     UCSCTL4 |= SELS__DCOCLK ;
  415.     InitIIC();
  416.     WriteBH1750(0x01,1);
  417.     P4DIR|=BIT7;
  418. }
  419. void ADCinit()
  420. {
  421.     ADC12CTL0 = ADC12SHT02 + ADC12ON;
  422.     ADC12CTL1 = ADC12SHP;
  423.     ADC12IE   = 0X01;
  424.     ADC12CTL0 |= ADC12ENC;
  425.     P6SEL |= 0X01;

  426. }
  427. void light_get()
  428. {
  429.     WriteBH1750(0x01,1);
  430.     WriteBH1750(0x10,1);
  431.     delay_ms(180);
  432.     ReadBH1750Seq(0x01);


  433. }
  434. void co2_get()
  435. {
  436.     ADC12CTL0 |= ADC12SC;
  437.     //__bis_SR_register(LPM0_bits + GIE);
  438. }

  439. char receive(void)
  440. {
  441.   unsigned char num=0,tem,cnt;              //临时变量用于存储接受数据
  442.   for(cnt=0;cnt<8;cnt++)
  443.   {
  444.     tem=0;
  445.     while(!(P1IN&BIT4));       //等待14us的低电平结束
  446.     delay_us(26);
  447.     if((P1IN&BIT4))           /////////长于30us定义为1
  448.     {
  449.       tem=1;
  450.       while((P1IN&BIT4));        //等待一位的采集结束
  451.     }
  452.     num<<=1;
  453.     num|=tem;
  454.   }
  455.   return num;
  456. }

  457. void water_get(void)
  458. {
  459.     P1DIR|=BIT4;
  460.     LOW;
  461.     delay_ms(20);
  462.     HIGH;
  463.     delay_us(30);         //20--40
  464.     P1DIR &=~BIT4;
  465.     if(!(P1IN&BIT4));             //从机发出响应信号
  466.     {
  467.       while(!(P1IN&BIT4)); //等待响应响应结束
  468.       while((P1IN&BIT4));  //开始采集
  469.       humdh=receive();
  470.       humdl=receive();
  471.       temph=receive();
  472.       templ=receive();
  473.       check=receive();
  474.     }
  475. }

复制代码

所有资料51hei提供下载:
Z8 LH.rar (725.19 KB, 下载次数: 32)
回复

使用道具 举报

ID:423060 发表于 2018-11-8 16:06 | 显示全部楼层
自顶~~~~~当年的毕业设计
回复

使用道具 举报

ID:423060 发表于 2018-11-8 16:06 | 显示全部楼层
本帖最后由 wonders 于 2018-11-8 16:09 编辑

当年的毕业设计
回复

使用道具 举报

ID:1 发表于 2018-11-8 16:30 | 显示全部楼层
gsm模块的名字是什么
回复

使用道具 举报

ID:189743 发表于 2018-11-11 22:41 | 显示全部楼层
用什么软件打开里面的内容????
回复

使用道具 举报

ID:423060 发表于 2018-11-16 22:29 | 显示全部楼层
admin 发表于 2018-11-8 16:30
gsm模块的名字是什么

SIM900
回复

使用道具 举报

ID:423060 发表于 2018-11-16 22:30 | 显示全部楼层
我用430做的   一般430都是用CCS的吧 我就是
回复

使用道具 举报

ID:451410 发表于 2018-12-28 10:11 | 显示全部楼层
没有图吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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