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

📄 sd.c

📁 GSM模块AT指令的调试程序
💻 C
字号:
//ICC-AVR application builder : 2007-04-05  
// Target : M8
// Crystal: 11.0592
//手机模块块是 HD31A 
#include <iom8v.h>
#include <macros.h>
#define uchar  unsigned char
#define uint   unsigned int

#define fosc  11059200   //晶振频率
#define baud  9600       //串行通讯波特率

#define Call_Phon    (PIND&0x08)        //启动定时器 PD3 输入

#define signe       (PIND&0x10)        //安全信号检测 PD4 输入

#define keys       (PIND&0x04)        //安全信号检测 PD2 输入

#define number     (PINB&0x3f)       //设置目的手机号码 PB口
  
#define wdt_reset() asm("wdr")  //看门狗复位 //清零

void wdt_disable(void);   //看门狗禁止
void wdt_enable(uchar value); //看门狗使能

void timer1_init(void); //定时器1初始化
void timer1_ovf_isr(void);//定时器1中断服务函数

void uart0_init(void); //串口初始化
void USART_Tranbuffer( uchar i ); //串口发送一个字节
void USART_Transmit( unsigned char data );//串口发送data个数据
void uart0_rx_isr(void);//串口中断服务函数

void port_init(void); //端口初始化

void delay(void);      //延时函数

uchar Read_EEPROM(uint Address);//读一个字节
void Write_EEPROM(uchar Data,uint Address); //写一个字节

//ber0[]发送短信方式 方式2 带目的号码发送短信  11 00  0D  0A XX YY YY YY CC CC CC
//XX表示电话号码的长度 YY电话号码  CC表示要发送的内容 最大140字节 返回08  01  0D  0A表示发送成功 返回08 00 0D 0A发送不成功
//如果以时间为结束标志不加结束符
//如果以结束符为结束标志则也加上结束符 0D 0A 加在发送结束的末尾
       const uchar ber0[]={0x11,0x00,0x0D,0x0A,0x0B,//短信头
/*电话号码ASCASC十六进制*/ 0x31,0x33,0x38,0x32,0x30,0x35,0x32,0x31,0x36,0x38,0x36,//电话号码
/*发送内容以及结束符*/     0x8b,0x66,0x62,0xa5,0x5d,0xf2,0x54,0x2f,0x52,0xa8,0x00,0x2c,
                           0x67,0x09,0x60,0xc5,0x51,0xb5,0x53,0xd1,0x75,0x1f,0x00,0x21};//发送内容
 //警         报       已      启          动     ,        有      情        况        发     生        !

/*=========================================================================================*/
//ber1[]发送短信方式 方式1 指向电话本中的某个位置号码发送短信 01 XX 0D  0A YY YY YY YY YY 
//XX表示在电话本中的位置最大不能超过20   YY是发送内容 返回与2一样
     const uchar ber1[]={0x01,0x00,0x0D,0x0A,//短信头
  /*发送内容以及结束符*/ //    现      在      进     行      通     讯      测       试    
      0x73,0xb0,0x57,0x28,0x8f,0xdb,0x88,0x4c,0x90,0x1a,0x8b,0xaf,0x6d,0x4b,0x8b,0xd5,0x00,0x21};//结束
/*=========================================================================================*/
//ber2[]发送短信方式 方式3默认向SIM卡中的第一个位置的电话号码发送短信
//YY YY  YY YY YY…………YY是发送内容 返回与2一样
    const uchar ber2[]={0x31,0x30,0x36,0x36,0x36,0x34,0x31,0x39,0x38};//发送内容
