⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chengxu.c

📁 数据采集数据采集数据采集数据采集数据采集数据采集数据采集数据采集数据采集数据采集
💻 C
字号:


#include <reg51.h>
#include <stdio.h>
#include <absacc.h>
#include <string.h>
#include <math.h>
#define UCHAR unsigned char
#define UINT unsigned int
#define ADC XBYTE[0x3FF8]

sbit IGT=P1^3;/*P1.3拉低100ms启动GSM*/
sbit KG=P1^5;/* 下拉启动继电器*/
sbit SYNC=P1^2;
sbit led1=P1^0;
sbit led2=P1^1;
unsigned char idata sen[30];
unsigned char duan=0;
xdata int Max_zhi=255;
xdata int timer0_counter;
xdata int caiji_counter=0; /*通道数*/
xdata int caiji_counter_1=0x3ff8; /*采集数据地址*/
unsigned char xdata caiji[13]={0};
unsigned char xdata temp[18];
unsigned char xdata rec[27];
unsigned char xdata red[87];
unsigned char xdata rec_m[6]={0};
unsigned char code Command_At[3] = "AT\r";/*检测GSM状态*/
/*41 54 0d  回传:41 54 0D 0D 0A 4F 4B 0D 0A
AT
OK
*/
unsigned char code Command_Cmgf[10] = "AT+CMGF=1\r";/*选择消息为TEXT格式*/
/*
发送41 54 2B 43 4D 47 46 3D 31 0D
接收:
41 54 2B 43 4D 47 46 3D 31 0D 0D 0A 4F 4B 0D 0A
AT+CMGF=1
OK
*/
unsigned char code Baojing_Cmgs[23] = "AT+CMGS=+8613473626989\r";/*向管理员报警1*/


unsigned char code Command_Cmgs[23] = "AT+CMGS=+8613473626989\r";/*向监控中心发数据2*/
/*发送 41 54 2B 43 4D 47 53 3D 2B 38 36 31 33 39 33 30 36 32 32 30 36 34 0D
  接受 0D 0A 3E 20
  */
unsigned char code Command_CSCA[23] = "AT+CSCA=+8613800311500\r";/*设置短信中心号码*/
/*发送 41 54 2B 43 53 43 41 3D 2B 38 36 31 33 38 30 30 33 31 31 35 30 30 0D
  接受 41 54 2B 43 53 43 41 3D 2B 38 36 31 33 38 30 30 33 31 31 35 30 30 0D 0D 0A 4F 4B 0D 0A
 */

unsigned char code Command_110[14] = "ShuJuChaoXian!";
unsigned char code Command_CeShi[14] = "TC35iYiQiDong!";/*测试命令*/
unsigned char code Command_Cnmi[18] = "AT+CNMI=1,1,0,0,1\r";/*收到提醒*/
unsigned char code Command_Cmgd[8]="AT+CMGD=";/*删除*/
unsigned char code Command_Cmgr[8]="AT+CMGR=";/*读短信*/

void Delay10ms(void)
{
   UINT idata i;
   for(i=0;i<1800;i++);
}


 void Delay_1S(void)
{
 	UINT idata i;
	for(i=0;i<100;i++) Delay10ms();
}
void led1_open(void)/*1亮*/
{ led1=0; }

void led1_close(void)/*1灭*/
{ led1=1; }

void led2_open(void)/*2亮*/
{ led2=0; }

void led2_close(void)/*2灭*/
{ led2=1; }

void start_timer0(void) /*开定时器0 */
{  timer0_counter=0;
	TR0=0;
	TF0=0;
        TMOD=0x21;
	TH0=0x00;
	TL0=0x00;
	ET0=1;
	TR0=1;
}
void close_timer0(void)/*关闭定时器0*/
{   timer0_counter=0;
    TR0=0;
    ET0=0;
}
void deal_with_error(void)/*进入错误状态   1 2灯全开*/
{      UINT idata i;
	led1_open();
	led2_open();
         while(1) ;            /*/????????????*/
}
void timer0(void)   interrupt 1 using 1/*中断1程序*/
{
	if(timer0_counter++>500)/*error times over 500*/
		deal_with_error();/*1,2灯全亮*/
	TH0=0x00;
	TL0=0x00;
}

void uart_send(unsigned char  *p,unsigned char data_len)/*字符串发送 ??data_len可优化*/
{
  unsigned char i;
  for(i=0;i<data_len;i++)
  sen[i]=*p++;

  TI=0;	/*清发送标志位*/
  for(i=0;i<data_len;i++)
  {
    SBUF=sen[i];
    while(!TI);
    TI=0;
  }
}

