📄 gsm-dtu-gr47avr.c
字号:
return temp;
}
//等待GSM响应OK,
void gsm_wait_ok()
{
uchar i,j;
gsm_ok_flag=0; //1有OK响应
for(i=0;i<250;i++)
{
if(UCSRA & (1<<RXC))
{
j=UDR;
i=1;
if(j=='O')
{
i=100;
}
else if(j=='K')
{gsm_ok_flag=1;
i=251;
}
}
else
{
WDR();
delay_us(500);
}
// */
}
}
void gsm_init() //如果gsm_init_flag=1成功
{
//检查模块 AT ENTER ,等待响应OK,最多三遍
uchar i;
for(i=0;i<3;i++)
{
USART1_Transmit('A'); //0x41 0x54(参见ASCII码表)
USART1_Transmit('T');
USART1_Transmit(0x0d);
gsm_wait_ok();
if(gsm_ok_flag==1)
{
i=3;
PORTC |=(1<<run_led); //1 灭
delay_ms(500);
PORTC &=~(1<<run_led); //0 亮
gsm_init_flag=1;
}
}
//关闭回显ATE0
USART1_Transmit('A'); //0x41 0x54
USART1_Transmit('T');
USART1_Transmit('E');
USART1_Transmit('0');
USART1_Transmit(0x0d);
gsm_wait_ok();
gsm_init_flag=0;
if(gsm_ok_flag==1)
{
gsm_init_flag=1;
}
//新短信来提示设置: AT+CNMI=3,2
USART1_Transmit('A'); //0x41 0x54
USART1_Transmit('T');
USART1_Transmit('+');
USART1_Transmit('C');
USART1_Transmit('N');
USART1_Transmit('M');
USART1_Transmit('I');
USART1_Transmit('=');
USART1_Transmit('3');
USART1_Transmit(',');
USART1_Transmit('2');
USART1_Transmit(0x0d);
gsm_wait_ok();
gsm_init_flag=0;
if(gsm_ok_flag==1)
{
gsm_init_flag=1;
}
//设置短信方式AT+CMGF=1,TEXT
USART1_Transmit('A'); //0x41 0x54
USART1_Transmit('T');
USART1_Transmit('+');
USART1_Transmit('C');
USART1_Transmit('M');
USART1_Transmit('G');
USART1_Transmit('F');
USART1_Transmit('=');
USART1_Transmit('1');
USART1_Transmit(0x0d);
gsm_wait_ok();
gsm_init_flag=0;
if(gsm_ok_flag==1)
{
PORTC |=(1<<run_led); //1 灭
delay_ms(500);
PORTC &=~(1<<run_led); //0 亮
gsm_init_flag=1;
}
}
//2007
void info_gsm_recieve() //已收到"+,从86开始接收短信信息,如正常
//则info_gsm_rx_flag=1; 短信GD..保存在data_buffer中
//来源手机号保存在gsm_rx_mobile_num中
//短信时间在gsm_rx_time中
{
uchar i,j;
info_gsm_rx_flag=0;
//清info_buffer[] RAM
for(i=0;i<250;i++)
{
info_buffer[i]=0x00;
}
//可以接收后面的内容了
info_lenght=0x00;
for(i=0;i<250;i++)
{
if(UCSR1A&(1<<RXC1))
{
info_buffer[info_lenght]=UDR1;
info_lenght++;
i=1;
}
else
{
delay_us(500);
}
}
//接收完毕,
//清数据区
for(i=0;i<120;i++)
{
data_buffer[i]=0x00;
}
for(i=0;i<11;i++)
{
rx_mobile_num[i]=0x00;
}
for(i=0;i<17;i++)
{
gsm_rx_time[i]=0x00;
}
//保存来源手机号
// USART0_Transmit('y');
// USART0_Transmit('z');
// USART0_Transmit('z');
// USART0_Transmit('-');
// USART0_Transmit('t');
// USART0_Transmit('e');
// USART0_Transmit('l');
// USART0_Transmit(':');
j=2;
for(i=0;i<11;i++)
{//把真正内容放到rx_mobile_num中
rx_mobile_num[i]=info_buffer[j];
//USART0_Transmit(info_buffer[j]);
j++;
}
// USART0_Transmit('-');
// USART0_Transmit('t');
// USART0_Transmit('i');
// USART0_Transmit('m');
// USART0_Transmit('e');
// USART0_Transmit(':');
//保存短信来时间
j=17;
for(i=0;i<17;i++)
{//把真正内容放到rx_mobile_num中
gsm_rx_time[i]=info_buffer[j];
//USART0_Transmit(info_buffer[j]);
j++;
}
//确定真正内容长度
//info_buffer[70]是长度
//或info_buffer[70]+info_buffer[71]
//或info_buffer[70]+info_buffer[71]+info_buffer[72]
//USART0_Transmit('-');
// USART0_Transmit('l');
// USART0_Transmit('e');
// USART0_Transmit('n');
// USART0_Transmit('g');
//USART0_Transmit('t');
// USART0_Transmit('h');
// USART0_Transmit(':');
if(info_buffer[71]==0x0d)
{
data_length=(info_buffer[70]-0x30);
//USART0_Transmit(info_buffer[70]);
j=73;
}
else if (info_buffer[72]==0x0d)
{
data_length=(((info_buffer[70]-0x30))*10+(info_buffer[71]-0x30));
//USART0_Transmit(info_buffer[70]);
//USART0_Transmit(info_buffer[71]);
j=74;
}
else
{
data_length=(((info_buffer[70]-0x30))*100+(info_buffer[71]-0x30)*10+(info_buffer[72]-0x30));
//USART0_Transmit(info_buffer[70]);
//USART0_Transmit(info_buffer[71]);
//USART0_Transmit(info_buffer[72]);
j=75;
}
//USART0_Transmit('-');
// USART0_Transmit('d');
// USART0_Transmit('a');
// USART0_Transmit('t');
// USART0_Transmit('a');
// USART0_Transmit(':');
for(i=0;i<data_length;i++)
{//把真正内容放到data_buffer中
data_buffer[i]=info_buffer[j];
//USART0_Transmit(data_buffer[i]);
j++;
}
//判断
if((data_buffer[0]=='G')&&(data_buffer[1]=='D'))
{//正常短信
info_gsm_rx_flag=1;
}
}
//now_time(12) ,ACSCII -TO -BCD ,now_time_hex(6)
void time_acscii_to_bcd()
{
now_time_hex[0]=now_time[0]-0x30;
now_time_hex[0]=(now_time_hex[0])*16;
now_time[1]=(now_time[1]-0x30);
now_time_hex[0]=now_time_hex[0]+now_time[1];
//year
now_time_hex[1]=now_time[2]-0x30;
now_time_hex[1]=(now_time_hex[1])*16;
now_time[3]=(now_time[3]-0x30);
now_time_hex[1]=now_time_hex[1]+now_time[3];
//month
now_time_hex[2]=now_time[4]-0x30;
now_time_hex[2]=(now_time_hex[2])*16;
now_time[5]=(now_time[5]-0x30);
now_time_hex[2]=now_time_hex[2]+now_time[5];
//date
now_time_hex[3]=now_time[6]-0x30;
now_time_hex[3]=(now_time_hex[3])*16;
now_time[7]=(now_time[7]-0x30);
now_time_hex[3]=now_time_hex[3]+now_time[7];
//hour
now_time_hex[4]=now_time[8]-0x30;
now_time_hex[4]=(now_time_hex[4])*16;
now_time[9]=(now_time[9]-0x30);
now_time_hex[4]=now_time_hex[4]+now_time[9];
//minute
now_time_hex[5]=now_time[10]-0x30;
now_time_hex[5]=(now_time_hex[5])*16;
now_time[11]=(now_time[11]-0x30);
now_time_hex[5]=now_time_hex[5]+now_time[11];
//seconds
}
//当前时间写,要写的时间在now_time中
void set_now_time()
{
//now_time ,ACSCII -TO -BCD ,now_time_hex, save the time;
time_acscii_to_bcd();
WDR();
//save
//先设置24小时制
i2c_Write(0x20,0xE0);
//再设置具体值
i2c_Write(now_time_hex[0],0x60);
i2c_Write(now_time_hex[1],0x50);
i2c_Write(now_time_hex[2],0x40);
i2c_Write(now_time_hex[3],0x20);
i2c_Write(now_time_hex[4],0x10);
i2c_Write(now_time_hex[5],0x00);
}
//当前时间读,BCD---ASCII, 时间保存在now_time中
void read_now_time()
{
time_reg=i2c_Read(0x60);
now_time[1]=time_reg&0x0f;
now_time[1]=now_time[1]+0x30;
now_time[0]=time_reg&0xf0;
now_time[0]=now_time[0]/16+0x30;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -