找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于51单片机中main如何调用子程序问题

[复制链接]
跳转到指定楼层
楼主
ID:279295 发表于 2020-5-13 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己写的一个利用GSM模块上传数据到服务器,发送短信的程序
上传数据到服务器部分不会写主函数了,就是如何在main中调用void GPRSInit();void  send_GPRSdata();这两部分
  1. #include "reg52.h"
  2. #include "type.h"
  3. #include <string.h>
  4. #include <stdio.h>
  5. #define DEVID        "" //设备id
  6. #define APIKEY        "" //设备apikey


  7. bit flag;
  8. uchar model=0;  //模式

  9. uchar temp1H=35; //上限值
  10. uchar temp2H=35; //上限值
  11. uchar temp3H=35; //上限值
  12. uchar hum1H=70; //上限值
  13. uchar hum2H=70; //上限值
  14. uchar hum3H=70; //上限值
  15. uchar temp_L=10;
  16. uchar  date[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  17. unsigned char temp1=0,temp2=0,temp3=0,hum1=0,hum2=0,hum3=0;
  18. #define SEND_MESSA_TO_YOUR "at+cmgs=\"1840**2397\"\r\n"    //填入你手上的手机号码 不是板子的

  19. #include "LCD1602.H"
  20. sbit set=P1^6;
  21. sbit add=P3^5;
  22. sbit min=P3^4;
  23. sbit beep=P3^6;
  24. sbit led1=P1^2;
  25. sbit led2=P1^1;

  26. /***********模拟开关*********************/
  27. sbit CS_4052=P1^0;
  28. sbit B_4052=P1^1;
  29. sbit A_4052=P1^2;
  30. uchar fen=0; //定时发送短信计时
  31. bit sendFlag=0; //发送短信标志
  32. void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
  33. {unsigned int i,j;
  34.    for(i=0;i<ms;i++)
  35.     for(j=0;j<100;j++);
  36. }
  37. void Uart_Send(uchar dat)         //发送一字节   
  38. {
  39.   SBUF=dat;
  40.   while(!TI);
  41.   TI=0;
  42. }
  43. //发送一串字符到串口
  44. void Uart_Sends(char* data_at)  
  45. {
  46.         unsigned char cnt=0;
  47.         while(*(data_at+cnt))        //判断一串数据是否结束
  48.         {
  49.                 Uart_Send(*(data_at+cnt));
  50.                 cnt++;
  51.         }
  52.                
  53. }


  54. void select(uchar num)               
  55. {
  56.   if(num==1)         //上位机串口使能
  57.     {
  58.          CS_4052=0;
  59.          B_4052=0;
  60.          A_4052=0;
  61.         }
  62. else  if(num==2)         //CC2530串口使能
  63.     {
  64.          CS_4052=0;
  65.          B_4052=0;
  66.          A_4052=1;
  67.         }

  68. }
  69. //发送短信函数
  70. void Send_SMS(void)
  71. {
  72.         uchar yy=1;
  73.         
  74.   select(1);        //GSM模块串口使能
  75.         delay1ms(100);
  76.         Uart_Sends("AT+CMGF=1\r");//设置中文方式发送
  77.         delay1ms(800);
  78.         delay1ms(1000);
  79.         Uart_Sends(SEND_MESSA_TO_YOUR);                                                                                                                                                                  
  80.         delay1ms(1000);        
  81. switch (yy)                                                                                         
  82. {                                                                                            
  83.    
  84.   case 1 : Uart_Sends("wendu1=");                                                               
  85.                    Uart_Send(temp1/10+0x30);
  86.                    Uart_Send(temp1%10+0x30);
  87.                    Uart_Sends(",wendu2=");
  88.                    Uart_Send(temp2/10+0x30);
  89.                    Uart_Send(temp2%10+0x30);
  90.                    Uart_Sends(",wendu3=");
  91.                    Uart_Send(temp3/10+0x30);
  92.                    Uart_Send(temp3%10+0x30);
  93.                    Uart_Sends("\r\nshidu1=");     
  94.                    Uart_Send(hum1/10+0x30);
  95.                    Uart_Send(hum1%10+0x30);
  96.        Uart_Sends(",shidu2=");
  97.                    Uart_Send(hum2/10+0x30);
  98.                    Uart_Send(hum2%10+0x30);
  99.        Uart_Sends(",shidu3=");
  100.                    Uart_Send(hum3/10+0x30);
  101.                    Uart_Send(hum3%10+0x30);
  102.                    Uart_Sends("\r\n");
  103.                          if(temp1>temp1H)
  104.                          {
  105.                           Uart_Sends("wendu1 Warning!!!\r\n");
  106.                          }
  107.                          if(temp2>temp2H)
  108.                          {
  109.                           Uart_Sends("wendu2 Warning!!!\r\n");
  110.                          }
  111.                          if(temp3>temp3H)
  112.                          {
  113.                           Uart_Sends("wendu3 Warning!!!\r\n");
  114.                          }
  115.                          if(hum1>hum1H)
  116.                          {
  117.                           Uart_Sends("hum1 Warning!!!\r\n");
  118.                          }
  119.                          if(hum2>hum2H)
  120.                          {
  121.                           Uart_Sends("hum2 Warning!!!\r\n");
  122.                          }
  123.                          if(hum3>hum3H)
  124.                          {
  125.                           Uart_Sends("hum3 Warning!!!\r\n");
  126.                          }                        
  127.                         
  128.                  
  129.                     break;        //烟雾报警
  130.   
  131. }                                                               
  132.                                                          
  133.    Uart_Send(0x1a);//以0x1a来结束,表示内容结束,发送短信                        
  134.                                                                                                               
  135. }


  136.   void GPRSInit()
  137.    {
  138.        select(1); //打开GSM串口
  139.               Uart_Sends("AT+CIPCLOSE=1\r\n");
  140.              delay1ms(1000);        
  141.              Uart_Sends("AT+CGCLASS=\"B\"\r\n");        
  142.              delay1ms(1000);
  143.              Uart_Sends("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n");        
  144.              delay1ms(1000);               
  145.              Uart_Sends("AT+CGATT=1\r\n");
  146.              delay1ms(1000);
  147.              Uart_Sends("AT+CIPCSGP=1,\"CMNET\"\r\n");        
  148.              delay1ms(1000);
  149.              Uart_Sends("AT+CLPORT=\"TCP\",\"2000\"\r\n");        //发送指令指定本地端口
  150.              delay1ms(1000);
  151.              Uart_Sends("AT+CIPSTART=\"TCP\",\"183.230.40.33\",\"80\"\r\n");
  152.              delay1ms(3000);
  153.          
  154.    
  155.    }
  156. void send_GPRSdata()
  157.    {
  158.                  char xdata text[28];
  159.      char xdata buf1[60];
  160.                  select(1); //打开GPRS串口
  161.                  //ES=0; //关闭串口接收中断
  162.                  Uart_Sends("AT+CIPSEND\r\n");
  163.           delay1ms(1000);
  164.                 memset(buf1, 0, sizeof(buf1));
  165.                 sprintf(buf1,"POST /devices/%s/datapoints?type=3 HTTP/1.1\r\n",DEVID);
  166.                 Uart_Sends(buf1);//向服务器发送数据
  167.                 delay1ms(1000);
  168.                 memset(buf1, 0, sizeof(buf1));//初始化
  169.                 sprintf(buf1,"api-key:%s\r\n",APIKEY);
  170.                 Uart_Sends(buf1);//向服务器发送数据
  171.                 delay1ms(1000);
  172.                 Uart_Sends("Host:api.heclouds点com\r\n");
  173.           delay1ms(1000);

  174.                 memset(text, 0, sizeof(text));
  175.           memset(buf1, 0, sizeof(buf1));
  176.           strcpy(buf1, "{");
  177.           memset(text, 0, sizeof(text));
  178.                 sprintf(text, "\"Temperature1\":%d,",temp1);
  179.           strcat(buf1, text);
  180.     memset(text, 0, sizeof(text));
  181.           sprintf(text, "\"Humidity1\":%d,",hum1);
  182.                 strcat(buf1, text);
  183.                 memset(text, 0, sizeof(text));
  184.                 sprintf(text, "\"Temperature2\":%d,",temp2);
  185.           strcat(buf1, text);
  186.     memset(text, 0, sizeof(text));
  187.           sprintf(text, "\"Humidity2\":%d,",hum2);
  188.                 strcat(buf1, text);
  189.                 memset(text, 0, sizeof(text));
  190.                 sprintf(text, "\"Temperature3\":%d,",temp3);
  191.           strcat(buf1, text);
  192.     memset(text, 0, sizeof(text));
  193.           sprintf(text, "\"Humidity3\":%d",hum3);
  194.           strcat(buf1, text);//字符串buf1尾加text的内容
  195.           strcat(buf1, "}");
  196.                 memset(text, 0, sizeof(text));
  197.                 sprintf(text,"Content-Length:%d\r\n",strlen(buf1));
  198.                 Uart_Sends(text);
  199.                 delay1ms(1000);
  200.                 Uart_Sends("\r\n");
  201.           delay1ms(1000);
  202.                 Uart_Sends(buf1);
  203.           delay1ms(100);
  204.                 Uart_Send(0x1a);
  205.           delay1ms(1000);
  206.         }
  207.                  
  208.                  
  209.                  

  210. void key()
  211.   {
  212.                 uchar i=0;
  213.                
  214.    if(!set) //检测设置按键
  215.      {
  216.           while(!set);
  217.           model++;
  218.          if(model==7)
  219.           {
  220.              model=0;   
  221.           }
  222.          if(model==1)//设置模式显示
  223.          {
  224.                   WRITE_LCD1602_COM(0x80);
  225.             for(i=0;i<16;i++)
  226.                         WRITE_LCD1602_DAT(DIS_TAB3[i]);
  227.                         WRITE_LCD1602_COM(0x80+0x40);
  228.                         for(i=0;i<16;i++)
  229.                         WRITE_LCD1602_DAT(DIS_TAB4[i]);
  230.                         WRITE_LCD1602_COM(0x80+0x40+9);
  231.          }
  232. else if(model==0)//正常模式显示
  233.   {   
  234.                   WRITE_LCD1602_COM(0x80);
  235.       for(i=0;i<16;i++)
  236.                         WRITE_LCD1602_DAT(DIS_TAB1[i]);
  237.                         WRITE_LCD1602_COM(0x80+0x40);
  238.                         for(i=0;i<16;i++)
  239.                         WRITE_LCD1602_DAT(DIS_TAB2[i]);
  240.                         WRITE_LCD1602_COM(0x80+0x40+9);        
  241.         }
  242.          
  243.         
  244.            
  245.          }
  246. else  if(!add)
  247.     {
  248.          while(!add);
  249.          switch(model)
  250.            {
  251.      case 1: if(temp1H<90) temp1H++;        break;
  252.            case 2: if(temp2H<90) temp2H++;        break;
  253.            case 3: if(temp3H<90) temp3H++;       break;
  254.                  case 4: if(hum1H<90)  hum1H++;        break;
  255.                  case 5: if(hum2H<90)  hum2H++;        break;
  256.                  case 6: if(hum3H<90)  hum3H++;        break;
  257.                  default:break;
  258.            }

  259.         
  260.         }
  261. else   if(!min)
  262.     {
  263.          while(!min);
  264.          switch(model)
  265.            {
  266.            case 1: if(temp1H>0) temp1H--;        break;
  267.            case 2: if(temp2H>0) temp2H--;        break;
  268.            case 3: if(temp3H>0) temp3H--;        break;
  269.                  case 4: if(hum1H>0)  hum1H--;        break;
  270.                  case 5: if(hum2H>0)  hum2H--;        break;
  271.                  case 6: if(hum3H>0)  hum3H--;        break;
  272.                  default:break;
  273.            }

  274.         
  275.         }
  276.   
  277.   }
  278.      void beeps()
  279.           {
  280.           static uchar count;
  281.           count++;
  282.           if(count<20)
  283.           beep=0;
  284. else if(count<40)           
  285.           beep=1;
  286.           else
  287.           count=0;
  288.          
  289.           }

  290.          void control()//报警检测控制
  291.           {
  292.      static uchar flagsend=0;
  293.                         
  294.                   if((temp1>temp1H)||(temp2>temp2H)||(temp3>temp3H)||
  295.                                 (hum1>hum1H)||(hum2>hum2H)||(hum3>hum3H))         //温度控制
  296.                    {
  297.                      beeps();          // 蜂鸣器报警
  298.                           if(flagsend==0)        
  299.                                 {        
  300.                        flagsend=1;                        
  301.                            Send_SMS();
  302.                                 }
  303.                    }
  304.             else  
  305.                    {
  306.                                 flagsend=0;         
  307.                     beep=1;// 关闭蜂鸣器报警
  308.                    }

  309.           }


  310.                
  311.    void rec_cc2530data()
  312.    {
  313.             select(2);          //选通 cc2530 串口
  314.          ES=1; //串口接收中断
  315.         if(date[0]==0x55)
  316.         {        
  317.              date[0]=0;
  318.                  if((date[1]==1)&&(date[2]+date[3]==date[4]))          //第一路        数据
  319.                  {
  320.                   date[1]=0;
  321.                   temp1=date[2];
  322.                   hum1=date[3];
  323.                  }
  324.                   if((date[1]==2)&&(date[2]+date[3]==date[4]))  //第二路
  325.                  {
  326.                  date[1]=0;
  327.                   temp2=date[2];
  328.                   hum2=date[3];
  329.                  }
  330.                   if((date[1]==3)&&(date[2]+date[3]==date[4]))   //第三路
  331.                  {
  332.                   date[1]=0;
  333.                   temp3=date[2];
  334.                   hum3=date[3];
  335.                  }
  336.          
  337.         }
  338.    
  339.    }

  340.                   


  341.          void Timer0Init(void)                //50毫秒@11.0592MHz
  342. {
  343.          
  344.         TMOD &= 0xF0;                //设置定时器模式
  345.         TMOD |= 0x01;                //设置定时器模式
  346.         TL0 = 0x00;                //设置定时初值
  347.         TH0 = 0x4C;                //设置定时初值
  348.         TF0 = 0;                //清除TF0标志
  349.         TR0 = 1;                //定时器0开始计时
  350.         ET0=1;
  351. }

  352. void main()
  353. {

  354.   
  355.         init_1602();
  356.         TMOD=0x20;         // T1定时方式2
  357.         SCON=0x40;//串行工作 方式1
  358.         PCON=0x00; //不加倍
  359.         TH1=TL1=0xfd; //定时器1赋初值  保证波特率9600
  360.         TR1=1;                  //开定时器1
  361.         REN=1;                  //允许串口接收
  362.         ES=1;                  //打开串口中断
  363.         EA=1;                  //开总中断

  364.         Timer0Init();
  365.         //GPRSInit();
  366.         while(1)
  367.         {
  368.          
  369.                      
  370.              control(); //控制
  371.              key();   //按键功能

  372.             
  373.          GPRSInit();
  374.          send_GPRSdata();
  375.                  
  376.          
  377.                   
  378.                   
  379.                
  380.                   if(sendFlag==0)
  381.                         {
  382.                         sendFlag=1; //代表已经发过一次,不在发了
  383.                         Send_SMS(); //发送短信

  384.                         }
  385.                   
  386.                           rec_cc2530data();
  387.                           delay1ms(50);
  388.                     display();
  389.                           delay1ms(50);

  390.         }

  391. }



  392.    void serial()interrupt 4                //串口中断服务函数
  393.   {
  394.    static uchar j;
  395.    
  396.    if(!RI);
  397.    RI=0;                    //清楚接收完毕标志
  398.    date[j]=SBUF;
  399.    if(date[0]==0x55)  //判断接收到的第一位为传感器所发数据
  400.       j++;
  401.   else
  402.       j=0;


  403.    if(j==5)                   //接收传感器所发数据字节
  404.      j=0;
  405.   
  406.    
  407.   }
  408. void timer0() interrupt  1 //50ms
  409. {
  410. static uchar count=0,miao=0;
  411.         
  412.   TL0 = 0x00;                //设置定时初值
  413.         TH0 = 0x4C;                //设置定时初值
  414.   count++;
  415.         if(count>20)
  416.         {
  417.                 count=0;
  418.            miao++;
  419.                 if(miao>60)
  420.                 {
  421.                         
  422.                         miao=0;
  423.                   fen++;
  424.                         if(fen>=1)
  425.                         {
  426.                           fen=0;
  427.                                 sendFlag=0;
  428.                         }
  429.                 }
  430.                
  431.         }

  432. }
复制代码





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

使用道具 举报

沙发
ID:584814 发表于 2020-5-14 13:48 | 只看该作者
目测都已经写在主函数main中了
回复

使用道具 举报

板凳
ID:279295 发表于 2020-5-18 23:01 | 只看该作者
man1234567 发表于 2020-5-14 13:48
目测都已经写在主函数main中了

但是GPRSInit();send_GPRSdata();这两个没反应
回复

使用道具 举报

地板
ID:754594 发表于 2020-5-19 13:03 | 只看该作者
我和问题不一样,但看看类似的程序,看看范例就可以了,看懂了,可以自己改
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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