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

📄 cheshi.#3

📁 GSM MCU 开发板
💻 #3
📖 第 1 页 / 共 3 页
字号:
			//1ms记数 921.6次
			//16位 2^16 - x = 922 x=64614 FC66
			//定时器里不断放fc66,不用怀疑51定时器得到的 1ms的精确性吗




   	TH0 = 0xf6;
    TL0 = 0x50;
    //TH0 = 0xB1;
	//TL0 = 0xE0; //20ms的时钟基准
  //串口中断
    TI=0;
    RI=0;
    SCON=0x50;        		//选用方式1
    TMOD=0x20;
    TMOD = (TMOD & 0xf0) | 1;//MODE 1
   // TH1=0xe8;              //波特率为9600
   // TL1=0xe8;
    TH1=0xfd;              //波特率为9600
   TL1=0xfd;
    PCON=0x00;            //倍频0x80

    IE = 0xb0;  	// EA XX ET2 ES ET0 EX0 ET1 EX1
    TR1=1;  		//enable TIMER1
    //TF0=0;
    //PT0=1; //Set Timer0 interrupt as highest priority level'
   // PT0=1; //Set Timer0 interrupt as highest priority level
    ES=1;
    TR0=1;
    ET0=1;
    ET1=0;
    EA=1;
    P0=0xC3;
    P1=0xFE;
    P2=0xFF;
    P3=0xFF;
   // P4=0xff;
    timer_1S_cnt=0;
    receive_count=0;
    send_count=0xff;		//表示禁止发送,可以接收
  // sync_count=0;
  // int_case=0;
   hsk1_pin_flag=1;
 //  IO_OUT=1;
   //INT_TMP1=0;
   //INT_TMP2=0;


}
#elif  CPU_TYPE2==C8051F330
void Sys_Init (void)
{
	 uchar j;
	 //OSCICN = 0x0C;                     // configure internal oscillator for
                                       // its maximum frequency}
  // RSTSRC = 0x04;                      // enable missing clock detector
   OSCICN |= 0x03;                     // 配置内部振荡器的的最大频率
   RSTSRC  = 0x04;

   P0SKIP  |= 0x01;
   P0MDIN  |= 0x01;
   P0MDOUT |= 0x10;
   P1MDOUT |= 0x08;
   XBR0    = 0x01; //端口I/O交叉开关寄存器0    TX0, RX0连到端口引脚P0.4和P0.5。
   XBR1    = 0x50;   // 端口I/O交叉开关寄存器1     使能交叉开关  T0连到端口引脚


   SCON0 = 0x10;               //(24500000/9600 /2/256)
   if (SYSCLK/BAUDRATE/2/256 < 1) {

      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;
      CKCON |=  0x08;
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;
      CKCON |=  0x09;
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);

       CKCON &= ~0x0B;
   } else {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;
      CKCON |=  0x02;
   }


    j=0x03;
    j=~0x0b;
   TL1 = TH1;
   TMOD &= ~0xf0;
   TMOD |=  0x20;
   TR1 = 1;
   TI0 = 1;                     // Indicate TX0 ready      24500000  ]
   	TH0 = 0x9e;
    TL0 = 0x38;
    //TH0 = 0xB1;
	//TL0 = 0xE0; //20ms的时钟基准
  //串口中断
    TI=0;
    RI=0;
    SCON0=0x50;        		//选用方式1
    IE = 0xb0;  	// EA XX ET2 ES ET0 EX0 ET1 EX1
    TR1=1;  		//enable TIMER1   TL0(低8位)和TH0(高8位)
    TR0 = 1;  ET0 = 1;                          //t=65536-( 24.5/12)*25*1000    25MS  51041  14495        389e
  //--- 定时器2系统时钟中断       //t=65536-(11.0592/12)*25*1000    25MS   23040   42496             A600
   timer_1S_cnt=0;
   //wait_count_50ms=0;
  // wait_count_10s=0;

   PCA0MD &= ~0x40;   // WDTE = 0 (clear watchdog timer enable)
}

#endif