void	AT_csca(void) /*设置短信中心号码*/
{  UCHAR idata i;
   TI=0;
   RI=0;
   uart_send(Command_CSCA,23);
     for(i=0;i<29;i++)
     {  while(!RI) ;
        RI=0;
     }

    RI=0;
	TI=0;
}

void	AT_cmgf(void)/*设置TEXT格式*/
{
  UINT idata i;
 TI=0;
 RI=0;
 uart_send(Command_Cmgf,10);
  for(i=0;i<16;i++)
  {while(!RI);
      RI=0;
  }
 RI=0;
 TI=0;
}

void AT_SEND(void)
{
	UINT idata i,error_counter;
	error_counter=0;
	while(1)
	{
		TI=0;
		RI=0;

		start_timer0();
       uart_send(Command_At,3);
		for(i=0;i<9;i++)
		{
			while(!RI);
			rec[i]=SBUF;
			RI=0;
		}
		close_timer0();

		if(rec[5]=='O'&&rec[6]=='K') break;
		//else if(error_counter++<10)	Delay100ms();
				else deal_with_error();
	}
}
void start_tc35(void)
{

IGT=0;
Delay_1S();

IGT=1;
 }
void	start_GSM(void)
{

	led2_open();
	start_tc35();
        Delay_1S();
	AT_SEND();
	Delay_1S();
	AT_cmgf();
       Delay_1S();
       AT_csca();
         Delay_1S();
	led2_close();
}
void	AT_cmgs(UINT  xuanze)
{
	UINT idata i;
        UCHAR idata  error=0;
        ES=0;
    while(1)                                           /* AT+cmgs*/
    {                                                 /*+号码*/
		TI=0;
		RI=0;
		if(xuanze==2)
		uart_send(Command_Cmgs,23);
		else
	    uart_send(Baojing_Cmgs,23);

		start_timer0();
    	for(i=0;i<27;i++)
    	{
      	  while(!RI);
      	  rec[i] = SBUF;
      	  RI = 0;


	    }

        close_timer0();
         if(rec[25]== 0x3E&& rec[26]== 0x20)
             break;
             else if(error++<10)
                    deal_with_error();
    }

	Delay10ms();	/*延时一段时间*/
		RI=0;
		TI=0;
}
void Send_shuju(UCHAR  *p,UINT len)
{
   UINT idata	i;
   ES=0;
   TI=0;
    RI=0;
  for(i=0;i<len;i++)
  {   SBUF=*p++;
     while(!TI);
	  TI=0;
  }
  	SBUF=0x1a;/*发送信息结束*/
		while(!TI);
		TI = 0;
		RI=0;
      	Delay10ms();
        RI=0;
        TI=0;
}
void    AT_cnmi(void)
{
	 UCHAR idata i;

	 ES=0;
	 while(1)
	 {
    	TI=0;
	RI=0;
        uart_send(Command_Cnmi,18);
		start_timer0();
    	for(i=0;i<24;i++)		/*only receive part data (10)*/
    	{
      	  while(!RI);
      	  rec[i] = SBUF;
      	  RI = 0;
	    }
	   close_timer0();

        if(rec[20]== 'O'&& rec[21]== 'K') break;
      				else deal_with_error();
       }
	Delay10ms();
    RI=0;
    TI=0;
    ES=0;
}
void AT_cmgr(unsigned char index_high,unsigned char index_low)
{
  	UINT idata	i;
	UINT byte_length=0;

		TI=0;
		RI=0;
		  if(index_high=='0')
		    byte_length=86;
		  else
		    byte_length=87;
		ES=0;
		uart_send(Command_Cmgr,8);
		if(index_high!='0')
		  {
        SBUF=index_high;
      	while(!TI);
		TI=0;
          }
        SBUF=index_low;
      	while(!TI);
		TI=0;
		SBUF='\r';
        while(!TI);
		TI=0;
        start_timer0();
        for(i=0;i<byte_length;i++)
		  {
		    while(!RI);
      	  red[i]=SBUF;
      	  RI=0;
		  }
		  close_timer0();
    if(red[byte_length-2]=='O'&&red[byte_length-1]=='K')
	{for(i=0;i<6;i++)
	  rec_m[i]=red[byte_length-12+i];
	}
	ES=1;
	Delay10ms();
    RI=0;
	TI=0;

}