/*=========================================================================================*/
//ber3[]  
    const uchar ber3[]={0x11,0x00,0x0D,0x0A,0x0B, 
/*电话号码**/           0x31,0x30,0x36,0x30,0x32,0x32,0x38,0x35,0x36,0x36,0x34,0x31,0x39,0x38,//电话号码
/*发送内容以及结束符*/  0x4f,0x60,0x59,0x7d,0x00,0x11,0x12,0x13,0x14,0x15,0x16,}; 
/*=========================================================================================*/
//ber4[] 
    const uchar ber4[]={0x11,0x00,0x0D,0x0A,0x0B, 
/*电话号码**/           0x31,0x30,0x36,0x30,0x32,0x32,0x38,0x35,0x36,0x36,0x34,0x31,0x39,0x38,//电话号码
/*发送内容以及结束符*/  0x4f,0x60,0x59,0x7d,0x00,0x11,0x12,0x13,0x14,0x15,0x16,}; 
/*=========================================================================================*/
// 设置命令 1
//uchar ber1[10]={1,2};
//uchar ber2[10]={1,2};
//uchar ber3[10]={1,2};
/*=========定义变量=========*/
  uchar berx[20]={0};
uint  time_timer;// 存放次数 到达存放结果后 换下一个字继续存放  满一天存放一次
                 //现在可定义存放一年或500天后 换下一个字放
uchar buf;      //接收缓冲
uint  time_9h;  //计时量  每10分钟存放一次 当有看门狗复位或其他外界干扰引起复位时
                //可读出eeprom里的内容并 相应的增加累积10分钟 避免到达时间断电
				//而这边还没有在定时时间之内
//6480*5=9h
//==============================================================================
void main()
{ uchar i;
  time_9h=0;
  CLI();
  port_init();
  uart0_init();
  
 // timer1_init();
  wdt_disable();
  MCUCR = 0x00;
  GICR  = 0x00;
  TIMSK = 0x04; //timer interrupt sources
  SEI();
//PORTD&=0xff;
//Call_Phon
while(1)
 { 
  // if()开始计时  打开定时器 
 // if(keys==0x00) 
 //    SEI();
	 
    //if((PIND&0x04)==0x00)
    // { delay();
	 // if(time_9h/2)
	   //USART_Transmit(time_9h/256);
	   //USART_Transmit(time_9h%256);
     //  if((PIND&0x04)!=0x00)
         if(time_9h<20)    //6480没有到定时时间 则检测线路状态
           {// PORTD=0x7f; 
		    
		    if(keys==0x00)//(signe==0x00) //检测到断线情况
             { delay();
              if(keys==0x00)//(signe==0x00);  //等待键抬起 //  if((PIND&0x04)!=0x00) //检测到断线情况
              {
               // USART_Tranbuffer(40);
				for(i=0;i<20;i++)
				{berx[i]=ber1[i];
				 }
			 switch(number) //PB0 PB1 PB2 PB3 PB4 PB5 
			   { case 62:berx[1]=0x01;break;
			     case 61:berx[1]=0x02;break;
			     case 59:berx[1]=0x03;break;
				 case 55:berx[1]=0x04;break;
				 case 47:berx[1]=0x05;break;
				 case 31:berx[1]=0x06;break;
				 default:berx[1]=0x00;break ;
			   }
			   //USART_Transmit(number);
			   //delay();delay();delay();delay();delay();
			   if(berx[1]!=0x00)
			   {
			    USART_Tranbuffer(20);
			   }
	         // CLI();
			 
 // const uchar ber1[]={0x01,0x01,0x0D,0x0A,//短信头
//  /*发送内容以及结束符*/   0x4f,0x60,0x59,0x7d,0x00,0x11,0x12,0x13,0x14,0x15,0x16,};//结束
	//ber1[]发送短信方式 方式1 指向电话本中的某个位置号码发送短信 01 XX 0D  0A YY YY YY YY YY 
//XX表示在电话本中的位置最大不能超过20   YY是发送内容 返回与2一样
				//time_9h=0;
		        
			   }
              }
           }

         else   
		  {
		   time_9h=0;
		  // CLI();
		  }
    
  // delay();

 }
}

//==============================================================================
//extern void timer1_ovf_isr(void); //定时中断服务程序 
//extern void timer1_init(void); //定时器初始化
//TIMER1 initialize - prescale:8
void timer1_init(void)
{
 TCCR1B = 0x00; //setup
 TCNT1H = 0x2D; //stop5ms
 TCNT1L = 0x11;
 OCR1AH = 0x00;
 OCR1AL = 0x00;
 OCR1BH = 0x00;
 OCR1BL = 0x00;
 ICR1H  = 0x00;
 ICR1L  = 0x00;
 TCCR1A = 0x00;
 TCCR1B = 0x05; //start Timer
}
void USART_Transmit( unsigned char data )
{
/* 等待发送缓冲器为空 */
 while ( !( UCSRA & (1<<UDRE)) );
/* 将数据放入缓冲器,发送数据 */
UDR = data;
}
void USART_Tranbuffer( uchar i )
{ 
 uchar j;
 for(j=0;j<i;j++)
  { USART_Transmit(berx[j]);
  }
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
    TCNT1H = 0x2D; // 5s  setup     
    TCNT1L = 0x11; //
	time_9h++;
	 //PORTD^=0x80; 
	 USART_Transmit(time_9h/256);
    USART_Transmit(time_9h%256);
}

void port_init(void)
{
 PORTB = 0xFF;
 DDRB  = 0x00;
 PORTC = 0x7F; //m103 output only
 DDRC  = 0x00;
 PORTD = 0xFF;
 DDRD  = 0xff;
}
// desired baud rate: 9600// actual: baud rate:9600 (0.0%)//UART0 initialisation
// char size: 8 bits// parity: Disabled
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = (1<<URSEL)|(3<<UCSZ0);
 UBRRL = (fosc/16/(baud+1))%256;; //set baud rate lo
 UBRRH = (fosc/16/(baud+1))/256; //set baud rate hi
 UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
// UCR = BIT(RXEN) ;
}

void delay()
{
 unsigned char i,j,m,n;
  for (i=0;i<250;i++)
    for (j=0;j<10;j++)
	  // for (m=0;m<250;m++)
	       for (n=0;n<250;n++);
}
//call this routine to initialise all peripherals

#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{uchar i;
// while ( !(USR&0x80))      /* wait for incomming data */
  CLI(); //disable all interrupts                                  /* return the data */
  //buf=UDR;    //uart has received a character in UDR
  //berx[0]=buf;
 // for(i=1;i<4;i++)
 // { while (!(UCSRA&(1<<RXC))); 
 //  { berx[i]=UDR;
 //  }
 //}
  //delay();
  //if(buf==0x08)
 //  if((berx[0]==0x91)&&(berx[1]==0x01)&&(berx[2]==0x0d)&&(berx[3]==0x0A))
 //   {
	 	// for(i=0;i<4;i++)
        // USART_Transmit(berx[i]);
		//PORTD=0x7f;
	   
	// }
  USART_Transmit(UDR);
  //else PORTD=0xbf; //USART_Transmit(0x88); //错误指示
 SEI();
}
//===============看门狗函数==================

void wdt_enable(uchar value)
{  WDTCR=BIT(WDCE)|BIT(WDE);
   //WDTCR=BIT(WDE)|BIT(WDP2)|BIT(WDP1);  //使能watchdog,1024K分频,典型溢出时间5V时1S
   WDTCR|=value;//value 为0 到7(16ms--2s)
}
void wdt_disable( )
{ WDTCR=BIT(WDCE)|BIT(WDE);
  WDTCR=0x00; //BIT(WDE)|BIT(WDP2)|BIT(WDP1); 
}

//====================================================
void Write_EEPROM(uchar Data,uint Address) //写一个字节
{//CLI();  
 wdt_reset();
 while(EECR&0x02);// (1<<EEWE));/* 等待上一次写操作结束 */ 
 EEAR=Address;/* 设置地址和数据寄存器*/
 EEDR=Data;
 EECR|=0x04;//(1<<EEMWE);/* 置位EEMWE */
 EECR|=0x02;//(1<<EEWE);/* 置位EEWE 以启动写操作*/ 
 ///SEI();
}
//========================================================
uchar Read_EEPROM(uint Address)//读一个字节
{uchar i;
 CLI(); 
 while(EECR&0x02);
 EEAR=Address;/* 设置地址寄存器*/
 EECR|=0x01;//(1<<EERE);/* 设置EERE 以启动读操作*/
 i=EEDR; /* 自数据寄存器返回数据 */
 SEI();
 return(i);
}
//===========================================================
//////////////////////////////////////////////////////

⌨️ 快捷键说明

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