uchar  Send_AT_Command( uchar type)
//拨号时号码放在phone.number
//其他用para_temp
{
	AT_Command_Type=type;
	send_count=0;
    switch(type)
    {

	case VOICE_DIAL:   	//语音拨号
        strcpy(uart_buff,"ATD");
        strcat(uart_buff,para_temp);
      // strcpy(uart_buff,"ATD10086;");
       //strcat(uart_buff,";");

        break;
      case RESET_TC35:		//复位TC35
      	strcpy(uart_buff,"AT+CFUN=1,1");
     	break;
      case CHECK_PIN:		//检查当前是否要输入PIN码
        strcpy(uart_buff,"AT+CPIN?");
        break;

      case TC35_INIT:		//TC35初始化命令
        strcpy(uart_buff,"ATE0V0");
        break;
      case TC35_SBC:      //检查信号
      	 strcpy(uart_buff,"AT^SBC?");
        break;

      case VOICE_HANDSET:	//手柄方式
      	strcpy(uart_buff,"AT^SNFS=4^SNFO=2,8000,14000,20000,26000,32700,0,512^SNFI=5,10000");
      	break;

    //
      //   case REQUEST_MOD:			//读模块型号
     	//strcpy(uart_buff,"AT+CGMM");
     	//strcpy(para_temp,uart_buff);
     	//strcpy(uart_buff,para_temp);
     	//uart_buff[55]=0x0d;
     //	uart_buff[60]=0x00;
     //	break;
     // case SIM_CARD_CHECK://查询是否有插入SIM卡 ^SCKS: 0,1
     // 	strcpy(uart_buff,"ate0v0^scks?");
     // 	break;

      case SIM_ID:
          strcpy(uart_buff,"AT+CMGF=1+CNMI=1,1");
        break;
        case SMSS_ID:
          strcpy(uart_buff,"ATE0V0^SSMSS=1+CNMI=1,1");
        break;
      case HOOKOFF:			//挂机,停止通话
        strcpy(uart_buff,"AT+CHUP");
        break;
      //case SMS_CNMI:	//SMS 接收方式,
      //  strcpy(uart_buff,"AT+CNMI=1,1");
       // break;
     // case  TC35_VERSION:   //读取TC35的版本号
     // 	strcpy(uart_buff,"AT+GMR");
    //  	break;

      case PHONE_WRITE:  	//存电话号码
        strcpy(uart_buff,"AT+CPBW=");
        strcat(uart_buff,para_temp);
        break;
    //  case PHONE_RC_CHECK:  	//已接电话
    //    strcpy(uart_buff,"AT+CPBS=\x22RC\x22+CPBS?");
    //    break;
     case PHONE_SET:
        strcpy(uart_buff,"AT+CPBW=");
        strcat(uart_buff,para_temp);
        break;
    //  case PHONE_RC_CHECK:  	//已接电话
    //    strcpy(uart_buff,"AT+CPBS=\x22RC\x22+CPBS?");
    //    break;
     case CALL_ID:			//读来电显示
      	strcpy(uart_buff,"AT+CLCC");
      	break;
      case PHONE_READ:  	//读电话本
        strcpy(uart_buff,"AT+CPBR=");
        strcat(uart_buff,&read_tmp);
        uart_buff[9]=0x0d; uart_buff[10]=0x0a;
        uart_buff[11]=0x00;   uart_buff[12]=0x00;
        break;
      case SMS_CMGR:		//读一个短信
        strcpy(uart_buff,"AT+CMGR=");
        strcat(uart_buff,para_temp);
        break;
       case SMS_CMGS:		//写一个短信
        strcpy(uart_buff,"AT+CMGS=");
           strcat(uart_buff,para_temp);

        break;
       case SMS_CMGD:		//删除一个短信
        strcpy(uart_buff,"AT+CMGD=");
        strcat(uart_buff,para_temp);
        break;
       case  CMGS_MUB:    //发报警短信内容
        strcpy(uart_buff,para_temp);
         break;
       case PICK_UP:         //摘机
	    strcpy(uart_buff,"ATA");

      case AT_COMMAND:
      	break;
      default:
      	receive_count=0;
      	return(TRUE);
    }
    ES=1;
    strcat(uart_buff,"\x0d\x00");//在命令后加入CR
    send_count=0;			//设置发送指针
    receive_count=0;
    AT_Command_Status=COMMAND_WAIT;	//设置接收成功标志
    timer_1S_cnt=0;  timer_S_cnt=0;
    txd_rxd_bit=0;
     at_send_bit=0;
    TI=1;					//开始发送数据
    RI=0;					//清除接收标志


  if(type==AT_COMMAND)
    {
    	return(TRUE);
    }
    else if (type==TC35_INIT )
    {     while (timer_S_cnt<20)
 		{

        	if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1)
        	return(TRUE);
    	}
    }

    else if((type==SMS_CMGR))
    {
        while (timer_S_cnt<25)
 		{

        	if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1)
        	return(TRUE);
    	}
    }

    else
    {
    	 while (timer_S_cnt<20)
 		{
    		system_sleep;
        	if (AT_Command_Status!=COMMAND_WAIT||txd_rxd_bit==1)
        	return(TRUE);
    	}
    }
       eer_int++;
    return(FALSE);
}
void tel_diat()           //报警时拨打前三个电话,时间设为40秒,
{   uchar j,t;
    timer_S_cnt=0;timer_1S_cnt=0;
   	while(timer_S_cnt<1&&(AT_Command_Status==COMMAND_WAIT))  ;
   	Send_AT_Command(VOICE_HANDSET );
   	timer_S_cnt=0;timer_1S_cnt=0;
   	while(timer_S_cnt<2);
    io_p02_on=1;
    t=0; //为没有打通电话时做临时存储    0000 0 000    0000 0111,
    do
        {
   			TMP_BUF=0;
   			read_tmp=0x31;
   			j=PHONE_RD();    //读电话号码

  			if(j)
   			{    para_temp[j++]=';';para_temp[j++]=0x0d;para_temp[j++]=0x00;
                   if(!Send_AT_Command(VOICE_DIAL));
                   {  ES=1;			//设置发送指针
    					receive_count=0;
					    send_count=0xff;
						 RI=0 ;
    					//AT_Command_Status=COMMAND_WAIT;	//设置接收成功标志
   				   		timercount=0;
   				   	 	while((timercount<40)&&(AT_Command_Status==COMMAND_WAIT))  system_sleep;
   				   }
   				   if((uart_buff[0]=='0')&&uart_buff[1]==0x0d)      //拨号成功
   				   {  	              //加语音发送设置--------------------------
   				   	//	IO_SBT=1;IO_IRP=0;   P0=0x87;
   				   		 ES=1;			//设置发送指针
    					receive_count=0;
					    send_count=0xff;
    					uart_buff[0]=0;
						 RI=0 ;
    					AT_Command_Status=COMMAND_WAIT;	//设置接收成功标志
   				   	 	timercount=0;
   				   	 	while(timercount<10&&(AT_Command_Status==COMMAND_WAIT))   system_sleep;

						// t&=~(1<<ii-1) ;     //  0110  &   1101
                      Send_AT_Command(HOOKOFF);
						while(timercount<5)   system_sleep;
						return;
   				    }
   				    else
   				    {

   				    }

   		 		       Send_AT_Command(HOOKOFF);
						while(timercount<5)   system_sleep;

   		 		  // else    continue;  //拨号失败  再拨下一个电话


   			  }

              t++;
             if(io_p02_on==0) return;
   		}while(t<50);

}

void tel_diat2()           //报警时拨打前2个电话,时间设为40秒,
{   uchar ii,j,t;
    timer_S_cnt=0;timer_1S_cnt=0;
   	while(timer_S_cnt<1&&(AT_Command_Status==COMMAND_WAIT))  ;
   	Send_AT_Command(VOICE_HANDSET );
   	timer_S_cnt=0;timer_1S_cnt=0;
   	while(timer_S_cnt<2);
    ii=0;
    t=3; //为没有打通电话时做临时存储    0000 0 000    0000 0111,
    do
        {
   			ii=ii+1;
			if(ii>=3)  ii=0;
   			TMP_BUF=0;
   			if(	(t>>ii-1)&0x01!=0)
   			{
   			  read_tmp=0x30+ii; }
   			else
			 { //ii=ii+1;
			   continue;  }
   			j=PHONE_RD();    //读电话号码

  			if(j)
   			{    para_temp[j++]=';';para_temp[j++]=0x0d;para_temp[j++]=0x00;
                   if(!Send_AT_Command(VOICE_DIAL));
                   {  ES=1;			//设置发送指针
    					receive_count=0;
					    send_count=0xff;
						 RI=0 ;
    					//AT_Command_Status=COMMAND_WAIT;	//设置接收成功标志
   				   		timercount=0;
   				   		while(timercount<70&&(AT_Command_Status==COMMAND_WAIT))  ;
   				   }
   				   if((uart_buff[0]=='0')&&uart_buff[1]==0x0d)      //拨号成功
   				   {  	              //加语音发送设置--------------------------
   				   	//	IO_SBT=1;IO_IRP=0;   P0=0x87;
   				   		 ES=1;			//设置发送指针
    					receive_count=0;
					    send_count=0xff;
    					uart_buff[0]=0;
						 RI=0 ;
    					AT_Command_Status=COMMAND_WAIT;	//设置接收成功标志

                        timercount=0;
   				   	 	while(timercount<40&&(AT_Command_Status==COMMAND_WAIT))
   				      	system_sleep;

						 t&=~(1<<ii-1) ;     //  0110  &   1101

   				}
   				else
                     {  sms_tmp= smss_alarm;
                        read_tmp=0x30+ii;
                        send_sms();
                        timercount=0;
   				        while(timercount<3&&(AT_Command_Status==COMMAND_WAIT))  ;
                     	}

   		 		        Send_AT_Command(HOOKOFF);
   				   	    timercount=0;
   				        while(timercount<10&&(AT_Command_Status==COMMAND_WAIT))  ;
                        Send_AT_Command(HOOKOFF);


   			}
   			else t=0;



   		}while(t!=0);

}