void    AT_cmgd(unsigned char index_high,unsigned char index_low)
{
  	unsigned int idata i;
	bit high_flag=(index_high!='0');
	UINT byte_length=0;

		 if(high_flag)
		    byte_length=17;
		  else
		    byte_length=16;
   while(1)
     {
		TI=0;
		RI=0;
         ES=0;
		uart_send(Command_Cmgd,8);
        if(high_flag)
		  {
        SBUF=index_high;
      	while(!TI);
        TI = 0;
          }
        SBUF=index_low;
      	while(!TI);
        TI=0;
		SBUF='\r';
      	while(!TI);
        TI=0;
		start_timer0();
		  for(i=0;i<byte_length;i++)
		    {
			  while(!RI);
			    rec[i]=SBUF;
				RI=0;
			}
		close_timer0();
        if((rec[12]== 'O'&& rec[13]== 'K')||(rec[13]== 'O'&& rec[14]== 'K')) break;

				else deal_with_error();
	  }
           Delay10ms();
	RI=0;
	TI=0;
        ES=0;
 }
void zhixingmingling(unsigned char  len0)
  {if(len0=='0')
    KG=rec_m[3];
    if(len0=='1')
     Max_zhi=rec_m[3];
     }
void compare_cnmi(void)
{   unsigned char i=0;
    UCHAR j,j0;
   unsigned char  rec_0;
  if(temp[i+5]=='T'&&temp[i+6]=='I')
   { if(duan==17)
   {   j=temp[14];
      AT_cmgr('0',j);
         duan=0;
     AT_cmgd('0',j);

      }
   else { j=temp[14];
        j0=temp[15];
          AT_cmgr(j,j0);
            duan=0;
            AT_cmgd(j,j0);
   }
    }
      if(rec_m[0]=='%')
         // if(rec_m[5]=='%')
        {  rec_0=rec_m[2]+rec_m[3];
         if(rec_0==rec_m[4])
         zhixingmingling(rec_m[2]);
           }
}


void shujucaiji(void)
{

   caiji[0]='%';
   caiji[1]='%';
   caiji[12]='%';
   EX0=1;
   IT0=1;
   ADC=0x0;
   while(1) ;
   }

void main(void)
{

        UINT i;
        led1_close();
	led2_close();

             SCON=0x50;  /*串口初始化*/
             EA=1;
             ES=0;
             PCON=0x80;
             TR1=0;
             TMOD=0x21;
	     TH1=0xfd;
             TL1=0xfd;
	      TR1=1; /*开定时器1*/
        start_GSM();
    for(i=1;i<10;i++)/*删除卡内所有短信*/
    AT_cmgd('0','0'+i);
     for(i=0;i<10;i++)
    AT_cmgd('1','0'+i);
       AT_cnmi();/*设置收到短信时发送CMTI*/
       Delay_1S();
       RI=0;
       TI=0;
    AT_cmgs(1);
  Delay10ms();
   Send_shuju(Command_CeShi,14);   /*发测试信号*/
     led1_open();
        Delay_1S();
        RI=0;
        TI=0;
     PS=1;
     PX0=0;
      ES=1;
      shujucaiji();


}
  void Int0(void) interrupt 0
  {
      UINT k0;
      UINT k2;
       int k1=0;
       caiji[caiji_counter+2]=XBYTE[caiji_counter_1];

          if(caiji[caiji_counter+2]>Max_zhi)
              {AT_cmgs(1);
	       Send_shuju(Command_110,14);
               ES=1;
              }
        caiji_counter++;
         caiji_counter_1++;
         Delay_1S();
         led2=~led2 ;
         if(caiji_counter==8)
       {
       caiji_counter=0;
       caiji_counter_1=0x3FF8;
       for(k0=0;k0<8;k0++)
       { k1=k1+caiji[k0+2];
       }
       k2=k1/0x7f;
       k1=k1%0x7f;
        caiji[10]=k1;
        caiji[11]=k2;
        k1=0;

        AT_cmgs(1);
       Send_shuju(caiji,13);
       RI=0;
       TI=0;
        //Delay_1S();
         ES=1;
        led1_open();
         Delay_1S();
          if(duan==17||duan==18)
          {   led2_open();
          compare_cnmi();
          }
          else duan=0;
                   Delay_1S();
                 led1_close();
                
                   
                 
       }
    XBYTE[caiji_counter_1]=0xff;
   }
   void  Serial_Service(void)   interrupt 4  using 0
 {

 if(RI)
 {
	  temp[duan]=SBUF;
	  duan++;
      RI=0;
  }


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -