找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2066|回复: 1
收起左侧

0.96OLED单片机万年历程序 GA6走AT指令

[复制链接]
ID:393260 发表于 2020-6-13 16:34 | 显示全部楼层 |阅读模式
发现一个两年前写的东西,可以自定义闹钟个数(为了稳妥我设置最多6个),超时报警,1分钟无人按下取消闹钟会发送短信给用户。
有个问题就是GA6走AT指令,发完短信有程序概率GG,也懒得去修改了。
确定好用,之前开出工厂板,焊接上就能跑,需要自己取,本人不提供任何技术支持。

单片机源程序如下:
  1. #include "REG51.h"
  2. #include "oled.h"
  3. #include "bmp.h"
  4. #include "24c02.h"
  5. #include "ds1302.h"
  6. #include "string.h"
  7. #include "GA6_module_errors.h"


  8. #define uchar unsigned char
  9. #define uint  unsigned int

  10. #define Buf_Max                    70         //串口1缓存长度
  11. #define STABLE_TIMES          20        //等待上电后稳定
  12. #define UART1_SendLR() UART1_SendData(0X0D)

  13.         //DS1302引脚定义,可根据实际情况自行修改端口定义
  14. uint aa;
  15. unsigned char pp;
  16. bit close;
  17. bit dunxin_Flag = 0;
  18. bit led = 0;

  19. //初始时间定义
  20. uchar time_buf[8] = {0x20,0x10,0x09,0x14,0x23,0x59,0x50,0x02};//初始时间
  21. uchar readtime[14];//当前时间
  22. uchar set[16] = {0x02,0x00,0x00,0x05,0x00,0x05,0x01,0x08,0x01,0x07,0x00,0x00,0x00,0x08,0x03,0x00};//年月日的每一位
  23. uchar sec_buf=0;  //秒缓存
  24. uchar sec_flag=0; //秒标志位

  25. //多组闹钟设置变量区
  26. uchar nao_change;
  27. uchar nao_number;                                                        //闹钟总个数
  28. uchar nao_this;                                 //当前时那个闹钟
  29. uchar nao_temp_number[4];                        //存放当前修改闹钟处
  30. uchar ten_delay[4];


  31. xdata uchar Uart1_Buf[Buf_Max];
  32. uchar First_Int = 0;

  33. static uchar  *phone_num = "AT+CMGS=\"15142345200\""; //拨打电话,修改这里可以修改拨打的电话。

  34. uint count_20ms;

  35. int ret;
  36. //功能:延时1毫秒
  37. //入口参数:x
  38. //出口参数:无
  39. //说明:晶振为12M

  40. /***********************按键定义*************************************************/
  41. sbit key1=P2^0;
  42. sbit key2=P2^1;
  43. sbit key3=P2^2;
  44. sbit key4=P0^1;
  45. uchar status=0,sta=0;//按键功能选择定义(年0,月1,日2,时3,分4 )
  46. /////////////////////////////////////////////

  47. sbit key_stop = P0^2;

  48. ////////////////
  49. sbit BEEZ = P0^7;
  50. sbit LED_B = P2^3;
  51. sbit LED_G = P2^4;
  52. sbit LED_R = P2^5;

  53. void delay_ms1(uint ms);   //延时ms个20ms  ms*20ms
  54. void CLR_Buf(void);      //清串口接收缓存
  55. uchar          Find(uchar *a);        //查找字符串
  56. void UART1_SendData(uchar dat);   //串口1发送 1字节
  57. void UART1_SendString(char *s);//串口1发送 字符串
  58. void UART1_Send_Command(char *s);
  59. uchar   UART1_Send_AT_Command(uchar *b,uchar *a,uchar wait_time,uint interval_time);//at命令发送
  60. uchar UART1_Send_AT_Command_END(uchar *b,uchar *a,uchar wait_time,uint interval_time);

  61. uchar Wait_CREG(uchar query_times);


  62. //
  63. void Timer0Init(void)                //20毫秒@115200
  64. {
  65.         TMOD &= 0xF0;               
  66.         TMOD |= 0x01;                //
  67.         TL0 = (65536-20000)%256;                //
  68.         TH0 = (65536-20000)/256;                //
  69.         TF0 = 0;                //
  70.         ET0 = 1;              //
  71.         TR0 = 1;                //开始计时
  72. }

  73. void Uart1Init(void)                //9600bps@11.05926MHz
  74. {
  75.         PCON &= 0x7F;                //
  76.         SCON = 0x50;                //
  77.         TMOD &= 0x0F;                //
  78.         TMOD |= 0x20;                //
  79.         TL1 = 0xFD;                  //
  80.         TH1 = 0xFD;                  //
  81.         ET1 = 0;                    //
  82.         TR1 = 1;                    //
  83.         ES  = 1;                                        //
  84. }

  85. int check_status(void)
  86. {
  87.         int ret;
  88.        
  89.         ret = UART1_Send_AT_Command("AT","OK",3,50);//测试通信是否成功
  90.         if(ret == 0)
  91.         {
  92.                 return COMMUNITE_ERROR;
  93.         }
  94.        
  95.         ret = UART1_Send_AT_Command("AT+CPIN?","READY",2,50);//查询卡是否插上
  96.         if(ret == 0)
  97.         {
  98.                 return NO_SIM_CARD_ERROR;
  99.         }
  100.        
  101.         ret = Wait_CREG(3);//查询卡是否注册到网络
  102.         if(ret == 0)
  103.         {
  104.                 return SIM_CARD_NO_REG_ERROR;
  105.         }
  106.         return 1;
  107. }

  108. /***************************************************************
  109. 注:当然你可以返回其他值,来确定到底是哪一步发送指令出现失败了。
  110. ****************************************************************/
  111. int send_text_message(char *content)
  112. {
  113.         uchar ret;
  114.         char end_char[2];
  115.        
  116.         end_char[0] = 0x1A;//结束字符
  117.         end_char[1] = '\0';
  118.        
  119.         //设置存储位置
  120.         ret = UART1_Send_AT_Command("AT+CPMS=\"SM\",\"ME\",\"SM\"","OK",3,100);
  121.         if(ret == 0)
  122.         {
  123.                 return AT_CPMS_ERROR;
  124.         }
  125.        
  126.         ret = UART1_Send_AT_Command("AT+CMGF=1","OK",3,50);//配置为TEXT模式
  127.         if(ret == 0)
  128.         {
  129.                 return AT_CMGF_ERROR;
  130.         }
  131.        
  132.        
  133.         ret = UART1_Send_AT_Command("AT+CSCS=\"GSM\"","OK",3,50);//设置字符格式
  134.         if(ret == 0)
  135.         {
  136.                 return AT_CSCS_ERROR;
  137.         }
  138.        
  139.         ret = UART1_Send_AT_Command(phone_num,">",3,50);//输入收信人的电话号码
  140.         if(ret == 0)
  141.         {
  142.                 return AT_CMGS_ERROR;
  143.         }
  144.        
  145.         UART1_SendString(content); //此函数发送短信内容 不加回车换行
  146.         ret = UART1_Send_AT_Command_END(end_char,"OK",1,250);//发送结束符,等待返回ok,等待5S发一次,因为短信成功发送的状态时间比较长
  147.         if(ret == 0)
  148.         {
  149.                 return END_CHAR_ERROR;
  150.         }
  151.        
  152.         return 1;
  153. }

  154. ///////

  155. void delay(uint t)  
  156. {
  157. uint b;
  158. for(;t;t--)
  159.   for(b=0;b<121;b++);
  160. }

  161. void Delay_xms(uint x)
  162. {
  163.   uint i,j;
  164.   for(i=0;i<x;i++)
  165.     for(j=0;j<112;j++);
  166. }

  167. /******************************************************************************/
  168. /*****************************按键功能函数*************************************/
  169. void key_1()     //选择变量函数
  170. {
  171.        
  172.          key1=1;
  173.          if(key1==0)
  174.           delay(10);                                                                                                                                                                                                                               
  175.          {
  176.           if(key1==0)
  177.           {
  178.            if(++status>12)
  179.                  {
  180.                                 if(++sta>4)
  181.                                 {
  182.                                         sta = 0;
  183.                                         status = 0;
  184.                                 }

  185.                  } //1控制年千位的变化,2控制年百位的变化,3控制年十位的变化
  186.           }       //4控制年个位的变化,5控制月十位的变化,6月个位,
  187.           while(key1==0);
  188.          }
  189. }

  190. ////////////////////////////////////////////////////////////////////////////
  191. void key_4()
  192. {
  193.         key4= 1;
  194.         if(key4==0)
  195.         {
  196.                 delay(10);
  197.                 if(key4==0)
  198.                 {
  199.                         if(++nao_change>2)
  200.                         {
  201.                                 nao_change = 0;
  202.                         }
  203.                 }
  204.         }
  205.         while(key4==0);
  206. }
  207. ////////////////////////////////////////////////////////////////////////////////

  208. /******************************************************************************/
  209. void key_2()       //加函数
  210. {
  211.        
  212.          key2=1;
  213.          if(key2==0)
  214.          {
  215.                   delay(10);
  216.                   if(key2==0)
  217.                   {
  218.                    switch(status)
  219.                    {
  220.                             case 1:if(++set[0]>9)set[0]=0;break;
  221.                             case 2:if(++set[1]>9)set[1]=0;break;
  222.                             case 3:if(++set[2]>1)set[2]=0;break;
  223.                             case 4:if(++set[3]>9)set[3]=1;break;
  224.                             case 5:if(++set[4]>9)set[4]=0;break;
  225.                                   case 6:if(++set[5]>9)set[5]=0;break;
  226.                                   case 7:if(++set[6]>9)set[6]=0;break;
  227.                                   case 8:if(++set[7]>9)set[7]=0;break;
  228.                                   case 9:if(++set[8]>9)set[8]=0;break;
  229.                                  case 10:if(++set[9]>9)set[9]=0;break;
  230.                                  case 11:if(++set[10]>9)set[10]=0;break;
  231.                                  case 12:if(++set[11]>9)set[11]=0;break;
  232.                    }
  233.                          
  234.                          switch(sta)
  235.                    {
  236.                            case 1:if(++set[12]>2)set[12]=0;break;
  237.                                  case 2:if(++set[13]>9)set[13]=0;break;
  238.                                  case 3:if(++set[14]>5)set[14]=0;break;
  239.                                  case 4:if(++set[15]>9)set[15]=0;break;         
  240.                    }
  241.                          
  242.                          switch(nao_change)
  243.                          {
  244.                                  case 1:if(++nao_number>6)nao_number=6;write24c02(250,nao_number);break; //这里写修改闹钟总个数
  245.                                  case 2:if(++nao_this>nao_number)nao_this=nao_number;write24c02(251,nao_this);break; //这里修改当前数值
  246.                          }
  247.                          
  248.           }
  249.         while(key2==0);
  250.          }
  251. }
  252. /*****************************************************************************/
  253. void key_3()//减函数
  254. {
  255.        
  256.           key3=1;
  257.          if(key3==0)
  258.          {
  259.                   delay(10);
  260.                   if(key3==0)
  261.                   {
  262.                    switch(status)
  263.                    {
  264.                             case 1:if((set[0]--)<=0)set[0]=9;break;
  265.                             case 2:if((set[1]--)<=0)set[1]=9;break;
  266.                             case 3:if((set[2]--)<=0)set[2]=1;break;
  267.                             case 4:if((set[3]--)<1)set[3]=9;break;
  268.                             case 5:if((set[4]--)<=0)set[4]=9;break;
  269.                                   case 6:if((set[5]--)<=0)set[5]=9;break;
  270.                                   case 7:if((set[6]--)<=0)set[6]=9;break;
  271.                                   case 8:if((set[7]--)<=0)set[7]=9;break;
  272.                                   case 9:if((set[8]--)<=0)set[8]=9;break;
  273.                                   case 10:if((set[9]--)<=0)set[9]=9;break;
  274.                                  case 11:if((set[10]--)<=0)set[10]=9;break;
  275.                                  case 12:if((set[11]--)<=0)set[11]=9;break;
  276. //                                 case 13:if((set[12]--)<=0)set[12]=9;break;
  277. //                                 case 14:if((set[13]--)<=0)set[13]=9;break;
  278. //                                 case 15:if((set[14]--)<=0)set[14]=9;break;
  279. //                                 case 16:if((set[15]--)<=0)set[15]=9;break;
  280.                    }
  281.                          switch(sta)
  282.                    {
  283.                            case 1:if((set[12]--)<=0)set[12]=2;break;
  284.                                  case 2:if((set[13]--)<=0)set[13]=9;break;
  285.                                  case 3:if((set[14]--)<=0)set[14]=5;break;
  286.                                  case 4:if((set[15]--)<=0)set[15]=9;break;         
  287.                    }
  288.                          
  289.                          switch(nao_change)
  290.                          {
  291.                                  case 1:if((nao_number--)<=1)nao_number=1;write24c02(250,nao_number);break; //这里写修改闹钟总个数
  292.                                  case 2:if((nao_this--)<=1)nao_this=1;
  293.                                                                 if(nao_this>nao_number)nao_this=nao_number;
  294.                                                                 write24c02(251,nao_this);break; //这里修改当前数值
  295.                          }
  296.                          
  297.                   }
  298.                   while(key3==0);
  299.          }
  300. }


  301. /*****************************************************************************/
  302. void key_time()    //按键设置时间的处理
  303. {
  304. if(status>0)
  305. {
  306.          ds1302_write_time(time_buf,set);
  307. }
  308. }
  309. ///////////////////////////////闹钟/////////////////////

  310. void naozhong()    //闹钟
  311. {
  312.         if((readtime[8]==set[12])&&(readtime[9]==set[13])&&(readtime[10]==set[14])&&(readtime[11]==set[15])&&(readtime[12]==0)&&(readtime[13]==0))
  313.         {   
  314.                 led = 1;
  315.                 ten_delay[0] = set[12];
  316.                 ten_delay[1] = set[13];
  317.                 ten_delay[2] = set[14];
  318.                 ten_delay[3] = set[15]+1;
  319.                 if(nao_this>=nao_number)
  320.                 {
  321.                         nao_this=1;
  322.                 }
  323.                
  324.                 nao_this++;
  325.                 write24c02(251,nao_this);
  326.         }
  327.         if((readtime[8]==ten_delay[0])&&(readtime[9]==ten_delay[1])&&(readtime[10]==ten_delay[2])&&(readtime[11]==ten_delay[3]))
  328.         {
  329.                 //响应闹钟10分钟后,发送短信
  330.                 dunxin_Flag = 1;
  331.                 led = 0;
  332.         }
  333. }

  334. void stop()
  335. {
  336.        
  337.          key_stop=1;
  338.         if(led == 1)
  339.         {
  340.          if(key_stop==0)
  341.           delay(10);                                                                                                                                                                                                                               
  342.          {
  343.           if(key_stop==0)
  344.           {
  345.            led =0;
  346.           }      
  347.           while(key_stop==0);
  348.                 //记录此刻时间点  6 到 9
  349.                 write24c02(100,set[6]);
  350.                 write24c02(101,set[7]);
  351.                 write24c02(102,set[8]);
  352.                 write24c02(103,set[9]);
  353.                 }
  354. }
  355. }

  356. void Time_chack()
  357. {
  358.                 set[0] = readtime[2];
  359.                 set[1] = readtime[3];
  360.                 set[2] = readtime[4];
  361.                 set[3] = readtime[5];
  362.                 set[4] = readtime[6];
  363.                 set[5] = readtime[7];
  364.                 set[6] = readtime[8];
  365.                 set[7] = readtime[9];
  366.                 set[8] = readtime[10];
  367.                 set[9] = readtime[11];
  368.                 set[10] = readtime[12];
  369.                 set[11] = readtime[13];
  370. }

  371. void BEEZ_Waring()
  372. {
  373.         if(led)
  374.         {
  375.                 BEEZ = 0;   //opens
  376.                 LED_B = 0;
  377.                 LED_G = 0;
  378.                 LED_R = 0;
  379.         }
  380.         else
  381.         {
  382.                 BEEZ = 1;
  383.                 LED_B = 1;
  384.                 LED_G = 1;
  385.                 LED_R = 1;
  386.         }
  387. }


  388. /////////////////////////////////////////////////////////
  389. int main(void)
  390. {       
  391.         uchar i;
  392.        
  393.         BEEZ = 1;
  394.         LED_B = 1;
  395.         LED_G = 1;
  396.         LED_R = 1;
  397.         //读取闹钟时间
  398. //        write24c02(250,1);write24c02(251,1);//初始化闹钟个数
  399.         //

  400.         nao_number = read24c02(250);
  401.         nao_this= read24c02(251);
  402.         //读取结束
  403.         Delay_xms(50);//等待系统稳定
  404.         ds1302_init(); //DS1302初始化
  405.         // Uart_init(0); //波特率初始化为2400
  406.         Delay_xms(10);
  407. //        ds1302_write_time(); //写入初始值
  408.         OLED_Init();                        //初始化OLED  
  409.         OLED_Clear();
  410.        
  411.         OLED_InitDIsply_DS1302(); //显示固定UI
  412.         //up all right

  413.         Uart1Init(); //串口初始化
  414.         Timer0Init();//TIM0初始化
  415.         EA = 1;      //开启总中断

  416.         for(i = 0;i < STABLE_TIMES;i++)//等待网络稳定
  417.         {
  418.                 delay_ms1(50);
  419.         }

  420.         while(1)
  421.         {       
  422.                
  423.                 set[12] = read24c02(nao_this*4-3);  //1    5
  424.                 set[13] = read24c02(nao_this*4-2);  //2    6
  425.                 set[14] = read24c02(nao_this*4-1);  //3    7
  426.                 set[15] = read24c02(nao_this*4-0);  //4    8

  427.                
  428.                 ds1302_read_time(time_buf,readtime);  //读取时间
  429.                 //set = readtime
  430.                 //start 0 to over 11
  431.                
  432.                 Time_chack();
  433.                
  434.     OLED_Disply_DS1302(readtime,set);
  435.                 //显示吃药时间
  436.                 OLED_ShowNum(45,6,(read24c02(100)),1,16);//
  437.                 OLED_ShowNum(54,6,(read24c02(101)),1,16);
  438.                 OLED_ShowNum(72,6,(read24c02(102)),1,16);
  439.                 OLED_ShowNum(81,6,(read24c02(103)),1,16);
  440.                
  441.                 OLED_ShowNum(0,6,nao_number,1,16);
  442.                 OLED_ShowNum(18,6,nao_this,1,16);
  443.                
  444.                 Disply_Time_Mark(status,sta,nao_change);
  445.                 key_1();
  446.                 key_2();
  447.                 key_3();
  448.                 key_4();
  449.                 key_time();
  450.                 naozhong();
  451.                 stop();
  452.                
  453.                 if(!((nao_temp_number[0] == set[12]) && (nao_temp_number[1] == set[13]) && (nao_temp_number[2] == set[14]) &&(nao_temp_number[3] == set[15])))
  454.                 {
  455.                         write24c02(nao_this*4-3,set[12]); //this 1 存放到 1  0    this 2 存放到 5  1
  456.                         write24c02(nao_this*4-2,set[13]); //this 1 存放到 2  0    this 2 存放到 6  1
  457.                         write24c02(nao_this*4-1,set[14]); //this 1 存放到 3  5    this 2 存放到 7  0
  458.                         write24c02(nao_this*4-0,set[15]); //this 1 存放到 4  5    this 2 存放到 8  0
  459.                         nao_temp_number[0] = set[12];
  460.                         nao_temp_number[1] = set[13];
  461.                         nao_temp_number[2] = set[14];
  462.                         nao_temp_number[3] = set[15];
  463.                 }

  464.                 BEEZ_Waring();
  465.                 if(dunxin_Flag)
  466.                 {
  467.                         dunxin_Flag = 0;
  468.                         if(ret == 1)
  469.                         {
  470.                                 ret = send_text_message("waring!");//发送TEXT短信
  471.                         }
  472.                 }
  473.         }
  474.        
  475. }          

  476. void Timer0_ISR() interrupt 1
  477. {
  478.         TR0=0;//关定时器
  479.         TL0 = (65536-20000)%256;                //重设定时器初值
  480.         TH0 = (65536-20000)/256;                //
  481.        
  482.         if(count_20ms > 0) //20ms延时计数器
  483.         {
  484.                 count_20ms--;
  485.         }       
  486.        
  487.         TR0=1;//开定时器
  488. }


  489. /********************* UART1中断函数************************/
  490. void UART1_ISR (void) interrupt 4
  491. {
  492.         if (RI)
  493.         {
  494.                 RI = 0;                           //清除RI位
  495.                 Uart1_Buf[First_Int] = SBUF;            //将接收到的字符串存到缓存中
  496.                 First_Int++;                          //缓存指针向后移动
  497.                 if(First_Int >= Buf_Max)                 //如果缓存满,将缓存指针指向缓存的首地址
  498.                 {
  499.                         First_Int = 0;
  500.                 }               
  501.         }
  502.         if (TI)
  503.         {
  504.                 TI = 0;                          //清除TI位
  505.         }
  506. }


  507. /*******************************************************************************
  508. * 函数名 : CLR_Buf
  509. * 描述   : 清除串口2缓存数据
  510. * 输入   :
  511. * 输出   :
  512. * 返回   :
  513. * 注意   :
  514. *******************************************************************************/
  515. void CLR_Buf(void)
  516. {
  517.         uchar k;
  518.         for(k=0;k<Buf_Max;k++)      //将缓存内容清零
  519.         {
  520.                 Uart1_Buf[k] = 0x00;
  521.         }
  522.     First_Int = 0;              //接收字符串的起始存储位置
  523. }


  524. /*******************************************************************************
  525. * 函数名 : Find
  526. * 描述   : 判断缓存中是否含有指定的字符串
  527. * 输入   :
  528. * 输出   :
  529. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  530. * 注意   :
  531. *******************************************************************************/

  532. uchar Find(uchar *a)
  533. {
  534.         ES = 0;  //改进程序
  535.         if(strstr(Uart1_Buf,a)!=NULL)
  536.         {
  537.                 ES = 1;
  538.                 return 1;
  539.         }       
  540.         else
  541.         {
  542.                 ES = 1;
  543.                 return 0;
  544.         }
  545.                
  546. }



  547. /*******************************************************************************
  548. * 函数名 : Wait_CREG
  549. * 描述   : 等待模块注册成功
  550. * 输入   :
  551. * 输出   :
  552. * 返回   :
  553. * 注意   :
  554. *******************************************************************************/
  555. uchar Wait_CREG(uchar query_times)
  556. {
  557.         uchar i;
  558.         uchar k;
  559.         uchar j;
  560.         i = 0;
  561.         CLR_Buf();
  562.         while(i == 0)                               
  563.         {

  564.                 UART1_Send_Command("AT+CREG?");
  565.                 delay_ms1(100);
  566.                
  567.                 for(k=0;k<Buf_Max;k++)                             
  568.                 {
  569.                         if((Uart1_Buf[k] == '+')&&(Uart1_Buf[k+1] == 'C')&&(Uart1_Buf[k+2] == 'R')&&(Uart1_Buf[k+3] == 'E')&&(Uart1_Buf[k+4] == 'G')&&(Uart1_Buf[k+5] == ':'))
  570.                         {
  571.                                          
  572.                                 if((Uart1_Buf[k+7] == '1')&&((Uart1_Buf[k+9] == '1')||(Uart1_Buf[k+9] == '5')))
  573.                                 {
  574.                                         i = 1;
  575.                                         return 1;
  576.                                 }
  577.                                
  578.                         }
  579.                 }
  580.                 j++;
  581.                 if(j > query_times)
  582.                 {
  583.                         return 0;
  584.                 }
  585.                
  586.         }
  587.         return 0;
  588. }



  589. /*----------------------------
  590. UART1 发送串口数据
  591. -----------------------------*/
  592. void UART1_SendData(uchar dat)
  593. {
  594.         ES=0;                        //关串口中断
  595.         SBUF=dat;                       
  596.         while(TI!=1);        //等待发送成功
  597.         TI=0;                        //清除发送中断标志
  598.         ES=1;                        //开串口中断
  599. }
  600. /*----------------------------
  601. UART1 发送字符串
  602. -----------------------------*/
  603. void UART1_SendString(char *s)
  604. {
  605.         while(*s)//检测字符串结束符
  606.         {
  607.                 UART1_SendData(*s++);//发送当前字符
  608.         }
  609. }

  610. /**********************************
  611. 发送命令
  612. **********************************/
  613. ……………………

  614. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png

所有资料51hei提供下载:
writebug代码.zip (131.24 KB, 下载次数: 8)

评分

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

查看全部评分

回复

使用道具 举报

ID:393260 发表于 2020-6-13 16:39 | 显示全部楼层
想要发短信,记得把号码改了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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