void main(void)
{
	Initialize_Model();
     pickup_pin_flag=1;hsk1_pin_flag=1;
	// if(system_server==SYS_RING) system_server=SYS_RING;
	// else
	system_server=SYS_SMSR;
	//system_server=SYS_START;
	//system_server=SYS_PARA;
	receive_count=0;
	 sms_tmp=0;
	 system_tep=1;
	 eer_int=0;
	 p2_stop_bit=0;
	 // pickup_pin_flag=1;   hsk1_pin_flag=1;
	while(1)
	{
		//-----------查询1到20条中的短信,只要有短信就处理------------------------------------------
		if(system_server==SYS_SMSR)			//读1-20条短信
			{	//send_sms();
				//system_server=SYS_SMSR;
			//
			   // tel_diat();
				read_sms();           		//timer_S_cnt=0;
				//tel_diat();

            }
 		//----------------一些短信的发送---------------------------------------------------
		else if(system_server==SYS_SMSS)       //发送小区信息
 			{   eer_int=0;

 				 send_sms();system_server=SYS_SMSR;

		   }

		//---===============外部中断进行 报警状态=================================================================

			//===================设置报警时的延时时长==================================================
		else if(system_server==SYS_ALARM)
		  	{
		  		sms_tmp=smss_tel;
				system_server=SYS_SMSR;
		  	}

		  else if(system_server==SYS_START)
		  {

		  		sms_tmp=smss_atart;
		  		send_sms();

		  		system_server=SYS_SMSR;



		  }

			//========================用短信进行设备参数检查=============================================================
		 else if(system_server==SYS_PARA)          //设备参数查询
     			{
     				sms_tmp=smss_para;
     			//	IO_OUT=1;     //断油、断电
     			//read_sms();
		  		system_server=SYS_SMSS;
		  	}
		//==========================进行报警时的电话号码和手机号的设置===========================================================
		  else if(system_server==SYS_TEL)  //防盗电话号码设置
		  {                          //存储位于SIM卡的4,5,6三个位置
		  		sms_tmp=smss_tel;
		  		system_server=SYS_SMSS;

	      }
		//==================//电池电量不充报警=================================================================
		else if(system_server==SYS_SBC)          //电池电量不充报警
		{
			   if(batt_tmp>=1)
			 {
			 	sms_tmp=smss_sbc;
		  	 	system_server=SYS_SMSS;
		  	 }
		  	 else 	 system_server=SYS_SMSR;

	}
	else  system_server=SYS_SMSR;

	}


}











































⌨️ 快捷键说明

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