找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于GSM的智能家居的单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:299784 发表于 2018-12-16 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为转化格式错误,汉子有点乱码,但不影响使用!.
不乱的可以看下一个注释有,
只可以发短信,让后采集温湿度,火焰,co,co2,光照强度,红外,屏幕是12864,
没有仿真,注释很详细,GSM是串口是固定的,
要用的拿

单片机源码如下:
  1. /**********************************************************************************
  2. * 工程名  :发送文本短信
  3. * 描述    :通过C51开发板控制模块发送一条TEXT短信
  4. * 实验平台:C51
  5. * 库版本  :
  6. * 硬件连接说明
  7.          使用单片串口与GPRS模块通信
  8.          C51        GPRS模块
  9.          P30 (RXD)->RXD
  10.          P31 (TXD)->TXD
  11.          GND            ->GND

  12. * 软件功能说明
  13.    板子上电后运行指示灯RUNING_LED会以一秒的频率闪烁
  14.          打开代码修改短信中心号、接收方手机号和短信内容,编译成功后下载到单片机里面,就可以实现发送一条文本短信
  15. **********************************************************************************/
  16. #include "config.h"
  17. #include "string.h"
  18. #include "delay.h"
  19. #include "uart.h"
  20. #include <reg51.h>  
  21. #include <stdlib.h>  
  22. #include <intrins.h>  
  23. #include <stdio.h>
  24. #include  <math.h>


  25. unsigned char receiveData[8];

  26. #define uchar unsigned char  
  27. #define uint  unsigned int
  28. #define          SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改                              //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
  29. typedef   unsigned char BYTE;
  30. typedef   unsigned short WORD;

  31. xdata BYTE    BUF[8];                         //接收数据缓存区              
  32. xdata int dis_data;                       //变?
  33. xdata float temp;
  34. /////////////////////温湿度
  35. bit flag_300ms ;
  36. xdata uchar flat=1;
  37. xdata uchar data_byte;
  38. xdata uchar RH,TH;

  39. xdata uchar c;




  40. void delay_nms(unsigned int k);
  41. void InitLcd();
  42. void Init_BH1750(void);

  43. void WriteDataLCM(uchar dataW);
  44. void WriteCommandLCM(uchar CMD,uchar Attribc);
  45. void DisplayOneChar(uchar X,uchar Y,uchar DData);
  46. void conversion(uint temp_data);

  47. void  Single_Write_BH1750(uchar REG_Address);               //单个写入数据
  48. uchar Single_Read_BH1750(uchar REG_Address);                //单个读取内部寄存器数据
  49. void  Multiple_Read_BH1750();                               //连续的读取内部寄存器数据
  50. //------------------------------------
  51. void Delay5us();
  52. void Delay5ms();


  53. void BH1750_Start();                    //起始信号
  54. void BH1750_Stop();                     //停止信号
  55. void BH1750_SendACK(bit ack);           //应答ACK
  56. bit  BH1750_RecvACK();                  //读ack
  57. void BH1750_SendByte(BYTE dat);         //IIC单个字节写
  58. BYTE BH1750_RecvByte();                 //IIC单个字节读





  59. uchar code dak[]="  ";        
  60. uchar code dav[16]="烟雾浓度:";
  61. uchar code daco[16]="CO浓度:";
  62. uchar code dag[]="光照强度:";        
  63. uchar code daw[]="温度:";        
  64. uchar code das[]="湿度:";        

  65. uchar dat[16];

  66. ////////12864接线
  67. sbit CS  = P2^7;//第4根线  RS  
  68. sbit SID = P2^6;//第5根线  RW  
  69. sbit SCK = P2^5;//第6根线  E



  70. sbit          ND1 = P2^0 ;        //浓度
  71. sbit          ND2 = P2^1 ;        //浓度
  72. sbit    io  = P2^2 ;        //dht11(口线定义)
  73. sbit    yin = P2^3;       //声音
  74. sbit    ren = P2^4;     //人体感应
  75. sbit    huo = P0^2;     //火焰感应


  76. sbit    beep = P0^3;    //蜂鸣器



  77. sbit          SCL=P0^1;      //IIC时钟引脚定义
  78. sbit          SDA=P0^0;      //IIC数据引脚定义


  79. uchar ad_data,adc,s,dianliu;



  80. void Delay5us()
  81. {
  82.     _nop_();_nop_();_nop_();_nop_();
  83.     _nop_();_nop_();_nop_();_nop_();
  84.         _nop_();_nop_();_nop_();_nop_();
  85.         _nop_();_nop_();_nop_();_nop_();
  86. }

  87. void Delay5ms()
  88. {
  89.     WORD n = 560;

  90.     while (n--);
  91. }



  92. void BH1750_Start()
  93. {
  94.     SDA = 1;                    //拉高数据线
  95.     SCL = 1;                    //拉高时钟线
  96.     Delay5us();                 //延时
  97.     SDA = 0;                    //产生下降沿
  98.     Delay5us();                 //延时
  99.     SCL = 0;                    //拉低时钟线
  100. }


  101. void BH1750_Stop()
  102. {
  103.     SDA = 0;                    //拉低数据线
  104.     SCL = 1;                    //拉高时钟线
  105.     Delay5us();                 //延时
  106.     SDA = 1;                    //产生上升沿
  107.     Delay5us();                 //延时
  108. }


  109. void BH1750_SendACK(bit ack)
  110. {
  111.     SDA = ack;                  //写应答信号
  112.     SCL = 1;                    //拉高时钟线
  113.     Delay5us();                 //延时
  114.     SCL = 0;                    //拉低时钟线
  115.     Delay5us();                 //延时
  116. }


  117. bit BH1750_RecvACK()
  118. {
  119.     SCL = 1;                    //拉高时钟线
  120.     Delay5us();                 //延时
  121.     CY = SDA;                   //读应答信号
  122.     SCL = 0;                    //拉低时钟线
  123.     Delay5us();                 //延时

  124.     return CY;
  125. }


  126. void BH1750_SendByte(BYTE dat)
  127. {
  128.     BYTE i;

  129.     for (i=0; i<8; i++)         //8位计数器
  130.     {
  131.         dat <<= 1;              //移出数据的最高位
  132.         SDA = CY;               //送数据口
  133.         SCL = 1;                //拉高时钟线
  134.         Delay5us();             //延时
  135.         SCL = 0;                //拉低时钟线
  136.         Delay5us();             //延时
  137.     }
  138.     BH1750_RecvACK();
  139. }


  140. BYTE BH1750_RecvByte()
  141. {
  142.     BYTE i;
  143.     BYTE dat = 0;

  144.     SDA = 1;                    //使能内部上拉,准备读取数据,
  145.     for (i=0; i<8; i++)         //8位计数器
  146.     {
  147.         dat <<= 1;
  148.         SCL = 1;                //拉高时钟线
  149.         Delay5us();             //延时
  150.         dat |= SDA;             //读数据               
  151.         SCL = 0;                //拉低时钟线
  152.         Delay5us();             //延时
  153.     }
  154.     return dat;
  155. }


  156. void Single_Write_BH1750(uchar REG_Address)
  157. {
  158.     BH1750_Start();                  //起始信号
  159.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
  160.     BH1750_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
  161.   //  BH1750_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
  162.     BH1750_Stop();                   //发送停止信号
  163. }
  164. void Multiple_read_BH1750(void)
  165. {   xdata uchar i;        
  166.     BH1750_Start();                          //起始信号
  167.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  168.         
  169.          for (i=0; i<3; i++)                      //连续读取6个地址数据,存储中BUF
  170.     {
  171.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  172.         if (i == 3)
  173.         {

  174.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
  175.         }
  176.         else
  177.         {               
  178.           BH1750_SendACK(0);                //回应ACK
  179.        }
  180.    }

  181.     BH1750_Stop();                          //停止信号
  182.     Delay5ms();
  183. }




  184. void Init_BH1750()
  185. {
  186.    Single_Write_BH1750(0x01);  

  187. }


  188. uchar code AC_TABLE[]={  
  189. 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,    //第一行汉字位置   
  190. 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,    //第二行汉字位置   
  191. 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,    //第三行汉字位置   
  192. 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,    //第四行汉字位置   
  193. };  
  194. /********************************
  195. 名称:SendByte  
  196. 功能:串口发送一个字节
  197. *********************************/  
  198. void SendByte(uchar Dbyte)  
  199. {  
  200.     xdata uchar i;  
  201.      for(i=0;i<8;i++)  
  202.      {  
  203.            SCK = 0;  
  204.            Dbyte=Dbyte<<1;      
  205.            SID = CY;            
  206.            SCK = 1;  
  207.            SCK = 0;  
  208.      }  
  209. }




  210. /***********接收一个字节****/  
  211. uchar ReceiveByte(void)  
  212. {  
  213.     xdata uchar i,temp1,temp2;  
  214.      temp1 = 0;  
  215.      temp2 = 0;  
  216.      for(i=0;i<8;i++)  
  217.      {  
  218.            temp1=temp1<<1;  
  219.            SCK = 0;  
  220.            SCK = 1;              
  221.            SCK = 0;  
  222.            if(SID) temp1++;  
  223.      }  
  224.      for(i=0;i<8;i++)  
  225.      {  
  226.            temp2=temp2<<1;  
  227.            SCK = 0;  
  228.            SCK = 1;  
  229.            SCK = 0;  
  230.            if(SID) temp2++;  
  231.      }  
  232.      return ((0xf0&temp1)+(0x0f&temp2));  
  233. }  

  234. void CheckBusy( void )  
  235. {  
  236.      do   SendByte(0xfc);        
  237.      while(0x80&ReceiveByte());      
  238. }  

  239. void WriteCommand(uchar Cbyte )  
  240. {  
  241.      CS = 1;  
  242.      CheckBusy();  
  243.      SendByte(0xf8);              
  244.      SendByte(0xf0&Cbyte);      
  245.      SendByte(0xf0&Cbyte<<4);  
  246.      CS = 0;  
  247. }  

  248. void WriteData(uchar Dbyte )  
  249. {  
  250.      CS = 1;  
  251.      CheckBusy();  
  252.      SendByte(0xfa);              
  253.      SendByte(0xf0&Dbyte);        
  254.      SendByte(0xf0&Dbyte<<4);  
  255.      CS = 0;  
  256. }  

  257. uchar ReadData( void )  
  258. {  
  259.      CheckBusy();  
  260.      SendByte(0xfe);              
  261.      return ReceiveByte();  
  262. }  

  263. void Delay(uint MS)  
  264. {  
  265.      xdata uchar us,usn;  
  266.      while(MS!=0)            
  267.       {   
  268.          usn = 2;  
  269.          while(usn!=0)  
  270.           {  
  271.             us = 0xf5;  
  272.             while (us!=0)  
  273.              {  
  274.                us--;  
  275.              };  
  276.             usn--;  
  277.            }  
  278.          MS--;  
  279.       }  
  280. }  



  281. void LcmInit( void )  
  282. {  
  283.      WriteCommand(0x30);        
  284.      WriteCommand(0x03);        
  285.      WriteCommand(0x0C);        
  286.      WriteCommand(0x01);        
  287.      WriteCommand(0x06);        
  288. }  

  289. void LcmClearTXT( void )  
  290. {  
  291.     xdata uchar i;  
  292.      WriteCommand(0x30);      
  293.      WriteCommand(0x80);        
  294.      for(i=0;i<64;i++)  
  295.      WriteData(0x20);  
  296. }     
  297. void write_str(uchar row,uchar col,uchar *puts)  
  298. {  
  299.      WriteCommand(0x30);      
  300.      WriteCommand(AC_TABLE[8*row+col]);     
  301.      while(*puts != '\0')        
  302.      {  
  303.            if(col==8)            
  304.            {              
  305.                  col='0';  
  306.                  row++;  
  307.            }  
  308.            if(row==4) row='0';      
  309.            WriteCommand(AC_TABLE[8*row+col]);  
  310.            WriteData(*puts);        
  311.            puts++;  
  312.            WriteData(*puts);  
  313.            puts++;  
  314.            col++;  
  315.      }  
  316. }  


  317. void DisplayDots(uchar DotByte)  
  318. {  
  319.     xdata uchar i,j;  
  320.      WriteCommand(0x34);      
  321.      WriteCommand(0x36);      
  322.      for(i=0;i<32;i++)            
  323.      {  
  324.            WriteCommand(0x80|i);      
  325.            WriteCommand(0x80);      
  326.            for(j=0;j<32;j++)      
  327.            {              
  328.               WriteData(DotByte);                    
  329.            }  
  330.            DotByte=~DotByte;  
  331.      }  
  332. }  

  333. unsigned long int poe(uchar a,uchar b)
  334. {
  335.         xdata unsigned long int result=1;//  初始化为 1
  336.                 for(;b>0;b--)
  337.         {
  338.                 result*=a;
  339.         }
  340. return result;
  341. }

  342. void write_num(uchar x,uchar y,unsigned long int num)
  343. {
  344.         xdata uchar i=10;
  345.         switch (x)
  346.         {
  347.                 case 0: WriteCommand(0x80+y);break;
  348.                 case 1: WriteCommand(0x90+y);break;
  349.                 case 2: WriteCommand(0x88+y);break;
  350.                 case 3: WriteCommand(0x98+y);break;
  351.                 default: ;
  352.         }
  353.         while(i>=1)
  354.         {
  355.                 if((uchar)(num/poe(10,i-1))!=0)
  356.                 break;
  357.                 i--;
  358.         }
  359.         while(i)
  360.         {
  361.                 WriteData(num/(unsigned long int)(poe(10,i-1))+'0');
  362.                 num=num%(unsigned long int)(poe(10,i-1));
  363.                 i--;
  364.         }   
  365. }

  366. void delayms(uint z)
  367. {
  368. xdata uint x,y;
  369.   for(x=z;x>0;x--)
  370.     for(y=110;y>0;y--);
  371. }

  372. void delayus(uint w)
  373. {
  374.   xdata uint x,y;
  375.   for(x=w;x>0;x--)
  376.     for(y=10;y>0;y--);
  377. }

  378. void Lcd_Write(unsigned char *dat)//*********************<LCD写数组>
  379. {
  380.         do{
  381.                 CS = 1;
  382.                 SID = 0;
  383.                 SCK = 0;
  384.                 s= *dat;
  385.                 delayms(5);
  386.                 SCK = 1;
  387.                 delayms(5);
  388.                 SCK = 0;
  389.         }while(*(dat++) != '\0');
  390. }







  391. void delay1()//延时10us
  392. {
  393.         uchar i;
  394.         i--;        i--;        i--;        i--;        i--;        i--;
  395. }

  396. void start()//开始信号
  397. {
  398.         io=1;
  399.         delay1();
  400.         io=0;
  401.         Delay(20);//>18ms
  402.         io=1;
  403.         delay1();//20-40us
  404.         delay1();
  405.         delay1();
  406.         delay1();
  407.         delay1();
  408. }
  409. uchar receive_byte()//接收一个字节
  410. {
  411.         uchar i,temp,count;
  412.         for(i=0;i<8;i++)
  413.         {
  414.          count=2;
  415.         while((!io)&&count++);        //判断数据位是0还是1
  416.                 delay1();delay1();delay1();delay1();
  417.                  temp=0;
  418.                 if(io==1)temp=1;        // 如果高电平高过预定0高电平值则数据位为 1
  419.                 count=2;
  420.                 while((io)&&count++);
  421.                 if(count==1)break;
  422.                 data_byte<<=1;        
  423.                 data_byte|=temp;
  424.         }
  425.         return (data_byte);
  426. }
  427. void receive()//接收数据
  428. {
  429.         uchar T_H,T_L,R_H,R_L,check,num_check;
  430.         uchar count;
  431.         start();//开始信号
  432.         io=1;
  433.         if(!io)//读取DHT11响应信号
  434.         {
  435.         
  436.          count=2;
  437.         while((!io)&&count++);                          //判断从机是否发出 80us 的高电平,若发出则开始采集数据
  438.            count=2;
  439.            while((io)&&count++);        
  440.                         R_H=receive_byte();                                   //采集湿度整数部分
  441.                         R_L=receive_byte();
  442.                         T_H=receive_byte();
  443.                         T_L=receive_byte();
  444.                         check=receive_byte();
  445.                         io=0;//拉低延时50us
  446.                         delay1();delay1();delay1();delay1();delay1();
  447.                         io=1;
  448.                         num_check=R_H+R_L+T_H+T_L;
  449.                         if(num_check=check)
  450.                         {
  451.                                 RH=R_H;
  452.                                 TH=T_H;
  453.                                 check=num_check;
  454.                         }
  455.                         }
  456. }


















  457. #define Automatic_Startup 1     //定义自启动 V1.2版本起有自启动功能

  458. #define Buf1_Max 200                                           //串口1缓存长度
  459. /*************        本地常量声明        **************/
  460. sbit RUNING_LED = P1^2;                                        //运行指示灯

  461. static unsigned char *SMS_Num="\"+8613800472500\"";//短信中心号 关于中心号的介绍可以看串口调试笔记的第二部分
  462. static unsigned char *phone="\"17361603954\"";     //短信接收方手机号
  463. static unsigned char *content="Stranger entering!!!";//发送短信内容
  464. static unsigned char *content1="fire fire fire!!!";//发送短信内容
  465. /*************  本地变量声明        **************/

  466. xdata u8 Uart1_Buf[Buf1_Max];

  467. u8 Times=0,First_Int = 0,shijian=0;

  468. bdata u8 Flag;//定时器标志位
  469. sbit Timer0_start =Flag^0;        //定时器0延时启动计数器


  470. /*************        本地函数声明        **************/
  471. void GPIO_config(void); //引脚初始化
  472. void Timer0Init(void);  //定时器0初始化
  473. void CLR_Buf1(void);    //清串口接收缓存
  474. u8 Find(u8 *a);         //查找字符串
  475. void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);  //发送指令
  476. void Wait_CREG(void);   //查询等待模块注册成功
  477. void Set_Text_Mode(void); //设置短信为TEXT模式
  478. void Send_Text_Sms(void); //发送一条TEXT短信
  479. /*************  外部函数和变量声明*****************/

  480. void beept()
  481. {
  482.                 u8 i;
  483.          for(i=1;i<20;i++)
  484.                 {
  485.      beep=~beep;
  486.            delayms(1);
  487.                 }
  488. }


  489. /*******************************************************************************
  490. * 函数名 : main
  491. * 描述   : 主函数
  492. * 输入   :
  493. * 输出   :
  494. * 返回   :
  495. * 注意   : 串口波特率是9600,GPRS模块默认波特率是115200,需要自己通过串口助手修改
  496.                                    为9600方可使用。
  497. *******************************************************************************/

  498. void main(void)
  499. {
  500.                          //OUT=0;      
  501.            LcmInit();             //液晶初始化
  502.      LcmClearTXT();          //清屏
  503.         
  504.                  Init_BH1750();       //初始化BH1750
  505.                  Lcd_Write(dat);
  506.                  write_str(3,0,daw);
  507.            write_str(3,4,das);
  508.                  write_str(0,0,dav);
  509.                  write_str(1,0,daco);
  510.            write_str(2,0,dag);
  511.         
  512.           // beep = 0;
  513.         while(1)
  514.         {
  515.         ////////////////////////////////温湿度
  516.                           receive();
  517.                          write_num(3,3,TH);           //温度显示
  518.                          write_num(3,7,RH);
  519.                          adc=ad_data;                                 
  520.                          delayms(2);
  521.                          if(ND1==1){
  522.                                  write_str(0,5,"低");
  523.                          }else{
  524.                           write_str(0,5,"高");
  525.                          }
  526.                           
  527.                         if(ND2==1){
  528.                                  write_str(1,5,"低");
  529.                          }else{
  530.                           write_str(1,5,"高");
  531.                          }                  
  532.                          ////////////////////////////////HHHHH
  533.                 Single_Write_BH1750(0x01);   // powher on
  534.     Single_Write_BH1750(0x10);   // H- resolution mode


  535.     Multiple_Read_BH1750();       //连续读出数据,存储在BUF中

  536.     dis_data=BUF[0];
  537.     dis_data=(dis_data<<8)+BUF[1];//合成数据

  538.     temp=(float)dis_data/1.2;
  539.                
  540.                 if(temp<100)
  541.                         {
  542.                         write_str(2,6,dak);
  543.                   }
  544.                 write_num(2,5,temp);        

  545. ///////////////////////////火焰  低有效
  546.                 if(huo==0)
  547.                         {
  548.                                 beept();
  549.                                 beep = 0;                                
  550.                   }
  551.                         
  552. //////////////////////////浓度  低电平有效
  553.                 if(ND1==0)
  554.                         {               
  555.                                 beept();
  556.                                 beep = 0;
  557.                   }
  558.                         if(ND2==0)
  559.                         {               
  560.                                 beept();
  561.                                 beep = 0;
  562.                   }
  563. if(temp>=1000&ren==1){              /////////////////////光照 人来
  564.                                 Timer0Init();  //初始化定时器0
  565.                                 GPIO_config();
  566.                                 EA=1;        //开总中断
  567.                                 Uart1Init();    //初始化串口9600
  568.                                 Wait_CREG();    //查询等待模块注册成功
  569.                                 Set_Text_Mode();//设置短信为TEXT模式
  570.                                 Send_Text_Sms();//发送一条短消息
  571.                 }
  572. while(ren==1){;}
  573.         }
  574.         
  575.         
  576.         /*if(ND1==0&TH>40&ND2==0){              /////////////////////
  577.                                 Timer0Init();  //初始化定时器0
  578.                                 GPIO_config();
  579.                                 EA=1;        //开总中断
  580.                                 Uart1Init();    //初始化串口9600
  581.                                 Wait_CREG();    //查询等待模块注册成功
  582.                                 Set_Text_Mode();//设置短信为TEXT模式
  583.                                 Send_Text_Sms();//发送一条短消息
  584.                 }*/

  585.         
  586. }

  587. /*******************************************************************************
  588. * 函数名 : Uart1
  589. * 描述   : 串口1中断服务入口函数
  590. * 输入   :
  591. * 输出   :
  592. * 返回   :
  593. * 注意   :
  594. *******************************************************************************/
  595. void Uart1() interrupt 4
  596. {
  597.     if (RI)
  598.     {
  599.       RI = 0;                 //清除RI位
  600.                         Uart1_Buf[First_Int] = SBUF;            //将接收到的字符串存到缓存中
  601.                         First_Int++;                                        //缓存指针向后移动
  602.                         if(First_Int > Buf1_Max)                       //如果缓存满,将缓存指针指向缓存的首地址
  603.                         {
  604.                                 First_Int = 0;
  605.                         }
  606.     }
  607.     if (TI)
  608.     {
  609.         TI = 0;                 //清除TI位
  610.     }
  611. }
  612. /*******************************************************************************
  613. * 函数名 : Timer0_ISR
  614. * 描述   : 定时器0中断服务入口函数,20ms中断一次
  615. * 输入   :
  616. * 输出   :
  617. * 返回   :
  618. * 注意   :
  619. *******************************************************************************/
  620. void Timer0_ISR() interrupt 1
  621. {
  622.         static u8 Time_count=0;
  623.   TL0 = 0x00;                  //重置定时器初值
  624.         TH0 = 0xB8;                  //重置定时器初值        
  625.         TR0=0;//关定时器
  626.         Time_count++;
  627.         if(Time_count>=50)
  628.         {
  629.                 Time_count = 0;
  630.                 RUNING_LED =~RUNING_LED;
  631.         }
  632.         if(count_20ms) //20ms延时计数器
  633.                 count_20ms--;
  634.         if(Timer0_start)
  635.           Times++;
  636.         if(Times > (50*shijian))
  637.         {
  638.                 Timer0_start = 0;
  639.                 Times = 0;
  640.         }
  641.         TR0=1;//开定时器
  642. }
  643. /*******************************************************************************
  644. * 函数名 : GPIO_config
  645. * 描述   : IO口配置函数
  646. * 输入   :
  647. * 输出   :
  648. * 返回   :
  649. * 注意   :
  650. *******************************************************************************/
  651. void        GPIO_config(void)
  652. {
  653.                 RUNING_LED=0;
  654. }
  655. /*******************************************************************************
  656. * 函数名 : Timer0Init
  657. * 描述   : 定时器0初始化,20ms定时
  658. * 输入   :
  659. * 输出   :
  660. * 返回   :
  661. * 注意   :
  662. *******************************************************************************/
  663. void Timer0Init(void)                //20毫秒@11.0592MHz
  664. {
  665.         AUXR &= 0x7F;                //定时器时钟12T模式
  666.         TMOD &= 0xF0;                //
  667.         TMOD |= 0x01;                //设置定时器模式,16位定时器
  668.         TL0 = 0x00;                  //设置定时器初值
  669.         TH0 = 0xB8;                  //设置定时器初值
  670.         TF0 = 0;                    //清TF0标志
  671.         TR0 = 1;                    //定时器0开始计时
  672.         ET0 = 1;              //使能定时器0中断
  673. }
  674. /*******************************************************************************
  675. * 函数名 : CLR_Buf1
  676. * 描述   : 清除串口2缓存数据
  677. * 输入   :
  678. * 输出   :
  679. * 返回   :
  680. * 注意   :
  681. *******************************************************************************/
  682. void CLR_Buf1(void)
  683. {
  684.         u16 k;
  685.         for(k=0;k<Buf1_Max;k++)      //将缓存内容清零
  686.         {
  687.                 Uart1_Buf[k] = 0x00;
  688.         }
  689.     First_Int = 0;              //接收字符串的起始存储位置
  690. }

  691. /*******************************************************************************
  692. * 函数名 : Find
  693. * 描述   : 判断缓存中是否含有指定的字符串
  694. * 输入   :
  695. * 输出   :
  696. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  697. * 注意   :
  698. *******************************************************************************/

  699. u8 Find(u8 *a)
  700. {
  701.   if(strstr(Uart1_Buf,a)!=NULL)
  702.             return 1;
  703.         else
  704.                         return 0;
  705. }

  706. /*******************************************************************************
  707. * 函数名 : Second_AT_Command
  708. * 描述   : 发送AT指令函数
  709. * 输入   : 发送数据的指针、希望收到的应答、发送等待时间(单位:S)
  710. * 输出   :
  711. * 返回   :
  712. * 注意   :
  713. *******************************************************************************/

  714. void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)         
  715. {
  716.         u8 i;
  717.         u8 *c;
  718.         c = b;                                                                                //保存字符串地址到c
  719.         CLR_Buf1();
  720.   i = 0;
  721.         while(i == 0)                    
  722.         {
  723.                 if(!Find(a))           //查找需要应答的字符
  724.                 {
  725.                         if(Timer0_start == 0)//超时重新发送命令
  726.                         {
  727.                                 b = c;                                                 //将字符串地址给b
  728.                                 for (b; *b!='\0';b++)
  729.                                 {
  730.                                         UART1_SendData(*b);
  731.                                 }
  732.                                 UART1_SendLR();        
  733.                                 Times = 0;
  734.                                 shijian = wait_time;
  735.                                 Timer0_start = 1;  //开始计时
  736.                    }
  737.     }
  738.            else
  739.                 {
  740.                         i = 1;
  741.                         Timer0_start = 0;  
  742.                 }
  743.         }
  744.         CLR_Buf1();
  745. }

  746. /*******************************************************************************
  747. * 函数名 : Set_Text_Mode
  748. * 描述   : 设置短信为TEXT文本模式
  749. * 输入   :
  750. * 输出   :
  751. * 返回   :
  752. * 注意   :
  753. *******************************************************************************/
  754. void Set_Text_Mode(void)
  755. {
  756.         unsigned char xdata temp[50]="AT+CSCA=";
  757.         Second_AT_Command("ATE0","OK",3);                                                                                //取消回显        
  758.         Second_AT_Command("AT+CMGF=1","OK",3);                                                                //TEXT模式        
  759.         Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中进行
  760.         strcat(temp,SMS_Num); //字符串拼接函数(库函数)
  761.         Second_AT_Command(temp,"OK",3);//设置短信中心号
  762. }
  763. /*******************************************************************************
  764. * 函数名 : Send_Text_Sms
  765. * 描述   : 发送TEXT文本短信
  766. * 输入   :
  767. * 输出   :
  768. * 返回   :
  769. * 注意   :
  770. *******************************************************************************/
  771. void Send_Text_Sms(void)
  772. {
  773.         unsigned char xdata temp[50]="AT+CMGS=";
  774.         
  775.         strcat(temp,phone); //字符串拼接函数(库函数)
  776.         Second_AT_Command(temp,">",3); //等待接收到“>”才发送短信内容
  777.         UART1_SendString(content);     //发送短信内容
  778.         UART1_SendData(0X1A);          //发送结束符
  779. }

  780. /*******************************************************************************
  781. * 函数名 : Wait_CREG
  782. * 描述   : 等待模块注册成功
  783. * 输入   :
  784. * 输出   :
  785. * 返回   :
  786. * 注意   :
  787. *******************************************************************************/
  788. void Wait_CREG(void)
  789. {
  790.         u8 i;
  791.         u8 k;
  792.         i = 0;
  793.         CLR_Buf1();
  794.   while(i == 0)                                
  795.         {
  796.                 CLR_Buf1();        
  797.                 UART1_SendString("AT+CREG?");//查询模块网络注册状态
  798.                 UART1_SendLR();
  799.                 delay_ms(250);                                                  
  800.             for(k=0;k<Buf1_Max;k++)                              
  801.             {
  802.                         if(Uart1_Buf[k] == ':')
  803.                         {
  804.                                 if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5')) //表明网络注册成功
  805.                                 {
  806.                                         i = 1;
  807.                                   break;
  808.                                 }
  809.                         }
  810.                 }
  811.         }
  812. }
复制代码

全部资料51hei下载地址:
GSM不乱.doc (91 KB, 下载次数: 15)
图.doc (331 KB, 下载次数: 15)
GSM.doc (97 KB, 下载次数: 12)


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

使用道具 举报

沙发
ID:1 发表于 2018-12-17 04:10 | 只看该作者
补全头文件原理图即可获得100+黑币
回复

使用道具 举报

板凳
ID:475424 发表于 2019-2-9 17:09 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:383374 发表于 2019-2-10 00:24 来自手机 | 只看该作者
短信发送太贵了,没有价值。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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